From c60ea36a315860cf41bb8f43cab514c746216f67 Mon Sep 17 00:00:00 2001 From: Benjamin Sago Date: Sat, 2 Sep 2017 12:13:41 +0100 Subject: [PATCH] Allow --git --tree, too MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This works by checking if any of the (immediate) files being listed are under Git, and hiding the column if all aren’t. --- src/fs/feature/git.rs | 8 ++++++++ src/output/details.rs | 10 +++++++--- src/output/grid_details.rs | 8 ++++++-- xtests/git_1_file | 1 + xtests/git_1_files | 4 ++++ xtests/git_1_tree | 22 +++++++++++----------- xtests/git_2_tree | 26 +++++++++++++------------- xtests/run.sh | 17 ++++++++++------- 8 files changed, 60 insertions(+), 36 deletions(-) create mode 100644 xtests/git_1_file create mode 100644 xtests/git_1_files diff --git a/src/fs/feature/git.rs b/src/fs/feature/git.rs index 84d2431..6ecf8e9 100644 --- a/src/fs/feature/git.rs +++ b/src/fs/feature/git.rs @@ -212,6 +212,14 @@ fn repo_to_statuses(repo: git2::Repository, workdir: &Path) -> Git { Git { statuses } } +// The `repo.statuses` call above takes a long time. exa debug output: +// +// 20.311276 INFO:exa::fs::feature::git: Getting Git statuses for repo with workdir "/vagrant/" +// 20.799610 DEBUG:exa::output::table: Getting Git status for file "./Cargo.toml" +// +// Even inserting another logging line immediately afterwards doesn't make it +// look any faster. + /// Container of Git statuses for all the files in this folder’s Git repository. struct Git { diff --git a/src/output/details.rs b/src/output/details.rs index c647505..b505a45 100644 --- a/src/output/details.rs +++ b/src/output/details.rs @@ -144,8 +144,12 @@ impl<'a> Render<'a> { let mut rows = Vec::new(); if let Some(ref table) = self.opts.table { - if self.dir.is_none() { git = None } - if let (Some(g), Some(d)) = (git, self.dir) { if !g.has_anything_for(&d.path) { git = None } } + match (git, self.dir) { + (Some(g), Some(d)) => if !g.has_anything_for(&d.path) { git = None }, + (Some(g), None) => if !self.files.iter().any(|f| g.has_anything_for(&f.path)) { git = None }, + (None, _) => {/* Keep Git how it is */}, + } + let mut table = Table::new(&table, git, &self.colours); if self.opts.header { @@ -154,7 +158,7 @@ impl<'a> Render<'a> { rows.push(self.render_header(header)); } - // This is weird, but I can't find a way around it: + // This is weird, but I can’t find a way around it: // https://internals.rust-lang.org/t/should-option-mut-t-implement-copy/3715/6 let mut table = Some(table); self.add_files_to_table(&mut table, &mut rows, &self.files, TreeDepth::root()); diff --git a/src/output/grid_details.rs b/src/output/grid_details.rs index c12c339..152ecf4 100644 --- a/src/output/grid_details.rs +++ b/src/output/grid_details.rs @@ -168,8 +168,12 @@ impl<'a> Render<'a> { } fn make_table<'t>(&'a self, options: &'a TableOptions, mut git: Option<&'a GitCache>, drender: &DetailsRender) -> (Table<'a>, Vec) { - if self.dir.is_none() { git = None } - if let (Some(g), Some(d)) = (git, self.dir) { if !g.has_anything_for(&d.path) { git = None } } + match (git, self.dir) { + (Some(g), Some(d)) => if !g.has_anything_for(&d.path) { git = None }, + (Some(g), None) => if !self.files.iter().any(|f| g.has_anything_for(&f.path)) { git = None }, + (None, _) => {/* Keep Git how it is */}, + } + let mut table = Table::new(options, git, self.colours); let mut rows = Vec::new(); diff --git a/xtests/git_1_file b/xtests/git_1_file new file mode 100644 index 0000000..5385e6d --- /dev/null +++ b/xtests/git_1_file @@ -0,0 +1 @@ +.rw-rw-r-- 21 cassowary  1 Jan 12:34 N- /testcases/git/moves/thither diff --git a/xtests/git_1_files b/xtests/git_1_files new file mode 100644 index 0000000..b3f4e43 --- /dev/null +++ b/xtests/git_1_files @@ -0,0 +1,4 @@ +.rw-rw-r-- 20 cassowary  1 Jan 12:34 NM /testcases/git/additions/edited .rw-rw-r-- 15 cassowary  1 Jan 12:34 M- /testcases/git/edits/staged +.rw-rw-r-- 0 cassowary  1 Jan 12:34 N- /testcases/git/additions/staged .rw-rw-r-- 20 cassowary  1 Jan 12:34 -M /testcases/git/edits/unstaged +.rw-rw-r-- 0 cassowary  1 Jan 12:34 -N /testcases/git/additions/unstaged .rw-rw-r-- 21 cassowary  1 Jan 12:34 N- /testcases/git/moves/thither +.rw-rw-r-- 20 cassowary  1 Jan 12:34 MM /testcases/git/edits/both drwxr-xr-x - cassowary  1 Jan 12:34 -- /testcases diff --git a/xtests/git_1_tree b/xtests/git_1_tree index 97500fb..bdd31b0 100644 --- a/xtests/git_1_tree +++ b/xtests/git_1_tree @@ -1,11 +1,11 @@ -drwxrwxr-x - cassowary  1 Jan 12:34 /testcases/git -drwxrwxr-x - cassowary  1 Jan 12:34 ├── additions -.rw-rw-r-- 20 cassowary  1 Jan 12:34 │ ├── edited -.rw-rw-r-- 0 cassowary  1 Jan 12:34 │ ├── staged -.rw-rw-r-- 0 cassowary  1 Jan 12:34 │ └── unstaged -drwxrwxr-x - cassowary  1 Jan 12:34 ├── edits -.rw-rw-r-- 20 cassowary  1 Jan 12:34 │ ├── both -.rw-rw-r-- 15 cassowary  1 Jan 12:34 │ ├── staged -.rw-rw-r-- 20 cassowary  1 Jan 12:34 │ └── unstaged -drwxrwxr-x - cassowary  1 Jan 12:34 └── moves -.rw-rw-r-- 21 cassowary  1 Jan 12:34  └── thither +drwxrwxr-x - cassowary  1 Jan 12:34 NN /testcases/git +drwxrwxr-x - cassowary  1 Jan 12:34 NN ├── additions +.rw-rw-r-- 20 cassowary  1 Jan 12:34 NM │ ├── edited +.rw-rw-r-- 0 cassowary  1 Jan 12:34 N- │ ├── staged +.rw-rw-r-- 0 cassowary  1 Jan 12:34 -N │ └── unstaged +drwxrwxr-x - cassowary  1 Jan 12:34 MM ├── edits +.rw-rw-r-- 20 cassowary  1 Jan 12:34 MM │ ├── both +.rw-rw-r-- 15 cassowary  1 Jan 12:34 M- │ ├── staged +.rw-rw-r-- 20 cassowary  1 Jan 12:34 -M │ └── unstaged +drwxrwxr-x - cassowary  1 Jan 12:34 N- └── moves +.rw-rw-r-- 21 cassowary  1 Jan 12:34 N-  └── thither diff --git a/xtests/git_2_tree b/xtests/git_2_tree index a3941c4..fd864cd 100644 --- a/xtests/git_2_tree +++ b/xtests/git_2_tree @@ -1,13 +1,13 @@ -drwxrwxr-x - cassowary  1 Jan 12:34 /testcases/git2 -drwxrwxr-x - cassowary  1 Jan 12:34 ├── deeply -drwxrwxr-x - cassowary  1 Jan 12:34 │ └── nested -drwxrwxr-x - cassowary  1 Jan 12:34 │ ├── directory -.rw-rw-r-- 0 cassowary  1 Jan 12:34 │ │ ├── l8st -.rw-rw-r-- 18 cassowary  1 Jan 12:34 │ │ └── upd8d -drwxrwxr-x - cassowary  1 Jan 12:34 │ └── repository -.rw-rw-r-- 0 cassowary  1 Jan 12:34 │ └── subfile -drwxrwxr-x - cassowary  1 Jan 12:34 ├── ignoreds -.rw-rw-r-- 0 cassowary  1 Jan 12:34 │ ├── music.m4a -.rw-rw-r-- 0 cassowary  1 Jan 12:34 │ └── music.mp3 -drwxrwxr-x - cassowary  1 Jan 12:34 └── target -.rw-rw-r-- 0 cassowary  1 Jan 12:34  └── another ignored file +drwxrwxr-x - cassowary  1 Jan 12:34 -N /testcases/git2 +drwxrwxr-x - cassowary  1 Jan 12:34 -N ├── deeply +drwxrwxr-x - cassowary  1 Jan 12:34 -N │ └── nested +drwxrwxr-x - cassowary  1 Jan 12:34 -N │ ├── directory +.rw-rw-r-- 0 cassowary  1 Jan 12:34 -N │ │ ├── l8st +.rw-rw-r-- 18 cassowary  1 Jan 12:34 -M │ │ └── upd8d +drwxrwxr-x - cassowary  1 Jan 12:34 -N │ └── repository +.rw-rw-r-- 0 cassowary  1 Jan 12:34 -- │ └── subfile +drwxrwxr-x - cassowary  1 Jan 12:34 -N ├── ignoreds +.rw-rw-r-- 0 cassowary  1 Jan 12:34 -N │ ├── music.m4a +.rw-rw-r-- 0 cassowary  1 Jan 12:34 -- │ └── music.mp3 +drwxrwxr-x - cassowary  1 Jan 12:34 -- └── target +.rw-rw-r-- 0 cassowary  1 Jan 12:34 --  └── another ignored file diff --git a/xtests/run.sh b/xtests/run.sh index c68d126..41cbfb5 100755 --- a/xtests/run.sh +++ b/xtests/run.sh @@ -188,13 +188,14 @@ COLUMNS=80 $exa_binary --colour=never $testcases/file-names-exts | diff -q - # Git -$exa $testcases/git -l --git 2>&1 | diff -q - $results/git_1_long || exit 1 -$exa $testcases/git -l 2>&1 | diff -q - $results/git_1_nogit || exit 1 -$exa $testcases/git --tree -l --git 2>&1 | diff -q - $results/git_1_tree || exit 1 -$exa $testcases/git --recurse -l --git 2>&1 | diff -q - $results/git_1_recurse || exit 1 -$exa $testcases/git/additions -l --git 2>&1 | diff -q - $results/git_1_additions || exit 1 -$exa $testcases/git/edits -l --git 2>&1 | diff -q - $results/git_1_edits || exit 1 -$exa $testcases/git/{additions,edits} -l --git 2>&1 | diff -q - $results/git_1_both || exit 1 +$exa $testcases/git -l --git 2>&1 | diff -q - $results/git_1_long || exit 1 +$exa $testcases/git -l 2>&1 | diff -q - $results/git_1_nogit || exit 1 +$exa $testcases/git --recurse -l --git 2>&1 | diff -q - $results/git_1_recurse || exit 1 +$exa $testcases/git --tree -l --git 2>&1 | diff -q - $results/git_1_tree || exit 1 +$exa $testcases/git/moves/thither --tree -l --git 2>&1 | diff -q - $results/git_1_file || exit 1 +$exa $testcases/git/additions -l --git 2>&1 | diff -q - $results/git_1_additions || exit 1 +$exa $testcases/git/edits -l --git 2>&1 | diff -q - $results/git_1_edits || exit 1 +$exa $testcases/git/{additions,edits} -l --git 2>&1 | diff -q - $results/git_1_both || exit 1 $exa $testcases/git2 -l --git 2>&1 | diff -q - $results/git_2_long || exit 1 $exa $testcases/git2 -l 2>&1 | diff -q - $results/git_2_nogit || exit 1 @@ -205,6 +206,8 @@ $exa $testcases/git2/target -l --git 2>&1 | diff -q - $results $exa $testcases/git2/deeply/nested/repository -l --git 2>&1 | diff -q - $results/git_2_repository || exit 1 $exa $testcases/git2/{deeply,ignoreds,target} -l --git 2>&1 | diff -q - $results/git_2_all || exit 1 +COLUMNS=150 $exa $testcases/git/**/* $testcases --git --long --grid -d | diff -q - $results/git_1_files || exit 1 + $exa $testcases/git $testcases/git2 --git --long | diff -q - $results/git_12 || exit 1 $exa $testcases/git/additions $testcases/git2/deeply \