diff --git a/internal/cmd/testdata/scripts/unmanagedtree.txtar b/internal/cmd/testdata/scripts/unmanagedtree.txtar new file mode 100644 index 00000000000..b678de8a62b --- /dev/null +++ b/internal/cmd/testdata/scripts/unmanagedtree.txtar @@ -0,0 +1,12 @@ +# test that chezmoi unmanaged --tree produces tree-like output +exec chezmoi unmanaged --tree +cmp stdout golden/stdout + +-- golden/stdout -- +.dir + file + subdir +.local +-- home/user/.dir/file -- +-- home/user/.dir/subdir/file -- +-- home/user/.local/share/chezmoi/dot_dir/.keep -- diff --git a/internal/cmd/unmanagedcmd.go b/internal/cmd/unmanagedcmd.go index b28cc1ba156..d65262c19aa 100644 --- a/internal/cmd/unmanagedcmd.go +++ b/internal/cmd/unmanagedcmd.go @@ -1,10 +1,8 @@ package cmd import ( - "fmt" "io/fs" "sort" - "strings" "github.com/spf13/cobra" @@ -14,6 +12,7 @@ import ( type unmanagedCmdConfig struct { pathStyle chezmoi.PathStyle + tree bool } func (c *Config) newUnmanagedCmd() *cobra.Command { @@ -28,6 +27,7 @@ func (c *Config) newUnmanagedCmd() *cobra.Command { } unmanagedCmd.Flags().VarP(&c.unmanaged.pathStyle, "path-style", "p", "Path style") + unmanagedCmd.Flags().BoolVarP(&c.unmanaged.tree, "tree", "t", c.unmanaged.tree, "Print paths as a tree") return unmanagedCmd } @@ -93,16 +93,18 @@ func (c *Config) runUnmanagedCmd(cmd *cobra.Command, args []string, sourceState } } - builder := strings.Builder{} - sortedRelPaths := chezmoi.RelPaths(unmanagedRelPaths.Elements()) - sort.Sort(sortedRelPaths) - for _, relPath := range sortedRelPaths { - switch c.unmanaged.pathStyle { - case chezmoi.PathStyleAbsolute: - fmt.Fprintln(&builder, c.DestDirAbsPath.Join(relPath)) - case chezmoi.PathStyleRelative: - fmt.Fprintln(&builder, relPath) + paths := make([]string, 0, len(unmanagedRelPaths.Elements())) + for relPath := range unmanagedRelPaths { + var path string + if c.unmanaged.pathStyle == chezmoi.PathStyleAbsolute { + path = c.DestDirAbsPath.Join(relPath).String() + } else { + path = relPath.String() } + paths = append(paths, path) } - return c.writeOutputString(builder.String()) + + return c.writePaths(paths, writePathsOptions{ + tree: c.unmanaged.tree, + }) }