Skip to content

Commit e84e5db

Browse files
authored
Lazy load object format with command line and don't do it in OpenRepository (#29712)
Most time, when invoking `git.OpenRepository`, `objectFormat` will not be used, so it's a waste to invoke commandline to get the object format. This PR make it a lazy operation, only invoke that when necessary.
1 parent 7f856d5 commit e84e5db

15 files changed

+72
-31
lines changed

modules/git/blame_sha256_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,12 @@ func TestReadingBlameOutputSha256(t *testing.T) {
118118
},
119119
}
120120

121+
objectFormat, err := repo.GetObjectFormat()
122+
assert.NoError(t, err)
121123
for _, c := range cases {
122124
commit, err := repo.GetCommit(c.CommitID)
123125
assert.NoError(t, err)
124-
125-
blameReader, err := CreateBlameReader(ctx, repo.objectFormat, "./tests/repos/repo6_blame_sha256", commit, "blame.txt", c.Bypass)
126+
blameReader, err := CreateBlameReader(ctx, objectFormat, "./tests/repos/repo6_blame_sha256", commit, "blame.txt", c.Bypass)
126127
assert.NoError(t, err)
127128
assert.NotNil(t, blameReader)
128129
defer blameReader.Close()

modules/git/blame_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,13 @@ func TestReadingBlameOutput(t *testing.T) {
118118
},
119119
}
120120

121+
objectFormat, err := repo.GetObjectFormat()
122+
assert.NoError(t, err)
121123
for _, c := range cases {
122124
commit, err := repo.GetCommit(c.CommitID)
123125
assert.NoError(t, err)
124126

125-
blameReader, err := CreateBlameReader(ctx, repo.objectFormat, "./tests/repos/repo6_blame", commit, "blame.txt", c.Bypass)
127+
blameReader, err := CreateBlameReader(ctx, objectFormat, "./tests/repos/repo6_blame", commit, "blame.txt", c.Bypass)
126128
assert.NoError(t, err)
127129
assert.NotNil(t, blameReader)
128130
defer blameReader.Close()

modules/git/commit_sha256_test.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,10 +140,13 @@ func TestHasPreviousCommitSha256(t *testing.T) {
140140
commit, err := repo.GetCommit("f004f41359117d319dedd0eaab8c5259ee2263da839dcba33637997458627fdc")
141141
assert.NoError(t, err)
142142

143+
objectFormat, err := repo.GetObjectFormat()
144+
assert.NoError(t, err)
145+
143146
parentSHA := MustIDFromString("b0ec7af4547047f12d5093e37ef8f1b3b5415ed8ee17894d43a34d7d34212e9c")
144147
notParentSHA := MustIDFromString("42e334efd04cd36eea6da0599913333c26116e1a537ca76e5b6e4af4dda00236")
145-
assert.Equal(t, repo.objectFormat, parentSHA.Type())
146-
assert.Equal(t, repo.objectFormat.Name(), "sha256")
148+
assert.Equal(t, objectFormat, parentSHA.Type())
149+
assert.Equal(t, objectFormat.Name(), "sha256")
147150

148151
haz, err := commit.HasPreviousCommit(parentSHA)
149152
assert.NoError(t, err)

modules/git/repo_base_nogogit.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,6 @@ func OpenRepository(ctx context.Context, repoPath string) (*Repository, error) {
7171
repo.batchWriter, repo.batchReader, repo.batchCancel = CatFileBatch(ctx, repoPath)
7272
repo.checkWriter, repo.checkReader, repo.checkCancel = CatFileBatchCheck(ctx, repoPath)
7373

74-
repo.objectFormat, err = repo.GetObjectFormat()
75-
if err != nil {
76-
return nil, err
77-
}
78-
7974
return repo, nil
8075
}
8176

modules/git/repo_commit.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,12 @@ func (repo *Repository) CommitsByFileAndRange(opts CommitsByFileAndRangeOptions)
246246
}
247247
}()
248248

249-
len := repo.objectFormat.FullLength()
249+
objectFormat, err := repo.GetObjectFormat()
250+
if err != nil {
251+
return nil, err
252+
}
253+
254+
len := objectFormat.FullLength()
250255
commits := []*Commit{}
251256
shaline := make([]byte, len+1)
252257
for {

modules/git/repo_commit_gogit.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,10 @@ func (repo *Repository) RemoveReference(name string) error {
4141

4242
// ConvertToHash returns a Hash object from a potential ID string
4343
func (repo *Repository) ConvertToGitID(commitID string) (ObjectID, error) {
44-
objectFormat := repo.objectFormat
44+
objectFormat, err := repo.GetObjectFormat()
45+
if err != nil {
46+
return nil, err
47+
}
4548
if len(commitID) == hash.HexSize && objectFormat.IsValid(commitID) {
4649
ID, err := NewIDFromString(commitID)
4750
if err == nil {

modules/git/repo_commit_nogogit.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,11 @@ func (repo *Repository) getCommitFromBatchReader(rd *bufio.Reader, id ObjectID)
132132

133133
// ConvertToGitID returns a GitHash object from a potential ID string
134134
func (repo *Repository) ConvertToGitID(commitID string) (ObjectID, error) {
135-
IDType := repo.objectFormat
136-
if len(commitID) == IDType.FullLength() && IDType.IsValid(commitID) {
135+
objectFormat, err := repo.GetObjectFormat()
136+
if err != nil {
137+
return nil, err
138+
}
139+
if len(commitID) == objectFormat.FullLength() && objectFormat.IsValid(commitID) {
137140
ID, err := NewIDFromString(commitID)
138141
if err == nil {
139142
return ID, nil
@@ -142,7 +145,7 @@ func (repo *Repository) ConvertToGitID(commitID string) (ObjectID, error) {
142145

143146
wr, rd, cancel := repo.CatFileBatchCheck(repo.Ctx)
144147
defer cancel()
145-
_, err := wr.Write([]byte(commitID + "\n"))
148+
_, err = wr.Write([]byte(commitID + "\n"))
146149
if err != nil {
147150
return nil, err
148151
}

modules/git/repo_compare.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,8 +283,12 @@ func (repo *Repository) GetPatch(base, head string, w io.Writer) error {
283283
// If base is undefined empty SHA (zeros), it only returns the files changed in the head commit
284284
// If base is the SHA of an empty tree (EmptyTreeSHA), it returns the files changes from the initial commit to the head commit
285285
func (repo *Repository) GetFilesChangedBetween(base, head string) ([]string, error) {
286+
objectFormat, err := repo.GetObjectFormat()
287+
if err != nil {
288+
return nil, err
289+
}
286290
cmd := NewCommand(repo.Ctx, "diff-tree", "--name-only", "--root", "--no-commit-id", "-r", "-z")
287-
if base == repo.objectFormat.EmptyObjectID().String() {
291+
if base == objectFormat.EmptyObjectID().String() {
288292
cmd.AddDynamicArguments(head)
289293
} else {
290294
cmd.AddDynamicArguments(base, head)

modules/git/repo_compare_test.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,17 +126,20 @@ func TestGetCommitFilesChanged(t *testing.T) {
126126
assert.NoError(t, err)
127127
defer repo.Close()
128128

129+
objectFormat, err := repo.GetObjectFormat()
130+
assert.NoError(t, err)
131+
129132
testCases := []struct {
130133
base, head string
131134
files []string
132135
}{
133136
{
134-
repo.objectFormat.EmptyObjectID().String(),
137+
objectFormat.EmptyObjectID().String(),
135138
"95bb4d39648ee7e325106df01a621c530863a653",
136139
[]string{"file1.txt"},
137140
},
138141
{
139-
repo.objectFormat.EmptyObjectID().String(),
142+
objectFormat.EmptyObjectID().String(),
140143
"8d92fc957a4d7cfd98bc375f0b7bb189a0d6c9f2",
141144
[]string{"file2.txt"},
142145
},
@@ -146,7 +149,7 @@ func TestGetCommitFilesChanged(t *testing.T) {
146149
[]string{"file2.txt"},
147150
},
148151
{
149-
repo.objectFormat.EmptyTree().String(),
152+
objectFormat.EmptyTree().String(),
150153
"8d92fc957a4d7cfd98bc375f0b7bb189a0d6c9f2",
151154
[]string{"file1.txt", "file2.txt"},
152155
},

modules/git/repo_index.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,14 +94,18 @@ func (repo *Repository) LsFiles(filenames ...string) ([]string, error) {
9494

9595
// RemoveFilesFromIndex removes given filenames from the index - it does not check whether they are present.
9696
func (repo *Repository) RemoveFilesFromIndex(filenames ...string) error {
97+
objectFormat, err := repo.GetObjectFormat()
98+
if err != nil {
99+
return err
100+
}
97101
cmd := NewCommand(repo.Ctx, "update-index", "--remove", "-z", "--index-info")
98102
stdout := new(bytes.Buffer)
99103
stderr := new(bytes.Buffer)
100104
buffer := new(bytes.Buffer)
101105
for _, file := range filenames {
102106
if file != "" {
103107
buffer.WriteString("0 ")
104-
buffer.WriteString(repo.objectFormat.EmptyObjectID().String())
108+
buffer.WriteString(objectFormat.EmptyObjectID().String())
105109
buffer.WriteByte('\t')
106110
buffer.WriteString(file)
107111
buffer.WriteByte('\000')

modules/git/repo_tag.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ func (repo *Repository) GetTagInfos(page, pageSize int) ([]*Tag, int, error) {
141141
break
142142
}
143143

144-
tag, err := parseTagRef(repo.objectFormat, ref)
144+
tag, err := parseTagRef(ref)
145145
if err != nil {
146146
return nil, 0, fmt.Errorf("GetTagInfos: parse tag: %w", err)
147147
}
@@ -161,7 +161,7 @@ func (repo *Repository) GetTagInfos(page, pageSize int) ([]*Tag, int, error) {
161161
}
162162

163163
// parseTagRef parses a tag from a 'git for-each-ref'-produced reference.
164-
func parseTagRef(objectFormat ObjectFormat, ref map[string]string) (tag *Tag, err error) {
164+
func parseTagRef(ref map[string]string) (tag *Tag, err error) {
165165
tag = &Tag{
166166
Type: ref["objecttype"],
167167
Name: ref["refname:lstrip=2"],

modules/git/repo_tag_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,6 @@ func TestRepository_GetAnnotatedTag(t *testing.T) {
194194
}
195195

196196
func TestRepository_parseTagRef(t *testing.T) {
197-
sha1 := Sha1ObjectFormat
198197
tests := []struct {
199198
name string
200199

@@ -351,7 +350,7 @@ Add changelog of v1.9.1 (#7859)
351350
for _, test := range tests {
352351
tc := test // don't close over loop variable
353352
t.Run(tc.name, func(t *testing.T) {
354-
got, err := parseTagRef(sha1, tc.givenRef)
353+
got, err := parseTagRef(tc.givenRef)
355354

356355
if tc.wantErr {
357356
require.Error(t, err)

modules/git/repo_tree_gogit.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,12 @@ func (repo *Repository) getTree(id ObjectID) (*Tree, error) {
2121

2222
// GetTree find the tree object in the repository.
2323
func (repo *Repository) GetTree(idStr string) (*Tree, error) {
24-
if len(idStr) != repo.objectFormat.FullLength() {
24+
objectFormat, err := repo.GetObjectFormat()
25+
if err != nil {
26+
return nil, err
27+
}
28+
29+
if len(idStr) != objectFormat.FullLength() {
2530
res, _, err := NewCommand(repo.Ctx, "rev-parse", "--verify").AddDynamicArguments(idStr).RunStdString(&RunOpts{Dir: repo.Path})
2631
if err != nil {
2732
return nil, err

modules/git/repo_tree_nogogit.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,11 @@ func (repo *Repository) getTree(id ObjectID) (*Tree, error) {
5151
case "tree":
5252
tree := NewTree(repo, id)
5353
tree.ResolvedID = id
54-
tree.entries, err = catBatchParseTreeEntries(repo.objectFormat, tree, rd, size)
54+
objectFormat, err := repo.GetObjectFormat()
55+
if err != nil {
56+
return nil, err
57+
}
58+
tree.entries, err = catBatchParseTreeEntries(objectFormat, tree, rd, size)
5559
if err != nil {
5660
return nil, err
5761
}
@@ -69,7 +73,11 @@ func (repo *Repository) getTree(id ObjectID) (*Tree, error) {
6973

7074
// GetTree find the tree object in the repository.
7175
func (repo *Repository) GetTree(idStr string) (*Tree, error) {
72-
if len(idStr) != repo.objectFormat.FullLength() {
76+
objectFormat, err := repo.GetObjectFormat()
77+
if err != nil {
78+
return nil, err
79+
}
80+
if len(idStr) != objectFormat.FullLength() {
7381
res, err := repo.GetRefCommitID(idStr)
7482
if err != nil {
7583
return nil, err

modules/git/tree_nogogit.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,11 @@ func (t *Tree) ListEntries() (Entries, error) {
7777
return nil, runErr
7878
}
7979

80-
var err error
81-
t.entries, err = parseTreeEntries(t.repo.objectFormat, stdout, t)
80+
objectFormat, err := t.repo.GetObjectFormat()
81+
if err != nil {
82+
return nil, err
83+
}
84+
t.entries, err = parseTreeEntries(objectFormat, stdout, t)
8285
if err == nil {
8386
t.entriesParsed = true
8487
}
@@ -101,8 +104,11 @@ func (t *Tree) listEntriesRecursive(extraArgs TrustedCmdArgs) (Entries, error) {
101104
return nil, runErr
102105
}
103106

104-
var err error
105-
t.entriesRecursive, err = parseTreeEntries(t.repo.objectFormat, stdout, t)
107+
objectFormat, err := t.repo.GetObjectFormat()
108+
if err != nil {
109+
return nil, err
110+
}
111+
t.entriesRecursive, err = parseTreeEntries(objectFormat, stdout, t)
106112
if err == nil {
107113
t.entriesRecursiveParsed = true
108114
}

0 commit comments

Comments
 (0)