import (
"bytes"
"context"
- "errors"
"fmt"
"io"
"net/url"
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)
import (
"context"
+ "fmt"
"code.gitea.io/gitea/models/db"
git_model "code.gitea.io/gitea/models/git"
}
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)
--- /dev/null
+// 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)
+}
}
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)
}