From bd782f16ddde1bdff6ee6e5237826be25e90fa9d Mon Sep 17 00:00:00 2001 From: Stefan Haller Date: Sat, 15 Jun 2024 15:48:18 +0200 Subject: [PATCH] Provide two config keys for configuring the author length in commits view One is for the normal view, the other for the expanded view. --- docs/Config.md | 6 ++++ pkg/config/user_config.go | 6 ++++ pkg/gui/presentation/authors/authors.go | 35 ++++++++++++++++---- pkg/gui/presentation/authors/authors_test.go | 25 +++++++++++++- pkg/gui/presentation/commits.go | 7 ++-- schema/config.json | 10 ++++++ 6 files changed, 79 insertions(+), 10 deletions(-) diff --git a/docs/Config.md b/docs/Config.md index 86e268550..ac296532f 100644 --- a/docs/Config.md +++ b/docs/Config.md @@ -185,6 +185,12 @@ gui: # If true (default), file icons are shown in the file views. Only relevant if NerdFontsVersion is not empty. showFileIcons: true + # Length of author name in (non-expanded) commits view. 2 means show initials only. + commitAuthorShortLength: 2 + + # Length of author name in expanded commits view. 2 means show initials only. + commitAuthorLongLength: 17 + # Length of commit hash in commits view. 0 shows '*' if NF icons aren't on. commitHashLength: 8 diff --git a/pkg/config/user_config.go b/pkg/config/user_config.go index 522a4f234..2c3baaa1b 100644 --- a/pkg/config/user_config.go +++ b/pkg/config/user_config.go @@ -125,6 +125,10 @@ type GuiConfig struct { NerdFontsVersion string `yaml:"nerdFontsVersion" jsonschema:"enum=2,enum=3,enum="` // If true (default), file icons are shown in the file views. Only relevant if NerdFontsVersion is not empty. ShowFileIcons bool `yaml:"showFileIcons"` + // Length of author name in (non-expanded) commits view. 2 means show initials only. + CommitAuthorShortLength int `yaml:"commitAuthorShortLength"` + // Length of author name in expanded commits view. 2 means show initials only. + CommitAuthorLongLength int `yaml:"commitAuthorLongLength"` // Length of commit hash in commits view. 0 shows '*' if NF icons aren't on. CommitHashLength int `yaml:"commitHashLength" jsonschema:"minimum=0"` // If true, show commit hashes alongside branch names in the branches view. @@ -694,6 +698,8 @@ func GetDefaultConfig() *UserConfig { ShowIcons: false, NerdFontsVersion: "", ShowFileIcons: true, + CommitAuthorShortLength: 2, + CommitAuthorLongLength: 17, CommitHashLength: 8, ShowBranchCommitHash: false, ShowDivergenceFromBaseBranch: "none", diff --git a/pkg/gui/presentation/authors/authors.go b/pkg/gui/presentation/authors/authors.go index 8f6325841..28c375f75 100644 --- a/pkg/gui/presentation/authors/authors.go +++ b/pkg/gui/presentation/authors/authors.go @@ -11,11 +11,16 @@ import ( "github.com/mattn/go-runewidth" ) +type authorNameCacheKey struct { + authorName string + truncateTo int +} + // if these being global variables causes trouble we can wrap them in a struct // attached to the gui state. var ( authorInitialCache = make(map[string]string) - authorNameCache = make(map[string]string) + authorNameCache = make(map[authorNameCacheKey]string) authorStyleCache = make(map[string]style.TextStyle) ) @@ -37,19 +42,37 @@ func ShortAuthor(authorName string) string { return value } -func LongAuthor(authorName string) string { - if value, ok := authorNameCache[authorName]; ok { +func LongAuthor(authorName string, length int) string { + cacheKey := authorNameCacheKey{authorName: authorName, truncateTo: length} + if value, ok := authorNameCache[cacheKey]; ok { return value } - paddedAuthorName := utils.WithPadding(authorName, 17, utils.AlignLeft) - truncatedName := utils.TruncateWithEllipsis(paddedAuthorName, 17) + paddedAuthorName := utils.WithPadding(authorName, length, utils.AlignLeft) + truncatedName := utils.TruncateWithEllipsis(paddedAuthorName, length) value := AuthorStyle(authorName).Sprint(truncatedName) - authorNameCache[authorName] = value + authorNameCache[cacheKey] = value return value } +// AuthorWithLength returns a representation of the author that fits into a +// given maximum length: +// - if the length is less than 2, it returns an empty string +// - if the length is 2, it returns the initials +// - otherwise, it returns the author name truncated to the maximum length +func AuthorWithLength(authorName string, length int) string { + if length < 2 { + return "" + } + + if length == 2 { + return ShortAuthor(authorName) + } + + return LongAuthor(authorName, length) +} + func AuthorStyle(authorName string) style.TextStyle { if value, ok := authorStyleCache[authorName]; ok { return value diff --git a/pkg/gui/presentation/authors/authors_test.go b/pkg/gui/presentation/authors/authors_test.go index 58efba297..d7c651031 100644 --- a/pkg/gui/presentation/authors/authors_test.go +++ b/pkg/gui/presentation/authors/authors_test.go @@ -1,6 +1,11 @@ package authors -import "testing" +import ( + "testing" + + "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/stretchr/testify/assert" +) func TestGetInitials(t *testing.T) { for input, expectedOutput := range map[string]string{ @@ -18,3 +23,21 @@ func TestGetInitials(t *testing.T) { } } } + +func TestAuthorWithLength(t *testing.T) { + scenarios := []struct { + authorName string + length int + expectedOutput string + }{ + {"Jesse Duffield", 0, ""}, + {"Jesse Duffield", 1, ""}, + {"Jesse Duffield", 2, "JD"}, + {"Jesse Duffield", 3, "Je…"}, + {"Jesse Duffield", 10, "Jesse Duf…"}, + {"Jesse Duffield", 14, "Jesse Duffield"}, + } + for _, s := range scenarios { + assert.Equal(t, s.expectedOutput, utils.Decolorise(AuthorWithLength(s.authorName, s.length))) + } +} diff --git a/pkg/gui/presentation/commits.go b/pkg/gui/presentation/commits.go index c385d3407..92327462f 100644 --- a/pkg/gui/presentation/commits.go +++ b/pkg/gui/presentation/commits.go @@ -440,10 +440,11 @@ func displayCommit( mark = fmt.Sprintf("%s ", willBeRebased) } - authorFunc := authors.ShortAuthor + authorLength := common.UserConfig.Gui.CommitAuthorShortLength if fullDescription { - authorFunc = authors.LongAuthor + authorLength = common.UserConfig.Gui.CommitAuthorLongLength } + author := authors.AuthorWithLength(commit.AuthorName, authorLength) cols := make([]string, 0, 7) cols = append( @@ -453,7 +454,7 @@ func displayCommit( bisectString, descriptionString, actionString, - authorFunc(commit.AuthorName), + author, graphLine+mark+tagString+theme.DefaultTextColor.Sprint(name), ) diff --git a/schema/config.json b/schema/config.json index 77a16099f..ba422388a 100644 --- a/schema/config.json +++ b/schema/config.json @@ -332,6 +332,16 @@ "description": "If true (default), file icons are shown in the file views. Only relevant if NerdFontsVersion is not empty.", "default": true }, + "commitAuthorShortLength": { + "type": "integer", + "description": "Length of author name in (non-expanded) commits view. 2 means show initials only.", + "default": 2 + }, + "commitAuthorLongLength": { + "type": "integer", + "description": "Length of author name in expanded commits view. 2 means show initials only.", + "default": 17 + }, "commitHashLength": { "type": "integer", "minimum": 0,