Răsfoiți Sursa

Merge pull request #21 from coyotebush/git-paths

Improve matching of Git status entries to files
Ben S 11 ani în urmă
părinte
comite
e21dc9af2a
2 a modificat fișierele cu 8 adăugiri și 5 ștergeri
  1. 5 4
      src/dir.rs
  2. 3 1
      src/file.rs

+ 5 - 4
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<u8>, 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<Git, git2::Error> {
         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()

+ 3 - 1
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(&current_dir().unwrap_or(Path::new(".")).join(&self.path),
+                                    self.stat.kind == io::FileType::Directory),
             None    => GREY.paint("--").to_string(),
         };