diff --git a/go.mod b/go.mod index 6069610..4a67630 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,9 @@ retract v0.6.1 // init -s writes to stderr instead of stdout, breaking eval require ( github.com/caarlos0/go-version v0.2.2 + github.com/fatih/color v1.19.0 github.com/google/go-cmp v0.7.0 + github.com/mattn/go-isatty v0.0.20 github.com/mroth/porcelain v0.1.1 github.com/rogpeppe/go-internal v1.14.1 github.com/spf13/cobra v1.10.2 @@ -14,7 +16,8 @@ require ( require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/spf13/pflag v1.0.9 // indirect - golang.org/x/sys v0.26.0 // indirect + golang.org/x/sys v0.42.0 // indirect golang.org/x/tools v0.26.0 // indirect ) diff --git a/go.sum b/go.sum index 01ae313..6dc6479 100644 --- a/go.sum +++ b/go.sum @@ -1,10 +1,16 @@ github.com/caarlos0/go-version v0.2.2 h1:5r+nlrg4H2wOVwWjqRqRRIRbZ7ytRmjC9xoMIP0a5kQ= github.com/caarlos0/go-version v0.2.2/go.mod h1:X+rI5VAtJDpcjCjeEIXpxGa5+rTcgur1FK66wS0/944= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/fatih/color v1.19.0 h1:Zp3PiM21/9Ld6FzSKyL5c/BULoe/ONr9KlbYVOfG8+w= +github.com/fatih/color v1.19.0/go.mod h1:zNk67I0ZUT1bEGsSGyCZYZNrHuTkJJB+r6Q9VuMi0LE= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mroth/porcelain v0.1.1 h1:9gj2GZtxsO/d23liwm2cIG45kTFP2lkI8hXqpxeE31E= github.com/mroth/porcelain v0.1.1/go.mod h1:j/qPthvngCR1yxkK890O4cP4mlTWbxnGb4s0MR+m6EE= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= @@ -15,8 +21,9 @@ github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiT github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY= github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/internal/cmd/status/color.go b/internal/cmd/status/color.go index f6b8442..88643f3 100644 --- a/internal/cmd/status/color.go +++ b/internal/cmd/status/color.go @@ -1,26 +1,24 @@ package status -import "github.com/mroth/scmpuff/internal/gitstatus" - -// Color represents an ANSI color code -type Color string +import ( + "github.com/fatih/color" + "github.com/mroth/scmpuff/internal/gitstatus" +) -// Base color constants with full ANSI escape sequences -const ( - RedColor Color = "\033[0;31m" - GreenColor Color = "\033[0;32m" - YellowColor Color = "\033[0;33m" - BlueColor Color = "\033[0;34m" - MagentaColor Color = "\033[0;35m" - CyanColor Color = "\033[0;36m" - BoldColor Color = "\033[1m" - DimWhiteColor Color = "\033[2;37m" - DimForegroundColor Color = "\033[2;39m" - ResetColor Color = "\033[0m" +// Color definitions using fatih/color for cross-platform terminal support. +var ( + RedColor = color.New(color.FgRed) + GreenColor = color.New(color.FgGreen) + YellowColor = color.New(color.FgYellow) + BlueColor = color.New(color.FgBlue) + MagentaColor = color.New(color.FgMagenta) + CyanColor = color.New(color.FgCyan) + BoldColor = color.New(color.Bold) + DimForegroundColor = color.New(color.Faint) ) // Semantic color mappings for different change states -var stateColors = map[gitstatus.ChangeState]Color{ +var stateColors = map[gitstatus.ChangeState]*color.Color{ gitstatus.NewState: YellowColor, gitstatus.ModifiedState: GreenColor, gitstatus.DeletedState: RedColor, @@ -31,7 +29,7 @@ var stateColors = map[gitstatus.ChangeState]Color{ } // Group color mappings for status groups -var groupColors = map[gitstatus.StatusGroup]Color{ +var groupColors = map[gitstatus.StatusGroup]*color.Color{ gitstatus.Staged: YellowColor, gitstatus.Unmerged: RedColor, gitstatus.Unstaged: GreenColor, @@ -39,9 +37,9 @@ var groupColors = map[gitstatus.StatusGroup]Color{ } // Bold group colors for headers (arrows) -var groupBoldColors = map[gitstatus.StatusGroup]Color{ - gitstatus.Staged: "\033[1;33m", // bold yellow - gitstatus.Unmerged: "\033[1;31m", // bold red - gitstatus.Unstaged: "\033[1;32m", // bold green - gitstatus.Untracked: "\033[1;36m", // bold cyan +var groupBoldColors = map[gitstatus.StatusGroup]*color.Color{ + gitstatus.Staged: color.New(color.FgYellow, color.Bold), + gitstatus.Unmerged: color.New(color.FgRed, color.Bold), + gitstatus.Unstaged: color.New(color.FgGreen, color.Bold), + gitstatus.Untracked: color.New(color.FgCyan, color.Bold), } diff --git a/internal/cmd/status/render.go b/internal/cmd/status/render.go index b7e7763..fee06da 100644 --- a/internal/cmd/status/render.go +++ b/internal/cmd/status/render.go @@ -4,6 +4,7 @@ import ( "bufio" "fmt" "io" + "strconv" "strings" "github.com/mroth/scmpuff/internal/gitstatus" @@ -178,17 +179,16 @@ func formatBranchBannerPrelude(b gitstatus.BranchInfo) string { var diffFormatted string if diffStr != "" { diffFormatted = fmt.Sprintf( - " %s| %s%s%s", - DimForegroundColor, YellowColor, diffStr, ResetColor, + " %s %s", + DimForegroundColor.Sprint("|"), YellowColor.Sprint(diffStr), ) } - return fmt.Sprintf( - "%s#%s On branch: %s%s%s %s| ", - DimForegroundColor, ResetColor, BoldColor, - b.Name, diffFormatted, - DimForegroundColor, - ) + hash := DimForegroundColor.Sprint("#") + branch := BoldColor.Sprint(b.Name) + separator := DimForegroundColor.Sprint("| ") + + return fmt.Sprintf("%s On branch: %s%s %s", hash, branch, diffFormatted, separator) } // formatUpstreamDiffIndicator formats the +1/-2 ahead/behind diff indicator for a branch relative to upstream @@ -207,17 +207,14 @@ func formatUpstreamDiffIndicator(b gitstatus.BranchInfo) string { func bannerChangeHeader() string { return fmt.Sprintf( - "[%s*%s]%s => $e*\n%s#%s", - ResetColor, DimForegroundColor, ResetColor, DimForegroundColor, ResetColor, + "%s*%s => $e*\n%s", + DimForegroundColor.Sprint("["), DimForegroundColor.Sprint("]"), DimForegroundColor.Sprint("#"), ) } // bannerNoChanges returns the no changes message when working directory is clean func bannerNoChanges() string { - return fmt.Sprintf( - "%sNo changes (working directory clean)%s", - GreenColor, ResetColor, - ) + return GreenColor.Sprint("No changes (working directory clean)") } // formatHeaderForGroup returns the display header string for a file group. @@ -230,15 +227,14 @@ func formatHeaderForGroup(group gitstatus.StatusGroup) string { groupColor := groupColors[group] groupBoldColor := groupBoldColors[group] return fmt.Sprintf( - "%s➤%s %s\n%s#%s\n", - groupBoldColor, ResetColor, group.Description(), groupColor, ResetColor, + "%s %s\n%s\n", + groupBoldColor.Sprint("➤"), group.Description(), groupColor.Sprint("#"), ) } // formatFooterForGroup prints a final "#" for vertical padding func formatFooterForGroup(group gitstatus.StatusGroup) string { - groupColor := groupColors[group] - return fmt.Sprintf("%s#%s\n", groupColor, ResetColor) + return groupColors[group].Sprint("#") + "\n" } // formatStatusItemDisplay returns print string for an individual status item for a group. @@ -247,9 +243,8 @@ func formatFooterForGroup(group gitstatus.StatusGroup) string { // // # modified: [1] commands/status/constants.go func (r *Renderer) formatStatusItemDisplay(item gitstatus.StatusItem, displayNum int) string { - // Get configured colors for the item display based on status group and state. - groupColor := string(groupColors[item.StatusGroup()]) - stateColor := string(stateColors[item.State()]) + groupColor := groupColors[item.StatusGroup()] + stateColor := stateColors[item.State()] // For reasons lost to time, I originally decided to use a fixed width of 2 // to pad the display number, so that entries 1-99 would align nicely. @@ -274,9 +269,10 @@ func (r *Renderer) formatStatusItemDisplay(item gitstatus.StatusItem, displayNum paddedMsg = fmt.Sprintf("%10s", baseMsg) } - return fmt.Sprintf( - "%s#%s %s%s:%s%s [%s%d%s] %s%s%s\n", - groupColor, ResetColor, stateColor, paddedMsg, padding, DimForegroundColor, - ResetColor, displayNum, DimForegroundColor, groupColor, itemDisplayPath, ResetColor, - ) + hash := groupColor.Sprint("#") + state := stateColor.Sprintf("%s:", paddedMsg) + num := DimForegroundColor.Sprint("[") + strconv.Itoa(displayNum) + DimForegroundColor.Sprint("]") + path := groupColor.Sprint(itemDisplayPath) + + return fmt.Sprintf("%s %s%s %s %s\n", hash, state, padding, num, path) } diff --git a/internal/cmd/status/render_test.go b/internal/cmd/status/render_test.go index f8c2d47..7dc249d 100644 --- a/internal/cmd/status/render_test.go +++ b/internal/cmd/status/render_test.go @@ -9,6 +9,7 @@ import ( "path/filepath" "testing" + "github.com/fatih/color" "github.com/mroth/scmpuff/internal/gitstatus" ) @@ -223,13 +224,18 @@ func TestRenderer_Display(t *testing.T) { name string includeParseData bool includeStatusOutput bool + forceColor bool }{ {name: "parsedata.txt", includeParseData: true, includeStatusOutput: false}, - {name: "display.ansi", includeParseData: false, includeStatusOutput: true}, + {name: "display.ansi", includeParseData: false, includeStatusOutput: true, forceColor: true}, + {name: "display.plain", includeParseData: false, includeStatusOutput: true, forceColor: false}, } for _, oc := range optionCases { t.Run(oc.name, func(t *testing.T) { + // Control color output for this test case. + color.NoColor = !oc.forceColor + renderer, err := NewRenderer(&tc.info, tc.root, tc.cwd) if err != nil { t.Fatalf("NewRenderer() error: %v", err) diff --git a/internal/cmd/status/status.go b/internal/cmd/status/status.go index afe6750..73e3a21 100644 --- a/internal/cmd/status/status.go +++ b/internal/cmd/status/status.go @@ -8,6 +8,8 @@ import ( "os/exec" "path/filepath" + "github.com/fatih/color" + "github.com/mattn/go-isatty" "github.com/mroth/scmpuff/internal/gitstatus/porcelainv2" "github.com/spf13/cobra" ) @@ -34,6 +36,22 @@ see 'scmpuff init'.) RunE: func(cmd *cobra.Command, args []string) error { cmd.SilenceUsage = true // silence usage-on-error after args processed + // Determine color output based on the user's terminal, not our stdout. + // + // stdout is always a pipe when invoked via the scmpuff_status() shell + // wrapper (which captures output in a subshell), so we cannot rely on + // fatih/color's default TTY detection against stdout. Instead, check + // stderr (which remains connected to the user's terminal) and honor + // the NO_COLOR convention (https://no-color.org/). + switch { + case os.Getenv("NO_COLOR") != "": + color.NoColor = true + case isatty.IsTerminal(os.Stderr.Fd()) || isatty.IsCygwinTerminal(os.Stderr.Fd()): + color.NoColor = false + default: + color.NoColor = true + } + // Obtain the current working directory (needed to determine git root and relative paths) wd, err := os.Getwd() if err != nil { @@ -49,7 +67,7 @@ see 'scmpuff init'.) var exitErr *exec.ExitError if errors.As(err, &exitErr) && exitErr.ExitCode() == 128 { msg := "Not a git repository (or any of the parent directories)" - fmt.Fprintf(os.Stderr, "%s%s%s\n", RedColor, msg, ResetColor) + fmt.Fprintln(os.Stderr, RedColor.Sprint(msg)) os.Exit(128) } diff --git a/internal/cmd/status/testdata/statuslist-complex_merge_conflict_intent.display.ansi.golden b/internal/cmd/status/testdata/statuslist-complex_merge_conflict_intent.display.ansi.golden index 7b005d1..a86a3a3 100644 --- a/internal/cmd/status/testdata/statuslist-complex_merge_conflict_intent.display.ansi.golden +++ b/internal/cmd/status/testdata/statuslist-complex_merge_conflict_intent.display.ansi.golden @@ -1,12 +1,12 @@ -# On branch: merge-conflict | [*] => $e* -# -➤ Unmerged paths -# -#  both added:  [1] both_added -#  both modified:  [2] both_modified -# deleted by them:  [3] deleted_by_them -#  deleted by us:  [4] deleted_by_us -#  both deleted:  [5] renamed_file -#  added by them:  [6] renamed_file_on_branch -#  added by us:  [7] renamed_file_on_master -# +# On branch: merge-conflict | [*] => $e* +# +➤ Unmerged paths +# +#  both added: [1] both_added +#  both modified: [2] both_modified +# deleted by them: [3] deleted_by_them +#  deleted by us: [4] deleted_by_us +#  both deleted: [5] renamed_file +#  added by them: [6] renamed_file_on_branch +#  added by us: [7] renamed_file_on_master +# diff --git a/internal/cmd/status/testdata/statuslist-complex_merge_conflict_intent.display.plain.golden b/internal/cmd/status/testdata/statuslist-complex_merge_conflict_intent.display.plain.golden new file mode 100644 index 0000000..2e92a08 --- /dev/null +++ b/internal/cmd/status/testdata/statuslist-complex_merge_conflict_intent.display.plain.golden @@ -0,0 +1,12 @@ +# On branch: merge-conflict | [*] => $e* +# +➤ Unmerged paths +# +# both added: [1] both_added +# both modified: [2] both_modified +# deleted by them: [3] deleted_by_them +# deleted by us: [4] deleted_by_us +# both deleted: [5] renamed_file +# added by them: [6] renamed_file_on_branch +# added by us: [7] renamed_file_on_master +# diff --git a/internal/cmd/status/testdata/statuslist-complex_mix.display.ansi.golden b/internal/cmd/status/testdata/statuslist-complex_mix.display.ansi.golden index 2390dd3..31c5c7a 100644 --- a/internal/cmd/status/testdata/statuslist-complex_mix.display.ansi.golden +++ b/internal/cmd/status/testdata/statuslist-complex_mix.display.ansi.golden @@ -1,15 +1,15 @@ -# On branch: feature | +2/-1 | [*] => $e* -# -➤ Changes to be committed -# -#  new file:  [1] new.go -#  new file:  [2] new_b.go -# -➤ Changes not staged for commit -# -#  modified:  [3] modified.go -# -➤ Untracked files -# -#  untracked:  [4] untracked.go -# +# On branch: feature | +2/-1 | [*] => $e* +# +➤ Changes to be committed +# +#  new file: [1] new.go +#  new file: [2] new_b.go +# +➤ Changes not staged for commit +# +#  modified: [3] modified.go +# +➤ Untracked files +# +#  untracked: [4] untracked.go +# diff --git a/internal/cmd/status/testdata/statuslist-complex_mix.display.plain.golden b/internal/cmd/status/testdata/statuslist-complex_mix.display.plain.golden new file mode 100644 index 0000000..e2d7f70 --- /dev/null +++ b/internal/cmd/status/testdata/statuslist-complex_mix.display.plain.golden @@ -0,0 +1,15 @@ +# On branch: feature | +2/-1 | [*] => $e* +# +➤ Changes to be committed +# +# new file: [1] new.go +# new file: [2] new_b.go +# +➤ Changes not staged for commit +# +# modified: [3] modified.go +# +➤ Untracked files +# +# untracked: [4] untracked.go +# diff --git a/internal/cmd/status/testdata/statuslist-empty.display.ansi.golden b/internal/cmd/status/testdata/statuslist-empty.display.ansi.golden index 8334351..add29fe 100644 --- a/internal/cmd/status/testdata/statuslist-empty.display.ansi.golden +++ b/internal/cmd/status/testdata/statuslist-empty.display.ansi.golden @@ -1 +1 @@ -# On branch: main | No changes (working directory clean) +# On branch: main | No changes (working directory clean) diff --git a/internal/cmd/status/testdata/statuslist-empty.display.plain.golden b/internal/cmd/status/testdata/statuslist-empty.display.plain.golden new file mode 100644 index 0000000..d7649f3 --- /dev/null +++ b/internal/cmd/status/testdata/statuslist-empty.display.plain.golden @@ -0,0 +1 @@ +# On branch: main | No changes (working directory clean) diff --git a/internal/cmd/status/testdata/statuslist-intent_to_add.display.ansi.golden b/internal/cmd/status/testdata/statuslist-intent_to_add.display.ansi.golden index ac6a1b2..8f86744 100644 --- a/internal/cmd/status/testdata/statuslist-intent_to_add.display.ansi.golden +++ b/internal/cmd/status/testdata/statuslist-intent_to_add.display.ansi.golden @@ -1,8 +1,8 @@ -# On branch: main | [*] => $e* -# -➤ Changes not staged for commit -# -#  new file:  [1] intent_to_add.txt -#  new file:  [2] another_new.txt -#  modified:  [3] modified.txt -# +# On branch: main | [*] => $e* +# +➤ Changes not staged for commit +# +#  new file: [1] intent_to_add.txt +#  new file: [2] another_new.txt +#  modified: [3] modified.txt +# diff --git a/internal/cmd/status/testdata/statuslist-intent_to_add.display.plain.golden b/internal/cmd/status/testdata/statuslist-intent_to_add.display.plain.golden new file mode 100644 index 0000000..3f94ff2 --- /dev/null +++ b/internal/cmd/status/testdata/statuslist-intent_to_add.display.plain.golden @@ -0,0 +1,8 @@ +# On branch: main | [*] => $e* +# +➤ Changes not staged for commit +# +# new file: [1] intent_to_add.txt +# new file: [2] another_new.txt +# modified: [3] modified.txt +# diff --git a/internal/cmd/status/testdata/statuslist-longlist.display.ansi.golden b/internal/cmd/status/testdata/statuslist-longlist.display.ansi.golden index 67fa227..cba13ad 100644 --- a/internal/cmd/status/testdata/statuslist-longlist.display.ansi.golden +++ b/internal/cmd/status/testdata/statuslist-longlist.display.ansi.golden @@ -1,23 +1,23 @@ -# On branch: techdebt | +42/-1123 | [*] => $e* -# -➤ Changes to be committed -# -#  new file:  [1] new_a.php -#  new file:  [2] new_b.php -#  new file:  [3] new_c.php -#  new file:  [4] new_d.php -#  renamed:  [5] tests/flakey -> tests/disabled -#  renamed:  [6] SECURITY.md -> docs/SECURITY.md -#  copied:  [7] me -> metoo -# -➤ Changes not staged for commit -# -#  modified:  [8] modified1.php -#  modified:  [9] modified2.php -#  modified: [10] 修改后的文件.php -#  deleted: [11] 👻.go -# -➤ Untracked files -# -#  untracked: [12] untracked file with spaces.txt -# +# On branch: techdebt | +42/-1123 | [*] => $e* +# +➤ Changes to be committed +# +#  new file: [1] new_a.php +#  new file: [2] new_b.php +#  new file: [3] new_c.php +#  new file: [4] new_d.php +#  renamed: [5] tests/flakey -> tests/disabled +#  renamed: [6] SECURITY.md -> docs/SECURITY.md +#  copied: [7] me -> metoo +# +➤ Changes not staged for commit +# +#  modified: [8] modified1.php +#  modified: [9] modified2.php +#  modified: [10] 修改后的文件.php +#  deleted: [11] 👻.go +# +➤ Untracked files +# +#  untracked: [12] untracked file with spaces.txt +# diff --git a/internal/cmd/status/testdata/statuslist-longlist.display.plain.golden b/internal/cmd/status/testdata/statuslist-longlist.display.plain.golden new file mode 100644 index 0000000..1efd353 --- /dev/null +++ b/internal/cmd/status/testdata/statuslist-longlist.display.plain.golden @@ -0,0 +1,23 @@ +# On branch: techdebt | +42/-1123 | [*] => $e* +# +➤ Changes to be committed +# +# new file: [1] new_a.php +# new file: [2] new_b.php +# new file: [3] new_c.php +# new file: [4] new_d.php +# renamed: [5] tests/flakey -> tests/disabled +# renamed: [6] SECURITY.md -> docs/SECURITY.md +# copied: [7] me -> metoo +# +➤ Changes not staged for commit +# +# modified: [8] modified1.php +# modified: [9] modified2.php +# modified: [10] 修改后的文件.php +# deleted: [11] 👻.go +# +➤ Untracked files +# +# untracked: [12] untracked file with spaces.txt +# diff --git a/internal/cmd/status/testdata/statuslist-rebase_conflict_head_no_branch_intent.display.ansi.golden b/internal/cmd/status/testdata/statuslist-rebase_conflict_head_no_branch_intent.display.ansi.golden index f9c143f..01f5ccf 100644 --- a/internal/cmd/status/testdata/statuslist-rebase_conflict_head_no_branch_intent.display.ansi.golden +++ b/internal/cmd/status/testdata/statuslist-rebase_conflict_head_no_branch_intent.display.ansi.golden @@ -1,6 +1,6 @@ -# On branch: HEAD (no branch) | [*] => $e* -# -➤ Unmerged paths -# -#  both modified:  [1] file_with_conflict -# +# On branch: HEAD (no branch) | [*] => $e* +# +➤ Unmerged paths +# +#  both modified: [1] file_with_conflict +# diff --git a/internal/cmd/status/testdata/statuslist-rebase_conflict_head_no_branch_intent.display.plain.golden b/internal/cmd/status/testdata/statuslist-rebase_conflict_head_no_branch_intent.display.plain.golden new file mode 100644 index 0000000..027a299 --- /dev/null +++ b/internal/cmd/status/testdata/statuslist-rebase_conflict_head_no_branch_intent.display.plain.golden @@ -0,0 +1,6 @@ +# On branch: HEAD (no branch) | [*] => $e* +# +➤ Unmerged paths +# +# both modified: [1] file_with_conflict +# diff --git a/internal/cmd/status/testdata/statuslist-subdirectory.display.ansi.golden b/internal/cmd/status/testdata/statuslist-subdirectory.display.ansi.golden index dbff232..33c5bbb 100644 --- a/internal/cmd/status/testdata/statuslist-subdirectory.display.ansi.golden +++ b/internal/cmd/status/testdata/statuslist-subdirectory.display.ansi.golden @@ -1,8 +1,8 @@ -# On branch: feature | -13 | [*] => $e* -# -➤ Changes to be committed -# -#  renamed:  [1] ../ds9 -> ../snw -#  renamed:  [2] SporeDriveSchematics.md -> CONFIDENTIAL.md -#  deleted:  [3] ../../docs/wolf 359 was an inside job.txt -# +# On branch: feature | -13 | [*] => $e* +# +➤ Changes to be committed +# +#  renamed: [1] ../ds9 -> ../snw +#  renamed: [2] SporeDriveSchematics.md -> CONFIDENTIAL.md +#  deleted: [3] ../../docs/wolf 359 was an inside job.txt +# diff --git a/internal/cmd/status/testdata/statuslist-subdirectory.display.plain.golden b/internal/cmd/status/testdata/statuslist-subdirectory.display.plain.golden new file mode 100644 index 0000000..59df9b2 --- /dev/null +++ b/internal/cmd/status/testdata/statuslist-subdirectory.display.plain.golden @@ -0,0 +1,8 @@ +# On branch: feature | -13 | [*] => $e* +# +➤ Changes to be committed +# +# renamed: [1] ../ds9 -> ../snw +# renamed: [2] SporeDriveSchematics.md -> CONFIDENTIAL.md +# deleted: [3] ../../docs/wolf 359 was an inside job.txt +# diff --git a/internal/cmd/status/testdata/statuslist-truncated.display.ansi.golden b/internal/cmd/status/testdata/statuslist-truncated.display.ansi.golden index db7359a..4f8eecf 100644 --- a/internal/cmd/status/testdata/statuslist-truncated.display.ansi.golden +++ b/internal/cmd/status/testdata/statuslist-truncated.display.ansi.golden @@ -1,256 +1,256 @@ -# On branch: main | [*] => $e* -# -➤ Untracked files -# -#  untracked:  [1] file_001.txt -#  untracked:  [2] file_002.txt -#  untracked:  [3] file_003.txt -#  untracked:  [4] file_004.txt -#  untracked:  [5] file_005.txt -#  untracked:  [6] file_006.txt -#  untracked:  [7] file_007.txt -#  untracked:  [8] file_008.txt -#  untracked:  [9] file_009.txt -#  untracked: [10] file_010.txt -#  untracked: [11] file_011.txt -#  untracked: [12] file_012.txt -#  untracked: [13] file_013.txt -#  untracked: [14] file_014.txt -#  untracked: [15] file_015.txt -#  untracked: [16] file_016.txt -#  untracked: [17] file_017.txt -#  untracked: [18] file_018.txt -#  untracked: [19] file_019.txt -#  untracked: [20] file_020.txt -#  untracked: [21] file_021.txt -#  untracked: [22] file_022.txt -#  untracked: [23] file_023.txt -#  untracked: [24] file_024.txt -#  untracked: [25] file_025.txt -#  untracked: [26] file_026.txt -#  untracked: [27] file_027.txt -#  untracked: [28] file_028.txt -#  untracked: [29] file_029.txt -#  untracked: [30] file_030.txt -#  untracked: [31] file_031.txt -#  untracked: [32] file_032.txt -#  untracked: [33] file_033.txt -#  untracked: [34] file_034.txt -#  untracked: [35] file_035.txt -#  untracked: [36] file_036.txt -#  untracked: [37] file_037.txt -#  untracked: [38] file_038.txt -#  untracked: [39] file_039.txt -#  untracked: [40] file_040.txt -#  untracked: [41] file_041.txt -#  untracked: [42] file_042.txt -#  untracked: [43] file_043.txt -#  untracked: [44] file_044.txt -#  untracked: [45] file_045.txt -#  untracked: [46] file_046.txt -#  untracked: [47] file_047.txt -#  untracked: [48] file_048.txt -#  untracked: [49] file_049.txt -#  untracked: [50] file_050.txt -#  untracked: [51] file_051.txt -#  untracked: [52] file_052.txt -#  untracked: [53] file_053.txt -#  untracked: [54] file_054.txt -#  untracked: [55] file_055.txt -#  untracked: [56] file_056.txt -#  untracked: [57] file_057.txt -#  untracked: [58] file_058.txt -#  untracked: [59] file_059.txt -#  untracked: [60] file_060.txt -#  untracked: [61] file_061.txt -#  untracked: [62] file_062.txt -#  untracked: [63] file_063.txt -#  untracked: [64] file_064.txt -#  untracked: [65] file_065.txt -#  untracked: [66] file_066.txt -#  untracked: [67] file_067.txt -#  untracked: [68] file_068.txt -#  untracked: [69] file_069.txt -#  untracked: [70] file_070.txt -#  untracked: [71] file_071.txt -#  untracked: [72] file_072.txt -#  untracked: [73] file_073.txt -#  untracked: [74] file_074.txt -#  untracked: [75] file_075.txt -#  untracked: [76] file_076.txt -#  untracked: [77] file_077.txt -#  untracked: [78] file_078.txt -#  untracked: [79] file_079.txt -#  untracked: [80] file_080.txt -#  untracked: [81] file_081.txt -#  untracked: [82] file_082.txt -#  untracked: [83] file_083.txt -#  untracked: [84] file_084.txt -#  untracked: [85] file_085.txt -#  untracked: [86] file_086.txt -#  untracked: [87] file_087.txt -#  untracked: [88] file_088.txt -#  untracked: [89] file_089.txt -#  untracked: [90] file_090.txt -#  untracked: [91] file_091.txt -#  untracked: [92] file_092.txt -#  untracked: [93] file_093.txt -#  untracked: [94] file_094.txt -#  untracked: [95] file_095.txt -#  untracked: [96] file_096.txt -#  untracked: [97] file_097.txt -#  untracked: [98] file_098.txt -#  untracked: [99] file_099.txt -#  untracked: [100] file_100.txt -#  untracked: [101] file_101.txt -#  untracked: [102] file_102.txt -#  untracked: [103] file_103.txt -#  untracked: [104] file_104.txt -#  untracked: [105] file_105.txt -#  untracked: [106] file_106.txt -#  untracked: [107] file_107.txt -#  untracked: [108] file_108.txt -#  untracked: [109] file_109.txt -#  untracked: [110] file_110.txt -#  untracked: [111] file_111.txt -#  untracked: [112] file_112.txt -#  untracked: [113] file_113.txt -#  untracked: [114] file_114.txt -#  untracked: [115] file_115.txt -#  untracked: [116] file_116.txt -#  untracked: [117] file_117.txt -#  untracked: [118] file_118.txt -#  untracked: [119] file_119.txt -#  untracked: [120] file_120.txt -#  untracked: [121] file_121.txt -#  untracked: [122] file_122.txt -#  untracked: [123] file_123.txt -#  untracked: [124] file_124.txt -#  untracked: [125] file_125.txt -#  untracked: [126] file_126.txt -#  untracked: [127] file_127.txt -#  untracked: [128] file_128.txt -#  untracked: [129] file_129.txt -#  untracked: [130] file_130.txt -#  untracked: [131] file_131.txt -#  untracked: [132] file_132.txt -#  untracked: [133] file_133.txt -#  untracked: [134] file_134.txt -#  untracked: [135] file_135.txt -#  untracked: [136] file_136.txt -#  untracked: [137] file_137.txt -#  untracked: [138] file_138.txt -#  untracked: [139] file_139.txt -#  untracked: [140] file_140.txt -#  untracked: [141] file_141.txt -#  untracked: [142] file_142.txt -#  untracked: [143] file_143.txt -#  untracked: [144] file_144.txt -#  untracked: [145] file_145.txt -#  untracked: [146] file_146.txt -#  untracked: [147] file_147.txt -#  untracked: [148] file_148.txt -#  untracked: [149] file_149.txt -#  untracked: [150] file_150.txt -#  untracked: [151] file_151.txt -#  untracked: [152] file_152.txt -#  untracked: [153] file_153.txt -#  untracked: [154] file_154.txt -#  untracked: [155] file_155.txt -#  untracked: [156] file_156.txt -#  untracked: [157] file_157.txt -#  untracked: [158] file_158.txt -#  untracked: [159] file_159.txt -#  untracked: [160] file_160.txt -#  untracked: [161] file_161.txt -#  untracked: [162] file_162.txt -#  untracked: [163] file_163.txt -#  untracked: [164] file_164.txt -#  untracked: [165] file_165.txt -#  untracked: [166] file_166.txt -#  untracked: [167] file_167.txt -#  untracked: [168] file_168.txt -#  untracked: [169] file_169.txt -#  untracked: [170] file_170.txt -#  untracked: [171] file_171.txt -#  untracked: [172] file_172.txt -#  untracked: [173] file_173.txt -#  untracked: [174] file_174.txt -#  untracked: [175] file_175.txt -#  untracked: [176] file_176.txt -#  untracked: [177] file_177.txt -#  untracked: [178] file_178.txt -#  untracked: [179] file_179.txt -#  untracked: [180] file_180.txt -#  untracked: [181] file_181.txt -#  untracked: [182] file_182.txt -#  untracked: [183] file_183.txt -#  untracked: [184] file_184.txt -#  untracked: [185] file_185.txt -#  untracked: [186] file_186.txt -#  untracked: [187] file_187.txt -#  untracked: [188] file_188.txt -#  untracked: [189] file_189.txt -#  untracked: [190] file_190.txt -#  untracked: [191] file_191.txt -#  untracked: [192] file_192.txt -#  untracked: [193] file_193.txt -#  untracked: [194] file_194.txt -#  untracked: [195] file_195.txt -#  untracked: [196] file_196.txt -#  untracked: [197] file_197.txt -#  untracked: [198] file_198.txt -#  untracked: [199] file_199.txt -#  untracked: [200] file_200.txt -#  untracked: [201] file_201.txt -#  untracked: [202] file_202.txt -#  untracked: [203] file_203.txt -#  untracked: [204] file_204.txt -#  untracked: [205] file_205.txt -#  untracked: [206] file_206.txt -#  untracked: [207] file_207.txt -#  untracked: [208] file_208.txt -#  untracked: [209] file_209.txt -#  untracked: [210] file_210.txt -#  untracked: [211] file_211.txt -#  untracked: [212] file_212.txt -#  untracked: [213] file_213.txt -#  untracked: [214] file_214.txt -#  untracked: [215] file_215.txt -#  untracked: [216] file_216.txt -#  untracked: [217] file_217.txt -#  untracked: [218] file_218.txt -#  untracked: [219] file_219.txt -#  untracked: [220] file_220.txt -#  untracked: [221] file_221.txt -#  untracked: [222] file_222.txt -#  untracked: [223] file_223.txt -#  untracked: [224] file_224.txt -#  untracked: [225] file_225.txt -#  untracked: [226] file_226.txt -#  untracked: [227] file_227.txt -#  untracked: [228] file_228.txt -#  untracked: [229] file_229.txt -#  untracked: [230] file_230.txt -#  untracked: [231] file_231.txt -#  untracked: [232] file_232.txt -#  untracked: [233] file_233.txt -#  untracked: [234] file_234.txt -#  untracked: [235] file_235.txt -#  untracked: [236] file_236.txt -#  untracked: [237] file_237.txt -#  untracked: [238] file_238.txt -#  untracked: [239] file_239.txt -#  untracked: [240] file_240.txt -#  untracked: [241] file_241.txt -#  untracked: [242] file_242.txt -#  untracked: [243] file_243.txt -#  untracked: [244] file_244.txt -#  untracked: [245] file_245.txt -#  untracked: [246] file_246.txt -#  untracked: [247] file_247.txt -#  untracked: [248] file_248.txt -#  untracked: [249] file_249.txt -#  untracked: [250] file_250.txt -# +# On branch: main | [*] => $e* +# +➤ Untracked files +# +#  untracked: [1] file_001.txt +#  untracked: [2] file_002.txt +#  untracked: [3] file_003.txt +#  untracked: [4] file_004.txt +#  untracked: [5] file_005.txt +#  untracked: [6] file_006.txt +#  untracked: [7] file_007.txt +#  untracked: [8] file_008.txt +#  untracked: [9] file_009.txt +#  untracked: [10] file_010.txt +#  untracked: [11] file_011.txt +#  untracked: [12] file_012.txt +#  untracked: [13] file_013.txt +#  untracked: [14] file_014.txt +#  untracked: [15] file_015.txt +#  untracked: [16] file_016.txt +#  untracked: [17] file_017.txt +#  untracked: [18] file_018.txt +#  untracked: [19] file_019.txt +#  untracked: [20] file_020.txt +#  untracked: [21] file_021.txt +#  untracked: [22] file_022.txt +#  untracked: [23] file_023.txt +#  untracked: [24] file_024.txt +#  untracked: [25] file_025.txt +#  untracked: [26] file_026.txt +#  untracked: [27] file_027.txt +#  untracked: [28] file_028.txt +#  untracked: [29] file_029.txt +#  untracked: [30] file_030.txt +#  untracked: [31] file_031.txt +#  untracked: [32] file_032.txt +#  untracked: [33] file_033.txt +#  untracked: [34] file_034.txt +#  untracked: [35] file_035.txt +#  untracked: [36] file_036.txt +#  untracked: [37] file_037.txt +#  untracked: [38] file_038.txt +#  untracked: [39] file_039.txt +#  untracked: [40] file_040.txt +#  untracked: [41] file_041.txt +#  untracked: [42] file_042.txt +#  untracked: [43] file_043.txt +#  untracked: [44] file_044.txt +#  untracked: [45] file_045.txt +#  untracked: [46] file_046.txt +#  untracked: [47] file_047.txt +#  untracked: [48] file_048.txt +#  untracked: [49] file_049.txt +#  untracked: [50] file_050.txt +#  untracked: [51] file_051.txt +#  untracked: [52] file_052.txt +#  untracked: [53] file_053.txt +#  untracked: [54] file_054.txt +#  untracked: [55] file_055.txt +#  untracked: [56] file_056.txt +#  untracked: [57] file_057.txt +#  untracked: [58] file_058.txt +#  untracked: [59] file_059.txt +#  untracked: [60] file_060.txt +#  untracked: [61] file_061.txt +#  untracked: [62] file_062.txt +#  untracked: [63] file_063.txt +#  untracked: [64] file_064.txt +#  untracked: [65] file_065.txt +#  untracked: [66] file_066.txt +#  untracked: [67] file_067.txt +#  untracked: [68] file_068.txt +#  untracked: [69] file_069.txt +#  untracked: [70] file_070.txt +#  untracked: [71] file_071.txt +#  untracked: [72] file_072.txt +#  untracked: [73] file_073.txt +#  untracked: [74] file_074.txt +#  untracked: [75] file_075.txt +#  untracked: [76] file_076.txt +#  untracked: [77] file_077.txt +#  untracked: [78] file_078.txt +#  untracked: [79] file_079.txt +#  untracked: [80] file_080.txt +#  untracked: [81] file_081.txt +#  untracked: [82] file_082.txt +#  untracked: [83] file_083.txt +#  untracked: [84] file_084.txt +#  untracked: [85] file_085.txt +#  untracked: [86] file_086.txt +#  untracked: [87] file_087.txt +#  untracked: [88] file_088.txt +#  untracked: [89] file_089.txt +#  untracked: [90] file_090.txt +#  untracked: [91] file_091.txt +#  untracked: [92] file_092.txt +#  untracked: [93] file_093.txt +#  untracked: [94] file_094.txt +#  untracked: [95] file_095.txt +#  untracked: [96] file_096.txt +#  untracked: [97] file_097.txt +#  untracked: [98] file_098.txt +#  untracked: [99] file_099.txt +#  untracked: [100] file_100.txt +#  untracked: [101] file_101.txt +#  untracked: [102] file_102.txt +#  untracked: [103] file_103.txt +#  untracked: [104] file_104.txt +#  untracked: [105] file_105.txt +#  untracked: [106] file_106.txt +#  untracked: [107] file_107.txt +#  untracked: [108] file_108.txt +#  untracked: [109] file_109.txt +#  untracked: [110] file_110.txt +#  untracked: [111] file_111.txt +#  untracked: [112] file_112.txt +#  untracked: [113] file_113.txt +#  untracked: [114] file_114.txt +#  untracked: [115] file_115.txt +#  untracked: [116] file_116.txt +#  untracked: [117] file_117.txt +#  untracked: [118] file_118.txt +#  untracked: [119] file_119.txt +#  untracked: [120] file_120.txt +#  untracked: [121] file_121.txt +#  untracked: [122] file_122.txt +#  untracked: [123] file_123.txt +#  untracked: [124] file_124.txt +#  untracked: [125] file_125.txt +#  untracked: [126] file_126.txt +#  untracked: [127] file_127.txt +#  untracked: [128] file_128.txt +#  untracked: [129] file_129.txt +#  untracked: [130] file_130.txt +#  untracked: [131] file_131.txt +#  untracked: [132] file_132.txt +#  untracked: [133] file_133.txt +#  untracked: [134] file_134.txt +#  untracked: [135] file_135.txt +#  untracked: [136] file_136.txt +#  untracked: [137] file_137.txt +#  untracked: [138] file_138.txt +#  untracked: [139] file_139.txt +#  untracked: [140] file_140.txt +#  untracked: [141] file_141.txt +#  untracked: [142] file_142.txt +#  untracked: [143] file_143.txt +#  untracked: [144] file_144.txt +#  untracked: [145] file_145.txt +#  untracked: [146] file_146.txt +#  untracked: [147] file_147.txt +#  untracked: [148] file_148.txt +#  untracked: [149] file_149.txt +#  untracked: [150] file_150.txt +#  untracked: [151] file_151.txt +#  untracked: [152] file_152.txt +#  untracked: [153] file_153.txt +#  untracked: [154] file_154.txt +#  untracked: [155] file_155.txt +#  untracked: [156] file_156.txt +#  untracked: [157] file_157.txt +#  untracked: [158] file_158.txt +#  untracked: [159] file_159.txt +#  untracked: [160] file_160.txt +#  untracked: [161] file_161.txt +#  untracked: [162] file_162.txt +#  untracked: [163] file_163.txt +#  untracked: [164] file_164.txt +#  untracked: [165] file_165.txt +#  untracked: [166] file_166.txt +#  untracked: [167] file_167.txt +#  untracked: [168] file_168.txt +#  untracked: [169] file_169.txt +#  untracked: [170] file_170.txt +#  untracked: [171] file_171.txt +#  untracked: [172] file_172.txt +#  untracked: [173] file_173.txt +#  untracked: [174] file_174.txt +#  untracked: [175] file_175.txt +#  untracked: [176] file_176.txt +#  untracked: [177] file_177.txt +#  untracked: [178] file_178.txt +#  untracked: [179] file_179.txt +#  untracked: [180] file_180.txt +#  untracked: [181] file_181.txt +#  untracked: [182] file_182.txt +#  untracked: [183] file_183.txt +#  untracked: [184] file_184.txt +#  untracked: [185] file_185.txt +#  untracked: [186] file_186.txt +#  untracked: [187] file_187.txt +#  untracked: [188] file_188.txt +#  untracked: [189] file_189.txt +#  untracked: [190] file_190.txt +#  untracked: [191] file_191.txt +#  untracked: [192] file_192.txt +#  untracked: [193] file_193.txt +#  untracked: [194] file_194.txt +#  untracked: [195] file_195.txt +#  untracked: [196] file_196.txt +#  untracked: [197] file_197.txt +#  untracked: [198] file_198.txt +#  untracked: [199] file_199.txt +#  untracked: [200] file_200.txt +#  untracked: [201] file_201.txt +#  untracked: [202] file_202.txt +#  untracked: [203] file_203.txt +#  untracked: [204] file_204.txt +#  untracked: [205] file_205.txt +#  untracked: [206] file_206.txt +#  untracked: [207] file_207.txt +#  untracked: [208] file_208.txt +#  untracked: [209] file_209.txt +#  untracked: [210] file_210.txt +#  untracked: [211] file_211.txt +#  untracked: [212] file_212.txt +#  untracked: [213] file_213.txt +#  untracked: [214] file_214.txt +#  untracked: [215] file_215.txt +#  untracked: [216] file_216.txt +#  untracked: [217] file_217.txt +#  untracked: [218] file_218.txt +#  untracked: [219] file_219.txt +#  untracked: [220] file_220.txt +#  untracked: [221] file_221.txt +#  untracked: [222] file_222.txt +#  untracked: [223] file_223.txt +#  untracked: [224] file_224.txt +#  untracked: [225] file_225.txt +#  untracked: [226] file_226.txt +#  untracked: [227] file_227.txt +#  untracked: [228] file_228.txt +#  untracked: [229] file_229.txt +#  untracked: [230] file_230.txt +#  untracked: [231] file_231.txt +#  untracked: [232] file_232.txt +#  untracked: [233] file_233.txt +#  untracked: [234] file_234.txt +#  untracked: [235] file_235.txt +#  untracked: [236] file_236.txt +#  untracked: [237] file_237.txt +#  untracked: [238] file_238.txt +#  untracked: [239] file_239.txt +#  untracked: [240] file_240.txt +#  untracked: [241] file_241.txt +#  untracked: [242] file_242.txt +#  untracked: [243] file_243.txt +#  untracked: [244] file_244.txt +#  untracked: [245] file_245.txt +#  untracked: [246] file_246.txt +#  untracked: [247] file_247.txt +#  untracked: [248] file_248.txt +#  untracked: [249] file_249.txt +#  untracked: [250] file_250.txt +# ... showing 250 of 260 files (use git directly for bulk operations) diff --git a/internal/cmd/status/testdata/statuslist-truncated.display.plain.golden b/internal/cmd/status/testdata/statuslist-truncated.display.plain.golden new file mode 100644 index 0000000..e8a26f3 --- /dev/null +++ b/internal/cmd/status/testdata/statuslist-truncated.display.plain.golden @@ -0,0 +1,256 @@ +# On branch: main | [*] => $e* +# +➤ Untracked files +# +# untracked: [1] file_001.txt +# untracked: [2] file_002.txt +# untracked: [3] file_003.txt +# untracked: [4] file_004.txt +# untracked: [5] file_005.txt +# untracked: [6] file_006.txt +# untracked: [7] file_007.txt +# untracked: [8] file_008.txt +# untracked: [9] file_009.txt +# untracked: [10] file_010.txt +# untracked: [11] file_011.txt +# untracked: [12] file_012.txt +# untracked: [13] file_013.txt +# untracked: [14] file_014.txt +# untracked: [15] file_015.txt +# untracked: [16] file_016.txt +# untracked: [17] file_017.txt +# untracked: [18] file_018.txt +# untracked: [19] file_019.txt +# untracked: [20] file_020.txt +# untracked: [21] file_021.txt +# untracked: [22] file_022.txt +# untracked: [23] file_023.txt +# untracked: [24] file_024.txt +# untracked: [25] file_025.txt +# untracked: [26] file_026.txt +# untracked: [27] file_027.txt +# untracked: [28] file_028.txt +# untracked: [29] file_029.txt +# untracked: [30] file_030.txt +# untracked: [31] file_031.txt +# untracked: [32] file_032.txt +# untracked: [33] file_033.txt +# untracked: [34] file_034.txt +# untracked: [35] file_035.txt +# untracked: [36] file_036.txt +# untracked: [37] file_037.txt +# untracked: [38] file_038.txt +# untracked: [39] file_039.txt +# untracked: [40] file_040.txt +# untracked: [41] file_041.txt +# untracked: [42] file_042.txt +# untracked: [43] file_043.txt +# untracked: [44] file_044.txt +# untracked: [45] file_045.txt +# untracked: [46] file_046.txt +# untracked: [47] file_047.txt +# untracked: [48] file_048.txt +# untracked: [49] file_049.txt +# untracked: [50] file_050.txt +# untracked: [51] file_051.txt +# untracked: [52] file_052.txt +# untracked: [53] file_053.txt +# untracked: [54] file_054.txt +# untracked: [55] file_055.txt +# untracked: [56] file_056.txt +# untracked: [57] file_057.txt +# untracked: [58] file_058.txt +# untracked: [59] file_059.txt +# untracked: [60] file_060.txt +# untracked: [61] file_061.txt +# untracked: [62] file_062.txt +# untracked: [63] file_063.txt +# untracked: [64] file_064.txt +# untracked: [65] file_065.txt +# untracked: [66] file_066.txt +# untracked: [67] file_067.txt +# untracked: [68] file_068.txt +# untracked: [69] file_069.txt +# untracked: [70] file_070.txt +# untracked: [71] file_071.txt +# untracked: [72] file_072.txt +# untracked: [73] file_073.txt +# untracked: [74] file_074.txt +# untracked: [75] file_075.txt +# untracked: [76] file_076.txt +# untracked: [77] file_077.txt +# untracked: [78] file_078.txt +# untracked: [79] file_079.txt +# untracked: [80] file_080.txt +# untracked: [81] file_081.txt +# untracked: [82] file_082.txt +# untracked: [83] file_083.txt +# untracked: [84] file_084.txt +# untracked: [85] file_085.txt +# untracked: [86] file_086.txt +# untracked: [87] file_087.txt +# untracked: [88] file_088.txt +# untracked: [89] file_089.txt +# untracked: [90] file_090.txt +# untracked: [91] file_091.txt +# untracked: [92] file_092.txt +# untracked: [93] file_093.txt +# untracked: [94] file_094.txt +# untracked: [95] file_095.txt +# untracked: [96] file_096.txt +# untracked: [97] file_097.txt +# untracked: [98] file_098.txt +# untracked: [99] file_099.txt +# untracked: [100] file_100.txt +# untracked: [101] file_101.txt +# untracked: [102] file_102.txt +# untracked: [103] file_103.txt +# untracked: [104] file_104.txt +# untracked: [105] file_105.txt +# untracked: [106] file_106.txt +# untracked: [107] file_107.txt +# untracked: [108] file_108.txt +# untracked: [109] file_109.txt +# untracked: [110] file_110.txt +# untracked: [111] file_111.txt +# untracked: [112] file_112.txt +# untracked: [113] file_113.txt +# untracked: [114] file_114.txt +# untracked: [115] file_115.txt +# untracked: [116] file_116.txt +# untracked: [117] file_117.txt +# untracked: [118] file_118.txt +# untracked: [119] file_119.txt +# untracked: [120] file_120.txt +# untracked: [121] file_121.txt +# untracked: [122] file_122.txt +# untracked: [123] file_123.txt +# untracked: [124] file_124.txt +# untracked: [125] file_125.txt +# untracked: [126] file_126.txt +# untracked: [127] file_127.txt +# untracked: [128] file_128.txt +# untracked: [129] file_129.txt +# untracked: [130] file_130.txt +# untracked: [131] file_131.txt +# untracked: [132] file_132.txt +# untracked: [133] file_133.txt +# untracked: [134] file_134.txt +# untracked: [135] file_135.txt +# untracked: [136] file_136.txt +# untracked: [137] file_137.txt +# untracked: [138] file_138.txt +# untracked: [139] file_139.txt +# untracked: [140] file_140.txt +# untracked: [141] file_141.txt +# untracked: [142] file_142.txt +# untracked: [143] file_143.txt +# untracked: [144] file_144.txt +# untracked: [145] file_145.txt +# untracked: [146] file_146.txt +# untracked: [147] file_147.txt +# untracked: [148] file_148.txt +# untracked: [149] file_149.txt +# untracked: [150] file_150.txt +# untracked: [151] file_151.txt +# untracked: [152] file_152.txt +# untracked: [153] file_153.txt +# untracked: [154] file_154.txt +# untracked: [155] file_155.txt +# untracked: [156] file_156.txt +# untracked: [157] file_157.txt +# untracked: [158] file_158.txt +# untracked: [159] file_159.txt +# untracked: [160] file_160.txt +# untracked: [161] file_161.txt +# untracked: [162] file_162.txt +# untracked: [163] file_163.txt +# untracked: [164] file_164.txt +# untracked: [165] file_165.txt +# untracked: [166] file_166.txt +# untracked: [167] file_167.txt +# untracked: [168] file_168.txt +# untracked: [169] file_169.txt +# untracked: [170] file_170.txt +# untracked: [171] file_171.txt +# untracked: [172] file_172.txt +# untracked: [173] file_173.txt +# untracked: [174] file_174.txt +# untracked: [175] file_175.txt +# untracked: [176] file_176.txt +# untracked: [177] file_177.txt +# untracked: [178] file_178.txt +# untracked: [179] file_179.txt +# untracked: [180] file_180.txt +# untracked: [181] file_181.txt +# untracked: [182] file_182.txt +# untracked: [183] file_183.txt +# untracked: [184] file_184.txt +# untracked: [185] file_185.txt +# untracked: [186] file_186.txt +# untracked: [187] file_187.txt +# untracked: [188] file_188.txt +# untracked: [189] file_189.txt +# untracked: [190] file_190.txt +# untracked: [191] file_191.txt +# untracked: [192] file_192.txt +# untracked: [193] file_193.txt +# untracked: [194] file_194.txt +# untracked: [195] file_195.txt +# untracked: [196] file_196.txt +# untracked: [197] file_197.txt +# untracked: [198] file_198.txt +# untracked: [199] file_199.txt +# untracked: [200] file_200.txt +# untracked: [201] file_201.txt +# untracked: [202] file_202.txt +# untracked: [203] file_203.txt +# untracked: [204] file_204.txt +# untracked: [205] file_205.txt +# untracked: [206] file_206.txt +# untracked: [207] file_207.txt +# untracked: [208] file_208.txt +# untracked: [209] file_209.txt +# untracked: [210] file_210.txt +# untracked: [211] file_211.txt +# untracked: [212] file_212.txt +# untracked: [213] file_213.txt +# untracked: [214] file_214.txt +# untracked: [215] file_215.txt +# untracked: [216] file_216.txt +# untracked: [217] file_217.txt +# untracked: [218] file_218.txt +# untracked: [219] file_219.txt +# untracked: [220] file_220.txt +# untracked: [221] file_221.txt +# untracked: [222] file_222.txt +# untracked: [223] file_223.txt +# untracked: [224] file_224.txt +# untracked: [225] file_225.txt +# untracked: [226] file_226.txt +# untracked: [227] file_227.txt +# untracked: [228] file_228.txt +# untracked: [229] file_229.txt +# untracked: [230] file_230.txt +# untracked: [231] file_231.txt +# untracked: [232] file_232.txt +# untracked: [233] file_233.txt +# untracked: [234] file_234.txt +# untracked: [235] file_235.txt +# untracked: [236] file_236.txt +# untracked: [237] file_237.txt +# untracked: [238] file_238.txt +# untracked: [239] file_239.txt +# untracked: [240] file_240.txt +# untracked: [241] file_241.txt +# untracked: [242] file_242.txt +# untracked: [243] file_243.txt +# untracked: [244] file_244.txt +# untracked: [245] file_245.txt +# untracked: [246] file_246.txt +# untracked: [247] file_247.txt +# untracked: [248] file_248.txt +# untracked: [249] file_249.txt +# untracked: [250] file_250.txt +# +... showing 250 of 260 files (use git directly for bulk operations) diff --git a/internal/cmd/status/testdata/statuslist-type_changes.display.ansi.golden b/internal/cmd/status/testdata/statuslist-type_changes.display.ansi.golden index dcd7f9f..4533153 100644 --- a/internal/cmd/status/testdata/statuslist-type_changes.display.ansi.golden +++ b/internal/cmd/status/testdata/statuslist-type_changes.display.ansi.golden @@ -1,10 +1,10 @@ -# On branch: type-change | +1 | [*] => $e* -# -➤ Changes to be committed -# -# typechange:  [1] staged_typechange.txt -# -➤ Changes not staged for commit -# -# typechange:  [2] unstaged_typechange.txt -# +# On branch: type-change | +1 | [*] => $e* +# +➤ Changes to be committed +# +# typechange: [1] staged_typechange.txt +# +➤ Changes not staged for commit +# +# typechange: [2] unstaged_typechange.txt +# diff --git a/internal/cmd/status/testdata/statuslist-type_changes.display.plain.golden b/internal/cmd/status/testdata/statuslist-type_changes.display.plain.golden new file mode 100644 index 0000000..2005636 --- /dev/null +++ b/internal/cmd/status/testdata/statuslist-type_changes.display.plain.golden @@ -0,0 +1,10 @@ +# On branch: type-change | +1 | [*] => $e* +# +➤ Changes to be committed +# +# typechange: [1] staged_typechange.txt +# +➤ Changes not staged for commit +# +# typechange: [2] unstaged_typechange.txt +# diff --git a/internal/cmd/status/testdata/statuslist-unmerged_conflicts.display.ansi.golden b/internal/cmd/status/testdata/statuslist-unmerged_conflicts.display.ansi.golden index 2738b96..da6daad 100644 --- a/internal/cmd/status/testdata/statuslist-unmerged_conflicts.display.ansi.golden +++ b/internal/cmd/status/testdata/statuslist-unmerged_conflicts.display.ansi.golden @@ -1,12 +1,12 @@ -# On branch: merge-conflict | [*] => $e* -# -➤ Unmerged paths -# -#  both deleted:  [1] deleted_by_both.txt -#  added by us:  [2] added_by_us.txt -# deleted by them:  [3] deleted_by_them.txt -#  added by them:  [4] added_by_them.txt -#  deleted by us:  [5] deleted_by_us.txt -#  both added:  [6] added_by_both.txt -#  both modified:  [7] modified_by_both.txt -# +# On branch: merge-conflict | [*] => $e* +# +➤ Unmerged paths +# +#  both deleted: [1] deleted_by_both.txt +#  added by us: [2] added_by_us.txt +# deleted by them: [3] deleted_by_them.txt +#  added by them: [4] added_by_them.txt +#  deleted by us: [5] deleted_by_us.txt +#  both added: [6] added_by_both.txt +#  both modified: [7] modified_by_both.txt +# diff --git a/internal/cmd/status/testdata/statuslist-unmerged_conflicts.display.plain.golden b/internal/cmd/status/testdata/statuslist-unmerged_conflicts.display.plain.golden new file mode 100644 index 0000000..efea677 --- /dev/null +++ b/internal/cmd/status/testdata/statuslist-unmerged_conflicts.display.plain.golden @@ -0,0 +1,12 @@ +# On branch: merge-conflict | [*] => $e* +# +➤ Unmerged paths +# +# both deleted: [1] deleted_by_both.txt +# added by us: [2] added_by_us.txt +# deleted by them: [3] deleted_by_them.txt +# added by them: [4] added_by_them.txt +# deleted by us: [5] deleted_by_us.txt +# both added: [6] added_by_both.txt +# both modified: [7] modified_by_both.txt +# diff --git a/internal/cmd/status/testdata/statuslist-unstaged_rename_copy.display.ansi.golden b/internal/cmd/status/testdata/statuslist-unstaged_rename_copy.display.ansi.golden index 7501570..b8be699 100644 --- a/internal/cmd/status/testdata/statuslist-unstaged_rename_copy.display.ansi.golden +++ b/internal/cmd/status/testdata/statuslist-unstaged_rename_copy.display.ansi.golden @@ -1,12 +1,12 @@ -# On branch: main | [*] => $e* -# -➤ Changes to be committed -# -#  modified:  [1] also_renamed.txt -# -➤ Changes not staged for commit -# -#  renamed:  [2] old_name.txt -> new_name.txt -#  copied:  [3] original.txt -> copy.txt -#  renamed:  [4] was_this.txt -> also_renamed.txt -# +# On branch: main | [*] => $e* +# +➤ Changes to be committed +# +#  modified: [1] also_renamed.txt +# +➤ Changes not staged for commit +# +#  renamed: [2] old_name.txt -> new_name.txt +#  copied: [3] original.txt -> copy.txt +#  renamed: [4] was_this.txt -> also_renamed.txt +# diff --git a/internal/cmd/status/testdata/statuslist-unstaged_rename_copy.display.plain.golden b/internal/cmd/status/testdata/statuslist-unstaged_rename_copy.display.plain.golden new file mode 100644 index 0000000..3914eb7 --- /dev/null +++ b/internal/cmd/status/testdata/statuslist-unstaged_rename_copy.display.plain.golden @@ -0,0 +1,12 @@ +# On branch: main | [*] => $e* +# +➤ Changes to be committed +# +# modified: [1] also_renamed.txt +# +➤ Changes not staged for commit +# +# renamed: [2] old_name.txt -> new_name.txt +# copied: [3] original.txt -> copy.txt +# renamed: [4] was_this.txt -> also_renamed.txt +# diff --git a/internal/cmd/status/testdata/statuslist-with_branch_ahead.display.ansi.golden b/internal/cmd/status/testdata/statuslist-with_branch_ahead.display.ansi.golden index f50fd6e..a1b078c 100644 --- a/internal/cmd/status/testdata/statuslist-with_branch_ahead.display.ansi.golden +++ b/internal/cmd/status/testdata/statuslist-with_branch_ahead.display.ansi.golden @@ -1 +1 @@ -# On branch: feature | +3 | No changes (working directory clean) +# On branch: feature | +3 | No changes (working directory clean) diff --git a/internal/cmd/status/testdata/statuslist-with_branch_ahead.display.plain.golden b/internal/cmd/status/testdata/statuslist-with_branch_ahead.display.plain.golden new file mode 100644 index 0000000..78e8de2 --- /dev/null +++ b/internal/cmd/status/testdata/statuslist-with_branch_ahead.display.plain.golden @@ -0,0 +1 @@ +# On branch: feature | +3 | No changes (working directory clean) diff --git a/internal/cmd/status/testdata/statuslist-with_staged_files.display.ansi.golden b/internal/cmd/status/testdata/statuslist-with_staged_files.display.ansi.golden index e291032..3c2e8f6 100644 --- a/internal/cmd/status/testdata/statuslist-with_staged_files.display.ansi.golden +++ b/internal/cmd/status/testdata/statuslist-with_staged_files.display.ansi.golden @@ -1,8 +1,8 @@ -# On branch: main | [*] => $e* -# -➤ Changes to be committed -# -#  new file:  [1] new.go -#  new file:  [2] new_b.go -#  modified:  [3] changed.go -# +# On branch: main | [*] => $e* +# +➤ Changes to be committed +# +#  new file: [1] new.go +#  new file: [2] new_b.go +#  modified: [3] changed.go +# diff --git a/internal/cmd/status/testdata/statuslist-with_staged_files.display.plain.golden b/internal/cmd/status/testdata/statuslist-with_staged_files.display.plain.golden new file mode 100644 index 0000000..6899636 --- /dev/null +++ b/internal/cmd/status/testdata/statuslist-with_staged_files.display.plain.golden @@ -0,0 +1,8 @@ +# On branch: main | [*] => $e* +# +➤ Changes to be committed +# +# new file: [1] new.go +# new file: [2] new_b.go +# modified: [3] changed.go +# diff --git a/internal/cmd/testdata/script/command-shell-functions-status-nocolor.txtar b/internal/cmd/testdata/script/command-shell-functions-status-nocolor.txtar new file mode 100644 index 0000000..44ed568 --- /dev/null +++ b/internal/cmd/testdata/script/command-shell-functions-status-nocolor.txtar @@ -0,0 +1,40 @@ +# Scenario: color output is disabled when NO_COLOR is set or stderr is not a TTY +# Purpose: Verify the NO_COLOR convention and non-TTY detection work through +# the scmpuff_status shell wrapper. + +exec git init repo +cd repo +exec git add keep.txt +exec git commit -m base + +# When NO_COLOR is set, output should contain no ANSI escape sequences. +env NO_COLOR=1 +[exec:bash] exec bash -c 'eval "$(scmpuff init -s)"; scmpuff_status' +[exec:bash] ! stdout '\x1b\[' +[exec:bash] stdout 'No changes \(working directory clean\)' + +[exec:zsh] exec zsh -c 'eval "$(scmpuff init -s)"; scmpuff_status' +[exec:zsh] ! stdout '\x1b\[' +[exec:zsh] stdout 'No changes \(working directory clean\)' + +[exec:fish] exec fish -c 'scmpuff init --shell=fish | source; scmpuff_status' +[exec:fish] ! stdout '\x1b\[' +[exec:fish] stdout 'No changes \(working directory clean\)' + +# When stderr is not a TTY (as in this test environment) and NO_COLOR is unset, +# color should also be disabled. +env NO_COLOR= +[exec:bash] exec bash -c 'eval "$(scmpuff init -s)"; scmpuff_status' +[exec:bash] ! stdout '\x1b\[' +[exec:bash] stdout 'No changes \(working directory clean\)' + +[exec:zsh] exec zsh -c 'eval "$(scmpuff init -s)"; scmpuff_status' +[exec:zsh] ! stdout '\x1b\[' +[exec:zsh] stdout 'No changes \(working directory clean\)' + +[exec:fish] exec fish -c 'scmpuff init --shell=fish | source; scmpuff_status' +[exec:fish] ! stdout '\x1b\[' +[exec:fish] stdout 'No changes \(working directory clean\)' + +-- repo/keep.txt -- +keep