mirror of
https://github.com/quine-global/hyper.git
synced 2026-01-12 20:18:41 -09:00
enable Add Hyper CLI to PATH option on linux
Use sudo-prompt to create symlink with sudo if required
This commit is contained in:
parent
cfb569eb5c
commit
0a7a0e6078
3 changed files with 61 additions and 32 deletions
|
|
@ -33,6 +33,7 @@
|
||||||
"react-dom": "17.0.1",
|
"react-dom": "17.0.1",
|
||||||
"semver": "7.3.4",
|
"semver": "7.3.4",
|
||||||
"shell-env": "3.0.1",
|
"shell-env": "3.0.1",
|
||||||
|
"sudo-prompt": "^9.2.1",
|
||||||
"uuid": "8.3.2"
|
"uuid": "8.3.2"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
|
|
|
||||||
|
|
@ -5,9 +5,12 @@ import notify from '../notify';
|
||||||
import {cliScriptPath, cliLinkPath} from '../config/paths';
|
import {cliScriptPath, cliLinkPath} from '../config/paths';
|
||||||
import {Registry, loadRegistry} from './registry';
|
import {Registry, loadRegistry} from './registry';
|
||||||
import type {ValueType} from 'native-reg';
|
import type {ValueType} from 'native-reg';
|
||||||
|
import sudoPrompt from 'sudo-prompt';
|
||||||
|
import {clipboard, dialog} from 'electron';
|
||||||
|
|
||||||
const readlink = pify(fs.readlink);
|
const readlink = pify(fs.readlink);
|
||||||
const symlink = pify(fs.symlink);
|
const symlink = pify(fs.symlink);
|
||||||
|
const sudoExec = pify(sudoPrompt.exec, {multiArgs: true});
|
||||||
|
|
||||||
const checkInstall = () => {
|
const checkInstall = () => {
|
||||||
return readlink(cliLinkPath)
|
return readlink(cliLinkPath)
|
||||||
|
|
@ -20,15 +23,44 @@ const checkInstall = () => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const addSymlink = () => {
|
const addSymlink = async (silent: boolean) => {
|
||||||
return checkInstall().then((isInstalled) => {
|
try {
|
||||||
|
const isInstalled = await checkInstall();
|
||||||
if (isInstalled) {
|
if (isInstalled) {
|
||||||
console.log('Hyper CLI already in PATH');
|
console.log('Hyper CLI already in PATH');
|
||||||
return Promise.resolve();
|
return;
|
||||||
}
|
}
|
||||||
console.log('Linking HyperCLI');
|
console.log('Linking HyperCLI');
|
||||||
return symlink(cliScriptPath, cliLinkPath);
|
await symlink(cliScriptPath, cliLinkPath);
|
||||||
});
|
} catch (err) {
|
||||||
|
// 'EINVAL' is returned by readlink,
|
||||||
|
// 'EEXIST' is returned by symlink
|
||||||
|
let error =
|
||||||
|
err.code === 'EEXIST' || err.code === 'EINVAL'
|
||||||
|
? `File already exists: ${cliLinkPath}`
|
||||||
|
: `Symlink creation failed: ${err.code}`;
|
||||||
|
// Need sudo access to create symlink
|
||||||
|
if (err.code === 'EACCES' && !silent) {
|
||||||
|
const result = await dialog.showMessageBox({
|
||||||
|
message: `You need to grant elevated privileges to add Hyper CLI to PATH
|
||||||
|
Or you can run
|
||||||
|
sudo ln -sf "${cliScriptPath}" "${cliLinkPath}"`,
|
||||||
|
type: 'info',
|
||||||
|
buttons: ['OK', 'Copy Command', 'Cancel']
|
||||||
|
});
|
||||||
|
if (result.response === 0) {
|
||||||
|
try {
|
||||||
|
await sudoExec(`ln -sf "${cliScriptPath}" "${cliLinkPath}"`, {name: 'Hyper'});
|
||||||
|
return;
|
||||||
|
} catch (_error) {
|
||||||
|
error = _error[0];
|
||||||
|
}
|
||||||
|
} else if (result.response === 1) {
|
||||||
|
clipboard.writeText(`sudo ln -sf "${cliScriptPath}" "${cliLinkPath}"`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const addBinToUserPath = () => {
|
const addBinToUserPath = () => {
|
||||||
|
|
@ -89,35 +121,26 @@ const logNotify = (withNotification: boolean, title: string, body: string, detai
|
||||||
withNotification && notify(title, body, details);
|
withNotification && notify(title, body, details);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const installCLI = (withNotification: boolean) => {
|
export const installCLI = async (withNotification: boolean) => {
|
||||||
if (process.platform === 'win32') {
|
if (process.platform === 'win32') {
|
||||||
addBinToUserPath()
|
try {
|
||||||
.then(() =>
|
await addBinToUserPath();
|
||||||
logNotify(
|
logNotify(
|
||||||
withNotification,
|
withNotification,
|
||||||
'Hyper CLI installed',
|
'Hyper CLI installed',
|
||||||
'You may need to restart your computer to complete this installation process.'
|
'You may need to restart your computer to complete this installation process.'
|
||||||
)
|
|
||||||
)
|
|
||||||
.catch((err) =>
|
|
||||||
logNotify(withNotification, 'Hyper CLI installation failed', `Failed to add Hyper CLI path to user PATH ${err}`)
|
|
||||||
);
|
);
|
||||||
} else if (process.platform === 'darwin') {
|
} catch (err) {
|
||||||
addSymlink()
|
logNotify(withNotification, 'Hyper CLI installation failed', `Failed to add Hyper CLI path to user PATH ${err}`);
|
||||||
.then(() => logNotify(withNotification, 'Hyper CLI installed', `Symlink created at ${cliLinkPath}`))
|
}
|
||||||
.catch((err) => {
|
} else if (process.platform === 'darwin' || process.platform === 'linux') {
|
||||||
// 'EINVAL' is returned by readlink,
|
try {
|
||||||
// 'EEXIST' is returned by symlink
|
await addSymlink(!withNotification);
|
||||||
const error =
|
logNotify(withNotification, 'Hyper CLI installed', `Symlink created at ${cliLinkPath}`);
|
||||||
err.code === 'EEXIST' || err.code === 'EINVAL'
|
} catch (error) {
|
||||||
? `File already exists: ${cliLinkPath}`
|
logNotify(withNotification, 'Hyper CLI installation failed', `${error}`);
|
||||||
: `Symlink creation failed: ${err.code}`;
|
}
|
||||||
|
|
||||||
console.error(err);
|
|
||||||
logNotify(withNotification, 'Hyper CLI installation failed', error);
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
withNotification &&
|
logNotify(withNotification, 'Hyper CLI installation failed', `Unsupported platform ${process.platform}`);
|
||||||
notify('Hyper CLI installation', 'Command is added in PATH only at package installation. Please reinstall.');
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -823,6 +823,11 @@ strip-final-newline@^2.0.0:
|
||||||
resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
|
resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
|
||||||
integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
|
integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
|
||||||
|
|
||||||
|
sudo-prompt@^9.2.1:
|
||||||
|
version "9.2.1"
|
||||||
|
resolved "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz#77efb84309c9ca489527a4e749f287e6bdd52afd"
|
||||||
|
integrity sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==
|
||||||
|
|
||||||
to-regex-range@^5.0.1:
|
to-regex-range@^5.0.1:
|
||||||
version "5.0.1"
|
version "5.0.1"
|
||||||
resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
|
resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue