package presentation import ( "fmt" "strings" "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/gui/style" "github.com/jesseduffield/lazygit/pkg/i18n" "github.com/jesseduffield/lazygit/pkg/theme" "github.com/jesseduffield/lazygit/pkg/utils" ) var branchPrefixColorCache = make(map[string]style.TextStyle) func GetBranchListDisplayStrings(branches []*models.Branch, fullDescription bool, diffName string, tr *i18n.TranslationSet) [][]string { return slices.Map(branches, func(branch *models.Branch) []string { diffed := branch.Name == diffName return getBranchDisplayStrings(branch, fullDescription, diffed, tr) }) } // getBranchDisplayStrings returns the display string of branch func getBranchDisplayStrings(b *models.Branch, fullDescription bool, diffed bool, tr *i18n.TranslationSet) []string { displayName := b.Name if b.DisplayName != "" { displayName = b.DisplayName } nameTextStyle := GetBranchTextStyle(b.Name) if diffed { nameTextStyle = theme.DiffTerminalColor } coloredName := nameTextStyle.Sprint(displayName) if b.IsTrackingRemote() { coloredName = fmt.Sprintf("%s %s", coloredName, ColoredBranchStatus(b, tr)) } recencyColor := style.FgCyan if b.Recency == " *" { recencyColor = style.FgGreen } res := []string{recencyColor.Sprint(b.Recency), coloredName} if fullDescription { return append( res, fmt.Sprintf("%s %s", style.FgYellow.Sprint(b.UpstreamRemote), style.FgYellow.Sprint(b.UpstreamBranch), ), ) } return res } // GetBranchTextStyle branch color func GetBranchTextStyle(name string) style.TextStyle { branchType := strings.Split(name, "/")[0] if value, ok := branchPrefixColorCache[branchType]; ok { return value } switch branchType { case "feature": return style.FgGreen case "bugfix": return style.FgYellow case "hotfix": return style.FgRed default: return theme.DefaultTextColor } } func ColoredBranchStatus(branch *models.Branch, tr *i18n.TranslationSet) string { colour := style.FgYellow if !branch.IsTrackingRemote() || branch.UpstreamGone { colour = style.FgRed } else if branch.MatchesUpstream() { colour = style.FgGreen } return colour.Sprint(BranchStatus(branch, tr)) } func BranchStatus(branch *models.Branch, tr *i18n.TranslationSet) string { if branch.UpstreamGone { return tr.UpstreamGone } return fmt.Sprintf("ā†‘%sā†“%s", branch.Pushables, branch.Pullables) } func SetCustomBranches(customBranchColors map[string]string) { branchPrefixColorCache = utils.SetCustomColors(customBranchColors) }