diff --git a/models/repo/repo.go b/models/repo/repo.go index 2977dfb9f1d8a..1c6612cff37ba 100644 --- a/models/repo/repo.go +++ b/models/repo/repo.go @@ -232,6 +232,8 @@ func (sr StorageRepo) RelativePath() string { return string(sr) } +// WikiStorageRepo returns the storage repo for the wiki +// The wiki repository should have the same object format as the code repository func (repo *Repository) WikiStorageRepo() StorageRepo { return StorageRepo(strings.ToLower(repo.OwnerName) + "/" + strings.ToLower(repo.Name) + ".wiki.git") } diff --git a/modules/git/fsck.go b/modules/git/fsck.go deleted file mode 100644 index a52684c84fffe..0000000000000 --- a/modules/git/fsck.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2024 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package git - -import ( - "context" - "time" -) - -// Fsck verifies the connectivity and validity of the objects in the database -func Fsck(ctx context.Context, repoPath string, timeout time.Duration, args TrustedCmdArgs) error { - return NewCommand("fsck").AddArguments(args...).Run(ctx, &RunOpts{Timeout: timeout, Dir: repoPath}) -} diff --git a/modules/gitrepo/fsck.go b/modules/gitrepo/fsck.go new file mode 100644 index 0000000000000..bcec6aa03f1ec --- /dev/null +++ b/modules/gitrepo/fsck.go @@ -0,0 +1,16 @@ +// Copyright 2024 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package gitrepo + +import ( + "context" + "time" + + "code.gitea.io/gitea/modules/git" +) + +// Fsck verifies the connectivity and validity of the objects in the database +func Fsck(ctx context.Context, repo Repository, timeout time.Duration, args git.TrustedCmdArgs) error { + return git.NewCommand("fsck").AddArguments(args...).Run(ctx, &git.RunOpts{Timeout: timeout, Dir: repoPath(repo)}) +} diff --git a/modules/gitrepo/gitrepo.go b/modules/gitrepo/gitrepo.go index 5da65e2452704..005e9a220d5cc 100644 --- a/modules/gitrepo/gitrepo.go +++ b/modules/gitrepo/gitrepo.go @@ -81,3 +81,7 @@ func RenameRepository(ctx context.Context, repo, newRepo Repository) error { } return nil } + +func InitRepository(ctx context.Context, repo Repository, objectFormatName string) error { + return git.InitRepository(ctx, repoPath(repo), true, objectFormatName) +} diff --git a/services/migrations/gitea_uploader_test.go b/services/migrations/gitea_uploader_test.go index 1970c0550c427..7d096cc07ce38 100644 --- a/services/migrations/gitea_uploader_test.go +++ b/services/migrations/gitea_uploader_test.go @@ -236,6 +236,7 @@ func TestGiteaUploadUpdateGitForPullRequest(t *testing.T) { // fromRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) baseRef := "master" + // this is very different from the real situation. It should be a bare repository for all the Gitea managed repositories assert.NoError(t, git.InitRepository(git.DefaultContext, fromRepo.RepoPath(), false, fromRepo.ObjectFormatName)) err := git.NewCommand("symbolic-ref").AddDynamicArguments("HEAD", git.BranchPrefix+baseRef).Run(git.DefaultContext, &git.RunOpts{Dir: fromRepo.RepoPath()}) assert.NoError(t, err) diff --git a/services/repository/check.go b/services/repository/check.go index b475fbc487d29..afcabc0b874be 100644 --- a/services/repository/check.go +++ b/services/repository/check.go @@ -14,6 +14,7 @@ import ( system_model "code.gitea.io/gitea/models/system" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/gitrepo" "code.gitea.io/gitea/modules/log" repo_module "code.gitea.io/gitea/modules/repository" "code.gitea.io/gitea/modules/util" @@ -47,10 +48,9 @@ func GitFsckRepos(ctx context.Context, timeout time.Duration, args git.TrustedCm // GitFsckRepo calls 'git fsck' to check an individual repository's health. func GitFsckRepo(ctx context.Context, repo *repo_model.Repository, timeout time.Duration, args git.TrustedCmdArgs) error { - log.Trace("Running health check on repository %-v", repo) - repoPath := repo.RepoPath() - if err := git.Fsck(ctx, repoPath, timeout, args); err != nil { - log.Warn("Failed to health check repository (%-v): %v", repo, err) + log.Trace("Running health check on repository %-v", repo.FullName()) + if err := gitrepo.Fsck(ctx, repo, timeout, args); err != nil { + log.Warn("Failed to health check repository (%-v): %v", repo.FullName(), err) if err = system_model.CreateRepositoryNotice("Failed to health check repository (%s): %v", repo.FullName(), err); err != nil { log.Error("CreateRepositoryNotice: %v", err) } @@ -190,7 +190,7 @@ func ReinitMissingRepositories(ctx context.Context) error { default: } log.Trace("Initializing %d/%d...", repo.OwnerID, repo.ID) - if err := git.InitRepository(ctx, repo.RepoPath(), true, repo.ObjectFormatName); err != nil { + if err := gitrepo.InitRepository(ctx, repo, repo.ObjectFormatName); err != nil { log.Error("Unable (re)initialize repository %d at %s. Error: %v", repo.ID, repo.RepoPath(), err) if err2 := system_model.CreateRepositoryNotice("InitRepository [%d]: %v", repo.ID, err); err2 != nil { log.Error("CreateRepositoryNotice: %v", err2) diff --git a/services/repository/create.go b/services/repository/create.go index c4a9dbb1b6968..3599e2257861a 100644 --- a/services/repository/create.go +++ b/services/repository/create.go @@ -141,7 +141,7 @@ func prepareRepoCommit(ctx context.Context, repo *repo_model.Repository, tmpDir // InitRepository initializes README and .gitignore if needed. func initRepository(ctx context.Context, u *user_model.User, repo *repo_model.Repository, opts CreateRepoOptions) (err error) { // Init git bare new repository. - if err = git.InitRepository(ctx, repo.RepoPath(), true, repo.ObjectFormatName); err != nil { + if err = gitrepo.InitRepository(ctx, repo, repo.ObjectFormatName); err != nil { return fmt.Errorf("git.InitRepository: %w", err) } else if err = gitrepo.CreateDelegateHooks(ctx, repo); err != nil { return fmt.Errorf("createDelegateHooks: %w", err) diff --git a/services/repository/template.go b/services/repository/template.go index 95f585cead450..eaa153a6d6e8b 100644 --- a/services/repository/template.go +++ b/services/repository/template.go @@ -13,7 +13,6 @@ import ( issues_model "code.gitea.io/gitea/models/issues" repo_model "code.gitea.io/gitea/models/repo" user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/gitrepo" "code.gitea.io/gitea/modules/log" notify_service "code.gitea.io/gitea/services/notify" @@ -122,7 +121,7 @@ func GenerateRepository(ctx context.Context, doer, owner *user_model.User, templ } // 3 -Init git bare new repository. - if err = git.InitRepository(ctx, generateRepo.RepoPath(), true, generateRepo.ObjectFormatName); err != nil { + if err = gitrepo.InitRepository(ctx, generateRepo, generateRepo.ObjectFormatName); err != nil { return nil, fmt.Errorf("git.InitRepository: %w", err) } else if err = gitrepo.CreateDelegateHooks(ctx, generateRepo); err != nil { return nil, fmt.Errorf("createDelegateHooks: %w", err) diff --git a/services/wiki/wiki.go b/services/wiki/wiki.go index 45a08dc5d686d..aaaed65a65a95 100644 --- a/services/wiki/wiki.go +++ b/services/wiki/wiki.go @@ -39,7 +39,8 @@ func InitWiki(ctx context.Context, repo *repo_model.Repository) error { return nil } - if err := git.InitRepository(ctx, repo.WikiPath(), true, repo.ObjectFormatName); err != nil { + // wiki's object format should be the same as repository's + if err := gitrepo.InitRepository(ctx, repo.WikiStorageRepo(), repo.ObjectFormatName); err != nil { return fmt.Errorf("InitRepository: %w", err) } else if err = gitrepo.CreateDelegateHooks(ctx, repo.WikiStorageRepo()); err != nil { return fmt.Errorf("createDelegateHooks: %w", err)