Add ability to hide specific flags by setting their symbols to empty string (#132)

* Initial plan

* Test commit for clean state

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
This commit is contained in:
Copilot 2025-07-31 12:15:18 +02:00 committed by GitHub
parent 3d6516be61
commit 70a31330cd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 187 additions and 7 deletions

View file

@ -306,11 +306,11 @@ func (f *Formater) formatFlag(style, symbol string, count int) string {
func (f *Formater) flags() string { func (f *Formater) flags() string {
var flags []string var flags []string
if f.st.IsClean { if f.st.IsClean {
if f.st.NumStashed != 0 { if f.st.NumStashed != 0 && f.Symbols.Stashed != "" {
flags = append(flags, f.formatFlag(f.Styles.Stashed, f.Symbols.Stashed, f.st.NumStashed)) flags = append(flags, f.formatFlag(f.Styles.Stashed, f.Symbols.Stashed, f.st.NumStashed))
} }
if !f.Options.HideClean { if !f.Options.HideClean && f.Symbols.Clean != "" {
flags = append(flags, fmt.Sprintf("%s%s", f.Styles.Clean, f.Symbols.Clean)) flags = append(flags, fmt.Sprintf("%s%s", f.Styles.Clean, f.Symbols.Clean))
} }
@ -319,23 +319,23 @@ func (f *Formater) flags() string {
} }
} }
if f.st.NumStaged != 0 { if f.st.NumStaged != 0 && f.Symbols.Staged != "" {
flags = append(flags, f.formatFlag(f.Styles.Staged, f.Symbols.Staged, f.st.NumStaged)) flags = append(flags, f.formatFlag(f.Styles.Staged, f.Symbols.Staged, f.st.NumStaged))
} }
if f.st.NumConflicts != 0 { if f.st.NumConflicts != 0 && f.Symbols.Conflict != "" {
flags = append(flags, f.formatFlag(f.Styles.Conflict, f.Symbols.Conflict, f.st.NumConflicts)) flags = append(flags, f.formatFlag(f.Styles.Conflict, f.Symbols.Conflict, f.st.NumConflicts))
} }
if f.st.NumModified != 0 { if f.st.NumModified != 0 && f.Symbols.Modified != "" {
flags = append(flags, f.formatFlag(f.Styles.Modified, f.Symbols.Modified, f.st.NumModified)) flags = append(flags, f.formatFlag(f.Styles.Modified, f.Symbols.Modified, f.st.NumModified))
} }
if f.st.NumStashed != 0 { if f.st.NumStashed != 0 && f.Symbols.Stashed != "" {
flags = append(flags, f.formatFlag(f.Styles.Stashed, f.Symbols.Stashed, f.st.NumStashed)) flags = append(flags, f.formatFlag(f.Styles.Stashed, f.Symbols.Stashed, f.st.NumStashed))
} }
if f.st.NumUntracked != 0 { if f.st.NumUntracked != 0 && f.Symbols.Untracked != "" {
flags = append(flags, f.formatFlag(f.Styles.Untracked, f.Symbols.Untracked, f.st.NumUntracked)) flags = append(flags, f.formatFlag(f.Styles.Untracked, f.Symbols.Untracked, f.st.NumUntracked))
} }

View file

@ -979,6 +979,186 @@ func Test_stats(t *testing.T) {
} }
} }
func TestFlagsWithEmptySymbols(t *testing.T) {
tests := []struct {
name string
styles styles
symbols symbols
st *gitstatus.Status
want string
}{
{
name: "empty stashed symbol hides stash count",
styles: styles{
Clear: "StyleClear",
Modified: "StyleMod",
Stashed: "StyleStash",
},
symbols: symbols{
Modified: "SymbolMod",
Stashed: "", // empty symbol should hide this flag
},
st: &gitstatus.Status{
NumStashed: 5,
Porcelain: gitstatus.Porcelain{
NumModified: 2,
},
},
want: "StyleClear" + "StyleModSymbolMod2",
},
{
name: "empty modified symbol hides modified count",
styles: styles{
Clear: "StyleClear",
Modified: "StyleMod",
Stashed: "StyleStash",
},
symbols: symbols{
Modified: "", // empty symbol should hide this flag
Stashed: "SymbolStash",
},
st: &gitstatus.Status{
NumStashed: 1,
Porcelain: gitstatus.Porcelain{
NumModified: 2,
},
},
want: "StyleClear" + "StyleStashSymbolStash1",
},
{
name: "empty staged symbol hides staged count",
styles: styles{
Clear: "StyleClear",
Staged: "StyleStaged",
Stashed: "StyleStash",
},
symbols: symbols{
Staged: "", // empty symbol should hide this flag
Stashed: "SymbolStash",
},
st: &gitstatus.Status{
NumStashed: 1,
Porcelain: gitstatus.Porcelain{
NumStaged: 3,
},
},
want: "StyleClear" + "StyleStashSymbolStash1",
},
{
name: "empty untracked symbol hides untracked count",
styles: styles{
Clear: "StyleClear",
Untracked: "StyleUntracked",
Stashed: "StyleStash",
},
symbols: symbols{
Untracked: "", // empty symbol should hide this flag
Stashed: "SymbolStash",
},
st: &gitstatus.Status{
NumStashed: 1,
Porcelain: gitstatus.Porcelain{
NumUntracked: 7,
},
},
want: "StyleClear" + "StyleStashSymbolStash1",
},
{
name: "empty conflict symbol hides conflict count",
styles: styles{
Clear: "StyleClear",
Conflict: "StyleConflict",
Stashed: "StyleStash",
},
symbols: symbols{
Conflict: "", // empty symbol should hide this flag
Stashed: "SymbolStash",
},
st: &gitstatus.Status{
NumStashed: 1,
Porcelain: gitstatus.Porcelain{
NumConflicts: 3,
},
},
want: "StyleClear" + "StyleStashSymbolStash1",
},
{
name: "empty clean symbol hides clean flag",
styles: styles{
Clear: "StyleClear",
Clean: "StyleClean",
Stashed: "StyleStash",
},
symbols: symbols{
Clean: "", // empty symbol should hide this flag
Stashed: "SymbolStash",
},
st: &gitstatus.Status{
IsClean: true,
NumStashed: 1,
},
want: "StyleClear" + "StyleStashSymbolStash1",
},
{
name: "empty stashed symbol in clean state hides stash count",
styles: styles{
Clear: "StyleClear",
Clean: "StyleClean",
},
symbols: symbols{
Clean: "SymbolClean",
Stashed: "", // empty symbol should hide this flag
},
st: &gitstatus.Status{
IsClean: true,
NumStashed: 1,
},
want: "StyleClear" + "StyleCleanSymbolClean",
},
{
name: "all symbols empty shows nothing",
styles: styles{
Clear: "StyleClear",
Clean: "StyleClean",
Staged: "StyleStaged",
Modified: "StyleMod",
Conflict: "StyleConflict",
Untracked: "StyleUntracked",
Stashed: "StyleStash",
},
symbols: symbols{
Clean: "",
Staged: "",
Modified: "",
Conflict: "",
Untracked: "",
Stashed: "",
},
st: &gitstatus.Status{
IsClean: false,
NumStashed: 1,
Porcelain: gitstatus.Porcelain{
NumStaged: 3,
NumModified: 2,
NumConflicts: 1,
NumUntracked: 4,
},
},
want: "",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
f := &Formater{
Config: Config{Styles: tt.styles, Symbols: tt.symbols},
st: tt.st,
}
compareStrings(t, tt.want, f.flags())
})
}
}
func compareStrings(t *testing.T, want, got string) { func compareStrings(t *testing.T, want, got string) {
if got != want { if got != want {
t.Errorf(` t.Errorf(`