* Allow running NPM as sudo (fix #690) * asd * fix
This commit is contained in:
committed by
GitHub
parent
f8648c9bc7
commit
f39899c3ff
@@ -81,3 +81,7 @@
|
|||||||
# to upgrade it. Use this only if you installed Topgrade by using a package
|
# to upgrade it. Use this only if you installed Topgrade by using a package
|
||||||
# manager such as Scoop to Cargo
|
# manager such as Scoop to Cargo
|
||||||
#self_rename = true
|
#self_rename = true
|
||||||
|
|
||||||
|
[npm]
|
||||||
|
# Use sudo if the NPM directory isn't owned by the current user
|
||||||
|
#use_sudo = true
|
||||||
|
|||||||
@@ -147,6 +147,13 @@ pub struct Windows {
|
|||||||
open_remotes_in_new_terminal: Option<bool>,
|
open_remotes_in_new_terminal: Option<bool>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Default, Debug)]
|
||||||
|
#[serde(deny_unknown_fields)]
|
||||||
|
#[allow(clippy::upper_case_acronyms)]
|
||||||
|
pub struct NPM {
|
||||||
|
use_sudo: Option<bool>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Default, Debug)]
|
#[derive(Deserialize, Default, Debug)]
|
||||||
#[serde(deny_unknown_fields)]
|
#[serde(deny_unknown_fields)]
|
||||||
pub struct Brew {
|
pub struct Brew {
|
||||||
@@ -204,6 +211,7 @@ pub struct ConfigFile {
|
|||||||
linux: Option<Linux>,
|
linux: Option<Linux>,
|
||||||
git: Option<Git>,
|
git: Option<Git>,
|
||||||
windows: Option<Windows>,
|
windows: Option<Windows>,
|
||||||
|
npm: Option<NPM>,
|
||||||
vagrant: Option<Vagrant>,
|
vagrant: Option<Vagrant>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -713,6 +721,15 @@ impl Config {
|
|||||||
.unwrap_or(false)
|
.unwrap_or(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(target_os = "linux")]
|
||||||
|
pub fn npm_use_sudo(&self) -> bool {
|
||||||
|
self.config_file
|
||||||
|
.npm
|
||||||
|
.as_ref()
|
||||||
|
.and_then(|npm| npm.use_sudo)
|
||||||
|
.unwrap_or(false)
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "linux")]
|
#[cfg(target_os = "linux")]
|
||||||
str_value!(linux, emerge_sync_flags);
|
str_value!(linux, emerge_sync_flags);
|
||||||
|
|
||||||
|
|||||||
@@ -297,7 +297,7 @@ fn run() -> Result<()> {
|
|||||||
runner.execute(Step::Vim, "vim", || vim::upgrade_vim(&base_dirs, &ctx))?;
|
runner.execute(Step::Vim, "vim", || vim::upgrade_vim(&base_dirs, &ctx))?;
|
||||||
runner.execute(Step::Vim, "Neovim", || vim::upgrade_neovim(&base_dirs, &ctx))?;
|
runner.execute(Step::Vim, "Neovim", || vim::upgrade_neovim(&base_dirs, &ctx))?;
|
||||||
runner.execute(Step::Vim, "voom", || vim::run_voom(&base_dirs, run_type))?;
|
runner.execute(Step::Vim, "voom", || vim::run_voom(&base_dirs, run_type))?;
|
||||||
runner.execute(Step::Node, "npm", || node::run_npm_upgrade(&base_dirs, run_type))?;
|
runner.execute(Step::Node, "npm", || node::run_npm_upgrade(&ctx))?;
|
||||||
runner.execute(Step::Node, "yarn", || node::yarn_global_update(run_type))?;
|
runner.execute(Step::Node, "yarn", || node::yarn_global_update(run_type))?;
|
||||||
runner.execute(Step::Deno, "deno", || node::deno_upgrade(&ctx))?;
|
runner.execute(Step::Deno, "deno", || node::deno_upgrade(&ctx))?;
|
||||||
runner.execute(Step::Composer, "composer", || generic::run_composer_update(&ctx))?;
|
runner.execute(Step::Composer, "composer", || generic::run_composer_update(&ctx))?;
|
||||||
|
|||||||
@@ -32,15 +32,25 @@ impl NPM {
|
|||||||
.map(|s| PathBuf::from(s.trim()))
|
.map(|s| PathBuf::from(s.trim()))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn upgrade(&self, run_type: RunType) -> Result<()> {
|
fn upgrade(&self, run_type: RunType, use_sudo: bool) -> Result<()> {
|
||||||
run_type.execute(&self.command).args(&["update", "-g"]).check_run()?;
|
if use_sudo {
|
||||||
|
run_type
|
||||||
|
.execute("sudo")
|
||||||
|
.arg(&self.command)
|
||||||
|
.args(&["update", "-g"])
|
||||||
|
.check_run()?;
|
||||||
|
} else {
|
||||||
|
run_type.execute(&self.command).args(&["update", "-g"]).check_run()?;
|
||||||
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn run_npm_upgrade(_base_dirs: &BaseDirs, run_type: RunType) -> Result<()> {
|
pub fn run_npm_upgrade(ctx: &ExecutionContext) -> Result<()> {
|
||||||
let npm = require("npm").map(NPM::new)?;
|
let npm = require("npm").map(NPM::new)?;
|
||||||
|
#[allow(unused_mut)]
|
||||||
|
let mut use_sudo = false;
|
||||||
|
|
||||||
#[cfg(target_os = "linux")]
|
#[cfg(target_os = "linux")]
|
||||||
{
|
{
|
||||||
@@ -53,17 +63,21 @@ pub fn run_npm_upgrade(_base_dirs: &BaseDirs, run_type: RunType) -> Result<()> {
|
|||||||
let uid = Uid::effective();
|
let uid = Uid::effective();
|
||||||
|
|
||||||
if metadata.uid() != uid.as_raw() {
|
if metadata.uid() != uid.as_raw() {
|
||||||
return Err(SkipStep(format!(
|
if metadata.uid() == 0 && (ctx.config().npm_use_sudo()) {
|
||||||
"NPM root at {} is owned by {} which is not the current user",
|
use_sudo = true;
|
||||||
npm_root.display(),
|
} else {
|
||||||
metadata.uid()
|
return Err(SkipStep(format!(
|
||||||
))
|
"NPM root at {} is owned by {} which is not the current user. Set use_sudo = true under the NPM section in your configuration to run NPM as sudo",
|
||||||
.into());
|
npm_root.display(),
|
||||||
|
metadata.uid()
|
||||||
|
))
|
||||||
|
.into());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
print_separator("Node Package Manager");
|
print_separator("Node Package Manager");
|
||||||
npm.upgrade(run_type)
|
npm.upgrade(ctx.run_type(), use_sudo)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn yarn_global_update(run_type: RunType) -> Result<()> {
|
pub fn yarn_global_update(run_type: RunType) -> Result<()> {
|
||||||
|
|||||||
Reference in New Issue
Block a user