Skip to content

Commit

Permalink
Add ability to configure branch color patterns
Browse files Browse the repository at this point in the history
  • Loading branch information
mtrajano authored and stefanhaller committed Jan 11, 2025
1 parent 3e623cd commit 1c4b10a
Show file tree
Hide file tree
Showing 7 changed files with 58 additions and 11 deletions.
9 changes: 6 additions & 3 deletions docs/Config.md
Original file line number Diff line number Diff line change
Expand Up @@ -832,14 +832,17 @@ gui:

## Custom Branch Color

You can customize the color of branches based on the branch prefix:
You can customize the color of branches based on branch patterns (regular expressions):

```yaml
gui:
branchColors:
'docs': '#11aaff' # use a light blue for branches beginning with 'docs/'
branchColorPatterns:
'^docs/': '#11aaff' # use a light blue for branches beginning with 'docs/'
'ISSUE-\d+': '#ff5733' # use a bright orange for branches containing 'ISSUE-<some-number>'
```

Note that the regular expressions are not implicitly anchored to the beginning/end of the branch name. If you want to do that, add leading `^` and/or trailing `$` as needed.

## Example Coloring

![border example](../../assets/colored-border-example.png)
Expand Down
3 changes: 3 additions & 0 deletions pkg/config/user_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,10 @@ type GuiConfig struct {
// See https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md#custom-author-color
AuthorColors map[string]string `yaml:"authorColors"`
// See https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md#custom-branch-color
// Deprecated: use branchColorPatterns instead
BranchColors map[string]string `yaml:"branchColors"`
// See https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md#custom-branch-color
BranchColorPatterns map[string]string `yaml:"branchColorPatterns"`
// The number of lines you scroll by when scrolling the main window
ScrollHeight int `yaml:"scrollHeight" jsonschema:"minimum=1"`
// If true, allow scrolling past the bottom of the content in the main window
Expand Down
8 changes: 7 additions & 1 deletion pkg/gui/gui.go
Original file line number Diff line number Diff line change
Expand Up @@ -455,7 +455,13 @@ func (gui *Gui) onUserConfigLoaded() error {
} else if userConfig.Gui.ShowIcons {
icons.SetNerdFontsVersion("2")
}
presentation.SetCustomBranches(userConfig.Gui.BranchColors)

if len(userConfig.Gui.BranchColorPatterns) > 0 {
presentation.SetCustomBranches(userConfig.Gui.BranchColorPatterns, true)
} else {
// The alternative is to match on branch types with the branchColors config which will be deprecated in the future
presentation.SetCustomBranches(userConfig.Gui.BranchColors, false)
}

return nil
}
Expand Down
39 changes: 32 additions & 7 deletions pkg/gui/presentation/branches.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package presentation

import (
"fmt"
"regexp"
"strings"
"time"

Expand All @@ -18,7 +19,12 @@ import (
"github.com/samber/lo"
)

var branchPrefixColorCache = make(map[string]style.TextStyle)
type colorMatcher struct {
patterns map[string]style.TextStyle
isRegex bool // NOTE: this value is needed only until branchColors is deprecated and only regex color patterns are used
}

var colorPatterns *colorMatcher

func GetBranchListDisplayStrings(
branches []*models.Branch,
Expand Down Expand Up @@ -125,15 +131,31 @@ func getBranchDisplayStrings(

// GetBranchTextStyle branch color
func GetBranchTextStyle(name string) style.TextStyle {
branchType := strings.Split(name, "/")[0]

if value, ok := branchPrefixColorCache[branchType]; ok {
return value
if style, ok := colorPatterns.match(name); ok {
return *style
}

return theme.DefaultTextColor
}

func (m *colorMatcher) match(name string) (*style.TextStyle, bool) {
if m.isRegex {
for pattern, style := range m.patterns {
if matched, _ := regexp.MatchString(pattern, name); matched {
return &style, true
}
}
} else {
// old behavior using the deprecated branchColors behavior matching on branch type
branchType := strings.Split(name, "/")[0]
if value, ok := m.patterns[branchType]; ok {
return &value, true
}
}

return nil, false
}

func BranchStatus(
branch *models.Branch,
itemOperation types.ItemOperation,
Expand Down Expand Up @@ -180,6 +202,9 @@ func BranchStatus(
return result
}

func SetCustomBranches(customBranchColors map[string]string) {
branchPrefixColorCache = utils.SetCustomColors(customBranchColors)
func SetCustomBranches(customBranchColors map[string]string, isRegex bool) {
colorPatterns = &colorMatcher{
patterns: utils.SetCustomColors(customBranchColors),
isRegex: isRegex,
}
}
1 change: 1 addition & 0 deletions pkg/gui/presentation/branches_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,7 @@ func Test_getBranchDisplayStrings(t *testing.T) {
defer color.ForceSetColorLevel(oldColorLevel)

c := utils.NewDummyCommon()
SetCustomBranches(c.UserConfig().Gui.BranchColorPatterns, true)

for i, s := range scenarios {
icons.SetNerdFontsVersion(lo.Ternary(s.useIcons, "3", ""))
Expand Down
2 changes: 2 additions & 0 deletions pkg/i18n/english.go
Original file line number Diff line number Diff line change
Expand Up @@ -2006,6 +2006,8 @@ keybinding:
gui:
filterMode: 'fuzzy'
`,
"0.44.0": `- The gui.branchColors config option is deprecated; it will be removed in a future version. Please use gui.branchColorPatterns instead.
- The automatic coloring of branches starting with "feature/", "bugfix/", or "hotfix/" has been removed; if you want this, it's easy to set up using the new gui.branchColorPatterns option.`,
},
}
}
7 changes: 7 additions & 0 deletions schema/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,13 @@
"description": "See https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md#custom-author-color"
},
"branchColors": {
"additionalProperties": {
"type": "string"
},
"type": "object",
"description": "See https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md#custom-branch-color\nDeprecated: use branchColorPatterns instead"
},
"branchColorPatterns": {
"additionalProperties": {
"type": "string"
},
Expand Down

0 comments on commit 1c4b10a

Please sign in to comment.