1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2025-08-06 22:33:07 +02:00

Revert "Add IsAnnotated field to models.Tag struct"

It seems that `git for-each-ref` is a lot slower than `git tag --list` when
there are thousands of tags, so revert back to the previous method, now that we
no longer use the IsAnnotated field.

This reverts commit b12b1040c3.
This commit is contained in:
Stefan Haller
2025-07-27 18:00:08 +02:00
parent 151e80902e
commit 1c533dcd55
3 changed files with 23 additions and 30 deletions

View File

@ -1,7 +1,7 @@
package git_commands package git_commands
import ( import (
"strings" "regexp"
"github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/commands/models"
"github.com/jesseduffield/lazygit/pkg/commands/oscommands" "github.com/jesseduffield/lazygit/pkg/commands/oscommands"
@ -26,13 +26,9 @@ func NewTagLoader(
} }
func (self *TagLoader) GetTags() ([]*models.Tag, error) { func (self *TagLoader) GetTags() ([]*models.Tag, error) {
// get tags, sorted by creation date (descending) // get remote branches, sorted by creation date (descending)
// see: https://git-scm.com/docs/git-tag#Documentation/git-tag.txt---sortltkeygt // see: https://git-scm.com/docs/git-tag#Documentation/git-tag.txt---sortltkeygt
cmdArgs := NewGitCmd("for-each-ref"). cmdArgs := NewGitCmd("tag").Arg("--list", "-n", "--sort=-creatordate").ToArgv()
Arg("--sort=-creatordate").
Arg("--format=%(refname)%00%(objecttype)%00%(contents:subject)").
Arg("refs/tags").
ToArgv()
tagsOutput, err := self.cmd.New(cmdArgs).DontLog().RunWithOutput() tagsOutput, err := self.cmd.New(cmdArgs).DontLog().RunWithOutput()
if err != nil { if err != nil {
return nil, err return nil, err
@ -40,20 +36,20 @@ func (self *TagLoader) GetTags() ([]*models.Tag, error) {
split := utils.SplitLines(tagsOutput) split := utils.SplitLines(tagsOutput)
tags := lo.FilterMap(split, func(line string, _ int) (*models.Tag, bool) { lineRegex := regexp.MustCompile(`^([^\s]+)(\s+)?(.*)$`)
fields := strings.SplitN(line, "\x00", 3)
if len(fields) != 3 { tags := lo.Map(split, func(line string, _ int) *models.Tag {
return nil, false matches := lineRegex.FindStringSubmatch(line)
tagName := matches[1]
message := ""
if len(matches) > 3 {
message = matches[3]
} }
tagName := fields[0]
objectType := fields[1]
message := fields[2]
return &models.Tag{ return &models.Tag{
Name: strings.TrimPrefix(tagName, "refs/tags/"), Name: tagName,
Message: message, Message: message,
IsAnnotated: objectType == "tag", }
}, true
}) })
return tags, nil return tags, nil

View File

@ -9,9 +9,10 @@ import (
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
const tagsOutput = "refs/tags/tag1\x00tag\x00this is my message\n" + const tagsOutput = `tag1 this is my message
"refs/tags/tag2\x00commit\x00\n" + tag2
"refs/tags/tag3\x00tag\x00this is my other message\n" tag3 this is my other message
`
func TestGetTags(t *testing.T) { func TestGetTags(t *testing.T) {
type scenario struct { type scenario struct {
@ -25,18 +26,18 @@ func TestGetTags(t *testing.T) {
{ {
testName: "should return no tags if there are none", testName: "should return no tags if there are none",
runner: oscommands.NewFakeRunner(t). runner: oscommands.NewFakeRunner(t).
ExpectGitArgs([]string{"for-each-ref", "--sort=-creatordate", "--format=%(refname)%00%(objecttype)%00%(contents:subject)", "refs/tags"}, "", nil), ExpectGitArgs([]string{"tag", "--list", "-n", "--sort=-creatordate"}, "", nil),
expectedTags: []*models.Tag{}, expectedTags: []*models.Tag{},
expectedError: nil, expectedError: nil,
}, },
{ {
testName: "should return tags if present", testName: "should return tags if present",
runner: oscommands.NewFakeRunner(t). runner: oscommands.NewFakeRunner(t).
ExpectGitArgs([]string{"for-each-ref", "--sort=-creatordate", "--format=%(refname)%00%(objecttype)%00%(contents:subject)", "refs/tags"}, tagsOutput, nil), ExpectGitArgs([]string{"tag", "--list", "-n", "--sort=-creatordate"}, tagsOutput, nil),
expectedTags: []*models.Tag{ expectedTags: []*models.Tag{
{Name: "tag1", Message: "this is my message", IsAnnotated: true}, {Name: "tag1", Message: "this is my message"},
{Name: "tag2", Message: "", IsAnnotated: false}, {Name: "tag2", Message: ""},
{Name: "tag3", Message: "this is my other message", IsAnnotated: true}, {Name: "tag3", Message: "this is my other message"},
}, },
expectedError: nil, expectedError: nil,
}, },

View File

@ -3,13 +3,9 @@ package models
// Tag : A git tag // Tag : A git tag
type Tag struct { type Tag struct {
Name string Name string
// this is either the first line of the message of an annotated tag, or the // this is either the first line of the message of an annotated tag, or the
// first line of a commit message for a lightweight tag // first line of a commit message for a lightweight tag
Message string Message string
// true if this is an annotated tag, false if it's a lightweight tag
IsAnnotated bool
} }
func (t *Tag) FullRefName() string { func (t *Tag) FullRefName() string {