]> source.dussan.org Git - gitea.git/commitdiff
Make "sync branch" also sync object format and add tests (#30878) (#30880)
authorGiteabot <teabot@gitea.io>
Tue, 7 May 2024 00:33:28 +0000 (08:33 +0800)
committerGitHub <noreply@github.com>
Tue, 7 May 2024 00:33:28 +0000 (08:33 +0800)
Backport #30878 by wxiaoguang

Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
modules/git/repo.go
modules/repository/branch.go
modules/repository/branch_test.go [new file with mode: 0644]
services/repository/adopt.go

index 4511e900e08a272f571776d4388f4b94c4830c28..c5ba5117a786e3191d309ce602964fc45fc5d0e0 100644 (file)
@@ -7,7 +7,6 @@ package git
 import (
        "bytes"
        "context"
-       "errors"
        "fmt"
        "io"
        "net/url"
@@ -63,32 +62,6 @@ func IsRepoURLAccessible(ctx context.Context, url string) bool {
        return err == nil
 }
 
-// GetObjectFormatOfRepo returns the hash type of repository at a given path
-func GetObjectFormatOfRepo(ctx context.Context, repoPath string) (ObjectFormat, error) {
-       var stdout, stderr strings.Builder
-
-       err := NewCommand(ctx, "hash-object", "--stdin").Run(&RunOpts{
-               Dir:    repoPath,
-               Stdout: &stdout,
-               Stderr: &stderr,
-               Stdin:  &strings.Reader{},
-       })
-       if err != nil {
-               return nil, err
-       }
-
-       if stderr.Len() > 0 {
-               return nil, errors.New(stderr.String())
-       }
-
-       h, err := NewIDFromString(strings.TrimRight(stdout.String(), "\n"))
-       if err != nil {
-               return nil, err
-       }
-
-       return h.Type(), nil
-}
-
 // InitRepository initializes a new Git repository.
 func InitRepository(ctx context.Context, repoPath string, bare bool, objectFormatName string) error {
        err := os.MkdirAll(repoPath, os.ModePerm)
index e448490f4ac18b208522643a02ab95503f5bd61f..a3fca7c7ce40146220b9723e436274a3af05da3c 100644 (file)
@@ -5,6 +5,7 @@ package repository
 
 import (
        "context"
+       "fmt"
 
        "code.gitea.io/gitea/models/db"
        git_model "code.gitea.io/gitea/models/git"
@@ -36,6 +37,15 @@ func SyncRepoBranches(ctx context.Context, repoID, doerID int64) (int64, error)
 }
 
 func SyncRepoBranchesWithRepo(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, doerID int64) (int64, error) {
+       objFmt, err := gitRepo.GetObjectFormat()
+       if err != nil {
+               return 0, fmt.Errorf("GetObjectFormat: %w", err)
+       }
+       _, err = db.GetEngine(ctx).ID(repo.ID).Update(&repo_model.Repository{ObjectFormatName: objFmt.Name()})
+       if err != nil {
+               return 0, fmt.Errorf("UpdateRepository: %w", err)
+       }
+
        allBranches := container.Set[string]{}
        {
                branches, _, err := gitRepo.GetBranchNames(0, 0)
diff --git a/modules/repository/branch_test.go b/modules/repository/branch_test.go
new file mode 100644 (file)
index 0000000..acf75a1
--- /dev/null
@@ -0,0 +1,31 @@
+// Copyright 2024 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package repository
+
+import (
+       "testing"
+
+       "code.gitea.io/gitea/models/db"
+       git_model "code.gitea.io/gitea/models/git"
+       repo_model "code.gitea.io/gitea/models/repo"
+       "code.gitea.io/gitea/models/unittest"
+
+       "github.com/stretchr/testify/assert"
+)
+
+func TestSyncRepoBranches(t *testing.T) {
+       assert.NoError(t, unittest.PrepareTestDatabase())
+       _, err := db.GetEngine(db.DefaultContext).ID(1).Update(&repo_model.Repository{ObjectFormatName: "bad-fmt"})
+       assert.NoError(t, db.TruncateBeans(db.DefaultContext, &git_model.Branch{}))
+       assert.NoError(t, err)
+       repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
+       assert.Equal(t, "bad-fmt", repo.ObjectFormatName)
+       _, err = SyncRepoBranches(db.DefaultContext, 1, 0)
+       assert.NoError(t, err)
+       repo = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
+       assert.Equal(t, "sha1", repo.ObjectFormatName)
+       branch, err := git_model.GetBranch(db.DefaultContext, 1, "master")
+       assert.NoError(t, err)
+       assert.EqualValues(t, "master", branch.Name)
+}
index 31e3e581b3134874014cfe9f95904645c5d96524..1ad1ef5b2cf01429d6af7499445f3c4ba16cdc33 100644 (file)
@@ -195,6 +195,10 @@ func adoptRepository(ctx context.Context, repoPath string, u *user_model.User, r
        }
        defer gitRepo.Close()
 
+       if _, err = repo_module.SyncRepoBranchesWithRepo(ctx, repo, gitRepo, 0); err != nil {
+               return fmt.Errorf("SyncRepoBranches: %w", err)
+       }
+
        if err = repo_module.SyncReleasesWithTags(ctx, repo, gitRepo); err != nil {
                return fmt.Errorf("SyncReleasesWithTags: %w", err)
        }