提交 e21dc9af 编写于 作者: B Ben S

Merge pull request #21 from coyotebush/git-paths

Improve matching of Git status entries to files
......@@ -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()
......
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(),
};
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册