refactor(git): add branch status to template

This commit is contained in:
Jan De Dobbeleer 2021-10-31 20:59:35 +01:00 committed by Jan De Dobbeleer
parent 4dbed1176c
commit 3f8400e8f1
3 changed files with 76 additions and 46 deletions

View file

@ -10,16 +10,17 @@ import (
// Repo represents a git repository
type Repo struct {
Working *GitStatus
Staging *GitStatus
Ahead int
Behind int
HEAD string
Upstream string
UpstreamIcon string
StashCount int
WorktreeCount int
IsWorkTree bool
Working *GitStatus
Staging *GitStatus
Ahead int
Behind int
HEAD string
BranchStatus string
Upstream string
UpstreamIcon string
StashCount int
WorktreeCount int
IsWorkTree bool
gitWorkingFolder string // .git working folder, can be different of root if using worktree
gitRootFolder string // .git root folder
@ -191,7 +192,9 @@ func (g *git) shouldIgnoreRootRepository(rootDir string) bool {
func (g *git) string() string {
statusColorsEnabled := g.props.getBool(StatusColorsEnabled, false)
displayStatus := g.props.getBool(DisplayStatus, false)
if !displayStatus {
g.repo.HEAD = g.getPrettyHEADName()
}
if displayStatus || statusColorsEnabled {
g.setGitStatus()
}
@ -201,23 +204,30 @@ func (g *git) string() string {
if g.repo.Upstream != "" && g.props.getBool(DisplayUpstreamIcon, false) {
g.repo.UpstreamIcon = g.getUpstreamIcon()
}
if g.props.getBool(DisplayBranchStatus, true) {
g.repo.BranchStatus = g.getBranchStatus()
}
// use template if available
segmentTemplate := g.props.getString(SegmentTemplate, "")
if len(segmentTemplate) > 0 {
template := &textTemplate{
Template: segmentTemplate,
Context: g.repo,
Env: g.env,
}
text, err := template.render()
if err != nil {
return err.Error()
}
return text
return g.templateString(segmentTemplate)
}
// legacy render string if no template
// remove this for 6.0
return g.renderDeprecatedString(displayStatus)
return g.renderDeprecatedString()
}
func (g *git) templateString(segmentTemplate string) string {
template := &textTemplate{
Template: segmentTemplate,
Context: g.repo,
Env: g.env,
}
text, err := template.render()
if err != nil {
return err.Error()
}
return text
}
func (g *git) init(props *properties, env environmentInfo) {

View file

@ -32,10 +32,7 @@ const (
WorktreeCountIcon Property = "worktree_count_icon"
)
func (g *git) renderDeprecatedString(displayStatus bool) string {
if !displayStatus {
return g.getPrettyHEADName()
}
func (g *git) renderDeprecatedString() string {
buffer := new(bytes.Buffer)
// remote (if available)
if len(g.repo.UpstreamIcon) != 0 {
@ -43,8 +40,8 @@ func (g *git) renderDeprecatedString(displayStatus bool) string {
}
// branchName
fmt.Fprintf(buffer, "%s", g.repo.HEAD)
if g.props.getBool(DisplayBranchStatus, true) {
buffer.WriteString(g.getBranchStatus())
if len(g.repo.BranchStatus) != 0 {
buffer.WriteString(g.repo.BranchStatus)
}
if g.repo.Staging.Changed {
fmt.Fprint(buffer, g.getStatusDetailString(g.repo.Staging, StagingColor, LocalStagingIcon, " \uF046"))

View file

@ -131,8 +131,8 @@ func setupHEADContextEnv(context *detachedContext) *git {
env: env,
repo: &Repo{
gitWorkingFolder: "",
Working: &GitStatus{},
Staging: &GitStatus{},
Working: &GitStatus{},
Staging: &GitStatus{},
},
}
return g
@ -993,7 +993,7 @@ func TestGetGitCommand(t *testing.T) {
}
}
func TestGitTemplate(t *testing.T) {
func TestGitTemplateString(t *testing.T) {
cases := []struct {
Case string
Expected string
@ -1001,29 +1001,29 @@ func TestGitTemplate(t *testing.T) {
Repo *Repo
}{
{
Case: "Only HEAD name",
Case: "Only HEAD name",
Expected: "main",
Template: "{{ .HEAD }}",
Repo: &Repo{
HEAD: "main",
HEAD: "main",
Behind: 2,
},
},
{
Case: "Working area changes",
Case: "Working area changes",
Expected: "main \uF044 +2 ~3",
Template: "{{ .HEAD }}{{ if .Working.Changed }} \uF044{{ .Working.String }}{{ end }}",
Repo: &Repo{
HEAD: "main",
Working: &GitStatus{
Added: 2,
Added: 2,
Modified: 3,
Changed: true,
Changed: true,
},
},
},
{
Case: "No working area changes",
Case: "No working area changes",
Expected: "main",
Template: "{{ .HEAD }}{{ if .Working.Changed }} \uF044{{ .Working.String }}{{ end }}",
Repo: &Repo{
@ -1034,44 +1034,67 @@ func TestGitTemplate(t *testing.T) {
},
},
{
Case: "Working and staging area changes",
Case: "Working and staging area changes",
Expected: "main \uF046 +5 ~1 \uF044 +2 ~3",
Template: "{{ .HEAD }}{{ if .Staging.Changed }} \uF046{{ .Staging.String }}{{ end }}{{ if .Working.Changed }} \uF044{{ .Working.String }}{{ end }}",
Repo: &Repo{
HEAD: "main",
Working: &GitStatus{
Added: 2,
Added: 2,
Modified: 3,
Changed: true,
Changed: true,
},
Staging: &GitStatus{
Added: 5,
Added: 5,
Modified: 1,
Changed: true,
Changed: true,
},
},
},
{
Case: "No local changes",
Case: "No local changes",
Expected: "main",
Template: "{{ .HEAD }}{{ if .Staging.Changed }} \uF046{{ .Staging.String }}{{ end }}{{ if .Working.Changed }} \uF044{{ .Working.String }}{{ end }}",
Repo: &Repo{
HEAD: "main",
HEAD: "main",
Staging: &GitStatus{},
Working: &GitStatus{},
},
},
{
Case: "Upstream Icon",
Expected: "from GitHub on main",
Template: "from {{ .UpstreamIcon }} on {{ .HEAD }}",
Repo: &Repo{
HEAD: "main",
Staging: &GitStatus{},
Working: &GitStatus{},
UpstreamIcon: "GitHub",
},
},
{
Case: "Branch status",
Expected: "from GitHub on main \u21912",
Template: "from {{ .UpstreamIcon }} on {{ .HEAD }} {{ .BranchStatus }}",
Repo: &Repo{
HEAD: "main",
Staging: &GitStatus{},
Working: &GitStatus{},
UpstreamIcon: "GitHub",
BranchStatus: "\u21912",
},
},
}
for _, tc := range cases {
g := &git{
props: &properties{
values: map[Property]interface{}{
SegmentTemplate: tc.Template,
DisplayStatus: true,
},
},
repo: tc.Repo,
}
assert.Equal(t, tc.Expected, g.string(), tc.Case)
assert.Equal(t, tc.Expected, g.templateString(tc.Template), tc.Case)
}
}