diff --git a/src/dir.rs b/src/dir.rs index 8bd6d44c02d836f4b6dd7ebbd270691e3d8336ca..28c60dd664c33a87fa849865fdd39fd4d1956f81 100644 --- a/src/dir.rs +++ b/src/dir.rs @@ -75,7 +75,7 @@ impl Dir { /// Container of Git statuses for all the files in this folder's Git repository. #[cfg(feature="git")] struct Git { - statuses: Vec<(Vec, git2::Status)>, + statuses: Vec<(Path, git2::Status)>, } #[cfg(feature="git")] @@ -85,8 +85,9 @@ impl Git { /// the files' statuses if one is found. fn scan(path: &Path) -> Result { let repo = try!(git2::Repository::discover(path)); + let workdir = repo.workdir().unwrap_or(Path::new(".")); let statuses = try!(repo.statuses(None)).iter() - .map(|e| (e.path_bytes().to_vec(), e.status())) + .map(|e| (workdir.join(e.path_bytes()), e.status())) .collect(); Ok(Git { statuses: statuses }) } @@ -94,7 +95,7 @@ impl Git { /// Get the status for the file at the given path, if present. fn status(&self, path: &Path) -> String { let status = self.statuses.iter() - .find(|p| p.0 == path.as_vec()); + .find(|p| &p.0 == path); match status { Some(&(_, s)) => ANSIStrings( &[Git::index_status(s), Git::working_tree_status(s) ]).to_string(), None => GREY.paint("--").to_string(), @@ -106,7 +107,7 @@ impl Git { /// directories, which don't really have an 'official' status. fn dir_status(&self, dir: &Path) -> String { let s = self.statuses.iter() - .filter(|p| p.0.starts_with(dir.as_vec())) + .filter(|p| dir.is_ancestor_of(&p.0)) .fold(git2::Status::empty(), |a, b| a | b.1); ANSIStrings( &[Git::index_status(s), Git::working_tree_status(s)] ).to_string() diff --git a/src/file.rs b/src/file.rs index 10716cdbbb8d05e16a892549e43059a4cdf03814..d1cd7b84ddd4cb3b725a01467ff2c64a2044beac 100644 --- a/src/file.rs +++ b/src/file.rs @@ -1,6 +1,7 @@ use std::old_io::{fs, IoResult}; use std::old_io as io; use std::ascii::AsciiExt; +use std::env::current_dir; use ansi_term::{ANSIString, ANSIStrings, Colour, Style}; use ansi_term::Style::Plain; @@ -415,7 +416,8 @@ impl<'a> File<'a> { fn git_status(&self) -> Cell { let status = match self.dir { - Some(d) => d.git_status(&self.path, self.stat.kind == io::FileType::Directory), + Some(d) => d.git_status(¤t_dir().unwrap_or(Path::new(".")).join(&self.path), + self.stat.kind == io::FileType::Directory), None => GREY.paint("--").to_string(), };