Invoke NPM only if the global installation dir is in the home directory (fix #21)

This commit is contained in:
Roey Darwish Dror
2018-06-09 20:39:13 +03:00
parent 59de02b8cf
commit 511d5f0559
3 changed files with 54 additions and 14 deletions

View File

@@ -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<PathBuf> {
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") {

32
src/npm.rs Normal file
View File

@@ -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<PathBuf, failure::Error> {
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(())
}
}

View File

@@ -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"])