From 0c84f9f3e6c50e6b1174718bf964b42f3f40349f Mon Sep 17 00:00:00 2001 From: webbrain-one <295484252+webbrain-one@users.noreply.github.com> Date: Mon, 3 Aug 2026 12:32:36 +0300 Subject: [PATCH] fix: hide directories without matching files Filter out directories that do not contain any files with the specified extension when using the --ext flag. Closes #14 --- pkg/printer/printer.go | 40 ++++++++++++++++++---------------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/pkg/printer/printer.go b/pkg/printer/printer.go index 6bfd5ac..1e6d096 100644 --- a/pkg/printer/printer.go +++ b/pkg/printer/printer.go @@ -125,10 +125,10 @@ func getTreeOutput(root string, extFilter string, useColor bool, dirColorName st fileColorFunc := getColorFunc(fileColorName) execColorFunc := getColorFunc(execColorName) - var traverse func(string, string, int) error + var traverse func(string, string, int) bool traverse = func(currentDir string, prefix string, depth int) error { if maxDepth != -1 && depth >= maxDepth { - return nil + return false } dir, err := os.Open(currentDir) if err != nil { @@ -138,12 +138,13 @@ func getTreeOutput(root string, extFilter string, useColor bool, dirColorName st entries, err := dir.Readdir(-1) if err != nil { - return err + return false } // Sort entries based on the specified criteria and order sortEntries(entries, sortBy, order) + found := false for i, entry := range entries { if !includeHidden && strings.HasPrefix(entry.Name(), ".") { continue @@ -159,17 +160,16 @@ func getTreeOutput(root string, extFilter string, useColor bool, dirColorName st isLast := i == len(entries)-1 if entry.IsDir() { - dirCount++ - if useColor { - fmt.Printf("%s%s/\n", prefix+getTreePrefix(isLast), dirColorFunc(entry.Name())) - } else { - fmt.Printf("%s%s/\n", prefix+getTreePrefix(isLast), entry.Name()) - } - output += fmt.Sprintf("%s%s/\n", prefix+getTreePrefix(isLast), entry.Name()) - - err := traverse(filepath.Join(currentDir, entry.Name()), prefix+getIndent(isLast), depth+1) - if err != nil { - return err + hasMatch := traverse(filepath.Join(currentDir, entry.Name()), prefix+getIndent(isLast), depth+1) + if extFilter == "" || hasMatch { + found = true + dirCount++ + if useColor { + fmt.Printf("%s%s/\n", prefix+getTreePrefix(isLast), dirColorFunc(entry.Name())) + } else { + fmt.Printf("%s%s/\n", prefix+getTreePrefix(isLast), entry.Name()) + } + output += fmt.Sprintf("%s%s/\n", prefix+getTreePrefix(isLast), entry.Name()) } } else { if extFilter == "" || strings.HasSuffix(entry.Name(), extFilter) { @@ -187,21 +187,17 @@ func getTreeOutput(root string, extFilter string, useColor bool, dirColorName st fmt.Printf("%s%s\n", prefix+getTreePrefix(isLast), entry.Name()) } output += fmt.Sprintf("%s%s/\n", prefix+getTreePrefix(isLast), entry.Name()) + found = true } } } - - return nil + return found } fmt.Printf("%s/\n", filepath.Base(root)) output += fmt.Sprintf("%s/\n", filepath.Base(root)) - err := traverse(root, "", 0) - if err != nil { - fmt.Println("Error traversing directory:", err) - output += fmt.Sprintf("Error traversing directory: %v\n", err) - } + traverse(root, "", 0) fmt.Printf("\n%d directories, %d files\n", dirCount, fileCount) output += fmt.Sprintf("\n%d directories, %d files\n", dirCount, fileCount) @@ -291,7 +287,7 @@ func buildTree(currentDir string, extFilter string, excludePatterns []string, so if entry.IsDir() { child := buildTree(filepath.Join(currentDir, entry.Name()), extFilter, excludePatterns, sortBy, order, includeHidden, maxDepth, depth+1) - if child != nil { + if child != nil && (extFilter == "" || len(child.Children) > 0) { node.Children = append(node.Children, child) } } else if extFilter == "" || strings.HasSuffix(entry.Name(), extFilter) {