Skip to content

Commit ad5a8d0

Browse files
GiteaBotwxiaoguang
andauthored
Make "sync branch" also sync object format and add tests (#30878) (#30880)
Backport #30878 by wxiaoguang Co-authored-by: wxiaoguang <[email protected]>
1 parent cfe6779 commit ad5a8d0

File tree

4 files changed

+45
-27
lines changed

4 files changed

+45
-27
lines changed

modules/git/repo.go

-27
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ package git
77
import (
88
"bytes"
99
"context"
10-
"errors"
1110
"fmt"
1211
"io"
1312
"net/url"
@@ -63,32 +62,6 @@ func IsRepoURLAccessible(ctx context.Context, url string) bool {
6362
return err == nil
6463
}
6564

66-
// GetObjectFormatOfRepo returns the hash type of repository at a given path
67-
func GetObjectFormatOfRepo(ctx context.Context, repoPath string) (ObjectFormat, error) {
68-
var stdout, stderr strings.Builder
69-
70-
err := NewCommand(ctx, "hash-object", "--stdin").Run(&RunOpts{
71-
Dir: repoPath,
72-
Stdout: &stdout,
73-
Stderr: &stderr,
74-
Stdin: &strings.Reader{},
75-
})
76-
if err != nil {
77-
return nil, err
78-
}
79-
80-
if stderr.Len() > 0 {
81-
return nil, errors.New(stderr.String())
82-
}
83-
84-
h, err := NewIDFromString(strings.TrimRight(stdout.String(), "\n"))
85-
if err != nil {
86-
return nil, err
87-
}
88-
89-
return h.Type(), nil
90-
}
91-
9265
// InitRepository initializes a new Git repository.
9366
func InitRepository(ctx context.Context, repoPath string, bare bool, objectFormatName string) error {
9467
err := os.MkdirAll(repoPath, os.ModePerm)

modules/repository/branch.go

+10
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package repository
55

66
import (
77
"context"
8+
"fmt"
89

910
"code.gitea.io/gitea/models/db"
1011
git_model "code.gitea.io/gitea/models/git"
@@ -36,6 +37,15 @@ func SyncRepoBranches(ctx context.Context, repoID, doerID int64) (int64, error)
3637
}
3738

3839
func SyncRepoBranchesWithRepo(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, doerID int64) (int64, error) {
40+
objFmt, err := gitRepo.GetObjectFormat()
41+
if err != nil {
42+
return 0, fmt.Errorf("GetObjectFormat: %w", err)
43+
}
44+
_, err = db.GetEngine(ctx).ID(repo.ID).Update(&repo_model.Repository{ObjectFormatName: objFmt.Name()})
45+
if err != nil {
46+
return 0, fmt.Errorf("UpdateRepository: %w", err)
47+
}
48+
3949
allBranches := container.Set[string]{}
4050
{
4151
branches, _, err := gitRepo.GetBranchNames(0, 0)

modules/repository/branch_test.go

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// Copyright 2024 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package repository
5+
6+
import (
7+
"testing"
8+
9+
"code.gitea.io/gitea/models/db"
10+
git_model "code.gitea.io/gitea/models/git"
11+
repo_model "code.gitea.io/gitea/models/repo"
12+
"code.gitea.io/gitea/models/unittest"
13+
14+
"github.com/stretchr/testify/assert"
15+
)
16+
17+
func TestSyncRepoBranches(t *testing.T) {
18+
assert.NoError(t, unittest.PrepareTestDatabase())
19+
_, err := db.GetEngine(db.DefaultContext).ID(1).Update(&repo_model.Repository{ObjectFormatName: "bad-fmt"})
20+
assert.NoError(t, db.TruncateBeans(db.DefaultContext, &git_model.Branch{}))
21+
assert.NoError(t, err)
22+
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
23+
assert.Equal(t, "bad-fmt", repo.ObjectFormatName)
24+
_, err = SyncRepoBranches(db.DefaultContext, 1, 0)
25+
assert.NoError(t, err)
26+
repo = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
27+
assert.Equal(t, "sha1", repo.ObjectFormatName)
28+
branch, err := git_model.GetBranch(db.DefaultContext, 1, "master")
29+
assert.NoError(t, err)
30+
assert.EqualValues(t, "master", branch.Name)
31+
}

services/repository/adopt.go

+4
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,10 @@ func adoptRepository(ctx context.Context, repoPath string, u *user_model.User, r
195195
}
196196
defer gitRepo.Close()
197197

198+
if _, err = repo_module.SyncRepoBranchesWithRepo(ctx, repo, gitRepo, 0); err != nil {
199+
return fmt.Errorf("SyncRepoBranches: %w", err)
200+
}
201+
198202
if err = repo_module.SyncReleasesWithTags(ctx, repo, gitRepo); err != nil {
199203
return fmt.Errorf("SyncReleasesWithTags: %w", err)
200204
}

0 commit comments

Comments
 (0)