Explorar el Código

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.
Benjamin Sago hace 8 años
padre
commit
c60ea36a31
Se han modificado 8 ficheros con 60 adiciones y 36 borrados
  1. 8 0
      src/fs/feature/git.rs
  2. 7 3
      src/output/details.rs
  3. 6 2
      src/output/grid_details.rs
  4. 1 0
      xtests/git_1_file
  5. 4 0
      xtests/git_1_files
  6. 11 11
      xtests/git_1_tree
  7. 13 13
      xtests/git_2_tree
  8. 10 7
      xtests/run.sh

+ 8 - 0
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 {

+ 7 - 3
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 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());

+ 6 - 2
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<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 - 0
xtests/git_1_file

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

+ 4 - 0
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

+ 11 - 11
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

+ 13 - 13
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

+ 10 - 7
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 \