From 511d5f0559f9e3104cba241b5cdbee9e63ce0c5d Mon Sep 17 00:00:00 2001 From: Roey Darwish Dror Date: Sat, 9 Jun 2018 20:39:13 +0300 Subject: [PATCH] Invoke NPM only if the global installation dir is in the home directory (fix #21) --- src/main.rs | 26 ++++++++++++++++++++++---- src/npm.rs | 32 ++++++++++++++++++++++++++++++++ src/steps.rs | 10 ---------- 3 files changed, 54 insertions(+), 14 deletions(-) create mode 100644 src/npm.rs diff --git a/src/main.rs b/src/main.rs index 2b4b1461..cc0c81c8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,7 @@ extern crate termion; mod git; mod linux; +mod npm; mod report; mod steps; mod terminal; @@ -16,7 +17,7 @@ use git::Git; use report::{Report, Reporter}; use std::collections::HashSet; use std::env::home_dir; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; use std::process::ExitStatus; use steps::*; use terminal::Terminal; @@ -46,6 +47,19 @@ fn home_path(p: &str) -> PathBuf { path } +fn is_ancestor(ancestor: &Path, path: &Path) -> bool { + let mut p = path; + while let Some(parent) = p.parent() { + if parent == ancestor { + return true; + } + + p = parent; + } + + false +} + #[cfg(unix)] fn tpm() -> Option { let mut path = home_dir().unwrap(); @@ -129,9 +143,13 @@ fn main() -> Result<(), Error> { } } - if let Ok(npm) = which("npm") { - terminal.print_separator("Node Package Manager"); - run_npm(&npm).report("Node Package Manager", &mut reports); + if let Ok(npm) = which("npm").map(npm::NPM::new) { + if let Ok(npm_root) = npm.root() { + if is_ancestor(&home_dir().unwrap(), &npm_root) { + terminal.print_separator("Node Package Manager"); + npm.upgrade().report("Node Package Manager", &mut reports); + } + } } if let Ok(apm) = which("apm") { diff --git a/src/npm.rs b/src/npm.rs new file mode 100644 index 00000000..42c43235 --- /dev/null +++ b/src/npm.rs @@ -0,0 +1,32 @@ +use super::Check; +use failure; +use std::path::PathBuf; +use std::process::Command; + +pub struct NPM { + command: PathBuf, +} + +impl NPM { + pub fn new(command: PathBuf) -> Self { + Self { command } + } + + pub fn root(&self) -> Result { + let output = Command::new(&self.command).args(&["root", "-g"]).output()?; + + output.status.check()?; + + Ok(PathBuf::from(&String::from_utf8(output.stdout)?)) + } + + pub fn upgrade(&self) -> Result<(), failure::Error> { + Command::new(&self.command) + .args(&["update", "-g"]) + .spawn()? + .wait()? + .check()?; + + Ok(()) + } +} diff --git a/src/steps.rs b/src/steps.rs index 54e64db3..700c8fe5 100644 --- a/src/steps.rs +++ b/src/steps.rs @@ -73,16 +73,6 @@ pub fn run_vim( Ok(()) } -pub fn run_npm(npm: &PathBuf) -> Result<(), failure::Error> { - Command::new(&npm) - .args(&["update", "-g"]) - .spawn()? - .wait()? - .check()?; - - Ok(()) -} - pub fn run_apm(apm: &PathBuf) -> Result<(), failure::Error> { Command::new(&apm) .args(&["upgrade", "--confirm=false"])