From 5dec08071902fabf5b9853c55ad3fb33fe14c5e6 Mon Sep 17 00:00:00 2001 From: Ryooooooga Date: Fri, 27 Jan 2023 20:14:03 +0900 Subject: fix: fix RefName of detached HEAD to works in Chinese --- pkg/commands/git_commands/branch.go | 22 +++++++--------------- pkg/commands/git_commands/branch_test.go | 22 +++++++++++++--------- 2 files changed, 20 insertions(+), 24 deletions(-) (limited to 'pkg/commands') diff --git a/pkg/commands/git_commands/branch.go b/pkg/commands/git_commands/branch.go index 117427778..a71e365ea 100644 --- a/pkg/commands/git_commands/branch.go +++ b/pkg/commands/git_commands/branch.go @@ -2,19 +2,12 @@ package git_commands import ( "fmt" - "regexp" "strings" "github.com/jesseduffield/lazygit/pkg/commands/oscommands" "github.com/jesseduffield/lazygit/pkg/utils" ) -// this takes something like: -// * (HEAD detached at 264fc6f5) -// remotes -// and returns '264fc6f5' as the second match -const CurrentBranchNameRegex = `(?m)^\*.*?([^ ]*?)\)?$` - type BranchCommands struct { *GitCommon } @@ -41,19 +34,18 @@ func (self *BranchCommands) CurrentBranchInfo() (BranchInfo, error) { DetachedHead: false, }, nil } - output, err := self.cmd.New("git branch --contains").DontLog().RunWithOutput() + output, err := self.cmd.New(`git branch --points-at=HEAD --format="%(HEAD)%00%(objectname)%00%(refname)"`).DontLog().RunWithOutput() if err != nil { return BranchInfo{}, err } for _, line := range utils.SplitLines(output) { - re := regexp.MustCompile(CurrentBranchNameRegex) - match := re.FindStringSubmatch(line) - if len(match) > 0 { - branchName = match[1] - displayBranchName := match[0][2:] + split := strings.Split(strings.TrimRight(line, "\r\n"), "\x00") + if len(split) == 3 && split[0] == "*" { + sha := split[1] + displayName := split[2] return BranchInfo{ - RefName: branchName, - DisplayName: displayBranchName, + RefName: sha, + DisplayName: displayName, DetachedHead: true, }, nil } diff --git a/pkg/commands/git_commands/branch_test.go b/pkg/commands/git_commands/branch_test.go index 94456c0f8..2fdf7d9c2 100644 --- a/pkg/commands/git_commands/branch_test.go +++ b/pkg/commands/git_commands/branch_test.go @@ -181,26 +181,30 @@ func TestBranchCurrentBranchInfo(t *testing.T) { }, }, { - "falls back to git `git branch --contains` if symbolic-ref fails", + "falls back to git `git branch --points-at=HEAD` if symbolic-ref fails", oscommands.NewFakeRunner(t). Expect(`git symbolic-ref --short HEAD`, "", errors.New("error")). - Expect(`git branch --contains`, "* (HEAD detached at 8982166a)", nil), + Expect(`git branch --points-at=HEAD --format="%(HEAD)%00%(objectname)%00%(refname)"`, "*\x006f71c57a8d4bd6c11399c3f55f42c815527a73a4\x00(HEAD detached at 6f71c57a)\n", nil), func(info BranchInfo, err error) { assert.NoError(t, err) - assert.EqualValues(t, "8982166a", info.RefName) - assert.EqualValues(t, "(HEAD detached at 8982166a)", info.DisplayName) + assert.EqualValues(t, "6f71c57a8d4bd6c11399c3f55f42c815527a73a4", info.RefName) + assert.EqualValues(t, "(HEAD detached at 6f71c57a)", info.DisplayName) assert.True(t, info.DetachedHead) }, }, { - "handles a detached head", + "handles a detached head (LANG=zh_CN.UTF-8)", oscommands.NewFakeRunner(t). Expect(`git symbolic-ref --short HEAD`, "", errors.New("error")). - Expect(`git branch --contains`, "* (HEAD detached at 123abcd)", nil), + Expect( + `git branch --points-at=HEAD --format="%(HEAD)%00%(objectname)%00%(refname)"`, + "*\x00679b0456f3db7c505b398def84e7d023e5b55a8d\x00(头指针在 679b0456 分离)\n"+ + " \x00679b0456f3db7c505b398def84e7d023e5b55a8d\x00refs/heads/master\n", + nil), func(info BranchInfo, err error) { assert.NoError(t, err) - assert.EqualValues(t, "123abcd", info.RefName) - assert.EqualValues(t, "(HEAD detached at 123abcd)", info.DisplayName) + assert.EqualValues(t, "679b0456f3db7c505b398def84e7d023e5b55a8d", info.RefName) + assert.EqualValues(t, "(头指针在 679b0456 分离)", info.DisplayName) assert.True(t, info.DetachedHead) }, }, @@ -208,7 +212,7 @@ func TestBranchCurrentBranchInfo(t *testing.T) { "bubbles up error if there is one", oscommands.NewFakeRunner(t). Expect(`git symbolic-ref --short HEAD`, "", errors.New("error")). - Expect(`git branch --contains`, "", errors.New("error")), + Expect(`git branch --points-at=HEAD --format="%(HEAD)%00%(objectname)%00%(refname)"`, "", errors.New("error")), func(info BranchInfo, err error) { assert.Error(t, err) assert.EqualValues(t, "", info.RefName) -- cgit v1.2.3