Allow --git --tree, too

This works by checking if any of the (immediate) files being listed are under Git, and hiding the column if all aren’t.
This commit is contained in:
Benjamin Sago 2017-09-02 12:13:41 +01:00
parent 9cda05df20
commit c60ea36a31
8 changed files with 60 additions and 36 deletions

View File

@ -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 folders Git repository.
struct Git {

View File

@ -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 cant 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());

View File

@ -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<DetailsRow>) {
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();

1
xtests/git_1_file Normal file
View File

@ -0,0 +1 @@
.rw-rw-r-- 21 cassowary  1 Jan 12:34 N- /testcases/git/moves/thither

4
xtests/git_1_files Normal file
View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 \