Skip to content

Commit

Permalink
fix: fix RefName of detached HEAD to works in Chinese
Browse files Browse the repository at this point in the history
  • Loading branch information
Ryooooooga committed Jan 27, 2023
1 parent 679b045 commit 5dec080
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 24 deletions.
22 changes: 7 additions & 15 deletions pkg/commands/git_commands/branch.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand All @@ -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
}
Expand Down
22 changes: 13 additions & 9 deletions pkg/commands/git_commands/branch_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -181,34 +181,38 @@ 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)
},
},
{
"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)
Expand Down
40 changes: 40 additions & 0 deletions pkg/integration/tests/branch/detached_head.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package branch

import (
"github.com/jesseduffield/lazygit/pkg/config"
. "github.com/jesseduffield/lazygit/pkg/integration/components"
)

var DetachedHead = NewIntegrationTest(NewIntegrationTestArgs{
Description: "Create a new branch on detached head",
ExtraCmdArgs: "",
Skip: false,
SetupConfig: func(config *config.AppConfig) {},
SetupRepo: func(shell *Shell) {
shell.
CreateNCommits(10).
Checkout("HEAD^")
},
Run: func(t *TestDriver, keys config.KeybindingConfig) {
t.Views().Branches().
Focus().
Lines(
MatchesRegexp(`\*.*HEAD`).IsSelected(),
MatchesRegexp(`master`),
).
Press(keys.Universal.New)

t.ExpectPopup().Prompt().
Title(MatchesRegexp(`^New Branch Name \(Branch is off of '[0-9a-f]+'\)$`)).
Type("new-branch").
Confirm()

t.Views().Branches().
Lines(
MatchesRegexp(`\* new-branch`).IsSelected(),
MatchesRegexp(`master`),
)

t.Git().CurrentBranchName("new-branch")
},
})
1 change: 1 addition & 0 deletions pkg/integration/tests/tests.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ var tests = []*components.IntegrationTest{
branch.RebaseAndDrop,
branch.Suggestions,
branch.Reset,
branch.DetachedHead,
cherry_pick.CherryPick,
cherry_pick.CherryPickConflicts,
commit.Commit,
Expand Down

0 comments on commit 5dec080

Please sign in to comment.