Repository: lsd-rs/lsd (Rust)

Issue:
`--tree` alongside `-a, --all` displays wrong results
- os: Funtoo Linux
- `lsd --version`: 0.19.0
- `echo $TERM`: screen-256color
- `echo $LS_COLORS`: rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.cfg=00;32:*.conf=00;32:*.diff=00;32:*.doc=00;32:*.ini=00;32:*.log=00;32:*.patch=00;32:*.pdf=00;32:*.ps=00;32:*.tex=00;32:*.txt=00;32:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:

## Expected behavior
A directory is not supposed to display as its own child

## Actual behavior
A directory itself and its parent are wrongly displayed as children of the directory when `-a` option is used with `--tree`.

Example, with and without `-a` option:

```sh
$ mkdir one two one/sub # create some directory structure as a test case
$ touch two/.hidden-file
$ lsd --tree -a  # a buggy output, see how three directories turned into a flood
 .
├──  .
├──  ./..
├──  one
│  ├──  one
│  ├──  ./one/..
│  └──  sub
│     ├──  sub
│     └──  ./one/sub/..
└──  two
   ├──  two
   ├──  ./two/..
   └──  .hidden-file

$ lsd --tree -A # the output above is expected to look closer to the following
 .
├──  one
│  └──  sub
└──  two
   └──  .hidden-file
```

I think it makes sense to list `.` and `..` directories for the top level only (if it does at all), if `-a` is provided.

Thank you


Discussion:

Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a166bf957..7d364a3bc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - Add support for `TIME_STYLE` environment variable from [999eagle](https://github.com/999eagle)
 - Add man page from [edneville](https://github.com/edneville)
 ### Changed
+- Not showing `.` and `..` when `--tree` with `--all` from [zwpaper](https://github.com/zwpaper) [#477](https://github.com/Peltoche/lsd/issues/477)
 ### Fixed
 - Fix handling blocks passed without -l in cli from [meain](https://github.com/meain)
 
diff --git a/src/display.rs b/src/display.rs
index 80d4a7f2b..f1d0084fd 100644
--- a/src/display.rs
+++ b/src/display.rs
@@ -345,11 +345,14 @@ fn get_padding_rules(metas: &[Meta], flags: &Flags) -> HashMap<Block, usize> {
 #[cfg(test)]
 mod tests {
     use super::*;
+    use crate::app;
     use crate::color;
     use crate::color::Colors;
     use crate::icon;
     use crate::icon::Icons;
     use crate::meta::{FileType, Name};
+    use crate::Config;
+    use assert_fs::prelude::*;
     use std::path::Path;
 
     #[test]
@@ -485,4 +488,31 @@ mod tests {
             assert_eq!(get_visible_width(&output), *l);
         }
     }
+
+    #[test]
+    fn test_display_tree_with_all() {
+        let argv = vec!["lsd", "--tree", "--all"];
+        let matches = app::build().get_matches_from_safe(argv).unwrap();
+        let flags = Flags::configure_from(&matches, &Config::with_none()).unwrap();
+
+        let dir = assert_fs::TempDir::new().unwrap();
+        dir.child("one.d").create_dir_all().unwrap();
+        dir.child("one.d/two").touch().unwrap();
+        dir.child("one.d/.hidden").touch().unwrap();
+        let metas = Meta::from_path(Path::new(dir.path()), false)
+            .unwrap()
+            .recurse_into(42, &flags)
+            .unwrap()
+            .unwrap();
+        let output = inner_display_tree(
+            &metas,
+            &flags,
+            &Colors::new(color::Theme::NoColor),
+            &Icons::new(icon::Theme::NoIcon, " ".to_string()),
+            0,
+            "",
+        );
+
+        assert_eq!("one.d\n├── .hidden\n└── two\n", output);
+    }
 }
diff --git a/src/meta/mod.rs b/src/meta/mod.rs
index d0c3f83aa..d29fceefc 100644
--- a/src/meta/mod.rs
+++ b/src/meta/mod.rs
@@ -81,7 +81,7 @@ impl Meta {
 
         let mut content: Vec<Meta> = Vec::new();
 
-        if let Display::All = flags.display {
+        if Display::All == flags.display && flags.layout != Layout::Tree {
             let mut current_meta;
 
             current_meta = self.clone();


Test patch:
diff --git a/tests/integration.rs b/tests/integration.rs
index 4fe280eb1..8d34eb61c 100644
--- a/tests/integration.rs
+++ b/tests/integration.rs
@@ -414,6 +414,24 @@ fn test_tree() {
         .stdout(predicate::str::is_match("├── one\n└── one.d\n   └── two\n$").unwrap());
 }
 
+#[test]
+fn test_tree_all_not_show_self() {
+    let tmp = tempdir();
+    tmp.child("one").touch().unwrap();
+    tmp.child("one.d").create_dir_all().unwrap();
+    tmp.child("one.d/two").touch().unwrap();
+    tmp.child("one.d/.hidden").touch().unwrap();
+
+    cmd()
+        .arg(tmp.path())
+        .arg("--tree")
+        .arg("--all")
+        .assert()
+        .stdout(
+            predicate::str::is_match("├── one\n└── one.d\n   ├── .hidden\n   └── two\n$").unwrap(),
+        );
+}
+
 #[test]
 fn test_tree_d() {
     let tmp = tempdir();