From 9dc04289aac1e5444ce55a57ba1b2fa2e1efd617 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Tue, 21 Jul 2026 00:07:38 +0800 Subject: [PATCH] refactor: make git package handle all git operations (#38543) before: gitrepo vs git packages after: git package fully handle all git operations by the way, use `WithRepo(repo)` instead of `WithDir(repo.Path)` to hide path details. benefits: 1. remove all unnecessary wrappers, developers no need to struggle with "which package should be used" 2. simplify code, RepositoryFacade can (will) be used everywhere, all "path" details are (will be) hidden --- cmd/admin.go | 3 +- modelmigration/v1_12/v136.go | 4 +- modelmigration/v1_21/v276.go | 6 +- modelmigration/v1_9/v82.go | 3 +- models/activities/repo_activity.go | 5 +- models/git/commit_status_test.go | 4 +- models/renderhelper/commit_checker.go | 3 +- modules/{gitrepo => git}/archive.go | 9 +- modules/git/attribute/batch.go | 2 +- modules/git/attribute/checker.go | 2 +- modules/{gitrepo => git}/blame.go | 15 +- modules/{gitrepo => git}/blame_sha256_test.go | 7 +- modules/{gitrepo => git}/blame_test.go | 5 +- modules/{gitrepo => git}/branch.go | 29 ++- modules/git/clone.go | 24 +++ modules/git/commit.go | 6 +- modules/{gitrepo/commit.go => git/commit2.go} | 21 +- .../commit_test.go => git/commit2_test.go} | 2 +- modules/{gitrepo => git}/commit_file.go | 5 +- modules/{gitrepo => git}/commit_file_test.go | 2 +- modules/git/commit_sha256_test.go | 8 +- modules/git/commit_test.go | 8 +- modules/{gitrepo => git}/compare.go | 7 +- modules/{gitrepo => git}/compare_test.go | 2 +- .../config.go => git/config_managed.go} | 11 +- modules/git/diff.go | 4 +- modules/{gitrepo/diff.go => git/diff2.go} | 7 +- modules/{gitrepo => git}/fetch.go | 9 +- modules/{gitrepo => git}/fsck.go | 5 +- modules/git/git_test.go | 6 - modules/{gitrepo => git}/gitrepo.go | 15 +- modules/git/grep.go | 2 +- modules/git/grep_test.go | 5 +- modules/{gitrepo => git}/hooks.go | 12 +- ...stats_nogogit.go => language_stats_get.go} | 2 - .../git/languagestats/language_stats_gogit.go | 182 ------------------ .../git/languagestats/language_stats_test.go | 2 - modules/git/localfs.go | 71 +++++++ modules/{gitrepo => git}/main_test.go | 13 +- modules/{gitrepo => git}/merge.go | 5 +- modules/{gitrepo => git}/merge_tree.go | 5 +- modules/{gitrepo => git}/merge_tree_test.go | 2 +- modules/git/pipeline/catfile.go | 9 +- .../pipeline/{lfs_nogogit.go => lfs_find.go} | 6 +- modules/git/pipeline/lfs_gogit.go | 86 --------- modules/git/pipeline/namerev.go | 5 +- modules/git/push.go | 27 +++ modules/git/ref.go | 9 + .../remote.go => git/remote_managed.go} | 16 +- modules/git/repo.go | 62 +++++- modules/git/repo_base_nogogit.go | 57 ------ modules/git/repo_branch.go | 2 +- modules/git/repo_commit.go | 26 +-- modules/git/repo_commit_gogit.go | 2 +- modules/git/repo_commit_nogogit.go | 2 +- modules/git/repo_compare.go | 16 +- modules/git/repo_compare_test.go | 4 +- modules/git/repo_index.go | 14 +- modules/git/repo_object.go | 2 +- modules/git/repo_ref.go | 2 +- modules/git/repo_ref_nogogit.go | 2 +- modules/git/repo_stats.go | 4 +- modules/git/repo_tag.go | 10 +- modules/git/repo_tree.go | 2 +- modules/git/repo_tree_gogit.go | 2 +- modules/{gitrepo => git}/size.go | 8 +- modules/git/tag.go | 6 + modules/git/tree.go | 4 +- modules/git/tree_nogogit.go | 4 +- modules/gitrepo/clone.go | 24 --- modules/gitrepo/localfs.go | 74 ------- modules/gitrepo/push.go | 27 --- modules/gitrepo/ref.go | 19 -- modules/gitrepo/tag.go | 15 -- modules/indexer/code/indexer.go | 4 +- modules/indexer/stats/db.go | 3 +- modules/lfs/pointer_scanner_nogogit.go | 4 +- modules/repository/branch.go | 3 +- modules/repository/commits.go | 3 +- modules/repository/create.go | 4 +- modules/repository/create_test.go | 4 +- modules/repository/repo.go | 3 +- modules/repository/temp.go | 16 +- modules/templates/util_misc.go | 4 +- routers/api/v1/admin/adopt.go | 6 +- routers/api/v1/repo/branch.go | 3 +- routers/api/v1/repo/commits.go | 11 +- routers/api/v1/repo/compare.go | 4 +- routers/api/v1/repo/pull.go | 5 +- routers/api/v1/repo/pull_review.go | 4 +- routers/api/v1/repo/repo.go | 9 +- routers/api/v1/repo/wiki.go | 7 +- routers/api/v1/utils/git.go | 5 +- routers/private/default_branch.go | 4 +- routers/private/hook_post_receive.go | 7 +- routers/private/hook_verification.go | 4 +- routers/private/internal_repo.go | 4 +- routers/web/admin/repos.go | 4 +- routers/web/repo/actions/view.go | 3 +- routers/web/repo/blame.go | 19 +- routers/web/repo/branch.go | 3 +- routers/web/repo/commit.go | 7 +- routers/web/repo/compare.go | 5 +- routers/web/repo/editor_cherry_pick.go | 3 +- routers/web/repo/editor_test.go | 4 +- routers/web/repo/editor_util.go | 3 +- routers/web/repo/githttp.go | 7 +- routers/web/repo/issue_comment.go | 7 +- routers/web/repo/pull.go | 7 +- routers/web/repo/release.go | 3 +- routers/web/repo/setting/lfs.go | 5 +- routers/web/repo/setting/setting.go | 3 +- routers/web/repo/setting/settings_test.go | 4 +- routers/web/repo/view_home.go | 3 +- routers/web/repo/wiki.go | 9 +- routers/web/repo/wiki_test.go | 3 +- routers/web/shared/user/header.go | 3 +- routers/web/user/setting/adopt.go | 4 +- services/actions/commit_status_test.go | 3 +- services/actions/notifier_helper.go | 5 +- services/actions/reusable_workflow.go | 4 +- services/actions/scoped_workflow_cache.go | 4 +- services/automerge/automerge.go | 7 +- services/automergequeue/automergequeue.go | 4 +- services/context/api.go | 3 +- services/context/repo.go | 19 +- services/contexttest/context_tests.go | 5 +- services/convert/convert.go | 5 +- services/convert/git_commit.go | 3 +- services/convert/pull.go | 9 +- services/doctor/misc.go | 15 +- services/git/compare.go | 9 +- services/gitdiff/git_diff_tree.go | 2 +- services/gitdiff/gitdiff.go | 9 +- services/issue/comments.go | 4 +- services/issue/issue.go | 3 +- services/issue/pull.go | 5 +- services/markup/renderhelper_codepreview.go | 4 +- services/migrations/gitea_uploader.go | 13 +- services/mirror/mirror_pull.go | 21 +- services/mirror/mirror_push.go | 19 +- services/pull/check.go | 7 +- services/pull/comment.go | 9 +- services/pull/comment_test.go | 3 +- services/pull/commit_status.go | 6 +- services/pull/lfs.go | 7 +- services/pull/merge.go | 8 +- services/pull/merge_rebase.go | 9 +- services/pull/merge_tree.go | 11 +- services/pull/patch.go | 3 +- services/pull/pull.go | 21 +- services/pull/pull_test.go | 5 +- services/pull/review.go | 5 +- services/pull/temp_repo.go | 91 ++++----- services/pull/update.go | 6 +- services/pull/update_rebase.go | 2 +- services/release/notes_test.go | 8 +- services/release/release.go | 9 +- services/release/release_test.go | 8 +- services/repository/adopt.go | 20 +- services/repository/archiver/archiver.go | 5 +- services/repository/branch.go | 35 ++-- services/repository/cache.go | 3 +- services/repository/check.go | 8 +- .../repository/commitstatus/commitstatus.go | 3 +- services/repository/contributors_graph.go | 5 +- services/repository/create.go | 11 +- services/repository/delete.go | 6 +- services/repository/files/cherry_pick.go | 3 +- services/repository/files/content.go | 3 +- services/repository/files/patch.go | 3 +- services/repository/files/temp_repo.go | 9 +- services/repository/files/update.go | 3 +- services/repository/fork.go | 9 +- services/repository/generate.go | 7 +- services/repository/gitgraph/graph.go | 4 +- services/repository/hooks.go | 10 +- services/repository/init.go | 3 +- services/repository/lfs.go | 3 +- services/repository/license.go | 3 +- services/repository/merge_upstream.go | 3 +- services/repository/migrate.go | 25 ++- services/repository/push.go | 5 +- services/repository/repository.go | 12 +- services/repository/template.go | 8 +- services/repository/transfer.go | 18 +- services/wiki/wiki.go | 33 ++-- services/wiki/wiki_test.go | 11 +- .../actions_reusable_workflow_test.go | 4 +- tests/integration/actions_trigger_test.go | 22 +-- tests/integration/api_packages_cargo_test.go | 4 +- tests/integration/api_pull_review_test.go | 6 +- tests/integration/api_releases_test.go | 8 +- tests/integration/api_repo_edit_test.go | 6 +- .../integration/api_repo_file_create_test.go | 6 +- .../integration/api_repo_file_update_test.go | 4 +- .../integration/api_repo_files_change_test.go | 4 +- tests/integration/api_repo_files_get_test.go | 4 +- .../api_repo_get_contents_list_test.go | 4 +- .../integration/api_repo_get_contents_test.go | 4 +- tests/integration/api_repo_git_tags_test.go | 8 +- .../integration/change_default_branch_test.go | 8 +- tests/integration/compare_test.go | 4 +- tests/integration/editor_test.go | 3 +- .../git_helper_for_declarative_test.go | 2 +- tests/integration/git_misc_test.go | 5 +- tests/integration/migrate_test.go | 4 +- tests/integration/mirror_pull_test.go | 4 +- tests/integration/mirror_push_test.go | 10 +- tests/integration/pull_merge_test.go | 7 +- tests/integration/pull_review_test.go | 3 +- tests/integration/pull_update_test.go | 14 +- tests/integration/repo_webhook_test.go | 19 +- tests/integration/repofiles_change_test.go | 11 +- 214 files changed, 859 insertions(+), 1301 deletions(-) rename modules/{gitrepo => git}/archive.go (86%) rename modules/{gitrepo => git}/blame.go (89%) rename modules/{gitrepo => git}/blame_sha256_test.go (95%) rename modules/{gitrepo => git}/blame_test.go (96%) rename modules/{gitrepo => git}/branch.go (61%) create mode 100644 modules/git/clone.go rename modules/{gitrepo/commit.go => git/commit2.go} (68%) rename modules/{gitrepo/commit_test.go => git/commit2_test.go} (99%) rename modules/{gitrepo => git}/commit_file.go (92%) rename modules/{gitrepo => git}/commit_file_test.go (99%) rename modules/{gitrepo => git}/compare.go (86%) rename modules/{gitrepo => git}/compare_test.go (99%) rename modules/{gitrepo/config.go => git/config_managed.go} (65%) rename modules/{gitrepo/diff.go => git/diff2.go} (85%) rename modules/{gitrepo => git}/fetch.go (74%) rename modules/{gitrepo => git}/fsck.go (68%) rename modules/{gitrepo => git}/gitrepo.go (72%) rename modules/{gitrepo => git}/hooks.go (94%) rename modules/git/languagestats/{language_stats_nogogit.go => language_stats_get.go} (99%) delete mode 100644 modules/git/languagestats/language_stats_gogit.go create mode 100644 modules/git/localfs.go rename modules/{gitrepo => git}/main_test.go (57%) rename modules/{gitrepo => git}/merge.go (82%) rename modules/{gitrepo => git}/merge_tree.go (89%) rename modules/{gitrepo => git}/merge_tree_test.go (99%) rename modules/git/pipeline/{lfs_nogogit.go => lfs_find.go} (97%) delete mode 100644 modules/git/pipeline/lfs_gogit.go create mode 100644 modules/git/push.go rename modules/{gitrepo/remote.go => git/remote_managed.go} (63%) rename modules/{gitrepo => git}/size.go (79%) delete mode 100644 modules/gitrepo/clone.go delete mode 100644 modules/gitrepo/localfs.go delete mode 100644 modules/gitrepo/push.go delete mode 100644 modules/gitrepo/ref.go delete mode 100644 modules/gitrepo/tag.go diff --git a/cmd/admin.go b/cmd/admin.go index 14cdc81e37d..3cdc6eda789 100644 --- a/cmd/admin.go +++ b/cmd/admin.go @@ -11,7 +11,6 @@ import ( "gitea.dev/models/db" repo_model "gitea.dev/models/repo" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" repo_module "gitea.dev/modules/repository" @@ -129,7 +128,7 @@ func runRepoSyncReleases(ctx context.Context, _ *cli.Command) error { log.Trace("Processing next %d repos of %d", len(repos), count) for _, repo := range repos { log.Trace("Synchronizing repo %s", repo.FullName()) - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) if err != nil { log.Warn("OpenRepository: %v", err) continue diff --git a/modelmigration/v1_12/v136.go b/modelmigration/v1_12/v136.go index 069bcc6a52d..a7004b58bfc 100644 --- a/modelmigration/v1_12/v136.go +++ b/modelmigration/v1_12/v136.go @@ -10,7 +10,7 @@ import ( "gitea.dev/modelmigration/base" repo_model "gitea.dev/models/repo" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/graceful" "gitea.dev/modules/log" "gitea.dev/modules/setting" @@ -85,7 +85,7 @@ func AddCommitDivergenceToPulls(x base.EngineMigration) error { } repoStore := repo_model.CodeRepoByName(baseRepo.OwnerName, baseRepo.Name) gitRefName := fmt.Sprintf("refs/pull/%d/head", pr.Index) - divergence, err := gitrepo.GetDivergingCommits(graceful.GetManager().HammerContext(), repoStore, pr.BaseBranch, gitRefName) + divergence, err := git.GetDivergingCommits(graceful.GetManager().HammerContext(), repoStore, pr.BaseBranch, gitRefName) if err != nil { log.Warn("Could not recalculate Divergence for pull: %d", pr.ID) pr.CommitsAhead = 0 diff --git a/modelmigration/v1_21/v276.go b/modelmigration/v1_21/v276.go index 9bf4b939b4f..c0375eaf4bb 100644 --- a/modelmigration/v1_21/v276.go +++ b/modelmigration/v1_21/v276.go @@ -8,7 +8,7 @@ import ( "gitea.dev/modelmigration/base" repo_model "gitea.dev/models/repo" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/setting" ) @@ -160,11 +160,11 @@ func migratePushMirrors(x base.EngineMigration) error { func getRemoteAddress(ownerName, repoName, remoteName string) (string, error) { ctx := context.Background() repo := repo_model.CodeRepoByName(ownerName, repoName) - if exist, _ := gitrepo.IsRepositoryExist(ctx, repo); !exist { + if exist, _ := git.IsRepositoryExist(ctx, repo); !exist { return "", nil } - u, err := gitrepo.GitRemoteGetURL(ctx, repo, remoteName) + u, err := git.ParseRemoteAddressURL(ctx, repo, remoteName) if err != nil { return "", err } diff --git a/modelmigration/v1_9/v82.go b/modelmigration/v1_9/v82.go index 59a75b7ca55..44b58432ad7 100644 --- a/modelmigration/v1_9/v82.go +++ b/modelmigration/v1_9/v82.go @@ -10,7 +10,6 @@ import ( "gitea.dev/modelmigration/base" repo_model "gitea.dev/models/repo" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" ) func FixReleaseSha1OnReleaseTable(ctx context.Context, x base.EngineMigration) error { @@ -87,7 +86,7 @@ func FixReleaseSha1OnReleaseTable(ctx context.Context, x base.EngineMigration) e userCache[repo.OwnerID] = user } - gitRepo, err = gitrepo.OpenRepository(repo_model.CodeRepoByName(user.Name, repo.Name)) + gitRepo, err = git.OpenRepository(repo_model.CodeRepoByName(user.Name, repo.Name)) if err != nil { return err } diff --git a/models/activities/repo_activity.go b/models/activities/repo_activity.go index bce46eea6a8..c6f4bf2997b 100644 --- a/models/activities/repo_activity.go +++ b/models/activities/repo_activity.go @@ -14,7 +14,6 @@ import ( repo_model "gitea.dev/models/repo" user_model "gitea.dev/models/user" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "xorm.io/builder" ) @@ -67,7 +66,7 @@ func GetActivityStats(ctx context.Context, repo *repo_model.Repository, timeFrom return nil, fmt.Errorf("FillUnresolvedIssues: %w", err) } if code { - gitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, repo) + gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, repo) if err != nil { return nil, fmt.Errorf("OpenRepository: %w", err) } @@ -84,7 +83,7 @@ func GetActivityStats(ctx context.Context, repo *repo_model.Repository, timeFrom // GetActivityStatsTopAuthors returns top author stats for git commits for all branches func GetActivityStatsTopAuthors(ctx context.Context, repo *repo_model.Repository, timeFrom time.Time, count int) ([]*ActivityAuthorData, error) { - gitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, repo) + gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, repo) if err != nil { return nil, fmt.Errorf("OpenRepository: %w", err) } diff --git a/models/git/commit_status_test.go b/models/git/commit_status_test.go index ca6402be7d0..f4dcd38e345 100644 --- a/models/git/commit_status_test.go +++ b/models/git/commit_status_test.go @@ -15,7 +15,7 @@ import ( "gitea.dev/models/unittest" user_model "gitea.dev/models/user" "gitea.dev/modules/commitstatus" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "github.com/stretchr/testify/assert" ) @@ -186,7 +186,7 @@ func TestFindRepoRecentCommitStatusContexts(t *testing.T) { repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}) user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - gitRepo, err := gitrepo.OpenRepository(repo2) + gitRepo, err := git.OpenRepository(repo2) assert.NoError(t, err) defer gitRepo.Close() diff --git a/models/renderhelper/commit_checker.go b/models/renderhelper/commit_checker.go index 1a5eeb31a5d..91a7e7b01ed 100644 --- a/models/renderhelper/commit_checker.go +++ b/models/renderhelper/commit_checker.go @@ -9,7 +9,6 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" ) @@ -40,7 +39,7 @@ func (c *commitChecker) IsCommitIDExisting(commitID string) bool { } if c.gitRepo == nil { - r, closer, err := gitrepo.RepositoryFromContextOrOpen(c.ctx, c.repo) + r, closer, err := git.RepositoryFromContextOrOpen(c.ctx, c.repo) if err != nil { log.Error("Unable to open repository: %s, error: %v", c.repo.FullName(), err) return false diff --git a/modules/gitrepo/archive.go b/modules/git/archive.go similarity index 86% rename from modules/gitrepo/archive.go rename to modules/git/archive.go index 10b22236545..b8174933938 100644 --- a/modules/gitrepo/archive.go +++ b/modules/git/archive.go @@ -1,7 +1,7 @@ // Copyright 2025 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package gitrepo +package git import ( "context" @@ -12,13 +12,12 @@ import ( "path/filepath" "strings" - "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" "gitea.dev/modules/setting" ) // CreateArchive create archive content to the target path -func CreateArchive(ctx context.Context, repo git.RepositoryFacade, repoName, format string, target io.Writer, commitID string, paths []string) error { +func CreateArchive(ctx context.Context, repo RepositoryFacade, repoName, format string, target io.Writer, commitID string, paths []string) error { if format == "unknown" { return fmt.Errorf("unknown format: %v", format) } @@ -38,7 +37,7 @@ func CreateArchive(ctx context.Context, repo git.RepositoryFacade, repoName, for } // CreateBundle create bundle content to the target path -func CreateBundle(ctx context.Context, repo git.RepositoryFacade, commit string, out io.Writer) error { +func CreateBundle(ctx context.Context, repo RepositoryFacade, commit string, out io.Writer) error { // TODO: use the following steps instead of creating a temp file, also need to iterate and clean up outdated refs // git update-ref refs/bundle/temp-{timestamp} {commit} // git bundle create - refs/bundle/temp-{timestamp} @@ -49,7 +48,7 @@ func CreateBundle(ctx context.Context, repo git.RepositoryFacade, commit string, } defer cleanup() - env := append(os.Environ(), "GIT_OBJECT_DIRECTORY="+filepath.Join(repoPath(repo), "objects")) + env := append(os.Environ(), "GIT_OBJECT_DIRECTORY="+filepath.Join(gitcmd.RepoLocalPath(repo), "objects")) _, _, err = gitcmd.NewCommand("init", "--bare").WithDir(tmp).WithEnv(env).RunStdString(ctx) if err != nil { return err diff --git a/modules/git/attribute/batch.go b/modules/git/attribute/batch.go index 1e596077077..cfe43269f8b 100644 --- a/modules/git/attribute/batch.go +++ b/modules/git/attribute/batch.go @@ -69,7 +69,7 @@ func NewBatchChecker(ctx context.Context, repo *git.Repository, treeish string, checker.stdOut = lw cmd.WithEnv(envs). - WithDir(repo.Path). + WithRepo(repo). WithStdoutCopy(lw) go func() { diff --git a/modules/git/attribute/checker.go b/modules/git/attribute/checker.go index f4d3e23c9c8..c0bc19ee265 100644 --- a/modules/git/attribute/checker.go +++ b/modules/git/attribute/checker.go @@ -69,7 +69,7 @@ func CheckAttributes(ctx context.Context, gitRepo *git.Repository, treeish strin defer cancel() stdout, _, err := cmd.WithEnv(append(os.Environ(), envs...)). - WithDir(gitRepo.Path). + WithRepo(gitRepo). RunStdBytes(ctx) if err != nil { return nil, fmt.Errorf("failed to run check-attr: %w", err) diff --git a/modules/gitrepo/blame.go b/modules/git/blame.go similarity index 89% rename from modules/gitrepo/blame.go rename to modules/git/blame.go index 98b0150ccc3..6ef59dc824d 100644 --- a/modules/gitrepo/blame.go +++ b/modules/git/blame.go @@ -1,7 +1,7 @@ // Copyright 2025 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package gitrepo +package git import ( "bufio" @@ -9,12 +9,11 @@ import ( "context" "io" - "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" "gitea.dev/modules/setting" ) -func LineBlame(ctx context.Context, repo git.RepositoryFacade, revision, file string, line uint) (string, error) { +func LineBlame(ctx context.Context, repo RepositoryFacade, revision, file string, line uint) (string, error) { stdout, _, err := gitcmd.NewCommand("blame").WithRepo(repo). AddOptionFormat("-L %d,%d", line, line). AddOptionValues("-p", revision). @@ -37,7 +36,7 @@ type BlameReader struct { done chan error lastSha *string ignoreRevsFile string - objectFormat git.ObjectFormat + objectFormat ObjectFormat cleanupFuncs []func() } @@ -139,7 +138,7 @@ func (r *BlameReader) cleanup() { } // CreateBlameReader creates reader for given git.RepositoryFacade, commit and file -func CreateBlameReader(ctx context.Context, objectFormat git.ObjectFormat, repo git.RepositoryFacade, gitRepo *git.Repository, commit *git.Commit, file string, bypassBlameIgnore bool) (rd *BlameReader, retErr error) { +func CreateBlameReader(ctx context.Context, objectFormat ObjectFormat, repo RepositoryFacade, gitRepo *Repository, commit *Commit, file string, bypassBlameIgnore bool) (rd *BlameReader, retErr error) { defer func() { if retErr != nil { rd.cleanup() @@ -157,9 +156,9 @@ func CreateBlameReader(ctx context.Context, objectFormat git.ObjectFormat, repo rd.bufferedReader = bufio.NewReader(stdoutReader) rd.cleanupFuncs = append(rd.cleanupFuncs, stdoutReaderClose) - if git.DefaultFeatures().CheckVersionAtLeast("2.23") && !bypassBlameIgnore { + if DefaultFeatures().CheckVersionAtLeast("2.23") && !bypassBlameIgnore { ignoreRevsFileName, ignoreRevsFileCleanup, err := tryCreateBlameIgnoreRevsFile(ctx, gitRepo, commit) - if err != nil && !git.IsErrNotExist(err) { + if err != nil && !IsErrNotExist(err) { return nil, err } else if err == nil { rd.ignoreRevsFile = ignoreRevsFileName @@ -180,7 +179,7 @@ func CreateBlameReader(ctx context.Context, objectFormat git.ObjectFormat, repo return rd, nil } -func tryCreateBlameIgnoreRevsFile(ctx context.Context, gitRepo *git.Repository, commit *git.Commit) (string, func(), error) { +func tryCreateBlameIgnoreRevsFile(ctx context.Context, gitRepo *Repository, commit *Commit) (string, func(), error) { entry, err := commit.GetTreeEntryByPath(ctx, gitRepo, ".git-blame-ignore-revs") if err != nil { return "", nil, err diff --git a/modules/gitrepo/blame_sha256_test.go b/modules/git/blame_sha256_test.go similarity index 95% rename from modules/gitrepo/blame_sha256_test.go rename to modules/git/blame_sha256_test.go index 274cded9297..09b5ade4353 100644 --- a/modules/gitrepo/blame_sha256_test.go +++ b/modules/git/blame_sha256_test.go @@ -1,13 +1,12 @@ // Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package gitrepo +package git import ( "context" "testing" - "gitea.dev/modules/git" "gitea.dev/modules/setting" "github.com/stretchr/testify/assert" @@ -18,7 +17,7 @@ func TestReadingBlameOutputSha256(t *testing.T) { ctx, cancel := context.WithCancel(t.Context()) defer cancel() - if git.DefaultFeatures().UsingGogit { + if DefaultFeatures().UsingGogit { t.Skip("Skipping test since gogit does not support sha256") return } @@ -49,7 +48,7 @@ func TestReadingBlameOutputSha256(t *testing.T) { } for _, bypass := range []bool{false, true} { - blameReader, err := CreateBlameReader(ctx, git.Sha256ObjectFormat, storage, repo, commit, "README.md", bypass) + blameReader, err := CreateBlameReader(ctx, Sha256ObjectFormat, storage, repo, commit, "README.md", bypass) assert.NoError(t, err) assert.NotNil(t, blameReader) defer blameReader.Close() diff --git a/modules/gitrepo/blame_test.go b/modules/git/blame_test.go similarity index 96% rename from modules/gitrepo/blame_test.go rename to modules/git/blame_test.go index 6b658512441..eb2234c15ca 100644 --- a/modules/gitrepo/blame_test.go +++ b/modules/git/blame_test.go @@ -1,13 +1,12 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package gitrepo +package git import ( "context" "testing" - "gitea.dev/modules/git" "gitea.dev/modules/setting" "github.com/stretchr/testify/assert" @@ -43,7 +42,7 @@ func TestReadingBlameOutput(t *testing.T) { } for _, bypass := range []bool{false, true} { - blameReader, err := CreateBlameReader(ctx, git.Sha1ObjectFormat, storage, repo, commit, "README.md", bypass) + blameReader, err := CreateBlameReader(ctx, Sha1ObjectFormat, storage, repo, commit, "README.md", bypass) assert.NoError(t, err) assert.NotNil(t, blameReader) defer blameReader.Close() diff --git a/modules/gitrepo/branch.go b/modules/git/branch.go similarity index 61% rename from modules/gitrepo/branch.go rename to modules/git/branch.go index 87cf4faea35..98e6cae1218 100644 --- a/modules/gitrepo/branch.go +++ b/modules/git/branch.go @@ -1,20 +1,19 @@ // Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package gitrepo +package git import ( "context" "errors" "strings" - "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" ) // GetBranchesByPath returns a branch by its path // if limit = 0 it will not limit -func GetBranchesByPath(ctx context.Context, repo git.RepositoryFacade, skip, limit int) ([]string, int, error) { +func GetBranchesByPath(ctx context.Context, repo RepositoryFacade, skip, limit int) ([]string, int, error) { gitRepo, err := OpenRepository(repo) if err != nil { return nil, 0, err @@ -24,7 +23,7 @@ func GetBranchesByPath(ctx context.Context, repo git.RepositoryFacade, skip, lim return gitRepo.GetBranchNames(ctx, skip, limit) } -func GetBranchCommitID(ctx context.Context, repo git.RepositoryFacade, branch string) (string, error) { +func GetBranchCommitID(ctx context.Context, repo RepositoryFacade, branch string) (string, error) { gitRepo, err := OpenRepository(repo) if err != nil { return "", err @@ -35,38 +34,38 @@ func GetBranchCommitID(ctx context.Context, repo git.RepositoryFacade, branch st } // SetDefaultBranch sets default branch of repository. -func SetDefaultBranch(ctx context.Context, repo git.RepositoryFacade, name string) error { +func SetDefaultBranch(ctx context.Context, repo RepositoryFacade, name string) error { _, _, err := gitcmd.NewCommand("symbolic-ref", "HEAD"). - AddDynamicArguments(git.BranchPrefix + name).WithRepo(repo).RunStdString(ctx) + AddDynamicArguments(BranchPrefix + name).WithRepo(repo).RunStdString(ctx) return err } // GetDefaultBranch gets default branch of repository. -func GetDefaultBranch(ctx context.Context, repo git.RepositoryFacade) (string, error) { +func GetDefaultBranch(ctx context.Context, repo RepositoryFacade) (string, error) { stdout, _, err := gitcmd.NewCommand("symbolic-ref", "HEAD").WithRepo(repo).RunStdString(ctx) if err != nil { return "", err } stdout = strings.TrimSpace(stdout) - if !strings.HasPrefix(stdout, git.BranchPrefix) { + if !strings.HasPrefix(stdout, BranchPrefix) { return "", errors.New("the HEAD is not a branch: " + stdout) } - return strings.TrimPrefix(stdout, git.BranchPrefix), nil + return strings.TrimPrefix(stdout, BranchPrefix), nil } // IsReferenceExist returns true if given reference exists in the repository. -func IsReferenceExist(ctx context.Context, repo git.RepositoryFacade, name string) bool { +func IsReferenceExist(ctx context.Context, repo RepositoryFacade, name string) bool { _, _, err := gitcmd.NewCommand("show-ref", "--verify").AddDashesAndList(name).WithRepo(repo).RunStdString(ctx) return err == nil } // IsBranchExist returns true if given branch exists in the repository. -func IsBranchExist(ctx context.Context, repo git.RepositoryFacade, name string) bool { - return IsReferenceExist(ctx, repo, git.BranchPrefix+name) +func IsBranchExist(ctx context.Context, repo RepositoryFacade, name string) bool { + return IsReferenceExist(ctx, repo, BranchPrefix+name) } // DeleteBranch delete a branch by name on repository. -func DeleteBranch(ctx context.Context, repo git.RepositoryFacade, name string, force bool) error { +func DeleteBranch(ctx context.Context, repo RepositoryFacade, name string, force bool) error { cmd := gitcmd.NewCommand("branch") if force { @@ -81,7 +80,7 @@ func DeleteBranch(ctx context.Context, repo git.RepositoryFacade, name string, f } // CreateBranch create a new branch -func CreateBranch(ctx context.Context, repo git.RepositoryFacade, branch, oldbranchOrCommit string) error { +func CreateBranch(ctx context.Context, repo RepositoryFacade, branch, oldbranchOrCommit string) error { cmd := gitcmd.NewCommand("branch") cmd.AddDashesAndList(branch, oldbranchOrCommit) @@ -90,7 +89,7 @@ func CreateBranch(ctx context.Context, repo git.RepositoryFacade, branch, oldbra } // RenameBranch rename a branch -func RenameBranch(ctx context.Context, repo git.RepositoryFacade, from, to string) error { +func RenameBranch(ctx context.Context, repo RepositoryFacade, from, to string) error { _, _, err := gitcmd.NewCommand("branch", "-m").AddDynamicArguments(from, to).WithRepo(repo).RunStdString(ctx) return err } diff --git a/modules/git/clone.go b/modules/git/clone.go new file mode 100644 index 00000000000..9c30a0cbfe0 --- /dev/null +++ b/modules/git/clone.go @@ -0,0 +1,24 @@ +// Copyright 2025 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package git + +import ( + "context" + + "gitea.dev/modules/git/gitcmd" +) + +// CloneExternalRepo clones an external repository to the managed repository. +func CloneExternalRepo(ctx context.Context, fromRemoteURL string, toRepo RepositoryFacade, opts CloneRepoOptions) error { + return Clone(ctx, fromRemoteURL, gitcmd.RepoLocalPath(toRepo), opts) +} + +// CloneRepoToLocal clones a managed repository to a local path. +func CloneRepoToLocal(ctx context.Context, fromRepo RepositoryFacade, toLocalPath string, opts CloneRepoOptions) error { + return Clone(ctx, gitcmd.RepoLocalPath(fromRepo), toLocalPath, opts) +} + +func CloneManaged(ctx context.Context, fromRepo, toRepo RepositoryFacade, opts CloneRepoOptions) error { + return Clone(ctx, gitcmd.RepoLocalPath(fromRepo), gitcmd.RepoLocalPath(toRepo), opts) +} diff --git a/modules/git/commit.go b/modules/git/commit.go index 3e46987aae8..bd19332b827 100644 --- a/modules/git/commit.go +++ b/modules/git/commit.go @@ -112,7 +112,7 @@ func (c *Commit) HasPreviousCommit(ctx context.Context, gitRepo *Repository, obj _, _, err := gitcmd.NewCommand("merge-base", "--is-ancestor"). AddDynamicArguments(that, this). - WithDir(gitRepo.Path). + WithRepo(gitRepo). RunStdString(ctx) if err == nil { return true, nil @@ -239,10 +239,10 @@ func (c *Commit) GetFileContent(ctx context.Context, gitRepo *Repository, filena } // GetFullCommitID returns full length (40) of commit ID by given short SHA in a repository. -func GetFullCommitID(ctx context.Context, repoPath, shortID string) (string, error) { +func GetFullCommitID(ctx context.Context, repo RepositoryFacade, shortID string) (string, error) { commitID, _, err := gitcmd.NewCommand("rev-parse"). AddDynamicArguments(shortID). - WithDir(repoPath). + WithRepo(repo). RunStdString(ctx) if err != nil { if gitcmd.IsErrorExitCode(err, 128) { diff --git a/modules/gitrepo/commit.go b/modules/git/commit2.go similarity index 68% rename from modules/gitrepo/commit.go rename to modules/git/commit2.go index d71bb270562..46d3e47932e 100644 --- a/modules/gitrepo/commit.go +++ b/modules/git/commit2.go @@ -1,7 +1,7 @@ // Copyright 2025 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package gitrepo +package git import ( "context" @@ -9,7 +9,6 @@ import ( "strings" "time" - "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" ) @@ -23,7 +22,7 @@ type CommitsCountOptions struct { } // CommitsCount returns number of total commits of until given revision. -func CommitsCount(ctx context.Context, repo git.RepositoryFacade, opts CommitsCountOptions) (int64, error) { +func CommitsCount(ctx context.Context, repo RepositoryFacade, opts CommitsCountOptions) (int64, error) { cmd := gitcmd.NewCommand("rev-list", "--count") cmd.AddDynamicArguments(opts.Revision...) @@ -53,7 +52,7 @@ func CommitsCount(ctx context.Context, repo git.RepositoryFacade, opts CommitsCo } // FileCommitsCount return the number of files at a revision -func FileCommitsCount(ctx context.Context, repo git.RepositoryFacade, revision, file string) (int64, error) { +func FileCommitsCount(ctx context.Context, repo RepositoryFacade, revision, file string) (int64, error) { return CommitsCount(ctx, repo, CommitsCountOptions{ Revision: []string{revision}, @@ -62,17 +61,17 @@ func FileCommitsCount(ctx context.Context, repo git.RepositoryFacade, revision, } // CommitsCountOfCommit returns number of total commits of until current revision. -func CommitsCountOfCommit(ctx context.Context, repo git.RepositoryFacade, commitID string) (int64, error) { +func CommitsCountOfCommit(ctx context.Context, repo RepositoryFacade, commitID string) (int64, error) { return CommitsCount(ctx, repo, CommitsCountOptions{ Revision: []string{commitID}, }) } // AllCommitsCount returns count of all commits in repository -func AllCommitsCount(ctx context.Context, repo git.RepositoryFacade, hidePRRefs bool, files ...string) (int64, error) { +func AllCommitsCount(ctx context.Context, repo RepositoryFacade, hidePRRefs bool, files ...string) (int64, error) { cmd := gitcmd.NewCommand("rev-list") if hidePRRefs { - cmd.AddArguments("--exclude=" + git.PullPrefix + "*") + cmd.AddArguments("--exclude=" + PullPrefix + "*") } cmd.AddArguments("--all", "--count") if len(files) > 0 { @@ -87,13 +86,9 @@ func AllCommitsCount(ctx context.Context, repo git.RepositoryFacade, hidePRRefs return strconv.ParseInt(strings.TrimSpace(stdout), 10, 64) } -func GetFullCommitID(ctx context.Context, repo git.RepositoryFacade, shortID string) (string, error) { - return git.GetFullCommitID(ctx, repoPath(repo), shortID) -} - // GetLatestCommitTime returns time for latest commit in repository (across all branches) -func GetLatestCommitTime(ctx context.Context, repo git.RepositoryFacade) (time.Time, error) { - stdout, _, err := gitcmd.NewCommand("for-each-ref", "--sort=-committerdate", git.BranchPrefix, "--count", "1", "--format=%(committerdate)").WithRepo(repo).RunStdString(ctx) +func GetLatestCommitTime(ctx context.Context, repo RepositoryFacade) (time.Time, error) { + stdout, _, err := gitcmd.NewCommand("for-each-ref", "--sort=-committerdate", BranchPrefix, "--count", "1", "--format=%(committerdate)").WithRepo(repo).RunStdString(ctx) if err != nil { return time.Time{}, err } diff --git a/modules/gitrepo/commit_test.go b/modules/git/commit2_test.go similarity index 99% rename from modules/gitrepo/commit_test.go rename to modules/git/commit2_test.go index c742b17f9c1..eb5bee4808e 100644 --- a/modules/gitrepo/commit_test.go +++ b/modules/git/commit2_test.go @@ -1,7 +1,7 @@ // Copyright 2025 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package gitrepo +package git import ( "testing" diff --git a/modules/gitrepo/commit_file.go b/modules/git/commit_file.go similarity index 92% rename from modules/gitrepo/commit_file.go rename to modules/git/commit_file.go index 33983fef94c..ff1562f884b 100644 --- a/modules/gitrepo/commit_file.go +++ b/modules/git/commit_file.go @@ -1,14 +1,13 @@ // Copyright 2025 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package gitrepo +package git import ( "bufio" "context" "io" - "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" "gitea.dev/modules/log" ) @@ -67,7 +66,7 @@ func parseCommitFileStatus(fileStatus *CommitFileStatus, stdout io.Reader) { } // GetCommitFileStatus returns file status of commit in given repository. -func GetCommitFileStatus(ctx context.Context, repo git.RepositoryFacade, commitID string) (*CommitFileStatus, error) { +func GetCommitFileStatus(ctx context.Context, repo RepositoryFacade, commitID string) (*CommitFileStatus, error) { cmd := gitcmd.NewCommand("log", "--name-status", "-m", "--pretty=format:", "--first-parent", "--no-renames", "-z", "-1") stdout, stdoutClose := cmd.MakeStdoutPipe() defer stdoutClose() diff --git a/modules/gitrepo/commit_file_test.go b/modules/git/commit_file_test.go similarity index 99% rename from modules/gitrepo/commit_file_test.go rename to modules/git/commit_file_test.go index f0dd9320829..d595958c13d 100644 --- a/modules/gitrepo/commit_file_test.go +++ b/modules/git/commit_file_test.go @@ -1,7 +1,7 @@ // Copyright 2025 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package gitrepo +package git import ( "strings" diff --git a/modules/git/commit_sha256_test.go b/modules/git/commit_sha256_test.go index 98859fc7b4a..82740a9b77f 100644 --- a/modules/git/commit_sha256_test.go +++ b/modules/git/commit_sha256_test.go @@ -15,17 +15,13 @@ import ( ) func TestGetFullCommitIDSha256(t *testing.T) { - bareRepo1Path := filepath.Join(testReposDir, "repo1_bare_sha256") - - id, err := GetFullCommitID(t.Context(), bareRepo1Path, "f004f4") + id, err := GetFullCommitID(t.Context(), mockRepository("repo1_bare_sha256"), "f004f4") assert.NoError(t, err) assert.Equal(t, "f004f41359117d319dedd0eaab8c5259ee2263da839dcba33637997458627fdc", id) } func TestGetFullCommitIDErrorSha256(t *testing.T) { - bareRepo1Path := filepath.Join(testReposDir, "repo1_bare_sha256") - - id, err := GetFullCommitID(t.Context(), bareRepo1Path, "unknown") + id, err := GetFullCommitID(t.Context(), mockRepository("repo1_bare_sha256"), "unknown") assert.Empty(t, id) if assert.Error(t, err) { assert.EqualError(t, err, "object does not exist [id: unknown, rel_path: ]") diff --git a/modules/git/commit_test.go b/modules/git/commit_test.go index 6a148756cc8..1ad82b1d748 100644 --- a/modules/git/commit_test.go +++ b/modules/git/commit_test.go @@ -14,17 +14,13 @@ import ( ) func TestGetFullCommitID(t *testing.T) { - bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") - - id, err := GetFullCommitID(t.Context(), bareRepo1Path, "8006ff9a") + id, err := GetFullCommitID(t.Context(), mockRepository("repo1_bare"), "8006ff9a") assert.NoError(t, err) assert.Equal(t, "8006ff9adbf0cb94da7dad9e537e53817f9fa5c0", id) } func TestGetFullCommitIDError(t *testing.T) { - bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") - - id, err := GetFullCommitID(t.Context(), bareRepo1Path, "unknown") + id, err := GetFullCommitID(t.Context(), mockRepository("repo1_bare"), "unknown") assert.Empty(t, id) if assert.Error(t, err) { assert.EqualError(t, err, "object does not exist [id: unknown, rel_path: ]") diff --git a/modules/gitrepo/compare.go b/modules/git/compare.go similarity index 86% rename from modules/gitrepo/compare.go rename to modules/git/compare.go index 8cce2d0a05c..90e98986e74 100644 --- a/modules/gitrepo/compare.go +++ b/modules/git/compare.go @@ -1,7 +1,7 @@ // Copyright 2025 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package gitrepo +package git import ( "context" @@ -9,7 +9,6 @@ import ( "strconv" "strings" - "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" ) @@ -20,7 +19,7 @@ type DivergeObject struct { } // GetDivergingCommits returns the number of commits a targetBranch is ahead or behind a baseBranch -func GetDivergingCommits(ctx context.Context, repo git.RepositoryFacade, baseBranch, targetBranch string) (*DivergeObject, error) { +func GetDivergingCommits(ctx context.Context, repo RepositoryFacade, baseBranch, targetBranch string) (*DivergeObject, error) { cmd := gitcmd.NewCommand("rev-list", "--count", "--left-right"). AddDynamicArguments(baseBranch + "..." + targetBranch).AddArguments("--") stdout, _, err1 := cmd.WithRepo(repo).RunStdString(ctx) @@ -46,7 +45,7 @@ func GetDivergingCommits(ctx context.Context, repo git.RepositoryFacade, baseBra // GetCommitIDsBetweenReverse returns the last commit IDs between two commits in reverse order (from old to new) with limit. // If the result exceeds the limit, the old commits IDs will be ignored -func GetCommitIDsBetweenReverse(ctx context.Context, repo git.RepositoryFacade, startRef, endRef, notRef string, limit int) ([]string, error) { +func GetCommitIDsBetweenReverse(ctx context.Context, repo RepositoryFacade, startRef, endRef, notRef string, limit int) ([]string, error) { genCmd := func(reversions ...string) *gitcmd.Command { cmd := gitcmd.NewCommand("rev-list", "--reverse"). AddArguments("-n").AddDynamicArguments(strconv.Itoa(limit)). diff --git a/modules/gitrepo/compare_test.go b/modules/git/compare_test.go similarity index 99% rename from modules/gitrepo/compare_test.go rename to modules/git/compare_test.go index 3808417ba5a..64ac71f2858 100644 --- a/modules/gitrepo/compare_test.go +++ b/modules/git/compare_test.go @@ -1,7 +1,7 @@ // Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package gitrepo +package git import ( "path/filepath" diff --git a/modules/gitrepo/config.go b/modules/git/config_managed.go similarity index 65% rename from modules/gitrepo/config.go rename to modules/git/config_managed.go index 2c79d1ee9fa..92e637e2801 100644 --- a/modules/gitrepo/config.go +++ b/modules/git/config_managed.go @@ -1,18 +1,17 @@ // Copyright 2025 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package gitrepo +package git import ( "context" - "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" ) // ManagedConfigAdd add a git configuration key to a specific value for the given repository. -func ManagedConfigAdd(ctx context.Context, repo git.RepositoryFacade, key, value string) error { - return git.LockConfigAndDo(ctx, repo, func(ctx context.Context) error { +func ManagedConfigAdd(ctx context.Context, repo RepositoryFacade, key, value string) error { + return LockConfigAndDo(ctx, repo, func(ctx context.Context) error { _, _, err := gitcmd.NewCommand("config", "--add"). AddDynamicArguments(key, value).WithRepo(repo).RunStdString(ctx) return err @@ -22,8 +21,8 @@ func ManagedConfigAdd(ctx context.Context, repo git.RepositoryFacade, key, value // ManagedConfigSet updates a git configuration key to a specific value for the given repository. // If the key does not exist, it will be created. // If the key exists, it will be updated to the new value. -func ManagedConfigSet(ctx context.Context, repo git.RepositoryFacade, key, value string) error { - return git.LockConfigAndDo(ctx, repo, func(ctx context.Context) error { +func ManagedConfigSet(ctx context.Context, repo RepositoryFacade, key, value string) error { + return LockConfigAndDo(ctx, repo, func(ctx context.Context) error { _, _, err := gitcmd.NewCommand("config"). AddDynamicArguments(key, value).WithRepo(repo).RunStdString(ctx) return err diff --git a/modules/git/diff.go b/modules/git/diff.go index fbe3988ac69..7b85532f38c 100644 --- a/modules/git/diff.go +++ b/modules/git/diff.go @@ -65,7 +65,7 @@ func getRepoRawDiffForFileCmd(ctx context.Context, repo *Repository, startCommit files = append(files, file) } - cmd := gitcmd.NewCommand().WithDir(repo.Path) + cmd := gitcmd.NewCommand().WithRepo(repo) switch diffType { case RawDiffNormal: if len(startCommit) != 0 { @@ -310,7 +310,7 @@ func GetAffectedFiles(ctx context.Context, repo *Repository, branchName, oldComm cmd := gitcmd.NewCommand("diff", "--name-only").AddDynamicArguments(oldCommitID, newCommitID) stdoutReader, stdoutReaderClose := cmd.MakeStdoutPipe() defer stdoutReaderClose() - err := cmd.WithEnv(env).WithDir(repo.Path). + err := cmd.WithEnv(env).WithRepo(repo). WithPipelineFunc(func(ctx gitcmd.Context) error { // Now scan the output from the command scanner := bufio.NewScanner(stdoutReader) diff --git a/modules/gitrepo/diff.go b/modules/git/diff2.go similarity index 85% rename from modules/gitrepo/diff.go rename to modules/git/diff2.go index 14880cb1593..d7ce47c2124 100644 --- a/modules/gitrepo/diff.go +++ b/modules/git/diff2.go @@ -1,7 +1,7 @@ // Copyright 2025 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package gitrepo +package git import ( "context" @@ -10,13 +10,12 @@ import ( "regexp" "strconv" - "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" ) // GetDiffShortStatByCmdArgs counts number of changed files, number of additions and deletions // TODO: it can be merged with another "GetDiffShortStat" in the future -func GetDiffShortStatByCmdArgs(ctx context.Context, repo git.RepositoryFacade, trustedArgs gitcmd.TrustedCmdArgs, dynamicArgs ...string) (numFiles, totalAdditions, totalDeletions int, err error) { +func GetDiffShortStatByCmdArgs(ctx context.Context, repo RepositoryFacade, trustedArgs gitcmd.TrustedCmdArgs, dynamicArgs ...string) (numFiles, totalAdditions, totalDeletions int, err error) { // Now if we call: // $ git diff --shortstat 1ebb35b98889ff77299f24d82da426b434b0cca0...788b8b1440462d477f45b0088875 // we get: @@ -64,7 +63,7 @@ func parseDiffStat(stdout string) (numFiles, totalAdditions, totalDeletions int, } // GetReverseRawDiff dumps the reverse diff results of repository in given commit ID to io.Writer. -func GetReverseRawDiff(ctx context.Context, repo git.RepositoryFacade, commitID string, writer io.Writer) error { +func GetReverseRawDiff(ctx context.Context, repo RepositoryFacade, commitID string, writer io.Writer) error { return gitcmd.NewCommand("show", "--pretty=format:revert %H%n", "-R"). AddDynamicArguments(commitID). WithStdoutCopy(writer). diff --git a/modules/gitrepo/fetch.go b/modules/git/fetch.go similarity index 74% rename from modules/gitrepo/fetch.go rename to modules/git/fetch.go index c7efb3e16d5..e370655fd92 100644 --- a/modules/gitrepo/fetch.go +++ b/modules/git/fetch.go @@ -1,12 +1,11 @@ // Copyright 2025 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package gitrepo +package git import ( "context" - "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" ) @@ -19,10 +18,10 @@ import ( // // This behavior is sufficient for temporary operations, such as determining the // merge base between commits. -func FetchRemoteCommit(ctx context.Context, repo, remoteRepo git.RepositoryFacade, commitID string) error { - return git.LockWriteAndDo(ctx, repo, func(ctx context.Context) error { +func FetchRemoteCommit(ctx context.Context, repo, remoteRepo RepositoryFacade, commitID string) error { + return LockWriteAndDo(ctx, repo, func(ctx context.Context) error { return gitcmd.NewCommand("fetch", "--no-tags"). - AddDynamicArguments(repoPath(remoteRepo)). + AddDynamicArguments(gitcmd.RepoLocalPath(remoteRepo)). AddDynamicArguments(commitID). WithRepo(repo).Run(ctx) }) diff --git a/modules/gitrepo/fsck.go b/modules/git/fsck.go similarity index 68% rename from modules/gitrepo/fsck.go rename to modules/git/fsck.go index 9cc8bd439bb..7bdccf35e0e 100644 --- a/modules/gitrepo/fsck.go +++ b/modules/git/fsck.go @@ -1,17 +1,16 @@ // Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package gitrepo +package git import ( "context" "time" - "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" ) // Fsck verifies the connectivity and validity of the objects in the database -func Fsck(ctx context.Context, repo git.RepositoryFacade, timeout time.Duration, args gitcmd.TrustedCmdArgs) error { +func Fsck(ctx context.Context, repo RepositoryFacade, timeout time.Duration, args gitcmd.TrustedCmdArgs) error { return gitcmd.NewCommand("fsck").AddArguments(args...).WithTimeout(timeout).WithRepo(repo).Run(ctx) } diff --git a/modules/git/git_test.go b/modules/git/git_test.go index af4ee7e3e43..6f65da60591 100644 --- a/modules/git/git_test.go +++ b/modules/git/git_test.go @@ -10,12 +10,6 @@ import ( "github.com/stretchr/testify/assert" ) -const testReposDir = "tests/repos/" - -func TestMain(m *testing.M) { - RunGitTests(m) -} - func TestParseGitVersion(t *testing.T) { v, err := parseGitVersionLine("git version 2.29.3") assert.NoError(t, err) diff --git a/modules/gitrepo/gitrepo.go b/modules/git/gitrepo.go similarity index 72% rename from modules/gitrepo/gitrepo.go rename to modules/git/gitrepo.go index 8d400cafbba..1b29c491d0e 100644 --- a/modules/gitrepo/gitrepo.go +++ b/modules/git/gitrepo.go @@ -1,20 +1,17 @@ // Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package gitrepo +package git import ( "context" "io" - "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" "gitea.dev/modules/reqctx" "gitea.dev/modules/util" ) -var OpenRepository = git.OpenRepository // TODO: can be removed in the future - // contextKey is a value for use with context.WithValue. type contextKey struct { key string @@ -22,7 +19,7 @@ type contextKey struct { // RepositoryFromContextOrOpen attempts to get the repository from the context or just opens it // The caller must call Closer.Close() -func RepositoryFromContextOrOpen(ctx context.Context, repo git.RepositoryFacade) (*git.Repository, io.Closer, error) { +func RepositoryFromContextOrOpen(ctx context.Context, repo RepositoryFacade) (*Repository, io.Closer, error) { reqCtx := reqctx.FromContext(ctx) if reqCtx != nil { gitRepo, err := RepositoryFromRequestContextOrOpen(reqCtx, repo) @@ -34,12 +31,12 @@ func RepositoryFromContextOrOpen(ctx context.Context, repo git.RepositoryFacade) // RepositoryFromRequestContextOrOpen opens the repository at the given relative path in the provided request context. // Caller shouldn't close the git repo manually, the git repo will be automatically closed when the request context is done. -func RepositoryFromRequestContextOrOpen(ctx reqctx.RequestContext, repo git.RepositoryFacade) (*git.Repository, error) { +func RepositoryFromRequestContextOrOpen(ctx reqctx.RequestContext, repo RepositoryFacade) (*Repository, error) { ck := contextKey{key: repo.GitRepoLocation()} - if gitRepo, ok := ctx.Value(ck).(*git.Repository); ok { + if gitRepo, ok := ctx.Value(ck).(*Repository); ok { return gitRepo, nil } - gitRepo, err := git.OpenRepository(repo) + gitRepo, err := OpenRepository(repo) if err != nil { return nil, err } @@ -48,7 +45,7 @@ func RepositoryFromRequestContextOrOpen(ctx reqctx.RequestContext, repo git.Repo return gitRepo, nil } -func UpdateServerInfo(ctx context.Context, repo git.RepositoryFacade) error { +func UpdateServerInfo(ctx context.Context, repo RepositoryFacade) error { _, _, err := gitcmd.NewCommand("update-server-info").WithRepo(repo).RunStdBytes(ctx) return err } diff --git a/modules/git/grep.go b/modules/git/grep.go index 5eb8a0320cf..73313c683e7 100644 --- a/modules/git/grep.go +++ b/modules/git/grep.go @@ -80,7 +80,7 @@ func GrepSearch(ctx context.Context, repo *Repository, search string, opts GrepO stdoutReader, stdoutReaderClose := cmd.MakeStdoutPipe() defer stdoutReaderClose() - err := cmd.WithDir(repo.Path). + err := cmd.WithRepo(repo). WithTimeout(grepSearchTimeout). WithPipelineFunc(func(ctx gitcmd.Context) error { isInBlock := false diff --git a/modules/git/grep_test.go b/modules/git/grep_test.go index 8d16e03f190..430a27536e5 100644 --- a/modules/git/grep_test.go +++ b/modules/git/grep_test.go @@ -7,6 +7,8 @@ import ( "path/filepath" "testing" + "gitea.dev/modules/git/gitcmd" + "github.com/stretchr/testify/assert" ) @@ -74,7 +76,8 @@ func TestGrepSearch(t *testing.T) { assert.NoError(t, err) assert.Empty(t, res) - res, err = GrepSearch(t.Context(), &Repository{RepositoryBase: RepositoryBase{Path: "no-such-git-repo"}}, "no-such-content", GrepOptions{}) + nonExistingRepo := &Repository{RepositoryBase: RepositoryBase{Path: "no-such-git-repo", repoFacade: gitcmd.RepositoryUnmanaged("no-such-git-repo")}} + res, err = GrepSearch(t.Context(), nonExistingRepo, "no-such-content", GrepOptions{}) assert.Error(t, err) assert.Empty(t, res) } diff --git a/modules/gitrepo/hooks.go b/modules/git/hooks.go similarity index 94% rename from modules/gitrepo/hooks.go rename to modules/git/hooks.go index f137ded930f..d4084bd09eb 100644 --- a/modules/gitrepo/hooks.go +++ b/modules/git/hooks.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package gitrepo +package git import ( "context" @@ -10,7 +10,7 @@ import ( "path/filepath" "runtime" - "gitea.dev/modules/git" + "gitea.dev/modules/git/gitcmd" "gitea.dev/modules/setting" "gitea.dev/modules/util" ) @@ -108,8 +108,8 @@ done } // CreateDelegateHooks creates all the hooks scripts for the repo -func CreateDelegateHooks(_ context.Context, repo git.RepositoryFacade) (err error) { - return createDelegateHooks(filepath.Join(repoPath(repo), "hooks")) +func CreateDelegateHooks(_ context.Context, repo RepositoryFacade) (err error) { + return createDelegateHooks(filepath.Join(gitcmd.RepoLocalPath(repo), "hooks")) } func createDelegateHooks(hookDir string) (err error) { @@ -175,8 +175,8 @@ func ensureExecutable(filename string) error { } // CheckDelegateHooks checks the hooks scripts for the repo -func CheckDelegateHooks(_ context.Context, repo git.RepositoryFacade) ([]string, error) { - return checkDelegateHooks(filepath.Join(repoPath(repo), "hooks")) +func CheckDelegateHooks(_ context.Context, repo RepositoryFacade) ([]string, error) { + return checkDelegateHooks(filepath.Join(gitcmd.RepoLocalPath(repo), "hooks")) } func checkDelegateHooks(hookDir string) ([]string, error) { diff --git a/modules/git/languagestats/language_stats_nogogit.go b/modules/git/languagestats/language_stats_get.go similarity index 99% rename from modules/git/languagestats/language_stats_nogogit.go rename to modules/git/languagestats/language_stats_get.go index 4acff61f415..4d2fbca37bd 100644 --- a/modules/git/languagestats/language_stats_nogogit.go +++ b/modules/git/languagestats/language_stats_get.go @@ -1,8 +1,6 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -//go:build !gogit - package languagestats import ( diff --git a/modules/git/languagestats/language_stats_gogit.go b/modules/git/languagestats/language_stats_gogit.go deleted file mode 100644 index 5ddf9096fb5..00000000000 --- a/modules/git/languagestats/language_stats_gogit.go +++ /dev/null @@ -1,182 +0,0 @@ -// Copyright 2020 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -//go:build gogit - -package languagestats - -import ( - "bytes" - "context" - "io" - - "gitea.dev/modules/analyze" - git_module "gitea.dev/modules/git" - "gitea.dev/modules/git/attribute" - "gitea.dev/modules/optional" - - "github.com/go-enry/go-enry/v2" - "github.com/go-git/go-git/v5" - "github.com/go-git/go-git/v5/plumbing" - "github.com/go-git/go-git/v5/plumbing/object" -) - -// GetLanguageStats calculates language stats for git repository at specified commit -func GetLanguageStats(ctx context.Context, repo *git_module.Repository, commitID string) (map[string]int64, error) { - r, err := git.PlainOpen(repo.Path) - if err != nil { - return nil, err - } - - rev, err := r.ResolveRevision(plumbing.Revision(commitID)) - if err != nil { - return nil, err - } - - commit, err := r.CommitObject(*rev) - if err != nil { - return nil, err - } - - tree, err := commit.Tree() - if err != nil { - return nil, err - } - - checker, err := attribute.NewBatchChecker(ctx, repo, commitID, attribute.LinguistAttributes) - if err != nil { - return nil, err - } - defer checker.Close() - - // sizes contains the current calculated size of all files by language - sizes := make(map[string]int64) - // by default we will only count the sizes of programming languages or markup languages - // unless they are explicitly set using linguist-language - includedLanguage := map[string]bool{} - // or if there's only one language in the repository - firstExcludedLanguage := "" - firstExcludedLanguageSize := int64(0) - - err = tree.Files().ForEach(func(f *object.File) error { - if f.Size == 0 { - return nil - } - - isVendored := optional.None[bool]() - isGenerated := optional.None[bool]() - isDocumentation := optional.None[bool]() - isDetectable := optional.None[bool]() - - attrs, err := checker.CheckPath(f.Name) - if err == nil { - isVendored = attrs.GetVendored() - if isVendored.ValueOrDefault(false) { - return nil - } - - isGenerated = attrs.GetGenerated() - if isGenerated.ValueOrDefault(false) { - return nil - } - - isDocumentation = attrs.GetDocumentation() - if isDocumentation.ValueOrDefault(false) { - return nil - } - - isDetectable = attrs.GetDetectable() - if !isDetectable.ValueOrDefault(true) { - return nil - } - - hasLanguage := attrs.GetLanguage() - if hasLanguage.Value() != "" { - language := hasLanguage.Value() - - // group languages, such as Pug -> HTML; SCSS -> CSS - group := enry.GetLanguageGroup(language) - if len(group) != 0 { - language = group - } - - // this language will always be added to the size - sizes[language] += f.Size - return nil - } - } - - if (!isVendored.Has() && analyze.IsVendor(f.Name)) || - enry.IsDotFile(f.Name) || - (!isDocumentation.Has() && enry.IsDocumentation(f.Name)) || - (!isDetectable.Has() && enry.IsConfiguration(f.Name)) { - return nil - } - - // If content can not be read or file is too big just do detection by filename - var content []byte - if f.Size <= bigFileSize { - content, _ = readFile(f, fileSizeLimit) - } - if !isGenerated.Has() && enry.IsGenerated(f.Name, content) { - return nil - } - - language := analyze.GetCodeLanguage(f.Name, content) - if language == enry.OtherLanguage || language == "" { - return nil - } - - // group languages, such as Pug -> HTML; SCSS -> CSS - group := enry.GetLanguageGroup(language) - if group != "" { - language = group - } - - included, checked := includedLanguage[language] - if !checked { - langtype := enry.GetLanguageType(language) - included = langtype == enry.Programming || langtype == enry.Markup - includedLanguage[language] = included - } - if included || isDetectable.ValueOrDefault(false) { - sizes[language] += f.Size - } else if len(sizes) == 0 && (firstExcludedLanguage == "" || firstExcludedLanguage == language) { - firstExcludedLanguage = language - firstExcludedLanguageSize += f.Size - } - - return nil - }) - if err != nil { - return nil, err - } - - // If there are no included languages add the first excluded language - if len(sizes) == 0 && firstExcludedLanguage != "" { - sizes[firstExcludedLanguage] = firstExcludedLanguageSize - } - - return mergeLanguageStats(sizes), nil -} - -func readFile(f *object.File, limit int64) ([]byte, error) { - r, err := f.Reader() - if err != nil { - return nil, err - } - defer r.Close() - - if limit <= 0 { - return io.ReadAll(r) - } - - size := f.Size - if limit > 0 && size > limit { - size = limit - } - buf := bytes.NewBuffer(nil) - buf.Grow(int(size)) - _, err = io.Copy(buf, io.LimitReader(r, limit)) - return buf.Bytes(), err -} diff --git a/modules/git/languagestats/language_stats_test.go b/modules/git/languagestats/language_stats_test.go index 979ea17d973..35d1ea28508 100644 --- a/modules/git/languagestats/language_stats_test.go +++ b/modules/git/languagestats/language_stats_test.go @@ -1,8 +1,6 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -//go:build !gogit - package languagestats import ( diff --git a/modules/git/localfs.go b/modules/git/localfs.go new file mode 100644 index 00000000000..9471440fc43 --- /dev/null +++ b/modules/git/localfs.go @@ -0,0 +1,71 @@ +// Copyright 2026 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package git + +import ( + "context" + "fmt" + "io" + "io/fs" + "os" + "path/filepath" + + "gitea.dev/modules/git/gitcmd" + "gitea.dev/modules/util" +) + +// IsRepositoryExist returns true if the repository directory exists in the disk +func IsRepositoryExist(ctx context.Context, repo RepositoryFacade) (bool, error) { + return util.IsExist(gitcmd.RepoLocalPath(repo)) +} + +// DeleteRepository deletes the repository directory from the disk, it will return +// nil if the repository does not exist. +func DeleteRepository(ctx context.Context, repo RepositoryFacade) error { + return util.RemoveAll(gitcmd.RepoLocalPath(repo)) +} + +// RenameRepository renames a repository's name on disk +func RenameRepository(ctx context.Context, repo, newRepo RepositoryFacade) error { + dstDir := gitcmd.RepoLocalPath(newRepo) + if err := os.MkdirAll(filepath.Dir(dstDir), os.ModePerm); err != nil { + return fmt.Errorf("Failed to create dir %s: %w", filepath.Dir(dstDir), err) + } + + if err := util.Rename(gitcmd.RepoLocalPath(repo), dstDir); err != nil { + return fmt.Errorf("rename repository directory: %w", err) + } + return nil +} + +func InitRepository(ctx context.Context, repo RepositoryFacade, objectFormatName string) error { + return InitRepositoryLocal(ctx, gitcmd.RepoLocalPath(repo), true, objectFormatName) +} + +func GetRepoFS(repo RepositoryFacade) fs.FS { + return os.DirFS(gitcmd.RepoLocalPath(repo)) +} + +func IsRepoFileExist(ctx context.Context, repo RepositoryFacade, relativeFilePath string) (bool, error) { + absoluteFilePath := filepath.Join(gitcmd.RepoLocalPath(repo), relativeFilePath) + return util.IsExist(absoluteFilePath) +} + +func IsRepoDirExist(ctx context.Context, repo RepositoryFacade, relativeDirPath string) (bool, error) { + absoluteDirPath := filepath.Join(gitcmd.RepoLocalPath(repo), relativeDirPath) + return util.IsDir(absoluteDirPath) +} + +func RemoveRepoFileOrDir(ctx context.Context, repo RepositoryFacade, relativeFileOrDirPath string) error { + absoluteFilePath := filepath.Join(gitcmd.RepoLocalPath(repo), relativeFileOrDirPath) + return util.Remove(absoluteFilePath) +} + +func CreateRepoFile(ctx context.Context, repo RepositoryFacade, relativeFilePath string) (io.WriteCloser, error) { + absoluteFilePath := filepath.Join(gitcmd.RepoLocalPath(repo), relativeFilePath) + if err := os.MkdirAll(filepath.Dir(absoluteFilePath), os.ModePerm); err != nil { + return nil, err + } + return os.Create(absoluteFilePath) +} diff --git a/modules/gitrepo/main_test.go b/modules/git/main_test.go similarity index 57% rename from modules/gitrepo/main_test.go rename to modules/git/main_test.go index 3dc79fd386b..85e7a983e94 100644 --- a/modules/gitrepo/main_test.go +++ b/modules/git/main_test.go @@ -1,26 +1,25 @@ // Copyright 2025 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package gitrepo +package git import ( "path/filepath" "testing" - "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/setting" ) +const testReposDir = "tests/repos/" + func mockRepository(repoPath string) gitcmd.RepositoryFacade { if !filepath.IsAbs(repoPath) { // resolve repository path relative to the unit test fixture directory - repoPath = filepath.Join(setting.GetGiteaTestSourceRoot(), "modules/git/tests/repos", repoPath) + repoPath, _ = filepath.Abs(filepath.Join(testReposDir, repoPath)) } - return gitcmd.RepositoryManaged(repoPath, repoPath) + return gitcmd.RepositoryUnmanaged(repoPath) } func TestMain(m *testing.M) { - setting.SetupGiteaTestEnv() - git.RunGitTests(m) + RunGitTests(m) } diff --git a/modules/gitrepo/merge.go b/modules/git/merge.go similarity index 82% rename from modules/gitrepo/merge.go rename to modules/git/merge.go index 971b7bba001..32cf5f44ba3 100644 --- a/modules/gitrepo/merge.go +++ b/modules/git/merge.go @@ -1,20 +1,19 @@ // Copyright 2025 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package gitrepo +package git import ( "context" "fmt" "strings" - "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" "gitea.dev/modules/util" ) // MergeBase checks and returns merge base of two commits. -func MergeBase(ctx context.Context, repo git.RepositoryFacade, baseCommitID, headCommitID string) (string, error) { +func MergeBase(ctx context.Context, repo RepositoryFacade, baseCommitID, headCommitID string) (string, error) { mergeBase, stderr, err := gitcmd.NewCommand("merge-base"). AddDashesAndList(baseCommitID, headCommitID).WithRepo(repo).RunStdString(ctx) if err != nil { diff --git a/modules/gitrepo/merge_tree.go b/modules/git/merge_tree.go similarity index 89% rename from modules/gitrepo/merge_tree.go rename to modules/git/merge_tree.go index 17c30cd36e5..f956a54e6f0 100644 --- a/modules/gitrepo/merge_tree.go +++ b/modules/git/merge_tree.go @@ -1,14 +1,13 @@ // Copyright 2026 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package gitrepo +package git import ( "bufio" "context" "fmt" - "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" "gitea.dev/modules/util" ) @@ -18,7 +17,7 @@ const MaxConflictedDetectFiles = 10 // MergeTree performs a merge between two commits (baseRef and headRef) with an optional merge base. // It returns the resulting tree hash, a list of conflicted files (if any), and an error if the operation fails. // If there are no conflicts, the list of conflicted files will be nil. -func MergeTree(ctx context.Context, repo git.RepositoryFacade, baseRef, headRef, mergeBase string) (treeID string, isErrHasConflicts bool, conflictFiles []string, _ error) { +func MergeTree(ctx context.Context, repo RepositoryFacade, baseRef, headRef, mergeBase string) (treeID string, isErrHasConflicts bool, conflictFiles []string, _ error) { cmd := gitcmd.NewCommand("merge-tree", "--write-tree", "-z", "--name-only", "--no-messages"). AddOptionFormat("--merge-base=%s", mergeBase). AddDynamicArguments(baseRef, headRef) diff --git a/modules/gitrepo/merge_tree_test.go b/modules/git/merge_tree_test.go similarity index 99% rename from modules/gitrepo/merge_tree_test.go rename to modules/git/merge_tree_test.go index 89f689e8013..48a8266a50b 100644 --- a/modules/gitrepo/merge_tree_test.go +++ b/modules/git/merge_tree_test.go @@ -1,7 +1,7 @@ // Copyright 2026 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package gitrepo +package git import ( "path/filepath" diff --git a/modules/git/pipeline/catfile.go b/modules/git/pipeline/catfile.go index 767f08af909..57ae25b3f80 100644 --- a/modules/git/pipeline/catfile.go +++ b/modules/git/pipeline/catfile.go @@ -10,6 +10,7 @@ import ( "strconv" "strings" + "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" ) @@ -20,13 +21,13 @@ func CatFileBatchCheck(ctx context.Context, cmd *gitcmd.Command, tmpBasePath str } // CatFileBatchCheckAllObjects runs cat-file with --batch-check --batch-all -func CatFileBatchCheckAllObjects(ctx context.Context, cmd *gitcmd.Command, tmpBasePath string) error { - return cmd.AddArguments("cat-file", "--batch-check", "--batch-all-objects").WithDir(tmpBasePath).RunWithStderr(ctx) +func CatFileBatchCheckAllObjects(ctx context.Context, cmd *gitcmd.Command, gitRepo *git.Repository) error { + return cmd.AddArguments("cat-file", "--batch-check", "--batch-all-objects").WithRepo(gitRepo).RunWithStderr(ctx) } // CatFileBatch runs cat-file --batch -func CatFileBatch(ctx context.Context, cmd *gitcmd.Command, tmpBasePath string) error { - return cmd.AddArguments("cat-file", "--batch").WithDir(tmpBasePath).RunWithStderr(ctx) +func CatFileBatch(ctx context.Context, cmd *gitcmd.Command, gitRepo git.RepositoryFacade) error { + return cmd.AddArguments("cat-file", "--batch").WithRepo(gitRepo).RunWithStderr(ctx) } // BlobsLessThan1024FromCatFileBatchCheck reads a pipeline from cat-file --batch-check and returns the blobs <1024 in size diff --git a/modules/git/pipeline/lfs_nogogit.go b/modules/git/pipeline/lfs_find.go similarity index 97% rename from modules/git/pipeline/lfs_nogogit.go rename to modules/git/pipeline/lfs_find.go index 656c38e5a6b..994004d6a97 100644 --- a/modules/git/pipeline/lfs_nogogit.go +++ b/modules/git/pipeline/lfs_find.go @@ -1,8 +1,6 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -//go:build !gogit - package pipeline import ( @@ -21,7 +19,7 @@ func FindLFSFile(ctx context.Context, repo *git.Repository, objectID git.ObjectI cmd := gitcmd.NewCommand("rev-list", "--all") revListReader, revListReaderClose := cmd.MakeStdoutPipe() defer revListReaderClose() - err := cmd.WithDir(repo.Path). + err := cmd.WithRepo(repo). WithPipelineFunc(func(context gitcmd.Context) (err error) { results, err = findLFSFileFunc(ctx, repo, objectID, revListReader) return err @@ -146,6 +144,6 @@ func findLFSFileFunc(ctx context.Context, repo *git.Repository, objectID git.Obj } sort.Sort(lfsResultSlice(results)) - err = fillResultNameRev(ctx, repo.Path, results) + err = fillResultNameRev(ctx, repo, results) return results, err } diff --git a/modules/git/pipeline/lfs_gogit.go b/modules/git/pipeline/lfs_gogit.go deleted file mode 100644 index add632f6942..00000000000 --- a/modules/git/pipeline/lfs_gogit.go +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright 2020 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -//go:build gogit - -package pipeline - -import ( - "context" - "fmt" - "io" - "sort" - "strings" - - "gitea.dev/modules/git" - - gogit "github.com/go-git/go-git/v5" - "github.com/go-git/go-git/v5/plumbing" - "github.com/go-git/go-git/v5/plumbing/object" -) - -// FindLFSFile finds commits that contain a provided pointer file hash -func FindLFSFile(ctx context.Context, repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, error) { - resultsMap := map[string]*LFSResult{} - results := make([]*LFSResult, 0) - - gogitRepo := repo.GoGitRepo() - - commitsIter, err := gogitRepo.Log(&gogit.LogOptions{ - Order: gogit.LogOrderCommitterTime, - All: true, - }) - if err != nil { - return nil, fmt.Errorf("LFS error occurred, failed to get GoGit CommitsIter: err: %w", err) - } - - err = commitsIter.ForEach(func(gitCommit *object.Commit) error { - tree, err := gitCommit.Tree() - if err != nil { - return err - } - treeWalker := object.NewTreeWalker(tree, true, nil) - defer treeWalker.Close() - for { - name, entry, err := treeWalker.Next() - if err == io.EOF { - break - } - if entry.Hash == plumbing.Hash(objectID.RawValue()) { - parents := make([]git.ObjectID, len(gitCommit.ParentHashes)) - for i, parentCommitID := range gitCommit.ParentHashes { - parents[i] = git.ParseGogitHash(parentCommitID) - } - - result := LFSResult{ - Name: name, - SHA: gitCommit.Hash.String(), - Summary: strings.Split(strings.TrimSpace(gitCommit.Message), "\n")[0], - When: gitCommit.Author.When, - ParentHashes: parents, - } - resultsMap[gitCommit.Hash.String()+":"+name] = &result - } - } - return nil - }) - if err != nil && err != io.EOF { - return nil, fmt.Errorf("LFS error occurred, failure in CommitIter.ForEach: %w", err) - } - - for _, result := range resultsMap { - hasParent := false - for _, parentHash := range result.ParentHashes { - if _, hasParent = resultsMap[parentHash.String()+":"+result.Name]; hasParent { - break - } - } - if !hasParent { - results = append(results, result) - } - } - - sort.Sort(lfsResultSlice(results)) - err = fillResultNameRev(ctx, repo.Path, results) - return results, err -} diff --git a/modules/git/pipeline/namerev.go b/modules/git/pipeline/namerev.go index c8447b86d5e..c39ccd0ef53 100644 --- a/modules/git/pipeline/namerev.go +++ b/modules/git/pipeline/namerev.go @@ -9,15 +9,16 @@ import ( "errors" "strings" + "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" "golang.org/x/sync/errgroup" ) -func fillResultNameRev(ctx context.Context, basePath string, results []*LFSResult) error { +func fillResultNameRev(ctx context.Context, repo git.RepositoryFacade, results []*LFSResult) error { // Should really use a go-git function here but name-rev is not completed and recapitulating it is not simple wg := errgroup.Group{} - cmd := gitcmd.NewCommand("name-rev", "--stdin", "--name-only", "--always").WithDir(basePath) + cmd := gitcmd.NewCommand("name-rev", "--stdin", "--name-only", "--always").WithRepo(repo) stdin, stdinClose := cmd.MakeStdinPipe() stdout, stdoutClose := cmd.MakeStdoutPipe() defer stdinClose() diff --git a/modules/git/push.go b/modules/git/push.go new file mode 100644 index 00000000000..1c050166f0c --- /dev/null +++ b/modules/git/push.go @@ -0,0 +1,27 @@ +// Copyright 2025 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package git + +import ( + "context" + + "gitea.dev/modules/git/gitcmd" +) + +// PushToExternal pushes a managed repository to an external remote. +func PushToExternal(ctx context.Context, repo RepositoryFacade, opts PushOptions) error { + return Push(ctx, gitcmd.RepoLocalPath(repo), opts) +} + +// PushManaged pushes from one managed repository to another managed repository. +func PushManaged(ctx context.Context, fromRepo, toRepo RepositoryFacade, opts PushOptions) error { + opts.Remote = gitcmd.RepoLocalPath(toRepo) + return Push(ctx, gitcmd.RepoLocalPath(fromRepo), opts) +} + +// PushFromLocal pushes from a local path to a managed repository. +func PushFromLocal(ctx context.Context, fromLocalPath string, toRepo RepositoryFacade, opts PushOptions) error { + opts.Remote = gitcmd.RepoLocalPath(toRepo) + return Push(ctx, fromLocalPath, opts) +} diff --git a/modules/git/ref.go b/modules/git/ref.go index ec6e237eb2d..b3cbe8fffb3 100644 --- a/modules/git/ref.go +++ b/modules/git/ref.go @@ -8,6 +8,7 @@ import ( "regexp" "strings" + "gitea.dev/modules/git/gitcmd" "gitea.dev/modules/setting" "gitea.dev/modules/util" ) @@ -242,3 +243,11 @@ func ParseRefSuffix(ref string) (refName, refSuffix string) { } return ref[:suffixIdx], ref[suffixIdx:] } + +func UpdateRef(ctx context.Context, repo RepositoryFacade, refName, newCommitID string) error { + return gitcmd.NewCommand("update-ref").AddDynamicArguments(refName, newCommitID).WithRepo(repo).Run(ctx) +} + +func RemoveRef(ctx context.Context, repo RepositoryFacade, refName string) error { + return gitcmd.NewCommand("update-ref", "--no-deref", "-d").AddDynamicArguments(refName).WithRepo(repo).Run(ctx) +} diff --git a/modules/gitrepo/remote.go b/modules/git/remote_managed.go similarity index 63% rename from modules/gitrepo/remote.go rename to modules/git/remote_managed.go index 50af148133c..2449550510a 100644 --- a/modules/gitrepo/remote.go +++ b/modules/git/remote_managed.go @@ -1,13 +1,12 @@ // Copyright 2025 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package gitrepo +package git import ( "context" "errors" - "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" giturl "gitea.dev/modules/git/url" "gitea.dev/modules/util" @@ -20,8 +19,8 @@ const ( RemoteOptionMirrorFetch RemoteOption = "--mirror=fetch" ) -func ManagedRemoteAdd(ctx context.Context, repo git.RepositoryFacade, remoteName, remoteURL string, options ...RemoteOption) error { - return git.LockConfigAndDo(ctx, repo, func(ctx context.Context) error { +func ManagedRemoteAdd(ctx context.Context, repo RepositoryFacade, remoteName, remoteURL string, options ...RemoteOption) error { + return LockConfigAndDo(ctx, repo, func(ctx context.Context) error { cmd := gitcmd.NewCommand("remote", "add") if len(options) > 0 { switch options[0] { @@ -38,17 +37,16 @@ func ManagedRemoteAdd(ctx context.Context, repo git.RepositoryFacade, remoteName }) } -func ManagedRemoteRemove(ctx context.Context, repo git.RepositoryFacade, remoteName string) error { - return git.LockConfigAndDo(ctx, repo, func(ctx context.Context) error { +func ManagedRemoteRemove(ctx context.Context, repo RepositoryFacade, remoteName string) error { + return LockConfigAndDo(ctx, repo, func(ctx context.Context) error { cmd := gitcmd.NewCommand("remote", "rm").AddDynamicArguments(remoteName) _, _, err := cmd.WithRepo(repo).RunStdString(ctx) return err }) } -// GitRemoteGetURL returns the url of a specific remote of the repository. -func GitRemoteGetURL(ctx context.Context, repo git.RepositoryFacade, remoteName string) (*giturl.GitURL, error) { - addr, err := git.GetRemoteAddress(ctx, repo, remoteName) +func ParseRemoteAddressURL(ctx context.Context, repo RepositoryFacade, remoteName string) (*giturl.GitURL, error) { + addr, err := GetRemoteAddress(ctx, repo, remoteName) if err != nil { return nil, err } diff --git a/modules/git/repo.go b/modules/git/repo.go index 4683ebe5d85..1754e7b97fc 100644 --- a/modules/git/repo.go +++ b/modules/git/repo.go @@ -13,6 +13,7 @@ import ( "path/filepath" "strconv" "strings" + "sync" "time" "gitea.dev/modules/git/gitcmd" @@ -24,13 +25,20 @@ import ( type RepositoryFacade = gitcmd.RepositoryFacade type RepositoryBase struct { - Path string // absolute path + // TODO: refactor it to a private field "localPath" in the future + // * for repo accessing purpose, in most causes, use "WithRepo", or RepoLocalPath(repo) if the local path must be used + // * for error handling & logging purpose, it needs to introduce a new function "git.RepoLogName()" to handle various cases + Path string LastCommitCache *LastCommitCache repoFacade RepositoryFacade tagCache *ObjectCache[*Tag] objectFormatCache ObjectFormat + + mu sync.Mutex + catFileBatchCloser CatFileBatchCloser + catFileBatchInUse bool } var _ gitcmd.RepositoryFacade = (*Repository)(nil) @@ -78,6 +86,14 @@ func (repo *Repository) Close() error { } repo.LastCommitCache = nil repo.tagCache = nil + + repo.mu.Lock() + defer repo.mu.Unlock() + if repo.catFileBatchCloser != nil { + repo.catFileBatchCloser.Close() + repo.catFileBatchCloser = nil + repo.catFileBatchInUse = false + } return repo.closeInternal() } @@ -87,8 +103,8 @@ func IsRepoURLAccessible(ctx context.Context, url string) bool { return err == nil } -// InitRepository initializes a new Git repository. -func InitRepository(ctx context.Context, repoPath string, bare bool, objectFormatName string) error { +// InitRepositoryLocal initializes a new Git repository. +func InitRepositoryLocal(ctx context.Context, repoPath string, bare bool, objectFormatName string) error { err := os.MkdirAll(repoPath, os.ModePerm) if err != nil { return err @@ -115,7 +131,7 @@ func (repo *Repository) IsEmpty(ctx context.Context) (bool, error) { stdout, _, err := gitcmd.NewCommand(). AddOptionFormat("--git-dir=%s", repo.Path). AddArguments("rev-list", "-n", "1", "--all"). - WithDir(repo.Path). + WithRepo(repo). RunStdString(ctx) if err != nil { if (gitcmd.IsErrorExitCode(err, 1) && err.Stderr() == "") || gitcmd.IsErrorExitCode(err, 129) { @@ -255,3 +271,41 @@ func Push(ctx context.Context, repoPath string, opts PushOptions) error { return nil } + +// CatFileBatch obtains a "batch object provider" for this repository. +// It reuses an existing one if available, otherwise creates a new one. +func (repo *Repository) CatFileBatch(ctx context.Context) (_ CatFileBatch, closeFunc func(), err error) { + repo.mu.Lock() + defer repo.mu.Unlock() + + if repo.catFileBatchCloser != nil && !repo.catFileBatchInUse { + if ctx != repo.catFileBatchCloser.Context() { + repo.catFileBatchCloser.Close() + repo.catFileBatchCloser = nil + repo.catFileBatchInUse = false + } + } + + if repo.catFileBatchCloser == nil { + repo.catFileBatchCloser, err = NewBatch(ctx, repo) + if err != nil { + repo.catFileBatchCloser = nil // otherwise it is "interface(nil)" and will cause wrong logic + return nil, nil, err + } + } + + if !repo.catFileBatchInUse { + repo.catFileBatchInUse = true + return CatFileBatch(repo.catFileBatchCloser), func() { + repo.mu.Lock() + defer repo.mu.Unlock() + repo.catFileBatchInUse = false + }, nil + } + + tempBatch, err := NewBatch(ctx, repo) + if err != nil { + return nil, nil, err + } + return tempBatch, tempBatch.Close, nil +} diff --git a/modules/git/repo_base_nogogit.go b/modules/git/repo_base_nogogit.go index b6b08f76b3a..850a4d031c5 100644 --- a/modules/git/repo_base_nogogit.go +++ b/modules/git/repo_base_nogogit.go @@ -6,73 +6,16 @@ package git -import ( - "context" - "sync" - - "gitea.dev/modules/log" -) - const isGogit = false type Repository struct { RepositoryBase - - mu sync.Mutex - catFileBatchCloser CatFileBatchCloser - catFileBatchInUse bool } func openRepositoryInternal(_ *Repository) error { return nil } -// CatFileBatch obtains a "batch object provider" for this repository. -// It reuses an existing one if available, otherwise creates a new one. -func (repo *Repository) CatFileBatch(ctx context.Context) (_ CatFileBatch, closeFunc func(), err error) { - repo.mu.Lock() - defer repo.mu.Unlock() - - if repo.catFileBatchCloser != nil && !repo.catFileBatchInUse { - if ctx != repo.catFileBatchCloser.Context() { - repo.catFileBatchCloser.Close() - repo.catFileBatchCloser = nil - repo.catFileBatchInUse = false - } - } - - if repo.catFileBatchCloser == nil { - repo.catFileBatchCloser, err = NewBatch(ctx, repo) - if err != nil { - repo.catFileBatchCloser = nil // otherwise it is "interface(nil)" and will cause wrong logic - return nil, nil, err - } - } - - if !repo.catFileBatchInUse { - repo.catFileBatchInUse = true - return CatFileBatch(repo.catFileBatchCloser), func() { - repo.mu.Lock() - defer repo.mu.Unlock() - repo.catFileBatchInUse = false - }, nil - } - - log.Debug("Opening temporary cat file batch for: %s", repo.Path) - tempBatch, err := NewBatch(ctx, repo) - if err != nil { - return nil, nil, err - } - return tempBatch, tempBatch.Close, nil -} - func (repo *Repository) closeInternal() error { - repo.mu.Lock() - defer repo.mu.Unlock() - if repo.catFileBatchCloser != nil { - repo.catFileBatchCloser.Close() - repo.catFileBatchCloser = nil - repo.catFileBatchInUse = false - } return nil } diff --git a/modules/git/repo_branch.go b/modules/git/repo_branch.go index a0a9025f1aa..554099498d4 100644 --- a/modules/git/repo_branch.go +++ b/modules/git/repo_branch.go @@ -20,7 +20,7 @@ func (repo *Repository) AddRemote(ctx context.Context, name, url string, fetch b cmd.AddArguments("-f") } _, _, err := cmd.AddDynamicArguments(name, url). - WithDir(repo.Path). + WithRepo(repo). RunStdString(ctx) return err } diff --git a/modules/git/repo_commit.go b/modules/git/repo_commit.go index 63977002726..2395f5be08d 100644 --- a/modules/git/repo_commit.go +++ b/modules/git/repo_commit.go @@ -50,7 +50,7 @@ const prettyLogFormat = `--pretty=format:%H` func (repo *Repository) ShowPrettyFormatLogToList(ctx context.Context, revisionRange string) ([]*Commit, error) { // avoid: ambiguous argument 'refs/a...refs/b': unknown revision or path not in the working tree. Use '--': 'git [...] -- [...]' logs, _, err := gitcmd.NewCommand("log").AddArguments(prettyLogFormat). - AddDynamicArguments(revisionRange).AddArguments("--").WithDir(repo.Path). + AddDynamicArguments(revisionRange).AddArguments("--").WithRepo(repo). RunStdBytes(ctx) if err != nil { return nil, err @@ -86,7 +86,7 @@ func (repo *Repository) getCommitByPathWithID(ctx context.Context, id ObjectID, stdout, _, runErr := gitcmd.NewCommand("log", "-1", prettyLogFormat). AddDynamicArguments(id.String()). AddDashesAndList(relpath). - WithDir(repo.Path). + WithRepo(repo). RunStdString(ctx) if runErr != nil { return nil, runErr @@ -104,7 +104,7 @@ func (repo *Repository) getCommitByPathWithID(ctx context.Context, id ObjectID, func (repo *Repository) GetCommitByPath(ctx context.Context, relpath string) (*Commit, error) { stdout, _, runErr := gitcmd.NewCommand("log", "-1", prettyLogFormat). AddDashesAndList(relpath). - WithDir(repo.Path). + WithRepo(repo). RunStdBytes(ctx) if runErr != nil { return nil, runErr @@ -138,7 +138,7 @@ func (repo *Repository) commitsByRangeWithTime(ctx context.Context, id ObjectID, cmd.AddOptionFormat("--until=%s", until) } - stdout, _, err := cmd.WithDir(repo.Path).RunStdBytes(ctx) + stdout, _, err := cmd.WithRepo(repo).RunStdBytes(ctx) if err != nil { return nil, err } @@ -192,7 +192,7 @@ func (repo *Repository) searchCommits(ctx context.Context, id ObjectID, opts Sea // search for commits matching given constraints and keywords in commit msg addCommonSearchArgs(cmd) - stdout, _, err := cmd.WithDir(repo.Path).RunStdBytes(ctx) + stdout, _, err := cmd.WithRepo(repo).RunStdBytes(ctx) if err != nil { return nil, err } @@ -213,7 +213,7 @@ func (repo *Repository) searchCommits(ctx context.Context, id ObjectID, opts Sea hashCmd.AddDynamicArguments(v) // search with given constraints for commit matching sha hash of v - hashMatching, _, err := hashCmd.WithDir(repo.Path).RunStdBytes(ctx) + hashMatching, _, err := hashCmd.WithRepo(repo).RunStdBytes(ctx) if err != nil || bytes.Contains(stdout, hashMatching) { continue } @@ -231,7 +231,7 @@ func (repo *Repository) FileChangedBetweenCommits(ctx context.Context, filename, stdout, _, err := gitcmd.NewCommand("diff", "--name-only", "-z"). AddDynamicArguments(id1, id2). AddDashesAndList(filename). - WithDir(repo.Path). + WithRepo(repo). RunStdBytes(ctx) if err != nil { return false, err @@ -275,7 +275,7 @@ func (repo *Repository) CommitsByFileAndRange(ctx context.Context, opts CommitsB stdoutReader, stdoutReaderClose := gitCmd.MakeStdoutPipe() defer stdoutReaderClose() - err := gitCmd.WithDir(repo.Path). + err := gitCmd.WithRepo(repo). WithPipelineFunc(func(context gitcmd.Context) error { objectFormat, err := repo.GetObjectFormat(ctx) if err != nil { @@ -316,7 +316,7 @@ func (repo *Repository) CommitsByFileAndRange(ctx context.Context, opts CommitsB // If "before" and "after" are not related, it returns the all commits for the "after" commit. func (repo *Repository) CommitsBetween(ctx context.Context, afterRef, beforeRef RefName, limit int, optSkip ...int) ([]*Commit, error) { gitCmd := func() *gitcmd.Command { - cmd := gitcmd.NewCommand("rev-list").WithDir(repo.Path) + cmd := gitcmd.NewCommand("rev-list").WithRepo(repo) if limit >= 0 { cmd.AddOptionValues("--max-count", strconv.Itoa(limit)) } @@ -351,7 +351,7 @@ func (repo *Repository) commitsBefore(ctx context.Context, id ObjectID, limit in } cmd.AddDynamicArguments(id.String()) - stdout, _, runErr := cmd.WithDir(repo.Path).RunStdBytes(ctx) + stdout, _, runErr := cmd.WithRepo(repo).RunStdBytes(ctx) if runErr != nil { return nil, runErr } @@ -392,7 +392,7 @@ func (repo *Repository) getBranches(ctx context.Context, env []string, commitID AddOptionValues("--contains", commitID). AddArguments(BranchPrefix). WithEnv(env). - WithDir(repo.Path). + WithRepo(repo). RunStdString(ctx) if err != nil { return nil, err @@ -418,7 +418,7 @@ func (repo *Repository) GetCommitsFromIDs(ctx context.Context, commitIDs []strin func (repo *Repository) IsCommitInBranch(ctx context.Context, commitID, branch string) (r bool, err error) { stdout, _, err := gitcmd.NewCommand("branch", "--contains"). AddDynamicArguments(commitID, branch). - WithDir(repo.Path). + WithRepo(repo). RunStdString(ctx) if err != nil { return false, err @@ -431,7 +431,7 @@ func (repo *Repository) GetCommitBranchStart(ctx context.Context, env []string, cmd := gitcmd.NewCommand("log", prettyLogFormat) cmd.AddDynamicArguments(endCommitID) - stdout, _, runErr := cmd.WithDir(repo.Path). + stdout, _, runErr := cmd.WithRepo(repo). WithEnv(env). RunStdBytes(ctx) if runErr != nil { diff --git a/modules/git/repo_commit_gogit.go b/modules/git/repo_commit_gogit.go index 551b668165a..53e35b6ff72 100644 --- a/modules/git/repo_commit_gogit.go +++ b/modules/git/repo_commit_gogit.go @@ -57,7 +57,7 @@ func (repo *Repository) ConvertToGitID(ctx context.Context, commitID string) (Ob actualCommitID, _, err := gitcmd.NewCommand("rev-parse", "--verify"). AddDynamicArguments(commitID). - WithDir(repo.Path). + WithRepo(repo). RunStdString(ctx) actualCommitID = strings.TrimSpace(actualCommitID) if err != nil { diff --git a/modules/git/repo_commit_nogogit.go b/modules/git/repo_commit_nogogit.go index 50eaabfe229..8a30858f689 100644 --- a/modules/git/repo_commit_nogogit.go +++ b/modules/git/repo_commit_nogogit.go @@ -19,7 +19,7 @@ import ( func (repo *Repository) ResolveReference(ctx context.Context, name string) (string, error) { stdout, _, err := gitcmd.NewCommand("show-ref", "--hash"). AddDynamicArguments(name). - WithDir(repo.Path). + WithRepo(repo). RunStdString(ctx) if err != nil { if strings.Contains(err.Error(), "not a valid ref") { diff --git a/modules/git/repo_compare.go b/modules/git/repo_compare.go index 6c268b52a75..c20ebc020cd 100644 --- a/modules/git/repo_compare.go +++ b/modules/git/repo_compare.go @@ -11,8 +11,6 @@ import ( "errors" "fmt" "io" - "os" - "path/filepath" "regexp" "strings" @@ -44,7 +42,7 @@ func (repo *Repository) GetDiffNumChangedFiles(ctx context.Context, base, head s if err := gitcmd.NewCommand("diff", "-z", "--name-only"). AddDynamicArguments(base + separator + head). AddArguments("--"). - WithDir(repo.Path). + WithRepo(repo). WithStdoutCopy(w). RunWithStderr(ctx); err != nil { if gitcmd.IsStderr(err, gitcmd.StderrNoMergeBase) { @@ -62,7 +60,7 @@ var patchCommits = regexp.MustCompile(`^From\s(\w+)\s`) // GetDiff generates and returns patch data between given revisions, optimized for human readability func (repo *Repository) GetDiff(ctx context.Context, compareArg string, w io.Writer) error { return gitcmd.NewCommand("diff", "-p").AddDynamicArguments(compareArg). - WithDir(repo.Path). + WithRepo(repo). WithStdoutCopy(w). Run(ctx) } @@ -71,7 +69,7 @@ func (repo *Repository) GetDiff(ctx context.Context, compareArg string, w io.Wri func (repo *Repository) GetDiffBinary(ctx context.Context, compareArg string, w io.Writer) error { return gitcmd.NewCommand("diff", "-p", "--binary", "--histogram"). AddDynamicArguments(compareArg). - WithDir(repo.Path). + WithRepo(repo). WithStdoutCopy(w). Run(ctx) } @@ -79,7 +77,7 @@ func (repo *Repository) GetDiffBinary(ctx context.Context, compareArg string, w // GetPatch generates and returns format-patch data between given revisions, able to be used with `git apply` func (repo *Repository) GetPatch(ctx context.Context, compareArg string, w io.Writer) error { return gitcmd.NewCommand("format-patch", "--binary", "--stdout").AddDynamicArguments(compareArg). - WithDir(repo.Path). + WithRepo(repo). WithStdoutCopy(w). Run(ctx) } @@ -98,7 +96,7 @@ func (repo *Repository) GetFilesChangedBetween(ctx context.Context, base, head s } else { cmd.AddDynamicArguments(base, head) } - stdout, _, err := cmd.WithDir(repo.Path).RunStdString(ctx) + stdout, _, err := cmd.WithRepo(repo).RunStdString(ctx) if err != nil { return nil, err } @@ -115,8 +113,8 @@ func (repo *Repository) GetFilesChangedBetween(ctx context.Context, base, head s // ReadPatchCommit will check if a diff patch exists and return stats func (repo *Repository) ReadPatchCommit(prID int64) (commitSHA string, err error) { // Migrated repositories download patches to "pulls" location - patchFile := fmt.Sprintf("pulls/%d.patch", prID) - loadPatch, err := os.Open(filepath.Join(repo.Path, patchFile)) + repoFS := GetRepoFS(repo) + loadPatch, err := repoFS.Open(fmt.Sprintf("pulls/%d.patch", prID)) if err != nil { return "", err } diff --git a/modules/git/repo_compare_test.go b/modules/git/repo_compare_test.go index 07cc0ffcd31..d627c6f59d3 100644 --- a/modules/git/repo_compare_test.go +++ b/modules/git/repo_compare_test.go @@ -103,7 +103,7 @@ func TestReadWritePullHead(t *testing.T) { newCommit := "feaf4ba6bc635fec442f46ddd4512416ec43c2c2" _, _, err = gitcmd.NewCommand("update-ref"). AddDynamicArguments(PullPrefix+"1/head", newCommit). - WithDir(repo.Path). + WithRepo(repo). RunStdString(t.Context()) if err != nil { assert.NoError(t, err) @@ -123,7 +123,7 @@ func TestReadWritePullHead(t *testing.T) { // Remove file after the test _, _, err = gitcmd.NewCommand("update-ref", "--no-deref", "-d"). AddDynamicArguments(PullPrefix + "1/head"). - WithDir(repo.Path). + WithRepo(repo). RunStdString(t.Context()) assert.NoError(t, err) } diff --git a/modules/git/repo_index.go b/modules/git/repo_index.go index 78c27514f54..dfc58b2b678 100644 --- a/modules/git/repo_index.go +++ b/modules/git/repo_index.go @@ -22,7 +22,7 @@ func (repo *Repository) ReadTreeToIndex(ctx context.Context, treeish string, ind } if len(treeish) != objectFormat.FullLength() { - res, _, err := gitcmd.NewCommand("rev-parse", "--verify").AddDynamicArguments(treeish).WithDir(repo.Path).RunStdString(ctx) + res, _, err := gitcmd.NewCommand("rev-parse", "--verify").AddDynamicArguments(treeish).WithRepo(repo).RunStdString(ctx) if err != nil { return err } @@ -42,7 +42,7 @@ func (repo *Repository) readTreeToIndex(ctx context.Context, id ObjectID, indexF if len(indexFilename) > 0 { env = append(os.Environ(), "GIT_INDEX_FILE="+indexFilename[0]) } - _, _, err := gitcmd.NewCommand("read-tree").AddDynamicArguments(id.String()).WithDir(repo.Path).WithEnv(env).RunStdString(ctx) + _, _, err := gitcmd.NewCommand("read-tree").AddDynamicArguments(id.String()).WithRepo(repo).WithEnv(env).RunStdString(ctx) if err != nil { return err } @@ -75,14 +75,14 @@ func (repo *Repository) ReadTreeToTemporaryIndex(ctx context.Context, treeish st // EmptyIndex empties the index func (repo *Repository) EmptyIndex(ctx context.Context) error { - _, _, err := gitcmd.NewCommand("read-tree", "--empty").WithDir(repo.Path).RunStdString(ctx) + _, _, err := gitcmd.NewCommand("read-tree", "--empty").WithRepo(repo).RunStdString(ctx) return err } // LsFiles checks if the given filenames are in the index func (repo *Repository) LsFiles(ctx context.Context, filenames ...string) ([]string, error) { cmd := gitcmd.NewCommand("ls-files", "-z").AddDashesAndList(filenames...) - res, _, err := cmd.WithDir(repo.Path).RunStdBytes(ctx) + res, _, err := cmd.WithRepo(repo).RunStdBytes(ctx) if err != nil { return nil, err } @@ -109,7 +109,7 @@ func (repo *Repository) RemoveFilesFromIndex(ctx context.Context, filenames ...s } } return cmd. - WithDir(repo.Path). + WithRepo(repo). WithStdinBytes(input.Bytes()). RunWithStderr(ctx) } @@ -129,7 +129,7 @@ func (repo *Repository) AddObjectsToIndex(ctx context.Context, objects ...IndexO input.WriteString(object.Mode + " blob " + object.Object.String() + "\t" + object.Filename + "\000") } return cmd. - WithDir(repo.Path). + WithRepo(repo). WithStdinBytes(input.Bytes()). RunWithStderr(ctx) } @@ -141,7 +141,7 @@ func (repo *Repository) AddObjectToIndex(ctx context.Context, mode string, objec // WriteTree writes the current index as a tree to the object db and returns its hash func (repo *Repository) WriteTree(ctx context.Context) (*Tree, error) { - stdout, _, runErr := gitcmd.NewCommand("write-tree").WithDir(repo.Path).RunStdString(ctx) + stdout, _, runErr := gitcmd.NewCommand("write-tree").WithRepo(repo).RunStdString(ctx) if runErr != nil { return nil, runErr } diff --git a/modules/git/repo_object.go b/modules/git/repo_object.go index c139d2a69e3..c3fb286d694 100644 --- a/modules/git/repo_object.go +++ b/modules/git/repo_object.go @@ -68,7 +68,7 @@ func (repo *Repository) hashObjectBytes(ctx context.Context, buf []byte, save bo cmd = gitcmd.NewCommand("hash-object", "--stdin") } stdout, _, err := cmd. - WithDir(repo.Path). + WithRepo(repo). WithStdinBytes(buf). RunStdString(ctx) if err != nil { diff --git a/modules/git/repo_ref.go b/modules/git/repo_ref.go index 974dcf1829d..35f018692e5 100644 --- a/modules/git/repo_ref.go +++ b/modules/git/repo_ref.go @@ -30,7 +30,7 @@ func (repo *Repository) ListOccurrences(ctx context.Context, refType, commitSHA return nil, util.NewInvalidArgumentErrorf(`can only use "branch" or "tag" for refType, but got %q`, refType) } stdout, _, err := cmd.AddArguments("--no-color", "--sort=-creatordate", "--contains"). - AddDynamicArguments(commitSHA).WithDir(repo.Path).RunStdString(ctx) + AddDynamicArguments(commitSHA).WithRepo(repo).RunStdString(ctx) if err != nil { return nil, err } diff --git a/modules/git/repo_ref_nogogit.go b/modules/git/repo_ref_nogogit.go index d3fcb057688..54f55a265eb 100644 --- a/modules/git/repo_ref_nogogit.go +++ b/modules/git/repo_ref_nogogit.go @@ -20,7 +20,7 @@ func (repo *Repository) GetRefsFiltered(ctx context.Context, pattern string) ([] cmd := gitcmd.NewCommand("for-each-ref") stdoutReader, stdoutReaderClose := cmd.MakeStdoutPipe() defer stdoutReaderClose() - err := cmd.WithDir(repo.Path). + err := cmd.WithRepo(repo). WithPipelineFunc(func(context gitcmd.Context) error { bufReader := bufio.NewReader(stdoutReader) for { diff --git a/modules/git/repo_stats.go b/modules/git/repo_stats.go index 8190b454a2b..c512529cfe7 100644 --- a/modules/git/repo_stats.go +++ b/modules/git/repo_stats.go @@ -42,7 +42,7 @@ func (repo *Repository) GetCodeActivityStats(ctx context.Context, fromTime time. stdout, _, runErr := gitcmd.NewCommand("rev-list", "--count", "--no-merges", "--branches=*", "--date=iso"). AddOptionFormat("--since=%s", since). - WithDir(repo.Path). + WithRepo(repo). RunStdString(ctx) if runErr != nil { return nil, runErr @@ -65,7 +65,7 @@ func (repo *Repository) GetCodeActivityStats(ctx context.Context, fromTime time. stdoutReader, stdoutReaderClose := gitCmd.MakeStdoutPipe() defer stdoutReaderClose() err = gitCmd. - WithDir(repo.Path). + WithRepo(repo). WithPipelineFunc(func(ctx gitcmd.Context) error { scanner := bufio.NewScanner(stdoutReader) scanner.Split(bufio.ScanLines) diff --git a/modules/git/repo_tag.go b/modules/git/repo_tag.go index ab404ce390f..dde15602bb8 100644 --- a/modules/git/repo_tag.go +++ b/modules/git/repo_tag.go @@ -19,7 +19,7 @@ const TagPrefix = "refs/tags/" // CreateTag create one tag in the repository func (repo *Repository) CreateTag(ctx context.Context, name, revision string) error { - _, _, err := gitcmd.NewCommand("tag").AddDashesAndList(name, revision).WithDir(repo.Path).RunStdString(ctx) + _, _, err := gitcmd.NewCommand("tag").AddDashesAndList(name, revision).WithRepo(repo).RunStdString(ctx) return err } @@ -28,7 +28,7 @@ func (repo *Repository) CreateAnnotatedTag(ctx context.Context, name, message, r _, _, err := gitcmd.NewCommand("tag", "-a", "-m"). AddDynamicArguments(message). AddDashesAndList(name, revision). - WithDir(repo.Path). + WithRepo(repo). RunStdString(ctx) return err } @@ -39,7 +39,7 @@ func (repo *Repository) GetTagNameBySHA(ctx context.Context, sha string) (string return "", fmt.Errorf("SHA is too short: %s", sha) } - stdout, _, err := gitcmd.NewCommand("show-ref", "--tags", "-d").WithDir(repo.Path).RunStdString(ctx) + stdout, _, err := gitcmd.NewCommand("show-ref", "--tags", "-d").WithRepo(repo).RunStdString(ctx) if err != nil { return "", err } @@ -62,7 +62,7 @@ func (repo *Repository) GetTagNameBySHA(ctx context.Context, sha string) (string // GetTagID returns the object ID for a tag (annotated tags have both an object SHA AND a commit SHA) func (repo *Repository) GetTagID(ctx context.Context, name string) (string, error) { - stdout, _, err := gitcmd.NewCommand("show-ref", "--tags").AddDashesAndList(name).WithDir(repo.Path).RunStdString(ctx) + stdout, _, err := gitcmd.NewCommand("show-ref", "--tags").AddDashesAndList(name).WithRepo(repo).RunStdString(ctx) if err != nil { return "", err } @@ -122,7 +122,7 @@ func (repo *Repository) GetTagInfos(ctx context.Context, page, pageSize int) ([] defer stdoutReaderClose() err := cmd.AddOptionFormat("--format=%s", forEachRefFmt.Flag()). AddArguments("--sort", "-*creatordate", "refs/tags"). - WithDir(repo.Path). + WithRepo(repo). WithPipelineFunc(func(context gitcmd.Context) error { parser := forEachRefFmt.Parser(stdoutReader) for { diff --git a/modules/git/repo_tree.go b/modules/git/repo_tree.go index b2c251a01a3..f0fce10a94d 100644 --- a/modules/git/repo_tree.go +++ b/modules/git/repo_tree.go @@ -60,7 +60,7 @@ func (repo *Repository) CommitTree(ctx context.Context, author, committer *Signa } stdout, _, err := cmd.WithEnv(env). - WithDir(repo.Path). + WithRepo(repo). WithStdinBytes(messageBytes.Bytes()). RunStdString(ctx) if err != nil { diff --git a/modules/git/repo_tree_gogit.go b/modules/git/repo_tree_gogit.go index 848c2fd14b1..b455ffdbb60 100644 --- a/modules/git/repo_tree_gogit.go +++ b/modules/git/repo_tree_gogit.go @@ -41,7 +41,7 @@ func (repo *Repository) GetTree(ctx context.Context, idStr string) (*Tree, error if len(idStr) != objectFormat.FullLength() { res, _, err := gitcmd.NewCommand("rev-parse", "--verify"). AddDynamicArguments(idStr). - WithDir(repo.Path). + WithRepo(repo). RunStdString(ctx) if err != nil { return nil, err diff --git a/modules/gitrepo/size.go b/modules/git/size.go similarity index 79% rename from modules/gitrepo/size.go rename to modules/git/size.go index d637e5d986c..480db26b551 100644 --- a/modules/gitrepo/size.go +++ b/modules/git/size.go @@ -1,21 +1,21 @@ // Copyright 2025 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package gitrepo +package git import ( "os" "path/filepath" - "gitea.dev/modules/git" + "gitea.dev/modules/git/gitcmd" ) const notRegularFileMode = os.ModeSymlink | os.ModeNamedPipe | os.ModeSocket | os.ModeDevice | os.ModeCharDevice | os.ModeIrregular // CalcRepositorySize returns the disk consumption for a given path -func CalcRepositorySize(repo git.RepositoryFacade) (int64, error) { +func CalcRepositorySize(repo RepositoryFacade) (int64, error) { var size int64 - err := filepath.WalkDir(repoPath(repo), func(_ string, entry os.DirEntry, err error) error { + err := filepath.WalkDir(gitcmd.RepoLocalPath(repo), func(_ string, entry os.DirEntry, err error) error { if os.IsNotExist(err) { // ignore the error because some files (like temp/lock file) may be deleted during traversing. return nil } else if err != nil { diff --git a/modules/git/tag.go b/modules/git/tag.go index 601debde260..f7d44f8f319 100644 --- a/modules/git/tag.go +++ b/modules/git/tag.go @@ -5,6 +5,7 @@ package git import ( "bytes" + "context" "sort" "gitea.dev/modules/util" @@ -114,3 +115,8 @@ func sortTagsByTime(tags []*Tag) { sorter := tagSorter(tags) sort.Sort(sorter) } + +// IsTagExist returns true if given tag exists in the repository. +func IsTagExist(ctx context.Context, repo RepositoryFacade, name string) bool { + return IsReferenceExist(ctx, repo, TagPrefix+name) +} diff --git a/modules/git/tree.go b/modules/git/tree.go index b22e20a5ac1..a397452d9c3 100644 --- a/modules/git/tree.go +++ b/modules/git/tree.go @@ -53,7 +53,7 @@ func (repo *Repository) LsTree(ctx context.Context, ref string, filenames ...str cmd := gitcmd.NewCommand("ls-tree", "-z", "--name-only"). AddDashesAndList(append([]string{ref}, filenames...)...) - res, _, err := cmd.WithDir(repo.Path).RunStdBytes(ctx) + res, _, err := cmd.WithRepo(repo).RunStdBytes(ctx) if err != nil { return nil, err } @@ -69,7 +69,7 @@ func (repo *Repository) LsTree(ctx context.Context, ref string, filenames ...str func (repo *Repository) GetTreePathLatestCommit(ctx context.Context, refName, treePath string) (*Commit, error) { stdout, _, err := gitcmd.NewCommand("rev-list", "-1"). AddDynamicArguments(refName).AddDashesAndList(treePath). - WithDir(repo.Path). + WithRepo(repo). RunStdString(ctx) if err != nil { return nil, err diff --git a/modules/git/tree_nogogit.go b/modules/git/tree_nogogit.go index 502a3c65859..14bf4372b95 100644 --- a/modules/git/tree_nogogit.go +++ b/modules/git/tree_nogogit.go @@ -61,7 +61,7 @@ func (t *Tree) ListEntries(ctx context.Context, gitRepo *Repository) (Entries, e return nil, err } - stdout, _, runErr := gitcmd.NewCommand("ls-tree", "-l").AddDynamicArguments(t.ID.String()).WithDir(gitRepo.Path).RunStdBytes(ctx) + stdout, _, runErr := gitcmd.NewCommand("ls-tree", "-l").AddDynamicArguments(t.ID.String()).WithRepo(gitRepo).RunStdBytes(ctx) if runErr != nil { if gitcmd.IsStderr(runErr, gitcmd.StderrNotValidObjectName) || gitcmd.IsStderr(runErr, gitcmd.StderrNotTreeObject) { return nil, ErrNotExist{ @@ -85,7 +85,7 @@ func (t *Tree) listEntriesRecursive(ctx context.Context, gitRepo *Repository, ex stdout, _, runErr := gitcmd.NewCommand("ls-tree", "-t", "-r"). AddArguments(extraArgs...). AddDynamicArguments(t.ID.String()). - WithDir(gitRepo.Path). + WithRepo(gitRepo). RunStdBytes(ctx) if runErr != nil { return nil, runErr diff --git a/modules/gitrepo/clone.go b/modules/gitrepo/clone.go deleted file mode 100644 index 521112f9605..00000000000 --- a/modules/gitrepo/clone.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2025 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package gitrepo - -import ( - "context" - - "gitea.dev/modules/git" -) - -// CloneExternalRepo clones an external repository to the managed repository. -func CloneExternalRepo(ctx context.Context, fromRemoteURL string, toRepo git.RepositoryFacade, opts git.CloneRepoOptions) error { - return git.Clone(ctx, fromRemoteURL, repoPath(toRepo), opts) -} - -// CloneRepoToLocal clones a managed repository to a local path. -func CloneRepoToLocal(ctx context.Context, fromRepo git.RepositoryFacade, toLocalPath string, opts git.CloneRepoOptions) error { - return git.Clone(ctx, repoPath(fromRepo), toLocalPath, opts) -} - -func CloneManaged(ctx context.Context, fromRepo, toRepo git.RepositoryFacade, opts git.CloneRepoOptions) error { - return git.Clone(ctx, repoPath(fromRepo), repoPath(toRepo), opts) -} diff --git a/modules/gitrepo/localfs.go b/modules/gitrepo/localfs.go deleted file mode 100644 index fefdc5d2505..00000000000 --- a/modules/gitrepo/localfs.go +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2026 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package gitrepo - -import ( - "context" - "fmt" - "io" - "io/fs" - "os" - "path/filepath" - - "gitea.dev/modules/git" - "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/util" -) - -var repoPath = gitcmd.RepoLocalPath // some functions need to operate local filesystem directly - -// IsRepositoryExist returns true if the repository directory exists in the disk -func IsRepositoryExist(ctx context.Context, repo git.RepositoryFacade) (bool, error) { - return util.IsExist(repoPath(repo)) -} - -// DeleteRepository deletes the repository directory from the disk, it will return -// nil if the repository does not exist. -func DeleteRepository(ctx context.Context, repo git.RepositoryFacade) error { - return util.RemoveAll(repoPath(repo)) -} - -// RenameRepository renames a repository's name on disk -func RenameRepository(ctx context.Context, repo, newRepo git.RepositoryFacade) error { - dstDir := repoPath(newRepo) - if err := os.MkdirAll(filepath.Dir(dstDir), os.ModePerm); err != nil { - return fmt.Errorf("Failed to create dir %s: %w", filepath.Dir(dstDir), err) - } - - if err := util.Rename(repoPath(repo), dstDir); err != nil { - return fmt.Errorf("rename repository directory: %w", err) - } - return nil -} - -func InitRepository(ctx context.Context, repo git.RepositoryFacade, objectFormatName string) error { - return git.InitRepository(ctx, repoPath(repo), true, objectFormatName) -} - -func GetRepoFS(repo git.RepositoryFacade) fs.FS { - return os.DirFS(repoPath(repo)) -} - -func IsRepoFileExist(ctx context.Context, repo git.RepositoryFacade, relativeFilePath string) (bool, error) { - absoluteFilePath := filepath.Join(repoPath(repo), relativeFilePath) - return util.IsExist(absoluteFilePath) -} - -func IsRepoDirExist(ctx context.Context, repo git.RepositoryFacade, relativeDirPath string) (bool, error) { - absoluteDirPath := filepath.Join(repoPath(repo), relativeDirPath) - return util.IsDir(absoluteDirPath) -} - -func RemoveRepoFileOrDir(ctx context.Context, repo git.RepositoryFacade, relativeFileOrDirPath string) error { - absoluteFilePath := filepath.Join(repoPath(repo), relativeFileOrDirPath) - return util.Remove(absoluteFilePath) -} - -func CreateRepoFile(ctx context.Context, repo git.RepositoryFacade, relativeFilePath string) (io.WriteCloser, error) { - absoluteFilePath := filepath.Join(repoPath(repo), relativeFilePath) - if err := os.MkdirAll(filepath.Dir(absoluteFilePath), os.ModePerm); err != nil { - return nil, err - } - return os.Create(absoluteFilePath) -} diff --git a/modules/gitrepo/push.go b/modules/gitrepo/push.go deleted file mode 100644 index 7fdc11c8c16..00000000000 --- a/modules/gitrepo/push.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2025 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package gitrepo - -import ( - "context" - - "gitea.dev/modules/git" -) - -// PushToExternal pushes a managed repository to an external remote. -func PushToExternal(ctx context.Context, repo git.RepositoryFacade, opts git.PushOptions) error { - return git.Push(ctx, repoPath(repo), opts) -} - -// PushManaged pushes from one managed repository to another managed repository. -func PushManaged(ctx context.Context, fromRepo, toRepo git.RepositoryFacade, opts git.PushOptions) error { - opts.Remote = repoPath(toRepo) - return git.Push(ctx, repoPath(fromRepo), opts) -} - -// PushFromLocal pushes from a local path to a managed repository. -func PushFromLocal(ctx context.Context, fromLocalPath string, toRepo git.RepositoryFacade, opts git.PushOptions) error { - opts.Remote = repoPath(toRepo) - return git.Push(ctx, fromLocalPath, opts) -} diff --git a/modules/gitrepo/ref.go b/modules/gitrepo/ref.go deleted file mode 100644 index 17c908e6345..00000000000 --- a/modules/gitrepo/ref.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2025 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package gitrepo - -import ( - "context" - - "gitea.dev/modules/git" - "gitea.dev/modules/git/gitcmd" -) - -func UpdateRef(ctx context.Context, repo git.RepositoryFacade, refName, newCommitID string) error { - return gitcmd.NewCommand("update-ref").AddDynamicArguments(refName, newCommitID).WithRepo(repo).Run(ctx) -} - -func RemoveRef(ctx context.Context, repo git.RepositoryFacade, refName string) error { - return gitcmd.NewCommand("update-ref", "--no-deref", "-d").AddDynamicArguments(refName).WithRepo(repo).Run(ctx) -} diff --git a/modules/gitrepo/tag.go b/modules/gitrepo/tag.go deleted file mode 100644 index cddea4c8bbc..00000000000 --- a/modules/gitrepo/tag.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2025 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package gitrepo - -import ( - "context" - - "gitea.dev/modules/git" -) - -// IsTagExist returns true if given tag exists in the repository. -func IsTagExist(ctx context.Context, repo git.RepositoryFacade, name string) bool { - return IsReferenceExist(ctx, repo, git.TagPrefix+name) -} diff --git a/modules/indexer/code/indexer.go b/modules/indexer/code/indexer.go index be067128157..55a0f70551d 100644 --- a/modules/indexer/code/indexer.go +++ b/modules/indexer/code/indexer.go @@ -13,7 +13,7 @@ import ( "gitea.dev/models/db" repo_model "gitea.dev/models/repo" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/graceful" "gitea.dev/modules/indexer" "gitea.dev/modules/indexer/code/bleve" @@ -74,7 +74,7 @@ func index(ctx context.Context, indexer internal.Indexer, repoID int64) error { return nil } - gitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, repo) + gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, repo) if err != nil { return err } diff --git a/modules/indexer/stats/db.go b/modules/indexer/stats/db.go index e4ba9cf2e8d..a03647f9b42 100644 --- a/modules/indexer/stats/db.go +++ b/modules/indexer/stats/db.go @@ -9,7 +9,6 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/modules/git" "gitea.dev/modules/git/languagestats" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/graceful" "gitea.dev/modules/log" "gitea.dev/modules/process" @@ -37,7 +36,7 @@ func (db *DBIndexer) Index(id int64) error { return err } - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) if err != nil { if err.Error() == "no such file or directory" { return nil diff --git a/modules/lfs/pointer_scanner_nogogit.go b/modules/lfs/pointer_scanner_nogogit.go index 896c34a20b8..052c878a8db 100644 --- a/modules/lfs/pointer_scanner_nogogit.go +++ b/modules/lfs/pointer_scanner_nogogit.go @@ -41,7 +41,7 @@ func SearchPointerBlobs(ctx context.Context, repo *git.Repository, pointerChan c // 3. Take the shas of the blobs and batch read them wg.Go(func() error { - return pipeline.CatFileBatch(ctx, cmd3BatchContent, repo.Path) + return pipeline.CatFileBatch(ctx, cmd3BatchContent, repo) }) // 2. From the provided objects restrict to blobs <=1k @@ -51,7 +51,7 @@ func SearchPointerBlobs(ctx context.Context, repo *git.Repository, pointerChan c // 1. Run batch-check on all objects in the repository wg.Go(func() error { - return pipeline.CatFileBatchCheckAllObjects(ctx, cmd1AllObjs, repo.Path) + return pipeline.CatFileBatchCheckAllObjects(ctx, cmd1AllObjs, repo) }) err := wg.Wait() close(pointerChan) diff --git a/modules/repository/branch.go b/modules/repository/branch.go index 21fbd3a9af8..d6058a83e8b 100644 --- a/modules/repository/branch.go +++ b/modules/repository/branch.go @@ -12,7 +12,6 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/modules/container" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" "gitea.dev/modules/timeutil" ) @@ -33,7 +32,7 @@ func SyncRepoBranches(ctx context.Context, repoID, doerID int64) (int64, error) log.Debug("SyncRepoBranches: in Repo[%d:%s]", repo.ID, repo.FullName()) - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) if err != nil { log.Error("OpenRepository[%s]: %w", repo.FullName(), err) return 0, err diff --git a/modules/repository/commits.go b/modules/repository/commits.go index 318b052ef18..b1e7872309b 100644 --- a/modules/repository/commits.go +++ b/modules/repository/commits.go @@ -12,7 +12,6 @@ import ( repo_model "gitea.dev/models/repo" user_model "gitea.dev/models/user" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" api "gitea.dev/modules/structs" ) @@ -70,7 +69,7 @@ func ToAPIPayloadCommit(ctx context.Context, emailUsers map[string]*user_model.U committerUsername = committer.Name } - fileStatus, err := gitrepo.GetCommitFileStatus(ctx, repo, commit.Sha1) + fileStatus, err := git.GetCommitFileStatus(ctx, repo, commit.Sha1) if err != nil { return nil, fmt.Errorf("FileStatus [commit_sha1: %s]: %w", commit.Sha1, err) } diff --git a/modules/repository/create.go b/modules/repository/create.go index 3076f8c4a03..1500d548fa9 100644 --- a/modules/repository/create.go +++ b/modules/repository/create.go @@ -9,12 +9,12 @@ import ( git_model "gitea.dev/models/git" repo_model "gitea.dev/models/repo" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" ) // UpdateRepoSize updates the repository size, calculating it using getDirectorySize func UpdateRepoSize(ctx context.Context, repo *repo_model.Repository) error { - size, err := gitrepo.CalcRepositorySize(repo) + size, err := git.CalcRepositorySize(repo) if err != nil { return fmt.Errorf("updateSize: %w", err) } diff --git a/modules/repository/create_test.go b/modules/repository/create_test.go index 45de0a0983d..80df8362dc3 100644 --- a/modules/repository/create_test.go +++ b/modules/repository/create_test.go @@ -8,7 +8,7 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/models/unittest" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "github.com/stretchr/testify/assert" ) @@ -17,7 +17,7 @@ func TestGetDirectorySize(t *testing.T) { assert.NoError(t, unittest.PrepareTestDatabase()) repo, err := repo_model.GetRepositoryByID(t.Context(), 1) assert.NoError(t, err) - size, err := gitrepo.CalcRepositorySize(repo) + size, err := git.CalcRepositorySize(repo) assert.NoError(t, err) repo.Size = 8165 // real size on the disk assert.Equal(t, repo.Size, size) diff --git a/modules/repository/repo.go b/modules/repository/repo.go index d24ed449efe..a297e92c984 100644 --- a/modules/repository/repo.go +++ b/modules/repository/repo.go @@ -14,7 +14,6 @@ import ( git_model "gitea.dev/models/git" repo_model "gitea.dev/models/repo" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/lfs" "gitea.dev/modules/log" "gitea.dev/modules/setting" @@ -47,7 +46,7 @@ func SyncRepoTags(ctx context.Context, repoID int64) error { return err } - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) if err != nil { return err } diff --git a/modules/repository/temp.go b/modules/repository/temp.go index 34c9fbb924c..4441decd34b 100644 --- a/modules/repository/temp.go +++ b/modules/repository/temp.go @@ -7,16 +7,18 @@ import ( "context" "fmt" - "gitea.dev/modules/log" + "gitea.dev/modules/git" + "gitea.dev/modules/git/gitcmd" "gitea.dev/modules/setting" ) -// CreateTemporaryPath creates a temporary path -func CreateTemporaryPath(prefix string) (string, context.CancelFunc, error) { - basePath, cleanup, err := setting.AppDataTempDir("local-repo").MkdirTempRandom(prefix + ".git") +// CreateTemporaryGitRepo creates a temporary Git repository empty directory (not initialized) +func CreateTemporaryGitRepo(prefix string) (tmpPath string, tmpRepo git.RepositoryFacade, cancel context.CancelFunc, err error) { + tmpNamePrefix := prefix + ".git" + tmpPath, cancel, err = setting.AppDataTempDir("local-repo").MkdirTempRandom(tmpNamePrefix) if err != nil { - log.Error("Unable to create temporary directory: %s-*.git (%v)", prefix, err) - return "", nil, fmt.Errorf("failed to create dir %s-*.git: %w", prefix, err) + return "", nil, nil, fmt.Errorf("failed to create temp dir with prefix %s: %w", tmpNamePrefix, err) } - return basePath, cleanup, nil + tmpRepo = gitcmd.RepositoryUnmanaged(tmpPath) + return tmpPath, tmpRepo, cancel, nil } diff --git a/modules/templates/util_misc.go b/modules/templates/util_misc.go index 27c37615ba6..ce6c4681a07 100644 --- a/modules/templates/util_misc.go +++ b/modules/templates/util_misc.go @@ -15,7 +15,7 @@ import ( activities_model "gitea.dev/models/activities" repo_model "gitea.dev/models/repo" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/json" "gitea.dev/modules/log" "gitea.dev/modules/repository" @@ -141,7 +141,7 @@ type remoteAddress struct { func mirrorRemoteAddress(ctx context.Context, m *repo_model.Repository, remoteName string) remoteAddress { ret := remoteAddress{} - u, err := gitrepo.GitRemoteGetURL(ctx, m, remoteName) + u, err := git.ParseRemoteAddressURL(ctx, m, remoteName) if err != nil { log.Error("GetRemoteURL %v", err) return ret diff --git a/routers/api/v1/admin/adopt.go b/routers/api/v1/admin/adopt.go index ac625bd2a26..c5d6a53a27a 100644 --- a/routers/api/v1/admin/adopt.go +++ b/routers/api/v1/admin/adopt.go @@ -8,7 +8,7 @@ import ( repo_model "gitea.dev/models/repo" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/routers/api/v1/utils" "gitea.dev/services/context" repo_service "gitea.dev/services/repository" @@ -99,7 +99,7 @@ func AdoptRepository(ctx *context.APIContext) { ctx.APIErrorInternal(err) return } - exist, err := gitrepo.IsRepositoryExist(ctx, repo_model.CodeRepoByName(ctxUser.Name, repoName)) + exist, err := git.IsRepositoryExist(ctx, repo_model.CodeRepoByName(ctxUser.Name, repoName)) if err != nil { ctx.APIErrorInternal(err) return @@ -161,7 +161,7 @@ func DeleteUnadoptedRepository(ctx *context.APIContext) { ctx.APIErrorInternal(err) return } - exist, err := gitrepo.IsRepositoryExist(ctx, repo_model.CodeRepoByName(ctxUser.Name, repoName)) + exist, err := git.IsRepositoryExist(ctx, repo_model.CodeRepoByName(ctxUser.Name, repoName)) if err != nil { ctx.APIErrorInternal(err) return diff --git a/routers/api/v1/repo/branch.go b/routers/api/v1/repo/branch.go index b890d52c7cd..08a838f265b 100644 --- a/routers/api/v1/repo/branch.go +++ b/routers/api/v1/repo/branch.go @@ -14,7 +14,6 @@ import ( repo_model "gitea.dev/models/repo" user_model "gitea.dev/models/user" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/optional" repo_module "gitea.dev/modules/repository" api "gitea.dev/modules/structs" @@ -1169,7 +1168,7 @@ func EditBranchProtection(ctx *context.APIContext) { } else { if !isPlainRule { if ctx.Repo.GitRepo == nil { - ctx.Repo.GitRepo, err = gitrepo.RepositoryFromRequestContextOrOpen(ctx, ctx.Repo.Repository) + ctx.Repo.GitRepo, err = git.RepositoryFromRequestContextOrOpen(ctx, ctx.Repo.Repository) if err != nil { ctx.APIErrorInternal(err) return diff --git a/routers/api/v1/repo/commits.go b/routers/api/v1/repo/commits.go index a445f796712..e4c2a0df4b7 100644 --- a/routers/api/v1/repo/commits.go +++ b/routers/api/v1/repo/commits.go @@ -13,7 +13,6 @@ import ( issues_model "gitea.dev/models/issues" user_model "gitea.dev/models/user" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/setting" api "gitea.dev/modules/structs" "gitea.dev/routers/api/v1/utils" @@ -223,7 +222,7 @@ func GetAllCommits(ctx *context.APIContext) { } // Total commit count - commitsCountTotal, err = gitrepo.CommitsCount(ctx, ctx.Repo.Repository, gitrepo.CommitsCountOptions{ + commitsCountTotal, err = git.CommitsCount(ctx, ctx.Repo.Repository, git.CommitsCountOptions{ Not: not, Revision: []string{baseCommit.ID.String()}, Since: since, @@ -245,8 +244,8 @@ func GetAllCommits(ctx *context.APIContext) { sha = ctx.Repo.Repository.DefaultBranch } - commitsCountTotal, err = gitrepo.CommitsCount(ctx, ctx.Repo.Repository, - gitrepo.CommitsCountOptions{ + commitsCountTotal, err = git.CommitsCount(ctx, ctx.Repo.Repository, + git.CommitsCountOptions{ Not: not, Revision: []string{sha}, RelPath: []string{path}, @@ -265,8 +264,8 @@ func GetAllCommits(ctx *context.APIContext) { return } // verify the path actually exists in the revision history - totalWithoutDate, err := gitrepo.CommitsCount(ctx, ctx.Repo.Repository, - gitrepo.CommitsCountOptions{ + totalWithoutDate, err := git.CommitsCount(ctx, ctx.Repo.Repository, + git.CommitsCountOptions{ Not: not, Revision: []string{sha}, RelPath: []string{path}, diff --git a/routers/api/v1/repo/compare.go b/routers/api/v1/repo/compare.go index afb43417878..fa1be491d94 100644 --- a/routers/api/v1/repo/compare.go +++ b/routers/api/v1/repo/compare.go @@ -7,7 +7,7 @@ import ( "net/http" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" api "gitea.dev/modules/structs" "gitea.dev/services/context" "gitea.dev/services/convert" @@ -58,7 +58,7 @@ func CompareDiff(ctx *context.APIContext) { if ctx.Repo.GitRepo == nil { var err error - ctx.Repo.GitRepo, err = gitrepo.RepositoryFromRequestContextOrOpen(ctx, ctx.Repo.Repository) + ctx.Repo.GitRepo, err = git.RepositoryFromRequestContextOrOpen(ctx, ctx.Repo.Repository) if err != nil { ctx.APIErrorInternal(err) return diff --git a/routers/api/v1/repo/pull.go b/routers/api/v1/repo/pull.go index 3bf39bfe868..8e8d599df52 100644 --- a/routers/api/v1/repo/pull.go +++ b/routers/api/v1/repo/pull.go @@ -23,7 +23,6 @@ import ( "gitea.dev/modules/base" "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/graceful" "gitea.dev/modules/log" "gitea.dev/modules/optional" @@ -1107,7 +1106,7 @@ func parseCompareInfo(ctx *context.APIContext, compareParam string) (result *git headGitRepo = ctx.Repo.GitRepo closer = func() {} // no need to close the head repo because it shares the base repo } else { - headGitRepo, err = gitrepo.OpenRepository(headRepo) + headGitRepo, err = git.OpenRepository(headRepo) if err != nil { ctx.APIErrorInternal(err) return nil, nil @@ -1426,7 +1425,7 @@ func GetPullRequestCommits(ctx *context.APIContext) { return } - baseGitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, pr.BaseRepo) + baseGitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, pr.BaseRepo) if err != nil { ctx.APIErrorInternal(err) return diff --git a/routers/api/v1/repo/pull_review.go b/routers/api/v1/repo/pull_review.go index 0eb823f891d..18ab857de89 100644 --- a/routers/api/v1/repo/pull_review.go +++ b/routers/api/v1/repo/pull_review.go @@ -13,7 +13,7 @@ import ( "gitea.dev/models/organization" access_model "gitea.dev/models/perm/access" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" api "gitea.dev/modules/structs" "gitea.dev/modules/web" "gitea.dev/routers/api/v1/utils" @@ -519,7 +519,7 @@ func CreatePullReview(ctx *context.APIContext) { // if CommitID is empty, set it as lastCommitID if opts.CommitID == "" { - gitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, pr.Issue.Repo) + gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, pr.Issue.Repo) if err != nil { ctx.APIErrorInternal(err) return diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index 531b48fe76a..e12f983615d 100644 --- a/routers/api/v1/repo/repo.go +++ b/routers/api/v1/repo/repo.go @@ -22,7 +22,6 @@ import ( unit_model "gitea.dev/models/unit" user_model "gitea.dev/models/user" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/label" "gitea.dev/modules/log" "gitea.dev/modules/optional" @@ -705,7 +704,7 @@ func updateBasicProperties(ctx *context.APIContext, opts api.EditRepoOption) err if ctx.Repo.GitRepo == nil && !repo.IsEmpty { var err error - ctx.Repo.GitRepo, err = gitrepo.RepositoryFromRequestContextOrOpen(ctx, repo) + ctx.Repo.GitRepo, err = git.RepositoryFromRequestContextOrOpen(ctx, repo) if err != nil { ctx.APIErrorInternal(err) return err @@ -714,10 +713,10 @@ func updateBasicProperties(ctx *context.APIContext, opts api.EditRepoOption) err // Default branch only updated if changed and exist or the repository is empty updateRepoLicense := false - if opts.DefaultBranch != nil && repo.DefaultBranch != *opts.DefaultBranch && (repo.IsEmpty || gitrepo.IsBranchExist(ctx, ctx.Repo.Repository, *opts.DefaultBranch)) { + if opts.DefaultBranch != nil && repo.DefaultBranch != *opts.DefaultBranch && (repo.IsEmpty || git.IsBranchExist(ctx, ctx.Repo.Repository, *opts.DefaultBranch)) { repo.DefaultBranch = *opts.DefaultBranch if !repo.IsEmpty { - if err := gitrepo.SetDefaultBranch(ctx, repo, repo.DefaultBranch); err != nil { + if err := git.SetDefaultBranch(ctx, repo, repo.DefaultBranch); err != nil { ctx.APIErrorInternal(err) return err } @@ -1067,7 +1066,7 @@ func updateMirror(ctx *context.APIContext, opts api.EditRepoOption) error { authUpdateRequested := opts.MirrorPassword != nil || opts.MirrorToken != nil || opts.MirrorUsername != nil if authUpdateRequested { - remoteURL, err := gitrepo.GitRemoteGetURL(ctx, repo, mirror.GetRemoteName()) + remoteURL, err := git.ParseRemoteAddressURL(ctx, repo, mirror.GetRemoteName()) if err != nil { ctx.APIErrorInternal(err) return err diff --git a/routers/api/v1/repo/wiki.go b/routers/api/v1/repo/wiki.go index 3b9d90a6bf8..12597dcbfdb 100644 --- a/routers/api/v1/repo/wiki.go +++ b/routers/api/v1/repo/wiki.go @@ -11,7 +11,6 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/setting" api "gitea.dev/modules/structs" "gitea.dev/modules/util" @@ -193,7 +192,7 @@ func getWikiPage(ctx *context.APIContext, wikiName wiki_service.WebPath) *api.Wi } // get commit count - wiki revisions - commitsCount, _ := gitrepo.FileCommitsCount(ctx, ctx.Repo.Repository.WikiStorageRepo(), ctx.Repo.Repository.DefaultWikiBranch, pageFilename) + commitsCount, _ := git.FileCommitsCount(ctx, ctx.Repo.Repository.WikiStorageRepo(), ctx.Repo.Repository.DefaultWikiBranch, pageFilename) // Get last change information. lastCommit, err := wikiRepo.GetCommitByPath(ctx, pageFilename) @@ -426,7 +425,7 @@ func ListPageRevisions(ctx *context.APIContext) { } // get commit count - wiki revisions - commitsCount, _ := gitrepo.FileCommitsCount(ctx, ctx.Repo.Repository.WikiStorageRepo(), ctx.Repo.Repository.DefaultWikiBranch, pageFilename) + commitsCount, _ := git.FileCommitsCount(ctx, ctx.Repo.Repository.WikiStorageRepo(), ctx.Repo.Repository.DefaultWikiBranch, pageFilename) page := max(ctx.FormInt("page"), 1) @@ -468,7 +467,7 @@ func findEntryForFile(ctx *context.APIContext, wikiRepo *git.Repository, commit // findWikiRepoCommit opens the wiki repo and returns the latest commit, writing to context on error. // The caller is responsible for closing the returned repo again func findWikiRepoCommit(ctx *context.APIContext) (*git.Repository, *git.Commit) { - wikiRepo, err := gitrepo.OpenRepository(ctx.Repo.Repository.WikiStorageRepo()) + wikiRepo, err := git.OpenRepository(ctx.Repo.Repository.WikiStorageRepo()) if err != nil { ctx.APIErrorAuto(err) return nil, nil diff --git a/routers/api/v1/utils/git.go b/routers/api/v1/utils/git.go index b88e8051d6f..0ee6af5664f 100644 --- a/routers/api/v1/utils/git.go +++ b/routers/api/v1/utils/git.go @@ -9,7 +9,6 @@ import ( git_model "gitea.dev/models/git" repo_model "gitea.dev/models/repo" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/reqctx" "gitea.dev/services/context" ) @@ -23,14 +22,14 @@ type RefCommit struct { // ResolveRefCommit resolve ref to a commit if exist func ResolveRefCommit(ctx reqctx.RequestContext, repo *repo_model.Repository, inputRef string, minCommitIDLen ...int) (_ *RefCommit, err error) { - gitRepo, err := gitrepo.RepositoryFromRequestContextOrOpen(ctx, repo) + gitRepo, err := git.RepositoryFromRequestContextOrOpen(ctx, repo) if err != nil { return nil, err } refCommit := RefCommit{InputRef: inputRef} if exist, _ := git_model.IsBranchExist(ctx, repo.ID, inputRef); exist { refCommit.RefName = git.RefNameFromBranch(inputRef) - } else if gitrepo.IsTagExist(ctx, repo, inputRef) { + } else if git.IsTagExist(ctx, repo, inputRef) { refCommit.RefName = git.RefNameFromTag(inputRef) } else if git.IsStringLikelyCommitID(git.ObjectFormatFromName(repo.ObjectFormatName), inputRef, minCommitIDLen...) { refCommit.RefName = git.RefNameFromCommit(inputRef) diff --git a/routers/private/default_branch.go b/routers/private/default_branch.go index 92866a4ece6..08b60e1d991 100644 --- a/routers/private/default_branch.go +++ b/routers/private/default_branch.go @@ -8,7 +8,7 @@ import ( "net/http" repo_model "gitea.dev/models/repo" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/private" gitea_context "gitea.dev/services/context" repo_service "gitea.dev/services/repository" @@ -21,7 +21,7 @@ func SetDefaultBranch(ctx *gitea_context.PrivateContext) { branch := ctx.PathParam("branch") ctx.Repo.Repository.DefaultBranch = branch - if err := gitrepo.SetDefaultBranch(ctx, ctx.Repo.Repository, ctx.Repo.Repository.DefaultBranch); err != nil { + if err := git.SetDefaultBranch(ctx, ctx.Repo.Repository, ctx.Repo.Repository.DefaultBranch); err != nil { ctx.JSON(http.StatusInternalServerError, private.Response{ Err: fmt.Sprintf("Unable to set default branch on repository: %s/%s Error: %v", ownerName, repoName, err), }) diff --git a/routers/private/hook_post_receive.go b/routers/private/hook_post_receive.go index a809f2813c2..206c5e1b8b1 100644 --- a/routers/private/hook_post_receive.go +++ b/routers/private/hook_post_receive.go @@ -17,7 +17,6 @@ import ( "gitea.dev/modules/cache" "gitea.dev/modules/cachegroup" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" "gitea.dev/modules/private" repo_module "gitea.dev/modules/repository" @@ -77,7 +76,7 @@ func hookPostReceiveSyncDatabaseBranches(ctx *gitea_context.PrivateContext, opts return true } - gitRepo, err := gitrepo.RepositoryFromRequestContextOrOpen(ctx, repo) + gitRepo, err := git.RepositoryFromRequestContextOrOpen(ctx, repo) if err != nil { ctx.PrivateInternalErrorf("failed to open repository: %v", err) return false @@ -288,7 +287,7 @@ func hookPostReceiveSyncRepoDefaultBranch(ctx *gitea_context.PrivateContext, opt if !hasBranch { return } - gitRepo, err := gitrepo.RepositoryFromRequestContextOrOpen(ctx, repo) + gitRepo, err := git.RepositoryFromRequestContextOrOpen(ctx, repo) if err != nil { log.Error("failed to open git repo: %v", err) return @@ -313,7 +312,7 @@ func hookPostReceiveSyncRepoDefaultBranch(ctx *gitea_context.PrivateContext, opt // if default branch was pushed, always keep the HEAD ref in sync for _, refFullName := range opts.RefFullNames { if refFullName.IsBranch() && refFullName.BranchName() == repo.DefaultBranch { - _ = gitrepo.SetDefaultBranch(ctx, repo, repo.DefaultBranch) + _ = git.SetDefaultBranch(ctx, repo, repo.DefaultBranch) } } } diff --git a/routers/private/hook_verification.go b/routers/private/hook_verification.go index 9621f6ff66e..9bb77e9f999 100644 --- a/routers/private/hook_verification.go +++ b/routers/private/hook_verification.go @@ -32,7 +32,7 @@ func verifyCommits(ctx context.Context, oldCommitID, newCommitID string, repo *g defer stdoutReaderClose() err := command.WithEnv(env). - WithDir(repo.Path). + WithRepo(repo). WithPipelineFunc(func(gitCtx gitcmd.Context) error { err := readAndVerifyCommitsFromShaReader(ctx, stdoutReader, repo, env) return gitCtx.CancelPipeline(err) @@ -63,7 +63,7 @@ func readAndVerifyCommit(ctx context.Context, sha string, repo *git.Repository, defer stdoutReaderClose() return cmd.WithEnv(env). - WithDir(repo.Path). + WithRepo(repo). WithPipelineFunc(func(gitCtx gitcmd.Context) error { commit, err := git.CommitFromReader(commitID, stdoutReader) if err != nil { diff --git a/routers/private/internal_repo.go b/routers/private/internal_repo.go index 52b8d80edb4..2b22d810170 100644 --- a/routers/private/internal_repo.go +++ b/routers/private/internal_repo.go @@ -8,7 +8,7 @@ import ( "net/http" repo_model "gitea.dev/models/repo" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/log" "gitea.dev/modules/private" gitea_context "gitea.dev/services/context" @@ -27,7 +27,7 @@ func RepoAssignment(ctx *gitea_context.PrivateContext) { return } - gitRepo, err := gitrepo.RepositoryFromRequestContextOrOpen(ctx, repo) + gitRepo, err := git.RepositoryFromRequestContextOrOpen(ctx, repo) if err != nil { log.Error("Failed to open repository: %s/%s Error: %v", ownerName, repoName, err) ctx.JSON(http.StatusInternalServerError, private.Response{ diff --git a/routers/web/admin/repos.go b/routers/web/admin/repos.go index af64106a859..2e751c6a7f3 100644 --- a/routers/web/admin/repos.go +++ b/routers/web/admin/repos.go @@ -11,7 +11,7 @@ import ( "gitea.dev/models/db" repo_model "gitea.dev/models/repo" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/log" "gitea.dev/modules/setting" "gitea.dev/modules/templates" @@ -134,7 +134,7 @@ func AdoptOrDeleteRepository(ctx *context.Context) { ctx.ServerError("IsRepositoryExist", err) return } - exist, err := gitrepo.IsRepositoryExist(ctx, repo_model.CodeRepoByName(ctxUser.Name, repoName)) + exist, err := git.IsRepositoryExist(ctx, repo_model.CodeRepoByName(ctxUser.Name, repoName)) if err != nil { ctx.ServerError("IsDir", err) return diff --git a/routers/web/repo/actions/view.go b/routers/web/repo/actions/view.go index 1ffb180d52a..7237c08b867 100644 --- a/routers/web/repo/actions/view.go +++ b/routers/web/repo/actions/view.go @@ -28,7 +28,6 @@ import ( "gitea.dev/modules/base" "gitea.dev/modules/cache" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/httplib" "gitea.dev/modules/json" "gitea.dev/modules/log" @@ -1476,7 +1475,7 @@ func viewScopedWorkflowFile(ctx *context_module.Context, run *actions_model.Acti return } - sourceGitRepo, err := gitrepo.OpenRepository(sourceRepo) + sourceGitRepo, err := git.OpenRepository(sourceRepo) if err != nil { ctx.ServerError("OpenRepository", err) return diff --git a/routers/web/repo/blame.go b/routers/web/repo/blame.go index 9b656ad0c16..b3c2246ee19 100644 --- a/routers/web/repo/blame.go +++ b/routers/web/repo/blame.go @@ -16,7 +16,6 @@ import ( "gitea.dev/modules/charset" "gitea.dev/modules/git" "gitea.dev/modules/git/languagestats" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/highlight" "gitea.dev/modules/log" "gitea.dev/modules/setting" @@ -100,7 +99,7 @@ func RefBlame(ctx *context.Context) { } type blameResult struct { - Parts []*gitrepo.BlamePart + Parts []*git.BlamePart UsesIgnoreRevs bool FaultyIgnoreRevsFile bool } @@ -112,7 +111,7 @@ func performBlame(ctx *context.Context, bypassBlameIgnore bool) (*blameResult, e file := ctx.Repo.TreePath objectFormat := ctx.Repo.GetObjectFormat() - blameReader, err := gitrepo.CreateBlameReader(ctx, objectFormat, repo, gitRepo, commit, file, bypassBlameIgnore) + blameReader, err := git.CreateBlameReader(ctx, objectFormat, repo, gitRepo, commit, file, bypassBlameIgnore) if err != nil { return nil, err } @@ -128,7 +127,7 @@ func performBlame(ctx *context.Context, bypassBlameIgnore bool) (*blameResult, e if len(r.Parts) == 0 && r.UsesIgnoreRevs { // try again without ignored revs - blameReader, err = gitrepo.CreateBlameReader(ctx, objectFormat, repo, gitRepo, commit, file, true) + blameReader, err = git.CreateBlameReader(ctx, objectFormat, repo, gitRepo, commit, file, true) if err != nil { return nil, err } @@ -148,12 +147,12 @@ func performBlame(ctx *context.Context, bypassBlameIgnore bool) (*blameResult, e return r, nil } -func fillBlameResult(br *gitrepo.BlameReader, r *blameResult) error { +func fillBlameResult(br *git.BlameReader, r *blameResult) error { r.UsesIgnoreRevs = br.UsesIgnoreRevs() - previousHelper := make(map[string]*gitrepo.BlamePart) + previousHelper := make(map[string]*git.BlamePart) - r.Parts = make([]*gitrepo.BlamePart, 0, 5) + r.Parts = make([]*git.BlamePart, 0, 5) for { blamePart, err := br.NextPart() if err != nil { @@ -178,7 +177,7 @@ func fillBlameResult(br *gitrepo.BlameReader, r *blameResult) error { return nil } -func processBlameParts(ctx *context.Context, blameParts []*gitrepo.BlamePart) map[string]*gituser.UserCommit { +func processBlameParts(ctx *context.Context, blameParts []*git.BlamePart) map[string]*gituser.UserCommit { // store commit data by SHA to look up avatar info etc commitNames := make(map[string]*gituser.UserCommit) // and as blameParts can reference the same commits multiple @@ -225,7 +224,7 @@ func processBlameParts(ctx *context.Context, blameParts []*gitrepo.BlamePart) ma return commitNames } -func renderBlameFillFirstBlameRow(ctx *context.Context, repoLink string, part *gitrepo.BlamePart, commit *gituser.UserCommit, br *blameRow) { +func renderBlameFillFirstBlameRow(ctx *context.Context, repoLink string, part *git.BlamePart, commit *gituser.UserCommit, br *blameRow) { br.AvatarStackData = gituser.BuildAvatarStackData(ctx, commit.GitCommit.AllParticipantIdentities(), nil) br.PreviousSha = part.PreviousSha br.PreviousShaURL = fmt.Sprintf("%s/blame/commit/%s/%s", repoLink, url.PathEscape(part.PreviousSha), util.PathEscapeSegments(part.PreviousPath)) @@ -234,7 +233,7 @@ func renderBlameFillFirstBlameRow(ctx *context.Context, repoLink string, part *g br.CommitSince = templates.TimeSince(commit.GitCommit.Author.When) } -func renderBlame(ctx *context.Context, blameParts []*gitrepo.BlamePart, commitNames map[string]*gituser.UserCommit) { +func renderBlame(ctx *context.Context, blameParts []*git.BlamePart, commitNames map[string]*gituser.UserCommit) { language, err := languagestats.GetFileLanguage(ctx, ctx.Repo.GitRepo, ctx.Repo.CommitID, ctx.Repo.TreePath) if err != nil { log.Error("Unable to get file language for %-v:%s. Error: %v", ctx.Repo.Repository, ctx.Repo.TreePath, err) diff --git a/routers/web/repo/branch.go b/routers/web/repo/branch.go index ccadbfe1d35..771a4b292ef 100644 --- a/routers/web/repo/branch.go +++ b/routers/web/repo/branch.go @@ -15,7 +15,6 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/models/unit" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" "gitea.dev/modules/optional" repo_module "gitea.dev/modules/repository" @@ -138,7 +137,7 @@ func RestoreBranchPost(ctx *context.Context) { return } - if err := gitrepo.PushManaged(ctx, ctx.Repo.Repository, ctx.Repo.Repository, git.PushOptions{ + if err := git.PushManaged(ctx, ctx.Repo.Repository, ctx.Repo.Repository, git.PushOptions{ Branch: fmt.Sprintf("%s:%s%s", deletedBranch.CommitID, git.BranchPrefix, deletedBranch.Name), Env: repo_module.PushingEnvironment(ctx.Doer, ctx.Repo.Repository), }); err != nil { diff --git a/routers/web/repo/commit.go b/routers/web/repo/commit.go index e06d495b8b1..71d290c5b6b 100644 --- a/routers/web/repo/commit.go +++ b/routers/web/repo/commit.go @@ -24,7 +24,6 @@ import ( "gitea.dev/modules/charset" "gitea.dev/modules/fileicon" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" "gitea.dev/modules/markup" "gitea.dev/modules/setting" @@ -237,7 +236,7 @@ func FileHistory(ctx *context.Context) { // there is no quick method to know the total count when "follow rename" commitsCount = -1 } else { - commitsCount, err = gitrepo.FileCommitsCount(ctx, ctx.Repo.Repository, ctx.Repo.RefFullName.ShortName(), ctx.Repo.TreePath) + commitsCount, err = git.FileCommitsCount(ctx, ctx.Repo.Repository, ctx.Repo.RefFullName.ShortName(), ctx.Repo.TreePath) if err != nil { ctx.ServerError("FileCommitsCount", err) return @@ -292,7 +291,7 @@ func Diff(ctx *context.Context) { if ctx.Data["PageIsWiki"] != nil { var err error - gitRepo, err = gitrepo.RepositoryFromRequestContextOrOpen(ctx, ctx.Repo.Repository.WikiStorageRepo()) + gitRepo, err = git.RepositoryFromRequestContextOrOpen(ctx, ctx.Repo.Repository.WikiStorageRepo()) if err != nil { ctx.ServerError("Repo.GitRepo.GetCommit", err) return @@ -431,7 +430,7 @@ func Diff(ctx *context.Context) { func RawDiff(ctx *context.Context) { var gitRepo *git.Repository if ctx.Data["PageIsWiki"] != nil { - wikiRepo, err := gitrepo.OpenRepository(ctx.Repo.Repository.WikiStorageRepo()) + wikiRepo, err := git.OpenRepository(ctx.Repo.Repository.WikiStorageRepo()) if err != nil { ctx.ServerError("OpenRepository", err) return diff --git a/routers/web/repo/compare.go b/routers/web/repo/compare.go index d9cb02467b5..a5f225cefba 100644 --- a/routers/web/repo/compare.go +++ b/routers/web/repo/compare.go @@ -27,7 +27,6 @@ import ( "gitea.dev/modules/fileicon" "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" "gitea.dev/modules/markup" "gitea.dev/modules/optional" @@ -198,7 +197,7 @@ func (cpi *comparePageInfoType) parseCompareInfo(ctx *context.Context, comparePa if err != nil { return err } - headGitRepo, err := gitrepo.RepositoryFromRequestContextOrOpen(ctx, headRepo) + headGitRepo, err := git.RepositoryFromRequestContextOrOpen(ctx, headRepo) if err != nil { return err } @@ -718,7 +717,7 @@ func ExcerptBlob(ctx *context.Context) { if ctx.Data["PageIsWiki"] == true { var err error - gitRepo, err = gitrepo.RepositoryFromRequestContextOrOpen(ctx, ctx.Repo.Repository.WikiStorageRepo()) + gitRepo, err = git.RepositoryFromRequestContextOrOpen(ctx, ctx.Repo.Repository.WikiStorageRepo()) if err != nil { ctx.ServerError("OpenRepository", err) return diff --git a/routers/web/repo/editor_cherry_pick.go b/routers/web/repo/editor_cherry_pick.go index 12c0bdb0b5d..8d133de867d 100644 --- a/routers/web/repo/editor_cherry_pick.go +++ b/routers/web/repo/editor_cherry_pick.go @@ -8,7 +8,6 @@ import ( "net/http" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/util" "gitea.dev/services/context" "gitea.dev/services/forms" @@ -64,7 +63,7 @@ func CherryPickPost(ctx *context.Context) { // Drop through to the "apply" method buf := &bytes.Buffer{} if parsed.form.Revert { - err = gitrepo.GetReverseRawDiff(ctx, ctx.Repo.Repository, fromCommitID, buf) + err = git.GetReverseRawDiff(ctx, ctx.Repo.Repository, fromCommitID, buf) } else { err = git.GetRawDiff(ctx, ctx.Repo.GitRepo, fromCommitID, git.RawDiffPatch, buf) } diff --git a/routers/web/repo/editor_test.go b/routers/web/repo/editor_test.go index fc0a38ce331..f60fdcd7f61 100644 --- a/routers/web/repo/editor_test.go +++ b/routers/web/repo/editor_test.go @@ -8,7 +8,7 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/models/unittest" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "github.com/stretchr/testify/assert" ) @@ -21,7 +21,7 @@ func TestEditorUtils(t *testing.T) { assert.Equal(t, "user2-patch-1", branchName) }) t.Run("getClosestParentWithFiles", func(t *testing.T) { - gitRepo, _ := gitrepo.OpenRepository(repo) + gitRepo, _ := git.OpenRepository(repo) defer gitRepo.Close() treePath := getClosestParentWithFiles(t.Context(), gitRepo, "sub-home-md-img-check", "docs/foo/bar") assert.Equal(t, "docs", treePath) diff --git a/routers/web/repo/editor_util.go b/routers/web/repo/editor_util.go index 5afb05cbf66..726f395f203 100644 --- a/routers/web/repo/editor_util.go +++ b/routers/web/repo/editor_util.go @@ -14,7 +14,6 @@ import ( repo_model "gitea.dev/models/repo" user_model "gitea.dev/models/user" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" "gitea.dev/modules/markup" repo_module "gitea.dev/modules/repository" @@ -128,7 +127,7 @@ func getUniqueRepositoryName(ctx context.Context, ownerID int64, name string) st } func editorPushBranchToForkedRepository(ctx context.Context, doer *user_model.User, baseRepo *repo_model.Repository, baseBranchName string, targetRepo *repo_model.Repository, targetBranchName string) error { - return gitrepo.PushManaged(ctx, baseRepo, targetRepo, git.PushOptions{ + return git.PushManaged(ctx, baseRepo, targetRepo, git.PushOptions{ Branch: baseBranchName + ":" + targetBranchName, Env: repo_module.PushingEnvironment(doer, targetRepo), }) diff --git a/routers/web/repo/githttp.go b/routers/web/repo/githttp.go index 0e168dc341b..24009bb93a8 100644 --- a/routers/web/repo/githttp.go +++ b/routers/web/repo/githttp.go @@ -24,7 +24,6 @@ import ( "gitea.dev/models/unit" "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" repo_module "gitea.dev/modules/repository" "gitea.dev/modules/setting" @@ -273,7 +272,7 @@ func dummyInfoRefs(ctx *context.Context) { } defer cleanup() - if err := git.InitRepository(ctx, tmpDir, true, git.Sha1ObjectFormat.Name()); err != nil { + if err := git.InitRepositoryLocal(ctx, tmpDir, true, git.Sha1ObjectFormat.Name()); err != nil { log.Error("Failed to init bare repo for git-receive-pack cache: %v", err) return } @@ -343,7 +342,7 @@ func (h *serviceHandler) sendFile(ctx *context.Context, contentType, file string return } - fs := gitrepo.GetRepoFS(h.getStorageRepo()) + fs := git.GetRepoFS(h.getStorageRepo()) ctx.Resp.Header().Set("Content-Type", contentType) http.ServeFileFS(ctx.Resp, ctx.Req, fs, path.Clean(file)) } @@ -463,7 +462,7 @@ func GetInfoRefs(ctx *context.Context) { if h.serviceType == "" { // it's said that some legacy git clients will send requests to "/info/refs" without "service" parameter, // although there should be no such case client in the modern days. TODO: not quite sure why we need this UpdateServerInfo logic - if err := gitrepo.UpdateServerInfo(ctx, h.getStorageRepo()); err != nil { + if err := git.UpdateServerInfo(ctx, h.getStorageRepo()); err != nil { ctx.ServerError("UpdateServerInfo", err) return } diff --git a/routers/web/repo/issue_comment.go b/routers/web/repo/issue_comment.go index d2eb1eab18e..569b0cf7075 100644 --- a/routers/web/repo/issue_comment.go +++ b/routers/web/repo/issue_comment.go @@ -15,7 +15,6 @@ import ( "gitea.dev/models/renderhelper" user_model "gitea.dev/models/user" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" "gitea.dev/modules/markup/markdown" repo_module "gitea.dev/modules/repository" @@ -116,7 +115,7 @@ func NewComment(ctx *context.Context) { ctx.ServerError("Unable to load base repo", err) return } - prHeadCommitID, err := gitrepo.GetFullCommitID(ctx, pull.BaseRepo, prHeadRef) + prHeadCommitID, err := git.GetFullCommitID(ctx, pull.BaseRepo, prHeadRef) if err != nil { ctx.ServerError("Get head commit Id of pr fail", err) return @@ -132,7 +131,7 @@ func NewComment(ctx *context.Context) { return } headBranchRef := git.RefNameFromBranch(pull.HeadBranch) - headBranchCommitID, err := gitrepo.GetFullCommitID(ctx, pull.HeadRepo, headBranchRef.String()) + headBranchCommitID, err := git.GetFullCommitID(ctx, pull.HeadRepo, headBranchRef.String()) if err != nil { ctx.ServerError("Get head commit Id of head branch fail", err) return @@ -146,7 +145,7 @@ func NewComment(ctx *context.Context) { if prHeadCommitID != headBranchCommitID { // force push to base repo - err := gitrepo.PushManaged(ctx, pull.HeadRepo, pull.BaseRepo, git.PushOptions{ + err := git.PushManaged(ctx, pull.HeadRepo, pull.BaseRepo, git.PushOptions{ Branch: pull.HeadBranch + ":" + prHeadRef, Force: true, Env: repo_module.InternalPushingEnvironment(pull.Issue.Poster, pull.BaseRepo), diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go index a770c14aaaf..64674bd63cb 100644 --- a/routers/web/repo/pull.go +++ b/routers/web/repo/pull.go @@ -29,7 +29,6 @@ import ( "gitea.dev/modules/fileicon" "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/glob" "gitea.dev/modules/graceful" issue_template "gitea.dev/modules/issue/template" @@ -233,7 +232,7 @@ func GetMergedBaseCommitID(ctx *context.Context, issue *issues_model.Issue) stri commitSHA, err = ctx.Repo.GitRepo.ReadPatchCommit(pull.Index) if err == nil { // Recreate pull head in files for next time - if err := gitrepo.UpdateRef(ctx, ctx.Repo.Repository, pull.GetGitHeadRefName(), commitSHA); err != nil { + if err := git.UpdateRef(ctx, ctx.Repo.Repository, pull.GetGitHeadRefName(), commitSHA); err != nil { log.Error("Could not write head file", err) } } else { @@ -551,13 +550,13 @@ func getViewPullHeadBranchCommitID(ctx *context.Context, pull *issues_model.Pull if pull.HeadRepo == nil { return "", util.ErrNotExist } - headGitRepo, err := gitrepo.RepositoryFromRequestContextOrOpen(ctx, pull.HeadRepo) + headGitRepo, err := git.RepositoryFromRequestContextOrOpen(ctx, pull.HeadRepo) if err != nil { return "", err } return headGitRepo.GetRefCommitID(ctx, git.RefNameFromBranch(pull.HeadBranch).String()) case issues_model.PullRequestFlowAGit: - baseGitRepo, err := gitrepo.RepositoryFromRequestContextOrOpen(ctx, pull.BaseRepo) + baseGitRepo, err := git.RepositoryFromRequestContextOrOpen(ctx, pull.BaseRepo) if err != nil { return "", err } diff --git a/routers/web/repo/release.go b/routers/web/repo/release.go index a5aac43ff4d..28cbe06b5d4 100644 --- a/routers/web/repo/release.go +++ b/routers/web/repo/release.go @@ -19,7 +19,6 @@ import ( "gitea.dev/models/unit" user_model "gitea.dev/models/user" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/markup/markdown" "gitea.dev/modules/optional" "gitea.dev/modules/setting" @@ -60,7 +59,7 @@ func calReleaseNumCommitsBehind(ctx stdCtx.Context, repoCtx *context.Repository, return fmt.Errorf("GetBranchCommit(DefaultBranch): %w", err) } } - countCache[target], err = gitrepo.CommitsCountOfCommit(ctx, repoCtx.Repository, commit.ID.String()) + countCache[target], err = git.CommitsCountOfCommit(ctx, repoCtx.Repository, commit.ID.String()) if err != nil { return fmt.Errorf("CommitsCount: %w", err) } diff --git a/routers/web/repo/setting/lfs.go b/routers/web/repo/setting/lfs.go index c8212e3b4ca..9643bd90a07 100644 --- a/routers/web/repo/setting/lfs.go +++ b/routers/web/repo/setting/lfs.go @@ -20,7 +20,6 @@ import ( "gitea.dev/modules/git" "gitea.dev/modules/git/attribute" "gitea.dev/modules/git/pipeline" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/lfs" "gitea.dev/modules/log" repo_module "gitea.dev/modules/repository" @@ -105,7 +104,7 @@ func LFSLocks(ctx *context.Context) { } // Clone base repo. - tmpBasePath, cleanup, err := repo_module.CreateTemporaryPath("locks") + tmpBasePath, _, cleanup, err := repo_module.CreateTemporaryGitRepo("locks") if err != nil { log.Error("Failed to create temporary path: %v", err) ctx.ServerError("LFSLocks", err) @@ -113,7 +112,7 @@ func LFSLocks(ctx *context.Context) { } defer cleanup() - if err := gitrepo.CloneRepoToLocal(ctx, ctx.Repo.Repository, tmpBasePath, git.CloneRepoOptions{ + if err := git.CloneRepoToLocal(ctx, ctx.Repo.Repository, tmpBasePath, git.CloneRepoOptions{ Bare: true, Shared: true, }); err != nil { diff --git a/routers/web/repo/setting/setting.go b/routers/web/repo/setting/setting.go index 730a30a7301..ff37c7c8e2b 100644 --- a/routers/web/repo/setting/setting.go +++ b/routers/web/repo/setting/setting.go @@ -17,7 +17,6 @@ import ( unit_model "gitea.dev/models/unit" user_model "gitea.dev/models/user" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/indexer/code" issue_indexer "gitea.dev/modules/indexer/issues" "gitea.dev/modules/indexer/stats" @@ -296,7 +295,7 @@ func handleSettingsPostMirror(ctx *context.Context) { return } - u, err := gitrepo.GitRemoteGetURL(ctx, ctx.Repo.Repository, pullMirror.GetRemoteName()) + u, err := git.ParseRemoteAddressURL(ctx, ctx.Repo.Repository, pullMirror.GetRemoteName()) if err != nil { ctx.Data["Err_MirrorAddress"] = true handleSettingRemoteAddrError(ctx, err, form) diff --git a/routers/web/repo/setting/settings_test.go b/routers/web/repo/setting/settings_test.go index e86527536bb..68d7ab1d12f 100644 --- a/routers/web/repo/setting/settings_test.go +++ b/routers/web/repo/setting/settings_test.go @@ -13,7 +13,7 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/models/unittest" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/setting" "gitea.dev/modules/test" "gitea.dev/modules/web" @@ -423,7 +423,7 @@ func TestHandleSettingsPostMirrorPreservesExistingUsername(t *testing.T) { updatedRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: mirrorRepo.ID}) assert.Equal(t, "https://example.com/user2/repo1.git", updatedRepo.OriginalURL) - remoteURL, err := gitrepo.GitRemoteGetURL(t.Context(), updatedRepo, updatedMirror.GetRemoteName()) + remoteURL, err := git.ParseRemoteAddressURL(t.Context(), updatedRepo, updatedMirror.GetRemoteName()) require.NoError(t, err) require.NotNil(t, remoteURL.User) assert.Equal(t, "existing-user", remoteURL.User.Username()) diff --git a/routers/web/repo/view_home.go b/routers/web/repo/view_home.go index c696b3c9a14..b6fd0cd6c3a 100644 --- a/routers/web/repo/view_home.go +++ b/routers/web/repo/view_home.go @@ -18,7 +18,6 @@ import ( unit_model "gitea.dev/models/unit" user_model "gitea.dev/models/user" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/htmlutil" "gitea.dev/modules/httplib" "gitea.dev/modules/log" @@ -223,7 +222,7 @@ func handleRepoEmptyOrBroken(ctx *context.Context) { showEmpty := true if ctx.Repo.GitRepo == nil { // in case the repo really exists and works, but the status was incorrectly marked as "broken", we need to open and check it again - ctx.Repo.GitRepo, _ = gitrepo.RepositoryFromRequestContextOrOpen(ctx, ctx.Repo.Repository) + ctx.Repo.GitRepo, _ = git.RepositoryFromRequestContextOrOpen(ctx, ctx.Repo.Repository) } if ctx.Repo.GitRepo != nil { reallyEmpty, err := ctx.Repo.GitRepo.IsEmpty(ctx) diff --git a/routers/web/repo/wiki.go b/routers/web/repo/wiki.go index 75de0351646..13e4be88c28 100644 --- a/routers/web/repo/wiki.go +++ b/routers/web/repo/wiki.go @@ -20,7 +20,6 @@ import ( "gitea.dev/modules/base" "gitea.dev/modules/charset" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" "gitea.dev/modules/markup" "gitea.dev/modules/markup/markdown" @@ -97,7 +96,7 @@ func findEntryForFile(ctx gocontext.Context, wikiRepo *git.Repository, commit *g } func findWikiRepoCommit(ctx *context.Context) (*git.Repository, *git.Commit, error) { - wikiGitRepo, errGitRepo := gitrepo.RepositoryFromRequestContextOrOpen(ctx, ctx.Repo.Repository.WikiStorageRepo()) + wikiGitRepo, errGitRepo := git.RepositoryFromRequestContextOrOpen(ctx, ctx.Repo.Repository.WikiStorageRepo()) if errGitRepo != nil { ctx.ServerError("OpenRepository", errGitRepo) return nil, nil, errGitRepo @@ -106,7 +105,7 @@ func findWikiRepoCommit(ctx *context.Context) (*git.Repository, *git.Commit, err commit, errCommit := wikiGitRepo.GetBranchCommit(ctx, ctx.Repo.Repository.DefaultWikiBranch) if git.IsErrNotExist(errCommit) { // if the default branch recorded in database is out of sync, then re-sync it - gitRepoDefaultBranch, errBranch := gitrepo.GetDefaultBranch(ctx, ctx.Repo.Repository.WikiStorageRepo()) + gitRepoDefaultBranch, errBranch := git.GetDefaultBranch(ctx, ctx.Repo.Repository.WikiStorageRepo()) if errBranch != nil { return wikiGitRepo, nil, errBranch } @@ -308,7 +307,7 @@ func renderViewPage(ctx *context.Context) (*git.Repository, *git.TreeEntry) { } // get commit count - wiki revisions - commitsCount, _ := gitrepo.FileCommitsCount(ctx, ctx.Repo.Repository.WikiStorageRepo(), ctx.Repo.Repository.DefaultWikiBranch, pageFilename) + commitsCount, _ := git.FileCommitsCount(ctx, ctx.Repo.Repository.WikiStorageRepo(), ctx.Repo.Repository.DefaultWikiBranch, pageFilename) ctx.Data["CommitCount"] = commitsCount return wikiGitRepo, entry @@ -345,7 +344,7 @@ func renderRevisionPage(ctx *context.Context) (*git.Repository, *git.TreeEntry) } // get commit count - wiki revisions - commitsCount, _ := gitrepo.FileCommitsCount(ctx, ctx.Repo.Repository.WikiStorageRepo(), ctx.Repo.Repository.DefaultWikiBranch, pageFilename) + commitsCount, _ := git.FileCommitsCount(ctx, ctx.Repo.Repository.WikiStorageRepo(), ctx.Repo.Repository.DefaultWikiBranch, pageFilename) ctx.Data["CommitCount"] = commitsCount // get page diff --git a/routers/web/repo/wiki_test.go b/routers/web/repo/wiki_test.go index d90d2f232da..df773e52b8e 100644 --- a/routers/web/repo/wiki_test.go +++ b/routers/web/repo/wiki_test.go @@ -12,7 +12,6 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/models/unittest" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/web" "gitea.dev/services/contexttest" "gitea.dev/services/forms" @@ -29,7 +28,7 @@ const ( ) func wikiEntry(t *testing.T, repo *repo_model.Repository, wikiName wiki_service.WebPath) (*git.Repository, *git.TreeEntry) { - wikiRepo, err := gitrepo.OpenRepository(repo.WikiStorageRepo()) + wikiRepo, err := git.OpenRepository(repo.WikiStorageRepo()) assert.NoError(t, err) t.Cleanup(func() { defer wikiRepo.Close() diff --git a/routers/web/shared/user/header.go b/routers/web/shared/user/header.go index 85ca8acccba..0114dc8ea7a 100644 --- a/routers/web/shared/user/header.go +++ b/routers/web/shared/user/header.go @@ -15,7 +15,6 @@ import ( "gitea.dev/models/unit" user_model "gitea.dev/models/user" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" "gitea.dev/modules/markup" "gitea.dev/modules/markup/markdown" @@ -110,7 +109,7 @@ func FindOwnerProfileReadme(ctx *context.Context, doer *user_model.User, optProf return nil, nil } - profileGitRepo, err := gitrepo.RepositoryFromRequestContextOrOpen(ctx, profileDbRepo) + profileGitRepo, err := git.RepositoryFromRequestContextOrOpen(ctx, profileDbRepo) if err != nil { log.Error("FindOwnerProfileReadme failed to OpenRepository: %v", err) return nil, nil diff --git a/routers/web/user/setting/adopt.go b/routers/web/user/setting/adopt.go index cd3ab7d3b01..eed0b8c36c5 100644 --- a/routers/web/user/setting/adopt.go +++ b/routers/web/user/setting/adopt.go @@ -5,7 +5,7 @@ package setting import ( repo_model "gitea.dev/models/repo" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/setting" "gitea.dev/services/context" repo_service "gitea.dev/services/repository" @@ -32,7 +32,7 @@ func AdoptOrDeleteRepository(ctx *context.Context) { return } - exist, err := gitrepo.IsRepositoryExist(ctx, repo_model.CodeRepoByName(ctxUser.Name, dir)) + exist, err := git.IsRepositoryExist(ctx, repo_model.CodeRepoByName(ctxUser.Name, dir)) if err != nil { ctx.ServerError("IsDir", err) return diff --git a/services/actions/commit_status_test.go b/services/actions/commit_status_test.go index 151bf2e5988..f54536f999b 100644 --- a/services/actions/commit_status_test.go +++ b/services/actions/commit_status_test.go @@ -15,7 +15,6 @@ import ( actions_module "gitea.dev/modules/actions" "gitea.dev/modules/commitstatus" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/timeutil" "github.com/stretchr/testify/assert" @@ -48,7 +47,7 @@ func TestCreateCommitStatus_Dedupe(t *testing.T) { assert.NoError(t, unittest.PrepareTestDatabase()) repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4}) - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) require.NoError(t, err) defer gitRepo.Close() diff --git a/services/actions/notifier_helper.go b/services/actions/notifier_helper.go index 4721b58dee1..54893281eef 100644 --- a/services/actions/notifier_helper.go +++ b/services/actions/notifier_helper.go @@ -21,7 +21,6 @@ import ( actions_module "gitea.dev/modules/actions" "gitea.dev/modules/container" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/json" "gitea.dev/modules/log" "gitea.dev/modules/setting" @@ -148,7 +147,7 @@ func notify(ctx context.Context, input *notifyInput) error { return nil } - gitRepo, err := gitrepo.OpenRepository(input.Repo) + gitRepo, err := git.OpenRepository(input.Repo) if err != nil { return fmt.Errorf("git.OpenRepository: %w", err) } @@ -591,7 +590,7 @@ func DetectAndHandleSchedules(ctx context.Context, repo *repo_model.Repository) return nil } - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) if err != nil { return fmt.Errorf("git.OpenRepository: %w", err) } diff --git a/services/actions/reusable_workflow.go b/services/actions/reusable_workflow.go index 119c11cba48..562e9ee2010 100644 --- a/services/actions/reusable_workflow.go +++ b/services/actions/reusable_workflow.go @@ -16,7 +16,7 @@ import ( actions_module "gitea.dev/modules/actions" "gitea.dev/modules/actions/jobparser" "gitea.dev/modules/container" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/httplib" "gitea.dev/modules/json" "gitea.dev/modules/setting" @@ -79,7 +79,7 @@ func loadReusableWorkflowSource(ctx context.Context, run *actions_model.ActionRu // readWorkflowFromRepo loads a workflow file from `repo` at `refOrSHA` and returns its content plus the resolved commit SHA. func readWorkflowFromRepo(ctx context.Context, repo *repo_model.Repository, refOrSHA, path string) ([]byte, string, error) { - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) if err != nil { return nil, "", fmt.Errorf("open repo %s: %w", repo.FullName(), err) } diff --git a/services/actions/scoped_workflow_cache.go b/services/actions/scoped_workflow_cache.go index 0288dbf2bfc..6a02877ac2e 100644 --- a/services/actions/scoped_workflow_cache.go +++ b/services/actions/scoped_workflow_cache.go @@ -10,7 +10,7 @@ import ( git_model "gitea.dev/models/git" repo_model "gitea.dev/models/repo" actions_module "gitea.dev/modules/actions" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/log" lru "github.com/hashicorp/golang-lru/v2" @@ -50,7 +50,7 @@ func LoadParsedScopedWorkflows(ctx context.Context, sourceRepo *repo_model.Repos } // cache miss: open the source repo at the exact SHA we keyed on - sourceGitRepo, err := gitrepo.OpenRepository(sourceRepo) + sourceGitRepo, err := git.OpenRepository(sourceRepo) if err != nil { return "", nil, fmt.Errorf("open source repo: %w", err) } diff --git a/services/automerge/automerge.go b/services/automerge/automerge.go index a29b9c028bb..b442756cbb5 100644 --- a/services/automerge/automerge.go +++ b/services/automerge/automerge.go @@ -18,7 +18,6 @@ import ( repo_model "gitea.dev/models/repo" user_model "gitea.dev/models/user" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/graceful" "gitea.dev/modules/log" "gitea.dev/modules/process" @@ -104,7 +103,7 @@ func StartPRCheckAndAutoMergeBySHA(ctx context.Context, sha string, repo *repo_m } func getPullRequestsByHeadSHA(ctx context.Context, sha string, repo *repo_model.Repository, filter func(*issues_model.PullRequest) bool) (map[int64]*issues_model.PullRequest, error) { - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) if err != nil { return nil, err } @@ -181,7 +180,7 @@ func handlePullRequestAutoMerge(pullID int64, sha string) { } // check the sha is the same as pull request head commit id - baseGitRepo, err := gitrepo.OpenRepository(pr.BaseRepo) + baseGitRepo, err := git.OpenRepository(pr.BaseRepo) if err != nil { log.Error("OpenRepository: %v", err) return @@ -217,7 +216,7 @@ func handlePullRequestAutoMerge(pullID int64, sha string) { return } case issues_model.PullRequestFlowAGit: - headBranchExist := gitrepo.IsReferenceExist(ctx, pr.BaseRepo, pr.GetGitHeadRefName()) + headBranchExist := git.IsReferenceExist(ctx, pr.BaseRepo, pr.GetGitHeadRefName()) if !headBranchExist { log.Warn("Head branch of auto merge %-v does not exist [HeadRepoID: %d, Branch(Agit): %s]", pr, pr.HeadRepoID, pr.HeadBranch) return diff --git a/services/automergequeue/automergequeue.go b/services/automergequeue/automergequeue.go index 0f69059dd9d..af56be24425 100644 --- a/services/automergequeue/automergequeue.go +++ b/services/automergequeue/automergequeue.go @@ -9,7 +9,7 @@ import ( "fmt" issues_model "gitea.dev/models/issues" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/log" "gitea.dev/modules/queue" ) @@ -34,7 +34,7 @@ func StartPRCheckAndAutoMerge(ctx context.Context, pull *issues_model.PullReques return } - gitRepo, err := gitrepo.OpenRepository(pull.BaseRepo) + gitRepo, err := git.OpenRepository(pull.BaseRepo) if err != nil { log.Error("OpenRepository: %v", err) return diff --git a/services/context/api.go b/services/context/api.go index b99e722ed43..50772bcea63 100644 --- a/services/context/api.go +++ b/services/context/api.go @@ -18,7 +18,6 @@ import ( user_model "gitea.dev/models/user" "gitea.dev/modules/cache" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/httpcache" "gitea.dev/modules/log" "gitea.dev/modules/setting" @@ -279,7 +278,7 @@ func ReferencesGitRepo(allowEmpty ...bool) func(ctx *APIContext) { // For API calls. if ctx.Repo.GitRepo == nil { var err error - ctx.Repo.GitRepo, err = gitrepo.RepositoryFromRequestContextOrOpen(ctx, ctx.Repo.Repository) + ctx.Repo.GitRepo, err = git.RepositoryFromRequestContextOrOpen(ctx, ctx.Repo.Repository) if err != nil { ctx.APIErrorInternal(err) return diff --git a/services/context/repo.go b/services/context/repo.go index ca770df7e4a..45978494d4a 100644 --- a/services/context/repo.go +++ b/services/context/repo.go @@ -24,7 +24,6 @@ import ( user_model "gitea.dev/models/user" "gitea.dev/modules/cache" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/httplib" code_indexer "gitea.dev/modules/indexer/code" "gitea.dev/modules/log" @@ -185,7 +184,7 @@ func PrepareCommitFormOptions(ctx *Context, doer *user_model.User, targetRepo *r } } - targetGitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, targetRepo) + targetGitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, targetRepo) if err != nil { return nil, err } @@ -260,7 +259,7 @@ func (r *Repository) GetCommitsCount(ctx context.Context) (int64, error) { contextName := r.RefFullName.ShortName() isRef := r.RefFullName.IsBranch() || r.RefFullName.IsTag() return cache.GetInt64(r.Repository.GetCommitsCountCacheKey(contextName, isRef), func() (int64, error) { - return gitrepo.CommitsCountOfCommit(ctx, r.Repository, r.Commit.ID.String()) + return git.CommitsCountOfCommit(ctx, r.Repository, r.Commit.ID.String()) }) } @@ -270,10 +269,10 @@ func (r *Repository) GetCommitGraphsCount(ctx context.Context, hidePRRefs bool, return cache.GetInt64(cacheKey, func() (int64, error) { if len(branches) == 0 { - return gitrepo.AllCommitsCount(ctx, r.Repository, hidePRRefs, files...) + return git.AllCommitsCount(ctx, r.Repository, hidePRRefs, files...) } - return gitrepo.CommitsCount(ctx, r.Repository, - gitrepo.CommitsCountOptions{ + return git.CommitsCount(ctx, r.Repository, + git.CommitsCountOptions{ Revision: branches, RelPath: files, }) @@ -689,7 +688,7 @@ func repoAssignmentAutoRedirectNotReady(ctx *Context, data *repoAssignmentPrepar func repoAssignmentPrepareGitRepo(ctx *Context, data *repoAssignmentPrepareDataStruct) { var err error repo := data.repo - ctx.Repo.GitRepo, err = gitrepo.RepositoryFromRequestContextOrOpen(ctx, repo) + ctx.Repo.GitRepo, err = git.RepositoryFromRequestContextOrOpen(ctx, repo) if err != nil { if strings.Contains(err.Error(), "repository does not exist") || strings.Contains(err.Error(), "no such file or directory") { log.Error("Repository %-v has a broken repository on the file system: %s Error: %v", ctx.Repo.Repository, ctx.Repo.Repository.FullName(), err) @@ -939,7 +938,7 @@ func RepoRefByType(detectRefType git.RefType) func(*Context) { reqPath := ctx.PathParam("*") if reqPath == "" { refShortName = ctx.Repo.Repository.DefaultBranch - if !gitrepo.IsBranchExist(ctx, ctx.Repo.Repository, refShortName) { + if !git.IsBranchExist(ctx, ctx.Repo.Repository, refShortName) { brs, _, err := ctx.Repo.GitRepo.GetBranchNames(ctx, 0, 1) if err == nil && len(brs) != 0 { refShortName = brs[0] @@ -976,7 +975,7 @@ func RepoRefByType(detectRefType git.RefType) func(*Context) { return } - if refType == git.RefTypeBranch && gitrepo.IsBranchExist(ctx, ctx.Repo.Repository, refShortName) { + if refType == git.RefTypeBranch && git.IsBranchExist(ctx, ctx.Repo.Repository, refShortName) { ctx.Repo.BranchName = refShortName ctx.Repo.RefFullName = git.RefNameFromBranch(refShortName) @@ -986,7 +985,7 @@ func RepoRefByType(detectRefType git.RefType) func(*Context) { return } ctx.Repo.CommitID = ctx.Repo.Commit.ID.String() - } else if refType == git.RefTypeTag && gitrepo.IsTagExist(ctx, ctx.Repo.Repository, refShortName) { + } else if refType == git.RefTypeTag && git.IsTagExist(ctx, ctx.Repo.Repository, refShortName) { ctx.Repo.RefFullName = git.RefNameFromTag(refShortName) ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetTagCommit(ctx, refShortName) diff --git a/services/contexttest/context_tests.go b/services/contexttest/context_tests.go index 135cddedb86..51484391daa 100644 --- a/services/contexttest/context_tests.go +++ b/services/contexttest/context_tests.go @@ -21,7 +21,6 @@ import ( user_model "gitea.dev/models/user" "gitea.dev/modules/cache" git_module "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/reqctx" "gitea.dev/modules/session" "gitea.dev/modules/templates" @@ -141,7 +140,7 @@ func LoadRepoCommit(t *testing.T, ctx gocontext.Context) { assert.FailNow(t, "context is not *context.Context or *context.APIContext") } - gitRepo, err := gitrepo.OpenRepository(repo.Repository) + gitRepo, err := git_module.OpenRepository(repo.Repository) require.NoError(t, err) t.Cleanup(func() { gitRepo.Close() @@ -185,7 +184,7 @@ func LoadGitRepo(t *testing.T, ctx gocontext.Context) { } assert.NoError(t, repo.Repository.LoadOwner(ctx)) var err error - repo.GitRepo, err = gitrepo.OpenRepository(repo.Repository) + repo.GitRepo, err = git_module.OpenRepository(repo.Repository) assert.NoError(t, err) } diff --git a/services/convert/convert.go b/services/convert/convert.go index dd1510031d4..3cdd49cd50a 100644 --- a/services/convert/convert.go +++ b/services/convert/convert.go @@ -30,7 +30,6 @@ import ( "gitea.dev/modules/actions" "gitea.dev/modules/container" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/httplib" "gitea.dev/modules/log" "gitea.dev/modules/setting" @@ -680,7 +679,7 @@ func ResolveActionWorkflowForRun(ctx context.Context, repo *repo_model.Repositor if err != nil { return nil, err } - sourceGitRepo, err := gitrepo.OpenRepository(sourceRepo) + sourceGitRepo, err := git.OpenRepository(sourceRepo) if err != nil { return nil, err } @@ -688,7 +687,7 @@ func ResolveActionWorkflowForRun(ctx context.Context, repo *repo_model.Repositor return GetScopedActionWorkflow(ctx, sourceGitRepo, sourceRepo, run.WorkflowID, run.WorkflowCommitSHA) } - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) if err != nil { return nil, err } diff --git a/services/convert/git_commit.go b/services/convert/git_commit.go index 855f0f79d39..745b5ef9d6b 100644 --- a/services/convert/git_commit.go +++ b/services/convert/git_commit.go @@ -11,7 +11,6 @@ import ( repo_model "gitea.dev/models/repo" user_model "gitea.dev/models/user" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" api "gitea.dev/modules/structs" ctx "gitea.dev/services/context" @@ -190,7 +189,7 @@ func ToCommit(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Rep // Retrieve files affected by the commit if opts.Files { - fileStatus, err := gitrepo.GetCommitFileStatus(ctx, repo, commit.ID.String()) + fileStatus, err := git.GetCommitFileStatus(ctx, repo, commit.ID.String()) if err != nil { return nil, err } diff --git a/services/convert/pull.go b/services/convert/pull.go index 884fb06543a..cf968ee590e 100644 --- a/services/convert/pull.go +++ b/services/convert/pull.go @@ -16,7 +16,6 @@ import ( "gitea.dev/modules/cache" "gitea.dev/modules/cachegroup" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" "gitea.dev/modules/setting" api "gitea.dev/modules/structs" @@ -145,7 +144,7 @@ func ToAPIPullRequest(ctx context.Context, pr *issues_model.PullRequest, doer *u apiPullRequest.Closed = pr.Issue.ClosedUnix.AsTimePtr() } - gitRepo, err := gitrepo.OpenRepository(pr.BaseRepo) + gitRepo, err := git.OpenRepository(pr.BaseRepo) if err != nil { log.Error("OpenRepository[%s]: %v", pr.BaseRepo.FullName(), err) return nil @@ -191,7 +190,7 @@ func ToAPIPullRequest(ctx context.Context, pr *issues_model.PullRequest, doer *u apiPullRequest.Head.RepoID = pr.HeadRepo.ID apiPullRequest.Head.Repository = ToRepo(ctx, pr.HeadRepo, p) - headGitRepo, err := gitrepo.OpenRepository(pr.HeadRepo) + headGitRepo, err := git.OpenRepository(pr.HeadRepo) if err != nil { log.Error("OpenRepository[%s]: %v", pr.HeadRepo.FullName(), err) return nil @@ -247,7 +246,7 @@ func ToAPIPullRequest(ctx context.Context, pr *issues_model.PullRequest, doer *u } if len(apiPullRequest.Head.Sha) == 0 && len(apiPullRequest.Head.Ref) != 0 { - baseGitRepo, err := gitrepo.OpenRepository(pr.BaseRepo) + baseGitRepo, err := git.OpenRepository(pr.BaseRepo) if err != nil { log.Error("OpenRepository[%s]: %v", pr.BaseRepo.FullName(), err) return nil @@ -329,7 +328,7 @@ func ToAPIPullRequests(ctx context.Context, baseRepo *repo_model.Repository, prs return nil, err } - gitRepo, err := gitrepo.OpenRepository(baseRepo) + gitRepo, err := git.OpenRepository(baseRepo) if err != nil { return nil, err } diff --git a/services/doctor/misc.go b/services/doctor/misc.go index 2f3d0a157ad..9880ce6adc2 100644 --- a/services/doctor/misc.go +++ b/services/doctor/misc.go @@ -12,7 +12,6 @@ import ( repo_model "gitea.dev/models/repo" user_model "gitea.dev/models/user" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" "gitea.dev/modules/structs" @@ -33,14 +32,14 @@ func iterateRepositories(ctx context.Context, each func(*repo_model.Repository) func checkHooks(ctx context.Context, logger log.Logger, autofix bool) error { if err := iterateRepositories(ctx, func(repo *repo_model.Repository) error { - results, err := gitrepo.CheckDelegateHooks(ctx, repo) + results, err := git.CheckDelegateHooks(ctx, repo) if err != nil { logger.Critical("Unable to check delegate hooks for repo %-v. ERROR: %v", repo, err) return fmt.Errorf("Unable to check delegate hooks for repo %-v. ERROR: %w", repo, err) } if len(results) > 0 && autofix { logger.Warn("Regenerated hooks for %s", repo.FullName()) - if err := gitrepo.CreateDelegateHooks(ctx, repo); err != nil { + if err := git.CreateDelegateHooks(ctx, repo); err != nil { logger.Critical("Unable to recreate delegate hooks for %-v. ERROR: %v", repo, err) return fmt.Errorf("Unable to recreate delegate hooks for %-v. ERROR: %w", repo, err) } @@ -91,7 +90,7 @@ func checkDaemonExport(ctx context.Context, logger log.Logger, autofix bool) err // Create/Remove git-daemon-export-ok for git-daemon... daemonExportFile := `git-daemon-export-ok` - isExist, err := gitrepo.IsRepoFileExist(ctx, repo, daemonExportFile) + isExist, err := git.IsRepoFileExist(ctx, repo, daemonExportFile) if err != nil { log.Error("Unable to check if %s:%s exists. Error: %v", repo.FullName(), daemonExportFile, err) return err @@ -102,11 +101,11 @@ func checkDaemonExport(ctx context.Context, logger log.Logger, autofix bool) err numNeedUpdate++ if autofix { if !isPublic && isExist { - if err = gitrepo.RemoveRepoFileOrDir(ctx, repo, daemonExportFile); err != nil { + if err = git.RemoveRepoFileOrDir(ctx, repo, daemonExportFile); err != nil { log.Error("Failed to remove %s:%s: %v", repo.FullName(), daemonExportFile, err) } } else if isPublic && !isExist { - if f, err := gitrepo.CreateRepoFile(ctx, repo, daemonExportFile); err != nil { + if f, err := git.CreateRepoFile(ctx, repo, daemonExportFile); err != nil { log.Error("Failed to create %s:%s: %v", repo.FullName(), daemonExportFile, err) } else { f.Close() @@ -139,7 +138,7 @@ func checkCommitGraph(ctx context.Context, logger log.Logger, autofix bool) erro commitGraphExists := func() (bool, error) { // Check commit-graph exists commitGraphFile := `objects/info/commit-graph` - isExist, err := gitrepo.IsRepoFileExist(ctx, repo, commitGraphFile) + isExist, err := git.IsRepoFileExist(ctx, repo, commitGraphFile) if err != nil { logger.Error("Unable to check if %s exists. Error: %v", commitGraphFile, err) return false, err @@ -147,7 +146,7 @@ func checkCommitGraph(ctx context.Context, logger log.Logger, autofix bool) erro if !isExist { commitGraphsDir := `objects/info/commit-graphs` - isExist, err = gitrepo.IsRepoDirExist(ctx, repo, commitGraphsDir) + isExist, err = git.IsRepoDirExist(ctx, repo, commitGraphsDir) if err != nil { logger.Error("Unable to check if %s exists. Error: %v", commitGraphsDir, err) return false, err diff --git a/services/git/compare.go b/services/git/compare.go index a19e6fd7bf5..6394fefe28c 100644 --- a/services/git/compare.go +++ b/services/git/compare.go @@ -10,7 +10,6 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/util" ) @@ -53,8 +52,8 @@ func (ci *CompareInfo) DirectComparison() bool { // It does its best to fill the fields as many as it can. // MergeBase can be empty if the base and head are unrelated. func GetCompareInfo(ctx context.Context, baseRepo, headRepo *repo_model.Repository, headGitRepo *git.Repository, baseRef, headRef git.RefName, directComparison, fileOnly bool) (compareInfo CompareInfo, err error) { - baseCommitID, err1 := gitrepo.GetFullCommitID(ctx, baseRepo, baseRef.String()) - headCommitID, err2 := gitrepo.GetFullCommitID(ctx, headRepo, headRef.String()) + baseCommitID, err1 := git.GetFullCommitID(ctx, baseRepo, baseRef.String()) + headCommitID, err2 := git.GetFullCommitID(ctx, headRepo, headRef.String()) compareInfo = CompareInfo{ BaseRepo: baseRepo, BaseRef: baseRef, @@ -74,14 +73,14 @@ func GetCompareInfo(ctx context.Context, baseRepo, headRepo *repo_model.Reposito if baseRepo.ID != headRepo.ID { exist := headGitRepo.IsReferenceExist(ctx, compareInfo.BaseCommitID) if !exist { - if err := gitrepo.FetchRemoteCommit(ctx, headRepo, baseRepo, compareInfo.BaseCommitID); err != nil { + if err := git.FetchRemoteCommit(ctx, headRepo, baseRepo, compareInfo.BaseCommitID); err != nil { return compareInfo, fmt.Errorf("FetchRemoteCommit: %w", err) } } } if !directComparison { - compareInfo.CompareBase, err = gitrepo.MergeBase(ctx, headRepo, compareInfo.BaseCommitID, compareInfo.HeadCommitID) + compareInfo.CompareBase, err = git.MergeBase(ctx, headRepo, compareInfo.BaseCommitID, compareInfo.HeadCommitID) if err != nil && !errors.Is(err, util.ErrNotExist) { return compareInfo, fmt.Errorf("MergeBase: %w", err) } diff --git a/services/gitdiff/git_diff_tree.go b/services/gitdiff/git_diff_tree.go index 9b50fb8e5f4..015ecc66fc1 100644 --- a/services/gitdiff/git_diff_tree.go +++ b/services/gitdiff/git_diff_tree.go @@ -64,7 +64,7 @@ func runGitDiffTree(ctx context.Context, gitRepo *git.Repository, useMergeBase b cmd.AddArguments("--merge-base") } cmd.AddDynamicArguments(baseCommitID, headCommitID) - stdout, _, runErr := cmd.WithDir(gitRepo.Path).RunStdString(ctx) + stdout, _, runErr := cmd.WithRepo(gitRepo).RunStdString(ctx) if runErr != nil { log.Warn("git diff-tree: %v", runErr) return nil, runErr diff --git a/services/gitdiff/gitdiff.go b/services/gitdiff/gitdiff.go index 0ccde7a1996..6c32c7c8fdb 100644 --- a/services/gitdiff/gitdiff.go +++ b/services/gitdiff/gitdiff.go @@ -29,7 +29,6 @@ import ( "gitea.dev/modules/git" "gitea.dev/modules/git/attribute" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/highlight" "gitea.dev/modules/htmlutil" "gitea.dev/modules/lfs" @@ -1322,8 +1321,6 @@ func guessBeforeCommitForDiff(ctx context.Context, gitRepo *git.Repository, befo // The whitespaceBehavior is either an empty string or a git flag // Returned beforeCommit could be nil if the afterCommit doesn't have parent commit func getDiffBasic(ctx context.Context, gitRepo *git.Repository, opts *DiffOptions, files ...string) (_ *Diff, beforeCommit, afterCommit *git.Commit, err error) { - repoPath := gitRepo.Path - afterCommit, err = gitRepo.GetCommit(ctx, opts.AfterCommitID) if err != nil { return nil, nil, nil, err @@ -1360,9 +1357,9 @@ func getDiffBasic(ctx context.Context, gitRepo *git.Repository, opts *DiffOption defer readerClose() go func() { if err := cmdDiff. - WithDir(repoPath). + WithRepo(gitRepo). RunWithStderr(cmdCtx); err != nil && !gitcmd.IsErrorCanceledOrKilled(err) { - log.Error("error during GetDiff(git diff dir: %s): %v", repoPath, err) + log.Error("error during GetDiff(git diff dir: %s): %v", gitRepo.Path, err) } }() @@ -1503,7 +1500,7 @@ func GetDiffShortStat(ctx context.Context, gitRepo *git.Repository, beforeCommit } diff := &DiffShortStat{} - diff.NumFiles, diff.TotalAddition, diff.TotalDeletion, err = gitrepo.GetDiffShortStatByCmdArgs(ctx, gitRepo, nil, actualBeforeCommitID.String(), afterCommitID) + diff.NumFiles, diff.TotalAddition, diff.TotalDeletion, err = git.GetDiffShortStatByCmdArgs(ctx, gitRepo, nil, actualBeforeCommitID.String(), afterCommitID) if err != nil { return nil, err } diff --git a/services/issue/comments.go b/services/issue/comments.go index 89943c83cdc..400ca775a04 100644 --- a/services/issue/comments.go +++ b/services/issue/comments.go @@ -13,7 +13,7 @@ import ( access_model "gitea.dev/models/perm/access" repo_model "gitea.dev/models/repo" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/json" "gitea.dev/modules/log" "gitea.dev/modules/timeutil" @@ -180,7 +180,7 @@ func LoadCommentPushCommits(ctx context.Context, c *issues_model.Comment) error return err } - gitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, c.Issue.Repo) + gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, c.Issue.Repo) if err != nil { return err } diff --git a/services/issue/issue.go b/services/issue/issue.go index 511357372f8..5d32279649f 100644 --- a/services/issue/issue.go +++ b/services/issue/issue.go @@ -16,7 +16,6 @@ import ( system_model "gitea.dev/models/system" user_model "gitea.dev/models/user" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" "gitea.dev/modules/storage" notify_service "gitea.dev/services/notify" @@ -171,7 +170,7 @@ func DeleteIssue(ctx context.Context, doer *user_model.User, issue *issues_model if err := issue.PullRequest.LoadBaseRepo(ctx); err != nil { return err } - if err := gitrepo.RemoveRef(ctx, issue.PullRequest.BaseRepo, issue.PullRequest.GetGitHeadRefName()); err != nil { + if err := git.RemoveRef(ctx, issue.PullRequest.BaseRepo, issue.PullRequest.GetGitHeadRefName()); err != nil { return err } } diff --git a/services/issue/pull.go b/services/issue/pull.go index 39a56ba233b..97c911e2e0c 100644 --- a/services/issue/pull.go +++ b/services/issue/pull.go @@ -13,7 +13,6 @@ import ( org_model "gitea.dev/models/organization" user_model "gitea.dev/models/user" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" "gitea.dev/modules/setting" ) @@ -55,7 +54,7 @@ func PullRequestCodeOwnersReview(ctx context.Context, pr *issues_model.PullReque return nil, nil } - repo, err := gitrepo.OpenRepository(pr.BaseRepo) + repo, err := git.OpenRepository(pr.BaseRepo) if err != nil { return nil, err } @@ -85,7 +84,7 @@ func PullRequestCodeOwnersReview(ctx context.Context, pr *issues_model.PullReque } // get the mergebase - mergeBase, err := gitrepo.MergeBase(ctx, pr.BaseRepo, git.BranchPrefix+pr.BaseBranch, pr.GetGitHeadRefName()) + mergeBase, err := git.MergeBase(ctx, pr.BaseRepo, git.BranchPrefix+pr.BaseBranch, pr.GetGitHeadRefName()) if err != nil { return nil, err } diff --git a/services/markup/renderhelper_codepreview.go b/services/markup/renderhelper_codepreview.go index 8a34b28714c..265f0759395 100644 --- a/services/markup/renderhelper_codepreview.go +++ b/services/markup/renderhelper_codepreview.go @@ -14,8 +14,8 @@ import ( "gitea.dev/models/repo" "gitea.dev/models/unit" "gitea.dev/modules/charset" + "gitea.dev/modules/git" "gitea.dev/modules/git/languagestats" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/indexer/code" "gitea.dev/modules/markup" "gitea.dev/modules/setting" @@ -50,7 +50,7 @@ func renderRepoFileCodePreview(ctx context.Context, opts markup.RenderCodePrevie return "", util.ErrPermissionDenied } - gitRepo, err := gitrepo.OpenRepository(dbRepo) + gitRepo, err := git.OpenRepository(dbRepo) if err != nil { return "", err } diff --git a/services/migrations/gitea_uploader.go b/services/migrations/gitea_uploader.go index f5b9177ee0d..283e7069111 100644 --- a/services/migrations/gitea_uploader.go +++ b/services/migrations/gitea_uploader.go @@ -20,7 +20,6 @@ import ( user_model "gitea.dev/models/user" "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/label" "gitea.dev/modules/log" base "gitea.dev/modules/migration" @@ -139,7 +138,7 @@ func (g *GiteaLocalUploader) CreateRepo(ctx context.Context, repo *base.Reposito if err != nil { return err } - g.gitRepo, err = gitrepo.OpenRepository(g.repo) + g.gitRepo, err = git.OpenRepository(g.repo) if err != nil { return err } @@ -304,7 +303,7 @@ func (g *GiteaLocalUploader) CreateReleases(ctx context.Context, releases ...*ba return fmt.Errorf("GetTagCommit[%v]: %w", rel.TagName, err) } rel.Sha1 = commit.ID.String() - rel.NumCommits, err = gitrepo.CommitsCountOfCommit(ctx, g.repo, commit.ID.String()) + rel.NumCommits, err = git.CommitsCountOfCommit(ctx, g.repo, commit.ID.String()) if err != nil { return fmt.Errorf("CommitsCount: %w", err) } @@ -596,7 +595,7 @@ func (g *GiteaLocalUploader) updateGitForPullRequest(ctx context.Context, pr *ba } defer ret.Close() - f, err := gitrepo.CreateRepoFile(ctx, g.repo, fmt.Sprintf("pulls/%d.patch", pr.Number)) + f, err := git.CreateRepoFile(ctx, g.repo, fmt.Sprintf("pulls/%d.patch", pr.Number)) if err != nil { return err } @@ -689,7 +688,7 @@ func (g *GiteaLocalUploader) updateGitForPullRequest(ctx context.Context, pr *ba pr.Head.SHA = headSha } - if err = gitrepo.UpdateRef(ctx, g.repo, pr.GetGitHeadRefName(), pr.Head.SHA); err != nil { + if err = git.UpdateRef(ctx, g.repo, pr.GetGitHeadRefName(), pr.Head.SHA); err != nil { return "", err } @@ -712,7 +711,7 @@ func (g *GiteaLocalUploader) updateGitForPullRequest(ctx context.Context, pr *ba log.Warn("Deprecated local head %s for PR #%d in %s/%s, removing %s", pr.Head.SHA, pr.Number, g.repoOwner, g.repoName, pr.GetGitHeadRefName()) } else { // set head information - if err = gitrepo.UpdateRef(ctx, g.repo, pr.GetGitHeadRefName(), pr.Head.SHA); err != nil { + if err = git.UpdateRef(ctx, g.repo, pr.GetGitHeadRefName(), pr.Head.SHA); err != nil { log.Error("unable to set %s as the local head for PR #%d from %s in %s/%s. Error: %v", pr.Head.SHA, pr.Number, pr.Head.Ref, g.repoOwner, g.repoName, err) } } @@ -742,7 +741,7 @@ func (g *GiteaLocalUploader) newPullRequest(ctx context.Context, pr *base.PullRe if pr.Base.Ref != "" && pr.Head.SHA != "" { // A PR against a tag base does not make sense - therefore pr.Base.Ref must be a branch // TODO: should we be checking for the refs/heads/ prefix on the pr.Base.Ref? (i.e. are these actually branches or refs) - pr.Base.SHA, err = gitrepo.MergeBase(ctx, g.repo, git.BranchPrefix+pr.Base.Ref, pr.Head.SHA) + pr.Base.SHA, err = git.MergeBase(ctx, g.repo, git.BranchPrefix+pr.Base.Ref, pr.Head.SHA) if err != nil { log.Error("Cannot determine the merge base for PR #%d in %s/%s. Error: %v", pr.Number, g.repoOwner, g.repoName, err) } diff --git a/services/mirror/mirror_pull.go b/services/mirror/mirror_pull.go index b317a8776de..22648987a62 100644 --- a/services/mirror/mirror_pull.go +++ b/services/mirror/mirror_pull.go @@ -15,7 +15,6 @@ import ( "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" giturl "gitea.dev/modules/git/url" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/globallock" "gitea.dev/modules/lfs" "gitea.dev/modules/log" @@ -40,12 +39,12 @@ func UpdateAddress(ctx context.Context, m *repo_model.Mirror, addr string) error remoteName := m.GetRemoteName() repo := m.GetRepository(ctx) // Remove old remote - err = gitrepo.ManagedRemoteRemove(ctx, repo, remoteName) + err = git.ManagedRemoteRemove(ctx, repo, remoteName) if err != nil && !git.IsRemoteNotExistError(err) { return err } - err = gitrepo.ManagedRemoteAdd(ctx, repo, remoteName, addr, gitrepo.RemoteOptionMirrorFetch) + err = git.ManagedRemoteAdd(ctx, repo, remoteName, addr, git.RemoteOptionMirrorFetch) if err != nil && !git.IsRemoteNotExistError(err) { return err } @@ -53,12 +52,12 @@ func UpdateAddress(ctx context.Context, m *repo_model.Mirror, addr string) error if repo_service.HasWiki(ctx, m.Repo) { wikiRemotePath := repo_module.WikiRemoteURL(ctx, addr) // Remove old remote of wiki - err = gitrepo.ManagedRemoteRemove(ctx, repo.WikiStorageRepo(), remoteName) + err = git.ManagedRemoteRemove(ctx, repo.WikiStorageRepo(), remoteName) if err != nil && !git.IsRemoteNotExistError(err) { return err } - err = gitrepo.ManagedRemoteAdd(ctx, repo.WikiStorageRepo(), remoteName, wikiRemotePath, gitrepo.RemoteOptionMirrorFetch) + err = git.ManagedRemoteAdd(ctx, repo.WikiStorageRepo(), remoteName, wikiRemotePath, git.RemoteOptionMirrorFetch) if err != nil && !git.IsRemoteNotExistError(err) { return err } @@ -110,7 +109,7 @@ func checkRecoverableSyncError(stderrMessage string) bool { func runSync(ctx context.Context, m *repo_model.Mirror) ([]*repo_module.SyncResult, bool) { log.Trace("SyncMirrors [repo: %-v]: running git remote update...", m.Repo) - remoteURL, remoteErr := gitrepo.GitRemoteGetURL(ctx, m.Repo, m.GetRemoteName()) + remoteURL, remoteErr := git.ParseRemoteAddressURL(ctx, m.Repo, m.GetRemoteName()) if remoteErr != nil { log.Error("SyncMirrors [repo: %-v]: GetRemoteURL Error %v", m.Repo, remoteErr) return nil, false @@ -175,7 +174,7 @@ func runSync(ctx context.Context, m *repo_model.Mirror) ([]*repo_module.SyncResu log.Error("SyncMirrors [repo: %-v]: %v", m.Repo, err) } - gitRepo, err := gitrepo.OpenRepository(m.Repo) + gitRepo, err := git.OpenRepository(m.Repo) if err != nil { log.Error("SyncMirrors [repo: %-v]: failed to OpenRepository: %v", m.Repo, err) return nil, false @@ -260,7 +259,7 @@ func runSync(ctx context.Context, m *repo_model.Mirror) ([]*repo_module.SyncResu } log.Trace("SyncMirrors [repo: %-v]: invalidating mirror branch caches...", m.Repo) - branches, _, err := gitrepo.GetBranchesByPath(ctx, m.Repo, 0, 0) + branches, _, err := git.GetBranchesByPath(ctx, m.Repo, 0, 0) if err != nil { log.Error("SyncMirrors [repo: %-v]: failed to GetBranches: %v", m.Repo, err) return nil, false @@ -324,7 +323,7 @@ func SyncPullMirror(ctx context.Context, repoID int64) bool { return false } - gitRepo, err := gitrepo.OpenRepository(m.Repo) + gitRepo, err := git.OpenRepository(m.Repo) if err != nil { log.Error("SyncMirrors [repo: %-v]: unable to OpenRepository: %v", m.Repo, err) return false @@ -400,7 +399,7 @@ func SyncPullMirror(ctx context.Context, repoID int64) bool { } if !isEmpty { // Get latest commit date and update to current repository updated time - commitDate, err := gitrepo.GetLatestCommitTime(ctx, m.Repo) + commitDate, err := git.GetLatestCommitTime(ctx, m.Repo) if err != nil { log.Error("SyncMirrors [repo: %-v]: unable to GetLatestCommitDate: %v", m.Repo, err) return false @@ -464,7 +463,7 @@ func checkAndUpdateEmptyRepository(ctx context.Context, m *repo_model.Mirror, re m.Repo.DefaultBranch = firstName } // Update the git repository default branch - if err := gitrepo.SetDefaultBranch(ctx, m.Repo, m.Repo.DefaultBranch); err != nil { + if err := git.SetDefaultBranch(ctx, m.Repo, m.Repo.DefaultBranch); err != nil { log.Error("Failed to update default branch of underlying git repository %-v. Error: %v", m.Repo, err) return false } diff --git a/services/mirror/mirror_push.go b/services/mirror/mirror_push.go index 69c180cccef..c9b86b8bba1 100644 --- a/services/mirror/mirror_push.go +++ b/services/mirror/mirror_push.go @@ -14,7 +14,6 @@ import ( "gitea.dev/models/db" repo_model "gitea.dev/models/repo" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/lfs" "gitea.dev/modules/log" "gitea.dev/modules/process" @@ -32,13 +31,13 @@ var stripExitStatus = regexp.MustCompile(`exit status \d+ - `) // AddPushMirrorRemote registers the push mirror remote. func AddPushMirrorRemote(ctx context.Context, m *repo_model.PushMirror, addr string) error { addRemoteAndConfig := func(storageRepo git.RepositoryFacade, addr string) error { - if err := gitrepo.ManagedRemoteAdd(ctx, storageRepo, m.RemoteName, addr, gitrepo.RemoteOptionMirrorPush); err != nil { + if err := git.ManagedRemoteAdd(ctx, storageRepo, m.RemoteName, addr, git.RemoteOptionMirrorPush); err != nil { return err } - if err := gitrepo.ManagedConfigAdd(ctx, storageRepo, "remote."+m.RemoteName+".push", "+refs/heads/*:refs/heads/*"); err != nil { + if err := git.ManagedConfigAdd(ctx, storageRepo, "remote."+m.RemoteName+".push", "+refs/heads/*:refs/heads/*"); err != nil { return err } - return gitrepo.ManagedConfigAdd(ctx, storageRepo, "remote."+m.RemoteName+".push", "+refs/tags/*:refs/tags/*") + return git.ManagedConfigAdd(ctx, storageRepo, "remote."+m.RemoteName+".push", "+refs/tags/*:refs/tags/*") } if err := addRemoteAndConfig(m.Repo.CodeStorageRepo(), addr); err != nil { @@ -60,12 +59,12 @@ func AddPushMirrorRemote(ctx context.Context, m *repo_model.PushMirror, addr str // RemovePushMirrorRemote removes the push mirror remote. func RemovePushMirrorRemote(ctx context.Context, m *repo_model.PushMirror) error { _ = m.GetRepository(ctx) - if err := gitrepo.ManagedRemoteRemove(ctx, m.Repo, m.RemoteName); err != nil { + if err := git.ManagedRemoteRemove(ctx, m.Repo, m.RemoteName); err != nil { return err } if repo_service.HasWiki(ctx, m.Repo) { - if err := gitrepo.ManagedRemoteRemove(ctx, m.Repo.WikiStorageRepo(), m.RemoteName); err != nil { + if err := git.ManagedRemoteRemove(ctx, m.Repo.WikiStorageRepo(), m.RemoteName); err != nil { // The wiki remote may not exist log.Warn("Wiki Remote[%d] could not be removed: %v", m.ID, err) } @@ -129,7 +128,7 @@ func runPushSync(ctx context.Context, m *repo_model.PushMirror) error { storageRepo = repo.WikiStorageRepo() } mirrorLogName := fmt.Sprintf("%s%s[mirror=%d]", m.Repo.FullName(), util.Iif(isWiki, ".wiki", ""), m.ID) - remoteURL, err := gitrepo.GitRemoteGetURL(ctx, storageRepo, m.RemoteName) + remoteURL, err := git.ParseRemoteAddressURL(ctx, storageRepo, m.RemoteName) if err != nil { log.Error("GetRemoteURL %s failed, error %v", mirrorLogName, err) return errors.New("GitRemoteGetURL failed") @@ -138,7 +137,7 @@ func runPushSync(ctx context.Context, m *repo_model.PushMirror) error { if setting.LFS.StartServer { log.Trace("SyncMirrors [repo: %-v]: syncing LFS objects...", m.Repo) - gitRepo, err := gitrepo.OpenRepository(storageRepo) + gitRepo, err := git.OpenRepository(storageRepo) if err != nil { log.Error("OpenRepository %s failed: %v", mirrorLogName, err) return errors.New("OpenRepository failed") @@ -157,7 +156,7 @@ func runPushSync(ctx context.Context, m *repo_model.PushMirror) error { log.Trace("Pushing %s remote %s", mirrorLogName, m.ID, m.RemoteName) envs := proxy.EnvWithProxy(remoteURL.URL) - if err := gitrepo.PushToExternal(ctx, storageRepo, git.PushOptions{ + if err := git.PushToExternal(ctx, storageRepo, git.PushOptions{ Remote: m.RemoteName, Force: true, Mirror: true, @@ -177,7 +176,7 @@ func runPushSync(ctx context.Context, m *repo_model.PushMirror) error { } if repo_service.HasWiki(ctx, m.Repo) { - if _, err := gitrepo.GitRemoteGetURL(ctx, m.Repo.WikiStorageRepo(), m.RemoteName); err == nil { + if _, err := git.ParseRemoteAddressURL(ctx, m.Repo.WikiStorageRepo(), m.RemoteName); err == nil { err := performPush(m.Repo, true) if err != nil { return err diff --git a/services/pull/check.go b/services/pull/check.go index 5a2c25b03d0..88a239b4ff0 100644 --- a/services/pull/check.go +++ b/services/pull/check.go @@ -21,7 +21,6 @@ import ( user_model "gitea.dev/models/user" "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/globallock" "gitea.dev/modules/graceful" "gitea.dev/modules/log" @@ -247,7 +246,7 @@ func checkSigningRequirements(ctx context.Context, pr *issues_model.PullRequest, return nil } - gitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, pr.BaseRepo) + gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, pr.BaseRepo) if err != nil { return err } @@ -328,12 +327,12 @@ func getMergeCommit(ctx context.Context, pr *issues_model.PullRequest) (*git.Com // If merge-base successfully exits then prHeadRef is an ancestor of pr.BaseBranch // Find the head commit id - prHeadCommitID, err := gitrepo.GetFullCommitID(ctx, pr.BaseRepo, prHeadRef) + prHeadCommitID, err := git.GetFullCommitID(ctx, pr.BaseRepo, prHeadRef) if err != nil { return nil, fmt.Errorf("GetFullCommitID(%s) in %s: %w", prHeadRef, pr.BaseRepo.FullName(), err) } - gitRepo, err := gitrepo.OpenRepository(pr.BaseRepo) + gitRepo, err := git.OpenRepository(pr.BaseRepo) if err != nil { return nil, fmt.Errorf("%-v OpenRepository: %w", pr.BaseRepo, err) } diff --git a/services/pull/comment.go b/services/pull/comment.go index 859c8b8b044..fcb1b49a3da 100644 --- a/services/pull/comment.go +++ b/services/pull/comment.go @@ -12,7 +12,6 @@ import ( user_model "gitea.dev/models/user" "gitea.dev/modules/container" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/json" "gitea.dev/modules/log" ) @@ -23,11 +22,11 @@ func preparePushPullCommentPushActionContent(ctx context.Context, pr *issues_mod if isForcePush { // if it's a force push, we need to get the whole pull request commits // the force-push timeline comment should always be created, so all errors are ignored and logged only. - mergeBase, err := gitrepo.MergeBase(ctx, pr.BaseRepo, pr.BaseBranch, newCommitID) + mergeBase, err := git.MergeBase(ctx, pr.BaseRepo, pr.BaseBranch, newCommitID) if err != nil { log.Debug("MergeBase %q..%q failed: %v", pr.BaseBranch, newCommitID, err) } else { - data.CommitIDs, err = gitrepo.GetCommitIDsBetweenReverse(ctx, pr.BaseRepo, mergeBase, newCommitID, "", maxPushCommitsInCommentCount) + data.CommitIDs, err = git.GetCommitIDsBetweenReverse(ctx, pr.BaseRepo, mergeBase, newCommitID, "", maxPushCommitsInCommentCount) if err != nil { log.Debug("GetCommitIDsBetweenReverse %q..%q failed: %v", mergeBase, newCommitID, err) } @@ -36,7 +35,7 @@ func preparePushPullCommentPushActionContent(ctx context.Context, pr *issues_mod } // for a normal push, it maybe an empty pull request, only non-empty pull request need to create push comment - data.CommitIDs, err = gitrepo.GetCommitIDsBetweenReverse(ctx, pr.BaseRepo, oldCommitID, newCommitID, pr.BaseBranch, maxPushCommitsInCommentCount) + data.CommitIDs, err = git.GetCommitIDsBetweenReverse(ctx, pr.BaseRepo, oldCommitID, newCommitID, pr.BaseBranch, maxPushCommitsInCommentCount) return data, len(data.CommitIDs) > 0, err } @@ -98,7 +97,7 @@ func CreatePushPullComment(ctx context.Context, pusher *user_model.User, pr *iss return nil, false, nil } - gitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, pr.BaseRepo) + gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, pr.BaseRepo) if err != nil { return nil, false, err } diff --git a/services/pull/comment_test.go b/services/pull/comment_test.go index 5836575fdc4..cb9d797bc36 100644 --- a/services/pull/comment_test.go +++ b/services/pull/comment_test.go @@ -11,7 +11,6 @@ import ( "gitea.dev/models/unittest" user_model "gitea.dev/models/user" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/json" "github.com/stretchr/testify/assert" @@ -26,7 +25,7 @@ func TestCreatePushPullCommentForcePushDeletesOldComments(t *testing.T) { require.NoError(t, pr.LoadIssue(ctx)) require.NoError(t, pr.LoadBaseRepo(ctx)) - gitRepo, err := gitrepo.OpenRepository(pr.BaseRepo) + gitRepo, err := git.OpenRepository(pr.BaseRepo) require.NoError(t, err) defer gitRepo.Close() diff --git a/services/pull/commit_status.go b/services/pull/commit_status.go index fb6ba7f9db7..a48ce2287c7 100644 --- a/services/pull/commit_status.go +++ b/services/pull/commit_status.go @@ -17,7 +17,7 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/modules/commitstatus" "gitea.dev/modules/container" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/glob" "gitea.dev/modules/log" ) @@ -108,7 +108,7 @@ func GetPullRequestCommitStatusState(ctx context.Context, pr *issues_model.PullR } // check if all required status checks are successful - headGitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, pr.HeadRepo) + headGitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, pr.HeadRepo) if err != nil { return "", fmt.Errorf("OpenRepository: %w", err) } @@ -121,7 +121,7 @@ func GetPullRequestCommitStatusState(ctx context.Context, pr *issues_model.PullR return "", errors.New("Head branch does not exist, can not merge") } } - if pr.Flow == issues_model.PullRequestFlowAGit && !gitrepo.IsReferenceExist(ctx, pr.HeadRepo, pr.GetGitHeadRefName()) { + if pr.Flow == issues_model.PullRequestFlowAGit && !git.IsReferenceExist(ctx, pr.HeadRepo, pr.GetGitHeadRefName()) { return "", errors.New("Head branch does not exist, can not merge") } diff --git a/services/pull/lfs.go b/services/pull/lfs.go index 34d811a3c37..dd619e3b419 100644 --- a/services/pull/lfs.go +++ b/services/pull/lfs.go @@ -13,6 +13,7 @@ import ( git_model "gitea.dev/models/git" issues_model "gitea.dev/models/issues" + "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" "gitea.dev/modules/git/pipeline" "gitea.dev/modules/lfs" @@ -23,8 +24,8 @@ import ( ) // LFSPush pushes lfs objects referred to in new commits in the head repository from the base repository -func LFSPush(ctx context.Context, tmpBasePath, mergeHeadSHA, mergeBaseSHA string, pr *issues_model.PullRequest) error { - // Now we have to implement git lfs push +func LFSPush(ctx context.Context, tmpBasePath string, tmpRepo git.RepositoryFacade, mergeHeadSHA, mergeBaseSHA string, pr *issues_model.PullRequest) error { + // Now we have to implement git-lfs push // git rev-list --objects --filter=blob:limit=1k HEAD --not base // pass blob shas in to git cat-file --batch-check (possibly unnecessary) // ensure only blobs and <=1k size then pass in to git cat-file --batch @@ -53,7 +54,7 @@ func LFSPush(ctx context.Context, tmpBasePath, mergeHeadSHA, mergeBaseSHA string // 5. Take the shas of the blobs and batch read them wg.Go(func() error { - return pipeline.CatFileBatch(ctx, cmd5BatchContent, tmpBasePath) + return pipeline.CatFileBatch(ctx, cmd5BatchContent, tmpRepo) }) // 4. From the provided objects restrict to blobs <=1k diff --git a/services/pull/merge.go b/services/pull/merge.go index 0c567c46280..0ffbc37d05d 100644 --- a/services/pull/merge.go +++ b/services/pull/merge.go @@ -362,15 +362,15 @@ func doMergeAndPush(ctx context.Context, pr *issues_model.PullRequest, doer *use } // OK we should cache our current head and origin/headbranch - mergeHeadSHA, err := git.GetFullCommitID(ctx, mergeCtx.tmpBasePath, "HEAD") + mergeHeadSHA, err := git.GetFullCommitID(ctx, mergeCtx.tmpRepo, "HEAD") if err != nil { return "", fmt.Errorf("Failed to get full commit id for HEAD: %w", err) } - mergeBaseSHA, err := git.GetFullCommitID(ctx, mergeCtx.tmpBasePath, "original_"+tmpRepoBaseBranch) + mergeBaseSHA, err := git.GetFullCommitID(ctx, mergeCtx.tmpRepo, "original_"+tmpRepoBaseBranch) if err != nil { return "", fmt.Errorf("Failed to get full commit id for origin/%s: %w", pr.BaseBranch, err) } - mergeCommitID, err := git.GetFullCommitID(ctx, mergeCtx.tmpBasePath, tmpRepoBaseBranch) + mergeCommitID, err := git.GetFullCommitID(ctx, mergeCtx.tmpRepo, tmpRepoBaseBranch) if err != nil { return "", fmt.Errorf("Failed to get full commit id for the new merge: %w", err) } @@ -379,7 +379,7 @@ func doMergeAndPush(ctx context.Context, pr *issues_model.PullRequest, doer *use // I think in the interests of data safety - failures to push to the lfs should prevent // the merge as you can always remerge. if setting.LFS.StartServer { - if err := LFSPush(ctx, mergeCtx.tmpBasePath, mergeHeadSHA, mergeBaseSHA, pr); err != nil { + if err := LFSPush(ctx, mergeCtx.tmpBasePath, mergeCtx.tmpRepo, mergeHeadSHA, mergeBaseSHA, pr); err != nil { return "", err } } diff --git a/services/pull/merge_rebase.go b/services/pull/merge_rebase.go index 0a2bca39405..fbdf0163793 100644 --- a/services/pull/merge_rebase.go +++ b/services/pull/merge_rebase.go @@ -10,7 +10,6 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" ) @@ -38,7 +37,7 @@ func getRebaseAmendMessage(ctx *mergeContext, baseGitRepo *git.Repository) (mess // Perform rebase merge without merge commit. func doMergeRebaseFastForward(ctx *mergeContext) error { - baseHeadSHA, err := git.GetFullCommitID(ctx, ctx.tmpBasePath, "HEAD") + baseHeadSHA, err := git.GetFullCommitID(ctx, ctx.tmpRepo, "HEAD") if err != nil { return fmt.Errorf("Failed to get full commit id for HEAD: %w", err) } @@ -49,8 +48,8 @@ func doMergeRebaseFastForward(ctx *mergeContext) error { return err } - // Check if anything actually changed before we amend the message, fast forward can skip commits. - newMergeHeadSHA, err := git.GetFullCommitID(ctx, ctx.tmpBasePath, "HEAD") + // Check if anything actually changed before we amend the message, fast-forward can skip commits. + newMergeHeadSHA, err := git.GetFullCommitID(ctx, ctx.tmpRepo, "HEAD") if err != nil { return fmt.Errorf("Failed to get full commit id for HEAD: %w", err) } @@ -59,7 +58,7 @@ func doMergeRebaseFastForward(ctx *mergeContext) error { } // Original repo to read template from. - baseGitRepo, err := gitrepo.OpenRepository(ctx.pr.BaseRepo) + baseGitRepo, err := git.OpenRepository(ctx.pr.BaseRepo) if err != nil { log.Error("Unable to get Git repo for rebase: %v", err) return err diff --git a/services/pull/merge_tree.go b/services/pull/merge_tree.go index e572b0da7d7..8d3cbb0fb9c 100644 --- a/services/pull/merge_tree.go +++ b/services/pull/merge_tree.go @@ -11,7 +11,6 @@ import ( issues_model "gitea.dev/models/issues" "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" ) @@ -19,7 +18,7 @@ import ( // return true if there are conflicts otherwise return false // pr.Status and pr.ConflictedFiles will be updated as necessary func checkConflictsMergeTree(ctx context.Context, pr *issues_model.PullRequest, baseCommitID string) (bool, error) { - treeHash, conflict, conflictFiles, err := gitrepo.MergeTree(ctx, pr.BaseRepo, baseCommitID, pr.HeadCommitID, pr.MergeBase) + treeHash, conflict, conflictFiles, err := git.MergeTree(ctx, pr.BaseRepo, baseCommitID, pr.HeadCommitID, pr.MergeBase) if err != nil { return false, fmt.Errorf("MergeTree: %w", err) } @@ -55,7 +54,7 @@ func checkPullRequestMergeableByMergeTree(ctx context.Context, pr *issues_model. if err := pr.LoadHeadRepo(ctx); err != nil { return err } - headGitRepo, err := gitrepo.OpenRepository(pr.HeadRepo) + headGitRepo, err := git.OpenRepository(pr.HeadRepo) if err != nil { return fmt.Errorf("OpenRepository: %w", err) } @@ -66,7 +65,7 @@ func checkPullRequestMergeableByMergeTree(ctx context.Context, pr *issues_model. if pr.IsSameRepo() { baseGitRepo = headGitRepo } else { - baseGitRepo, err = gitrepo.OpenRepository(pr.BaseRepo) + baseGitRepo, err = git.OpenRepository(pr.BaseRepo) if err != nil { return fmt.Errorf("OpenRepository: %w", err) } @@ -94,7 +93,7 @@ func checkPullRequestMergeableByMergeTree(ctx context.Context, pr *issues_model. // it will be checked in 2 weeks by default from git if the pull request created failure. if !pr.IsSameRepo() { if !baseGitRepo.IsReferenceExist(ctx, pr.HeadCommitID) { - if err := gitrepo.FetchRemoteCommit(ctx, pr.BaseRepo, pr.HeadRepo, pr.HeadCommitID); err != nil { + if err := git.FetchRemoteCommit(ctx, pr.BaseRepo, pr.HeadRepo, pr.HeadCommitID); err != nil { return fmt.Errorf("FetchRemoteCommit: %w", err) } } @@ -106,7 +105,7 @@ func checkPullRequestMergeableByMergeTree(ctx context.Context, pr *issues_model. return fmt.Errorf("GetBranchCommitID: can't find commit ID for base: %w", err) } - pr.MergeBase, err = gitrepo.MergeBase(ctx, pr.BaseRepo, baseCommitID, pr.HeadCommitID) + pr.MergeBase, err = git.MergeBase(ctx, pr.BaseRepo, baseCommitID, pr.HeadCommitID) if err != nil { // if there is no merge base, then it's empty, still need to allow the pull request to be created // not quite right (e.g.: why not reset the fields like below), but no interest to do more investigation at the moment diff --git a/services/pull/patch.go b/services/pull/patch.go index 63d7a68eb51..f9231c004f2 100644 --- a/services/pull/patch.go +++ b/services/pull/patch.go @@ -16,7 +16,6 @@ import ( issues_model "gitea.dev/models/issues" "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/glob" "gitea.dev/modules/log" "gitea.dev/modules/process" @@ -30,7 +29,7 @@ func DownloadDiffOrPatch(ctx context.Context, pr *issues_model.PullRequest, w io return err } - gitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, pr.BaseRepo) + gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, pr.BaseRepo) if err != nil { return fmt.Errorf("OpenRepository: %w", err) } diff --git a/services/pull/pull.go b/services/pull/pull.go index 9a57b16c318..8de32f5f839 100644 --- a/services/pull/pull.go +++ b/services/pull/pull.go @@ -27,7 +27,6 @@ import ( "gitea.dev/modules/container" "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/globallock" "gitea.dev/modules/graceful" "gitea.dev/modules/log" @@ -157,7 +156,7 @@ func NewPullRequest(ctx context.Context, opts *NewPullRequestOptions) error { return nil }); err != nil { // cleanup: this will only remove the reference, the real commit will be clean up when next GC - if err1 := gitrepo.RemoveRef(ctx, pr.BaseRepo, pr.GetGitHeadRefName()); err1 != nil { + if err1 := git.RemoveRef(ctx, pr.BaseRepo, pr.GetGitHeadRefName()); err1 != nil { log.Error("RemoveRef: %v", err1) } return err @@ -365,7 +364,7 @@ func checkForInvalidation(ctx context.Context, requests issues_model.PullRequest if err != nil { return fmt.Errorf("GetRepositoryByIDCtx: %w", err) } - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) if err != nil { return fmt.Errorf("gitrepo.OpenRepository: %w", err) } @@ -528,7 +527,7 @@ func checkIfPRContentChanged(ctx context.Context, pr *issues_model.PullRequest, } defer cancel() - mergeBase, err = gitrepo.MergeBase(ctx, pr.BaseRepo, pr.BaseBranch, pr.GetGitHeadRefName()) + mergeBase, err = git.MergeBase(ctx, pr.BaseRepo, pr.BaseBranch, pr.GetGitHeadRefName()) if err != nil { return false, "", fmt.Errorf("GetMergeBase: %w", err) } @@ -586,7 +585,7 @@ func pushToBaseRepoHelper(ctx context.Context, pr *issues_model.PullRequest, pre gitRefName := pr.GetGitHeadRefName() - if err := gitrepo.PushManaged(ctx, pr.HeadRepo, pr.BaseRepo, git.PushOptions{ + if err := git.PushManaged(ctx, pr.HeadRepo, pr.BaseRepo, git.PushOptions{ Branch: prefixHeadBranch + pr.HeadBranch + ":" + gitRefName, Force: true, // Use InternalPushingEnvironment here because we know that pre-receive and post-receive do not run on a refs/pulls/... @@ -643,7 +642,7 @@ func UpdateRef(ctx context.Context, pr *issues_model.PullRequest) (err error) { return err } - if err := gitrepo.UpdateRef(ctx, pr.BaseRepo, pr.GetGitHeadRefName(), pr.HeadCommitID); err != nil { + if err := git.UpdateRef(ctx, pr.BaseRepo, pr.GetGitHeadRefName(), pr.HeadCommitID); err != nil { log.Error("Unable to update ref in base repository for PR[%d] Error: %v", pr.ID, err) } @@ -745,7 +744,7 @@ func AdjustPullsCausedByBranchDeleted(ctx context.Context, doer *user_model.User // CloseRepoBranchesPulls close all pull requests which head branches are in the given repository, but only whose base repo is not in the given repository func CloseRepoBranchesPulls(ctx context.Context, doer *user_model.User, repo *repo_model.Repository) error { - branches, _, err := gitrepo.GetBranchesByPath(ctx, repo, 0, 0) + branches, _, err := git.GetBranchesByPath(ctx, repo, 0, 0) if err != nil { return err } @@ -793,7 +792,7 @@ func GetSquashMergeCommitMessages(ctx context.Context, pr *issues_model.PullRequ } } - gitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, pr.HeadRepo) + gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, pr.HeadRepo) if err != nil { return "", err } @@ -960,7 +959,7 @@ func GetIssuesAllCommitStatus(ctx context.Context, issues issues_model.IssueList } gitRepo, ok := gitRepos[issue.RepoID] if !ok { - gitRepo, err = gitrepo.OpenRepository(issue.Repo) + gitRepo, err = git.OpenRepository(issue.Repo) if err != nil { log.Error("Cannot open git repository %-v for issue #%d[%d]. Error: %v", issue.Repo, issue.Index, issue.ID, err) continue @@ -997,7 +996,7 @@ func IsHeadEqualWithBranch(ctx context.Context, pr *issues_model.PullRequest, br if err = pr.LoadBaseRepo(ctx); err != nil { return false, err } - baseGitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, pr.BaseRepo) + baseGitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, pr.BaseRepo) if err != nil { return false, err } @@ -1017,7 +1016,7 @@ func IsHeadEqualWithBranch(ctx context.Context, pr *issues_model.PullRequest, br } else { var closer io.Closer - headGitRepo, closer, err = gitrepo.RepositoryFromContextOrOpen(ctx, pr.HeadRepo) + headGitRepo, closer, err = git.RepositoryFromContextOrOpen(ctx, pr.HeadRepo) if err != nil { return false, err } diff --git a/services/pull/pull_test.go b/services/pull/pull_test.go index 674e4f642da..cc1386ae4a3 100644 --- a/services/pull/pull_test.go +++ b/services/pull/pull_test.go @@ -12,7 +12,6 @@ import ( "gitea.dev/models/unit" "gitea.dev/models/unittest" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/setting" "gitea.dev/modules/test" @@ -45,7 +44,7 @@ func TestPullRequest_GetDefaultMergeMessage_InternalTracker(t *testing.T) { pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 2}) assert.NoError(t, pr.LoadBaseRepo(t.Context())) - gitRepo, err := gitrepo.OpenRepository(pr.BaseRepo) + gitRepo, err := git.OpenRepository(pr.BaseRepo) assert.NoError(t, err) defer gitRepo.Close() @@ -75,7 +74,7 @@ func TestPullRequest_GetDefaultMergeMessage_ExternalTracker(t *testing.T) { pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 2, BaseRepo: baseRepo}) assert.NoError(t, pr.LoadBaseRepo(t.Context())) - gitRepo, err := gitrepo.OpenRepository(pr.BaseRepo) + gitRepo, err := git.OpenRepository(pr.BaseRepo) assert.NoError(t, err) defer gitRepo.Close() diff --git a/services/pull/review.go b/services/pull/review.go index a3ff735e4f1..aebd7ed7e99 100644 --- a/services/pull/review.go +++ b/services/pull/review.go @@ -16,7 +16,6 @@ import ( user_model "gitea.dev/models/user" "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" "gitea.dev/modules/optional" "gitea.dev/modules/setting" @@ -57,7 +56,7 @@ var ErrSubmitReviewOnClosedPR = errors.New("can't submit review for a closed or // LineBlame returns the latest commit at the given line func lineBlame(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, branch, file string, line uint) (*git.Commit, error) { - sha, err := gitrepo.LineBlame(ctx, repo, branch, file, line) + sha, err := git.LineBlame(ctx, repo, branch, file, line) if err != nil { return nil, err } @@ -215,7 +214,7 @@ func createCodeComment(ctx context.Context, doer *user_model.User, repo *repo_mo if err := pr.LoadBaseRepo(ctx); err != nil { return nil, fmt.Errorf("LoadBaseRepo: %w", err) } - gitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, pr.BaseRepo) + gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, pr.BaseRepo) if err != nil { return nil, fmt.Errorf("RepositoryFromContextOrOpen: %w", err) } diff --git a/services/pull/temp_repo.go b/services/pull/temp_repo.go index 17bfd6a8087..45a3ffe04fe 100644 --- a/services/pull/temp_repo.go +++ b/services/pull/temp_repo.go @@ -16,7 +16,6 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/log" repo_module "gitea.dev/modules/repository" ) @@ -31,6 +30,7 @@ const ( type prTmpRepoContext struct { context.Context tmpBasePath string + tmpRepo git.RepositoryFacade pr *issues_model.PullRequest outbuf *bytes.Buffer // we keep these around to help reduce needless buffer recreation, any use should be preceded by a Reset and preferably after use } @@ -45,42 +45,37 @@ func (ctx *prTmpRepoContext) PrepareGitCmd(cmd *gitcmd.Command) *gitcmd.Command // createTemporaryRepoForPR creates a temporary repo with "base" for pr.BaseBranch and "tracking" for pr.HeadBranch // it also create a second base branch called "original_base" -func createTemporaryRepoForPR(ctx context.Context, pr *issues_model.PullRequest) (prCtx *prTmpRepoContext, cancel context.CancelFunc, err error) { +func createTemporaryRepoForPR(ctx context.Context, pr *issues_model.PullRequest) (prCtx *prTmpRepoContext, cancel context.CancelFunc, retErr error) { + defer func() { + if retErr != nil && cancel != nil { + cancel() + } + }() if err := pr.LoadHeadRepo(ctx); err != nil { - log.Error("%-v LoadHeadRepo: %v", pr, err) - return nil, nil, fmt.Errorf("%v LoadHeadRepo: %w", pr, err) + return nil, nil, fmt.Errorf("LoadHeadRepo[PR:%d]: %w", pr.ID, err) } else if pr.HeadRepo == nil { - log.Error("%-v HeadRepo %d does not exist", pr, pr.HeadRepoID) - return nil, nil, &repo_model.ErrRepoNotExist{ - ID: pr.HeadRepoID, - } + return nil, nil, &repo_model.ErrRepoNotExist{ID: pr.HeadRepoID} } else if err := pr.LoadBaseRepo(ctx); err != nil { - log.Error("%-v LoadBaseRepo: %v", pr, err) - return nil, nil, fmt.Errorf("%v LoadBaseRepo: %w", pr, err) + return nil, nil, fmt.Errorf("LoadBaseRepo[PR:%d]: %w", pr.ID, err) } else if pr.BaseRepo == nil { - log.Error("%-v BaseRepo %d does not exist", pr, pr.BaseRepoID) - return nil, nil, &repo_model.ErrRepoNotExist{ - ID: pr.BaseRepoID, - } + return nil, nil, &repo_model.ErrRepoNotExist{ID: pr.BaseRepoID} } else if err := pr.HeadRepo.LoadOwner(ctx); err != nil { - log.Error("%-v HeadRepo.LoadOwner: %v", pr, err) - return nil, nil, fmt.Errorf("%v HeadRepo.LoadOwner: %w", pr, err) + return nil, nil, fmt.Errorf("HeadRepo.LoadOwner[PR:%d]: %w", pr.ID, err) } else if err := pr.BaseRepo.LoadOwner(ctx); err != nil { - log.Error("%-v BaseRepo.LoadOwner: %v", pr, err) - return nil, nil, fmt.Errorf("%v BaseRepo.LoadOwner: %w", pr, err) + return nil, nil, fmt.Errorf("BaseRepo.LoadOwner[PR:%d]: %w", pr.ID, err) } // Clone base repo. - tmpBasePath, cleanup, err := repo_module.CreateTemporaryPath("pull") + tmpBasePath, tmpRepo, cleanup, err := repo_module.CreateTemporaryGitRepo("pull") if err != nil { - log.Error("CreateTemporaryPath[%-v]: %v", pr, err) - return nil, nil, err + return nil, nil, fmt.Errorf("CreateTemporaryPath[PR:%d]: %w", pr.ID, err) } cancel = cleanup prCtx = &prTmpRepoContext{ Context: ctx, tmpBasePath: tmpBasePath, + tmpRepo: tmpRepo, pr: pr, outbuf: &bytes.Buffer{}, } @@ -88,10 +83,8 @@ func createTemporaryRepoForPR(ctx context.Context, pr *issues_model.PullRequest) baseRepoPath := pr.BaseRepo.RepoPath() headRepoPath := pr.HeadRepo.RepoPath() - if err := git.InitRepository(ctx, tmpBasePath, false, pr.BaseRepo.ObjectFormatName); err != nil { - log.Error("Unable to init tmpBasePath for %-v: %v", pr, err) - cancel() - return nil, nil, err + if err := git.InitRepositoryLocal(ctx, tmpBasePath, false, pr.BaseRepo.ObjectFormatName); err != nil { + return nil, nil, fmt.Errorf("InitRepository[PR:%d]: %w", pr.ID, err) } remoteRepoName := "head_repo" @@ -104,61 +97,49 @@ func createTemporaryRepoForPR(ctx context.Context, pr *issues_model.PullRequest) // addCacheRepo adds git alternatives for the cacheRepoPath in the repoPath addCacheRepo := func(repoPath, cacheRepoPath string) error { - p := filepath.Join(repoPath, ".git", "objects", "info", "alternates") - f, err := os.OpenFile(p, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o600) + const altFileRelPath = ".git/objects/info/alternates" + gitInfoAltFile := filepath.Join(repoPath, filepath.FromSlash(altFileRelPath)) + newAltLine := filepath.Join(cacheRepoPath, "objects") + + f, err := os.OpenFile(gitInfoAltFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o600) if err != nil { - log.Error("Could not create .git/objects/info/alternates file in %s: %v", repoPath, err) - return err + return fmt.Errorf("unable to open %s file in %s: %w", altFileRelPath, filepath.Base(repoPath), err) } defer f.Close() - data := filepath.Join(cacheRepoPath, "objects") - if _, err := fmt.Fprintln(f, data); err != nil { - log.Error("Could not write to .git/objects/info/alternates file in %s: %v", repoPath, err) - return err + if _, err := fmt.Fprintln(f, newAltLine); err != nil { + return fmt.Errorf("unable to write %s file in %s: %w", altFileRelPath, filepath.Base(repoPath), err) } return nil } // Add head repo remote. if err := addCacheRepo(tmpBasePath, baseRepoPath); err != nil { - log.Error("%-v Unable to add base repository to temporary repo [%s -> %s]: %v", pr, pr.BaseRepo.FullName(), tmpBasePath, err) - cancel() - return nil, nil, fmt.Errorf("Unable to add base repository to temporary repo [%s -> tmpBasePath]: %w", pr.BaseRepo.FullName(), err) + return nil, nil, fmt.Errorf("unable to add base repository to temporary repo [%s -> tmpBasePath]: %w", pr.BaseRepo.FullName(), err) } if err := prCtx.PrepareGitCmd(gitcmd.NewCommand("remote", "add", "-t").AddDynamicArguments(pr.BaseBranch).AddArguments("-m").AddDynamicArguments(pr.BaseBranch).AddDynamicArguments("origin", baseRepoPath)). RunWithStderr(ctx); err != nil { - log.Error("%-v Unable to add base repository as origin [%s -> %s]: %v\n%s\n%s", pr, pr.BaseRepo.FullName(), tmpBasePath, err, prCtx.outbuf.String(), err.Stderr()) - cancel() - return nil, nil, fmt.Errorf("Unable to add base repository as origin [%s -> tmpBasePath]: %w\n%s\n%s", pr.BaseRepo.FullName(), err, prCtx.outbuf.String(), err.Stderr()) + return nil, nil, fmt.Errorf("unable to add base repository as origin [%s -> tmpBasePath]: %w\n%s\n%s", pr.BaseRepo.FullName(), err, prCtx.outbuf.String(), err.Stderr()) } if err := prCtx.PrepareGitCmd(gitcmd.NewCommand("fetch", "origin").AddArguments(fetchArgs...). AddDashesAndList(git.BranchPrefix+pr.BaseBranch+":"+git.BranchPrefix+tmpRepoBaseBranch, git.BranchPrefix+pr.BaseBranch+":"+git.BranchPrefix+"original_"+tmpRepoBaseBranch)). RunWithStderr(ctx); err != nil { - log.Error("%-v Unable to fetch origin base branch [%s:%s -> base, original_base in %s]: %v:\n%s\n%s", pr, pr.BaseRepo.FullName(), pr.BaseBranch, tmpBasePath, err, prCtx.outbuf.String(), err.Stderr()) - cancel() - return nil, nil, fmt.Errorf("Unable to fetch origin base branch [%s:%s -> base, original_base in tmpBasePath]: %w\n%s\n%s", pr.BaseRepo.FullName(), pr.BaseBranch, err, prCtx.outbuf.String(), err.Stderr()) + return nil, nil, fmt.Errorf("unable to fetch origin base branch [%s:%s -> base, original_base in tmpBasePath]: %w\n%s\n%s", pr.BaseRepo.FullName(), pr.BaseBranch, err, prCtx.outbuf.String(), err.Stderr()) } if err := prCtx.PrepareGitCmd(gitcmd.NewCommand("symbolic-ref").AddDynamicArguments("HEAD", git.BranchPrefix+tmpRepoBaseBranch)). RunWithStderr(ctx); err != nil { - log.Error("%-v Unable to set HEAD as base branch in [%s]: %v\n%s\n%s", pr, tmpBasePath, err, prCtx.outbuf.String(), err.Stderr()) - cancel() - return nil, nil, fmt.Errorf("Unable to set HEAD as base branch in tmpBasePath: %w\n%s\n%s", err, prCtx.outbuf.String(), err.Stderr()) + return nil, nil, fmt.Errorf("unable to set HEAD as base branch in tmpBasePath: %w\n%s\n%s", err, prCtx.outbuf.String(), err.Stderr()) } if err := addCacheRepo(tmpBasePath, headRepoPath); err != nil { - log.Error("%-v Unable to add head repository to temporary repo [%s -> %s]: %v", pr, pr.HeadRepo.FullName(), tmpBasePath, err) - cancel() - return nil, nil, fmt.Errorf("Unable to add head base repository to temporary repo [%s -> tmpBasePath]: %w", pr.HeadRepo.FullName(), err) + return nil, nil, fmt.Errorf("unable to add head base repository to temporary repo [%s -> tmpBasePath]: %w", pr.HeadRepo.FullName(), err) } if err := prCtx.PrepareGitCmd(gitcmd.NewCommand("remote", "add").AddDynamicArguments(remoteRepoName, headRepoPath)). RunWithStderr(ctx); err != nil { - log.Error("%-v Unable to add head repository as head_repo [%s -> %s]: %v\n%s\n%s", pr, pr.HeadRepo.FullName(), tmpBasePath, err, prCtx.outbuf.String(), err.Stderr()) - cancel() - return nil, nil, fmt.Errorf("Unable to add head repository as head_repo [%s -> tmpBasePath]: %w\n%s\n%s", pr.HeadRepo.FullName(), err, prCtx.outbuf.String(), err.Stderr()) + return nil, nil, fmt.Errorf("unable to add head repository as head_repo [%s -> tmpBasePath]: %w\n%s\n%s", pr.HeadRepo.FullName(), err, prCtx.outbuf.String(), err.Stderr()) } objectFormat := git.ObjectFormatFromName(pr.BaseRepo.ObjectFormatName) @@ -173,14 +154,10 @@ func createTemporaryRepoForPR(ctx context.Context, pr *issues_model.PullRequest) } if err := prCtx.PrepareGitCmd(gitcmd.NewCommand("fetch").AddArguments(fetchArgs...).AddDynamicArguments(remoteRepoName, headBranch+":"+tmpRepoTrackingBranch)). RunWithStderr(ctx); err != nil { - cancel() if exist, _ := git_model.IsBranchExist(ctx, pr.HeadRepo.ID, pr.HeadBranch); !exist { - return nil, nil, git_model.ErrBranchNotExist{ - BranchName: pr.HeadBranch, - } + return nil, nil, git_model.ErrBranchNotExist{BranchName: pr.HeadBranch} } - log.Error("%-v Unable to fetch head_repo head branch [%s:%s -> tracking in %s]: %v:\n%s\n%s", pr, pr.HeadRepo.FullName(), pr.HeadBranch, tmpBasePath, err, prCtx.outbuf.String(), err.Stderr()) - return nil, nil, fmt.Errorf("Unable to fetch head_repo head branch [%s:%s -> tracking in tmpBasePath]: %w\n%s\n%s", pr.HeadRepo.FullName(), headBranch, err, prCtx.outbuf.String(), err.Stderr()) + return nil, nil, fmt.Errorf("unable to fetch head_repo head branch [%s:%s -> tracking in tmpBasePath]: %w\n%s\n%s", pr.HeadRepo.FullName(), headBranch, err, prCtx.outbuf.String(), err.Stderr()) } prCtx.outbuf.Reset() return prCtx, cancel, nil diff --git a/services/pull/update.go b/services/pull/update.go index 15bb65ae7d5..d4840b5fb12 100644 --- a/services/pull/update.go +++ b/services/pull/update.go @@ -14,7 +14,7 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/models/unit" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/globallock" "gitea.dev/modules/log" "gitea.dev/modules/repository" @@ -41,7 +41,7 @@ func Update(ctx context.Context, pr *issues_model.PullRequest, doer *user_model. // TODO: FakePR: if the PR is a fake PR (for example: from Merge Upstream), then no need to check diverging if pr.ID > 0 { - diffCount, err := gitrepo.GetDivergingCommits(ctx, pr.BaseRepo, pr.BaseBranch, pr.GetGitHeadRefName()) + diffCount, err := git.GetDivergingCommits(ctx, pr.BaseRepo, pr.BaseBranch, pr.GetGitHeadRefName()) if err != nil { return err } else if diffCount.Behind == 0 { @@ -213,7 +213,7 @@ func syncCommitDivergence(ctx context.Context, pr *issues_model.PullRequest) err if err := pr.LoadBaseRepo(ctx); err != nil { return err } - divergence, err := gitrepo.GetDivergingCommits(ctx, pr.BaseRepo, pr.BaseBranch, pr.GetGitHeadRefName()) + divergence, err := git.GetDivergingCommits(ctx, pr.BaseRepo, pr.BaseBranch, pr.GetGitHeadRefName()) if err != nil { return err } diff --git a/services/pull/update_rebase.go b/services/pull/update_rebase.go index 2479db54c16..9709125a41f 100644 --- a/services/pull/update_rebase.go +++ b/services/pull/update_rebase.go @@ -42,7 +42,7 @@ func updateHeadByRebaseOnToBase(ctx context.Context, pr *issues_model.PullReques // It's questionable about where this should go - either after or before the push // I think in the interests of data safety - failures to push to the lfs should prevent // the push as you can always re-rebase. - if err := LFSPush(ctx, mergeCtx.tmpBasePath, tmpRepoBaseBranch, oldMergeBase, &issues_model.PullRequest{ + if err := LFSPush(ctx, mergeCtx.tmpBasePath, mergeCtx.tmpRepo, tmpRepoBaseBranch, oldMergeBase, &issues_model.PullRequest{ HeadRepoID: pr.BaseRepoID, BaseRepoID: pr.HeadRepoID, }); err != nil { diff --git a/services/release/notes_test.go b/services/release/notes_test.go index df050d9243d..0ad62b81cbc 100644 --- a/services/release/notes_test.go +++ b/services/release/notes_test.go @@ -11,7 +11,7 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/models/unittest" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/timeutil" "github.com/stretchr/testify/assert" @@ -23,7 +23,7 @@ func TestGenerateReleaseNotes(t *testing.T) { t.Run("ChangeLogsWithPRs", func(t *testing.T) { repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) require.NoError(t, err) t.Cleanup(func() { gitRepo.Close() }) @@ -52,7 +52,7 @@ func TestGenerateReleaseNotes(t *testing.T) { t.Run("NoPreviousTag", func(t *testing.T) { repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 16}) - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) require.NoError(t, err) t.Cleanup(func() { gitRepo.Close() }) @@ -83,7 +83,7 @@ func TestGenerateReleaseNotes(t *testing.T) { t.Run("EmptyPreviousTagWithExistingTags", func(t *testing.T) { repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) require.NoError(t, err) t.Cleanup(func() { gitRepo.Close() }) diff --git a/services/release/release.go b/services/release/release.go index 5a80340417c..7c1eb180529 100644 --- a/services/release/release.go +++ b/services/release/release.go @@ -16,7 +16,6 @@ import ( "gitea.dev/modules/container" "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/graceful" "gitea.dev/modules/log" "gitea.dev/modules/repository" @@ -78,9 +77,9 @@ func createTag(ctx context.Context, gitRepo *git.Repository, rel *repo_model.Rel } var created bool - // Only actual create when publish. + // Only actual create when a release is published. if !rel.IsDraft { - if !gitrepo.IsTagExist(ctx, rel.Repo, rel.TagName) { + if !git.IsTagExist(ctx, rel.Repo, rel.TagName) { if err := rel.LoadAttributes(ctx); err != nil { log.Error("LoadAttributes: %v", err) return false, err @@ -150,7 +149,7 @@ func createTag(ctx context.Context, gitRepo *git.Repository, rel *repo_model.Rel } rel.Sha1 = commit.ID.String() - rel.NumCommits, err = gitrepo.CommitsCountOfCommit(ctx, rel.Repo, commit.ID.String()) + rel.NumCommits, err = git.CommitsCountOfCommit(ctx, rel.Repo, commit.ID.String()) if err != nil { return false, fmt.Errorf("CommitsCount: %w", err) } @@ -229,7 +228,7 @@ func CreateNewTag(ctx context.Context, doer *user_model.User, repo *repo_model.R } } - gitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, repo) + gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, repo) if err != nil { return err } diff --git a/services/release/release_test.go b/services/release/release_test.go index b9f029da9b2..2813fbd1f72 100644 --- a/services/release/release_test.go +++ b/services/release/release_test.go @@ -11,7 +11,7 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/models/unittest" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/setting" "gitea.dev/modules/test" "gitea.dev/modules/timeutil" @@ -33,7 +33,7 @@ func TestRelease_Create(t *testing.T) { user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() @@ -138,7 +138,7 @@ func TestRelease_Update(t *testing.T) { user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() @@ -297,7 +297,7 @@ func TestRelease_createTag(t *testing.T) { user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() diff --git a/services/repository/adopt.go b/services/repository/adopt.go index e08f32499d5..eef625fe73e 100644 --- a/services/repository/adopt.go +++ b/services/repository/adopt.go @@ -16,7 +16,7 @@ import ( repo_model "gitea.dev/models/repo" user_model "gitea.dev/models/user" "gitea.dev/modules/container" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/glob" "gitea.dev/modules/graceful" "gitea.dev/modules/log" @@ -109,7 +109,7 @@ func AdoptRepository(ctx context.Context, doer, owner *user_model.User, opts Cre } func adoptRepository(ctx context.Context, repo *repo_model.Repository, defaultBranch string) (err error) { - isExist, err := gitrepo.IsRepositoryExist(ctx, repo) + isExist, err := git.IsRepositoryExist(ctx, repo) if err != nil { log.Error("Unable to check if %s exists. Error: %v", repo.FullName(), err) return err @@ -118,7 +118,7 @@ func adoptRepository(ctx context.Context, repo *repo_model.Repository, defaultBr return fmt.Errorf("adoptRepository: path does not already exist: %s", repo.FullName()) } - if err := gitrepo.CreateDelegateHooks(ctx, repo); err != nil { + if err := git.CreateDelegateHooks(ctx, repo); err != nil { return fmt.Errorf("createDelegateHooks: %w", err) } @@ -127,21 +127,21 @@ func adoptRepository(ctx context.Context, repo *repo_model.Repository, defaultBr if len(defaultBranch) > 0 { repo.DefaultBranch = defaultBranch - if err = gitrepo.SetDefaultBranch(ctx, repo, repo.DefaultBranch); err != nil { + if err = git.SetDefaultBranch(ctx, repo, repo.DefaultBranch); err != nil { return fmt.Errorf("setDefaultBranch: %w", err) } } else { - repo.DefaultBranch, err = gitrepo.GetDefaultBranch(ctx, repo) + repo.DefaultBranch, err = git.GetDefaultBranch(ctx, repo) if err != nil { repo.DefaultBranch = setting.Repository.DefaultBranch - if err = gitrepo.SetDefaultBranch(ctx, repo, repo.DefaultBranch); err != nil { + if err = git.SetDefaultBranch(ctx, repo, repo.DefaultBranch); err != nil { return fmt.Errorf("setDefaultBranch: %w", err) } } } // Don't bother looking this repo in the context it won't be there - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) if err != nil { return fmt.Errorf("openRepository: %w", err) } @@ -191,7 +191,7 @@ func adoptRepository(ctx context.Context, repo *repo_model.Repository, defaultBr repo.DefaultBranch = setting.Repository.DefaultBranch } - if err = gitrepo.SetDefaultBranch(ctx, repo, repo.DefaultBranch); err != nil { + if err = git.SetDefaultBranch(ctx, repo, repo.DefaultBranch); err != nil { return fmt.Errorf("setDefaultBranch: %w", err) } } @@ -214,7 +214,7 @@ func DeleteUnadoptedRepository(ctx context.Context, doer, u *user_model.User, re } codeRepo := repo_model.CodeRepoByName(u.Name, repoName) - exist, err := gitrepo.IsRepositoryExist(ctx, codeRepo) + exist, err := git.IsRepositoryExist(ctx, codeRepo) if err != nil { log.Error("Unable to check if repo %s/%s exists. Error: %v", u.Name, repoName, err) return err @@ -235,7 +235,7 @@ func DeleteUnadoptedRepository(ctx context.Context, doer, u *user_model.User, re } } - return gitrepo.DeleteRepository(ctx, codeRepo) + return git.DeleteRepository(ctx, codeRepo) } type unadoptedRepositories struct { diff --git a/services/repository/archiver/archiver.go b/services/repository/archiver/archiver.go index e7c0d12616c..2a0a4b3d70a 100644 --- a/services/repository/archiver/archiver.go +++ b/services/repository/archiver/archiver.go @@ -16,7 +16,6 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/graceful" "gitea.dev/modules/httplib" "gitea.dev/modules/log" @@ -151,14 +150,14 @@ func (aReq *ArchiveRequest) Await(ctx context.Context) (*repo_model.RepoArchiver // will occur directly in this routine. func (aReq *ArchiveRequest) Stream(ctx context.Context, w io.Writer) error { if aReq.Type == repo_model.ArchiveBundle { - return gitrepo.CreateBundle( + return git.CreateBundle( ctx, aReq.Repo, aReq.CommitID, w, ) } - return gitrepo.CreateArchive( + return git.CreateArchive( ctx, aReq.Repo, aReq.Repo.Name, diff --git a/services/repository/branch.go b/services/repository/branch.go index 352beddfaa6..666e1bf38bd 100644 --- a/services/repository/branch.go +++ b/services/repository/branch.go @@ -19,7 +19,6 @@ import ( user_model "gitea.dev/models/user" "gitea.dev/modules/cache" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/graceful" "gitea.dev/modules/json" "gitea.dev/modules/log" @@ -123,9 +122,9 @@ func getDivergenceCacheKey(repoID int64, branchName string) string { } // getDivergenceFromCache gets the divergence from cache -func getDivergenceFromCache(repoID int64, branchName string) (*gitrepo.DivergeObject, bool) { +func getDivergenceFromCache(repoID int64, branchName string) (*git.DivergeObject, bool) { data, ok := cache.GetCache().Get(getDivergenceCacheKey(repoID, branchName)) - res := gitrepo.DivergeObject{ + res := git.DivergeObject{ Ahead: -1, Behind: -1, } @@ -139,7 +138,7 @@ func getDivergenceFromCache(repoID int64, branchName string) (*gitrepo.DivergeOb return &res, true } -func putDivergenceFromCache(repoID int64, branchName string, divergence *gitrepo.DivergeObject) error { +func putDivergenceFromCache(repoID int64, branchName string, divergence *git.DivergeObject) error { bs, err := json.Marshal(divergence) if err != nil { return err @@ -178,7 +177,7 @@ func loadOneBranch(ctx context.Context, repo *repo_model.Repository, dbBranch *g p := protectedBranches.GetFirstMatched(branchName) isProtected := p != nil - var divergence *gitrepo.DivergeObject + var divergence *git.DivergeObject // it's not default branch if repo.DefaultBranch != dbBranch.Name && !dbBranch.IsDeleted { @@ -186,7 +185,7 @@ func loadOneBranch(ctx context.Context, repo *repo_model.Repository, dbBranch *g divergence, cached = getDivergenceFromCache(repo.ID, dbBranch.Name) if !cached { var err error - divergence, err = gitrepo.GetDivergingCommits(ctx, repo, repo.DefaultBranch, git.BranchPrefix+branchName) + divergence, err = git.GetDivergingCommits(ctx, repo, repo.DefaultBranch, git.BranchPrefix+branchName) if err != nil { log.Error("GetDivergingCommits: %v", err) } else { @@ -199,7 +198,7 @@ func loadOneBranch(ctx context.Context, repo *repo_model.Repository, dbBranch *g if divergence == nil { // tolerate the error that we cannot get divergence - divergence = &gitrepo.DivergeObject{Ahead: -1, Behind: -1} + divergence = &git.DivergeObject{Ahead: -1, Behind: -1} } pr, err := issues_model.GetLatestPullRequestByHeadInfo(ctx, repo.ID, branchName) @@ -226,7 +225,7 @@ func loadOneBranch(ctx context.Context, repo *repo_model.Repository, dbBranch *g if pr.HasMerged { baseGitRepo, ok := repoIDToGitRepo[pr.BaseRepoID] if !ok { - baseGitRepo, err = gitrepo.OpenRepository(pr.BaseRepo) + baseGitRepo, err = git.OpenRepository(pr.BaseRepo) if err != nil { return nil, fmt.Errorf("OpenRepository: %v", err) } @@ -385,7 +384,7 @@ func CreateNewBranchFromCommit(ctx context.Context, doer *user_model.User, repo return err } - if err := gitrepo.PushManaged(ctx, repo, repo, git.PushOptions{ + if err := git.PushManaged(ctx, repo, repo, git.PushOptions{ Branch: fmt.Sprintf("%s:%s%s", commitID, git.BranchPrefix, branchName), Env: repo_module.PushingEnvironment(doer, repo), }); err != nil { @@ -453,7 +452,7 @@ func RenameBranch(ctx context.Context, repo *repo_model.Repository, doer *user_m } if err := git_model.RenameBranch(ctx, repo, from, to, func(ctx context.Context, isDefault bool) error { - err2 := gitrepo.RenameBranch(ctx, repo, from, to) + err2 := git.RenameBranch(ctx, repo, from, to) if err2 != nil { return err2 } @@ -474,7 +473,7 @@ func RenameBranch(ctx context.Context, repo *repo_model.Repository, doer *user_m log.Error("CancelPreviousJobs: %v", err) } - err2 = gitrepo.SetDefaultBranch(ctx, repo, to) + err2 = git.SetDefaultBranch(ctx, repo, to) if err2 != nil { return err2 } @@ -545,7 +544,7 @@ func UpdateBranch(ctx context.Context, repo *repo_model.Repository, gitRepo *git } // branch protection will be checked in the pre received hook, so that we don't need any check here - return gitrepo.PushManaged(ctx, repo, repo, pushOpts) + return git.PushManaged(ctx, repo, repo, pushOpts) } var ErrBranchIsDefault = util.ErrorWrap(util.ErrPermissionDenied, "branch is default or pull request target") @@ -589,7 +588,7 @@ func deleteBranchInternal(ctx context.Context, doer *user_model.User, repo *repo // process the branch in git if branchCommit != nil { - err := gitrepo.DeleteBranch(ctx, repo, branchName, true) + err := git.DeleteBranch(ctx, repo, branchName, true) if err != nil { return false, fmt.Errorf("DeleteBranch: %w", err) } @@ -729,7 +728,7 @@ func SetRepoDefaultBranch(ctx context.Context, repo *repo_model.Repository, newB log.Error("CancelPreviousJobs: %v", err) } - return gitrepo.SetDefaultBranch(ctx, repo, newBranchName) + return git.SetDefaultBranch(ctx, repo, newBranchName) }); err != nil { return err } @@ -792,14 +791,14 @@ func GetBranchDivergingInfo(ctx reqctx.RequestContext, baseRepo *repo_model.Repo // if the fork repo has new commits, this call will fail because they are not in the base repo // exit status 128 - fatal: Invalid symmetric difference expression aaaaaaaaaaaa...bbbbbbbbbbbb // so at the moment, we first check the update time, then check whether the fork branch has base's head - diff, err := gitrepo.GetDivergingCommits(ctx, baseRepo, baseGitBranch.CommitID, headGitBranch.CommitID) + diff, err := git.GetDivergingCommits(ctx, baseRepo, baseGitBranch.CommitID, headGitBranch.CommitID) if err != nil { info.BaseHasNewCommits = baseGitBranch.UpdatedUnix > headGitBranch.UpdatedUnix if headRepo.IsFork && info.BaseHasNewCommits { return info, nil } // if the base's update time is before the fork, check whether the base's head is in the fork - headGitRepo, err := gitrepo.RepositoryFromRequestContextOrOpen(ctx, headRepo) + headGitRepo, err := git.RepositoryFromRequestContextOrOpen(ctx, headRepo) if err != nil { return nil, err } @@ -873,13 +872,13 @@ func DeleteBranchAfterMerge(ctx context.Context, doer *user_model.User, prID int return err } - gitBaseRepo, gitBaseCloser, err := gitrepo.RepositoryFromContextOrOpen(ctx, pr.BaseRepo) + gitBaseRepo, gitBaseCloser, err := git.RepositoryFromContextOrOpen(ctx, pr.BaseRepo) if err != nil { return err } defer gitBaseCloser.Close() - gitHeadRepo, gitHeadCloser, err := gitrepo.RepositoryFromContextOrOpen(ctx, pr.HeadRepo) + gitHeadRepo, gitHeadCloser, err := git.RepositoryFromContextOrOpen(ctx, pr.HeadRepo) if err != nil { return err } diff --git a/services/repository/cache.go b/services/repository/cache.go index 1f08f042bcf..84b232d5808 100644 --- a/services/repository/cache.go +++ b/services/repository/cache.go @@ -9,7 +9,6 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/modules/cache" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" ) // CacheRef cachhe last commit information of the branch or the tag @@ -21,7 +20,7 @@ func CacheRef(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Rep if gitRepo.LastCommitCache == nil { commitsCount, err := cache.GetInt64(repo.GetCommitsCountCacheKey(fullRefName.ShortName(), true), func() (int64, error) { - return gitrepo.CommitsCountOfCommit(ctx, repo, commit.ID.String()) + return git.CommitsCountOfCommit(ctx, repo, commit.ID.String()) }) if err != nil { return err diff --git a/services/repository/check.go b/services/repository/check.go index efdad3446a8..ef2473d9740 100644 --- a/services/repository/check.go +++ b/services/repository/check.go @@ -13,8 +13,8 @@ import ( repo_model "gitea.dev/models/repo" system_model "gitea.dev/models/system" user_model "gitea.dev/models/user" + "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" repo_module "gitea.dev/modules/repository" @@ -48,7 +48,7 @@ func GitFsckRepos(ctx context.Context, timeout time.Duration, args gitcmd.Truste // GitFsckRepo calls 'git fsck' to check an individual repository's health. func GitFsckRepo(ctx context.Context, repo *repo_model.Repository, timeout time.Duration, args gitcmd.TrustedCmdArgs) error { log.Trace("Running health check on repository %-v", repo.FullName()) - if err := gitrepo.Fsck(ctx, repo, timeout, args); err != nil { + if err := git.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) @@ -122,7 +122,7 @@ func gatherMissingRepoRecords(ctx context.Context) (repo_model.RepositoryList, e return db.ErrCancelledf("during gathering missing repo records before checking %s", repo.FullName()) default: } - exist, err := gitrepo.IsRepositoryExist(ctx, repo) + exist, err := git.IsRepositoryExist(ctx, repo) if err != nil { return fmt.Errorf("Unable to check dir for %s. %w", repo.FullName(), err) } @@ -189,7 +189,7 @@ func ReinitMissingRepositories(ctx context.Context) error { default: } log.Trace("Initializing %d/%d...", repo.OwnerID, repo.ID) - if err := gitrepo.InitRepository(ctx, repo, repo.ObjectFormatName); err != nil { + if err := git.InitRepository(ctx, repo, repo.ObjectFormatName); err != nil { log.Error("Unable (re)initialize repository %d at %s. Error: %v", repo.ID, repo.FullName(), err) if err2 := system_model.CreateRepositoryNotice("InitRepository (%s) [%d]: %v", repo.FullName(), repo.ID, err); err2 != nil { log.Error("CreateRepositoryNotice: %v", err2) diff --git a/services/repository/commitstatus/commitstatus.go b/services/repository/commitstatus/commitstatus.go index 9ff7f849d83..022e8f2458c 100644 --- a/services/repository/commitstatus/commitstatus.go +++ b/services/repository/commitstatus/commitstatus.go @@ -16,7 +16,6 @@ import ( "gitea.dev/modules/cache" "gitea.dev/modules/commitstatus" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/json" "gitea.dev/modules/log" repo_module "gitea.dev/modules/repository" @@ -70,7 +69,7 @@ func deleteCommitStatusCache(repoID int64, branchName string) error { // Requires: Repo, Creator, SHA func CreateCommitStatus(ctx context.Context, repo *repo_model.Repository, creator *user_model.User, sha string, status *git_model.CommitStatus) error { // confirm that commit is exist - gitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, repo) + gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, repo) if err != nil { return fmt.Errorf("OpenRepository[%s]: %w", repo.FullName(), err) } diff --git a/services/repository/contributors_graph.go b/services/repository/contributors_graph.go index 03219d5ed0d..6211d53feef 100644 --- a/services/repository/contributors_graph.go +++ b/services/repository/contributors_graph.go @@ -19,7 +19,6 @@ import ( "gitea.dev/modules/cache" "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/graceful" "gitea.dev/modules/log" api "gitea.dev/modules/structs" @@ -125,7 +124,7 @@ func getExtendedCommitStats(ctx context.Context, repo *git.Repository, revision defer stdoutReaderClose() var extendedCommitStats []*ExtendedCommitStats - err = gitCmd.WithDir(repo.Path). + err = gitCmd.WithRepo(repo). WithPipelineFunc(func(ctx gitcmd.Context) error { scanner := bufio.NewScanner(stdoutReader) @@ -191,7 +190,7 @@ func getExtendedCommitStats(ctx context.Context, repo *git.Repository, revision func generateContributorStats(genDone chan struct{}, cache cache.StringCache, cacheKey string, repo *repo_model.Repository, revision string) { ctx := graceful.GetManager().HammerContext() - gitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, repo) + gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, repo) if err != nil { _ = cache.PutJSON(cacheKey, fmt.Errorf("OpenRepository: %w", err), contributorStatsCacheTimeout) return diff --git a/services/repository/create.go b/services/repository/create.go index 25ae041bca5..cefde90f058 100644 --- a/services/repository/create.go +++ b/services/repository/create.go @@ -23,7 +23,6 @@ import ( "gitea.dev/models/webhook" "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/graceful" "gitea.dev/modules/log" "gitea.dev/modules/options" @@ -71,7 +70,7 @@ func prepareRepoCommit(ctx context.Context, repo *repo_model.Repository, tmpDir ) // Clone to temporary path and do the init commit. - if err := gitrepo.CloneRepoToLocal(ctx, repo, tmpDir, git.CloneRepoOptions{ + if err := git.CloneRepoToLocal(ctx, repo, tmpDir, git.CloneRepoOptions{ Env: env, }); err != nil { log.Error("Failed to clone from %v into %s\nError: %v", repo, tmpDir, err) @@ -146,9 +145,9 @@ 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 = gitrepo.InitRepository(ctx, repo, repo.ObjectFormatName); err != nil { + if err = git.InitRepository(ctx, repo, repo.ObjectFormatName); err != nil { return fmt.Errorf("git.InitRepository: %w", err) - } else if err = gitrepo.CreateDelegateHooks(ctx, repo); err != nil { + } else if err = git.CreateDelegateHooks(ctx, repo); err != nil { return fmt.Errorf("createDelegateHooks: %w", err) } @@ -180,7 +179,7 @@ func initRepository(ctx context.Context, u *user_model.User, repo *repo_model.Re } } - if err = gitrepo.SetDefaultBranch(ctx, repo, repo.DefaultBranch); err != nil { + if err = git.SetDefaultBranch(ctx, repo, repo.DefaultBranch); err != nil { return fmt.Errorf("setDefaultBranch: %w", err) } @@ -276,7 +275,7 @@ func CreateRepositoryDirectly(ctx context.Context, doer, owner *user_model.User, // 2 - check whether the repository with the same storage exists var isExist bool - isExist, err = gitrepo.IsRepositoryExist(ctx, repo) + isExist, err = git.IsRepositoryExist(ctx, repo) if err != nil { log.Error("Unable to check if %s exists. Error: %v", repo.FullName(), err) return nil, err diff --git a/services/repository/delete.go b/services/repository/delete.go index db843076102..5e5877c4ef8 100644 --- a/services/repository/delete.go +++ b/services/repository/delete.go @@ -23,7 +23,7 @@ import ( user_model "gitea.dev/models/user" "gitea.dev/models/webhook" actions_module "gitea.dev/modules/actions" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/graceful" "gitea.dev/modules/lfs" "gitea.dev/modules/log" @@ -310,7 +310,7 @@ func DeleteRepositoryDirectly(ctx context.Context, repoID int64, ignoreOrgTeams // we delete the file but the database rollback, the repository will be broken. // Remove repository files. - if err := gitrepo.DeleteRepository(ctx, repo); err != nil { + if err := git.DeleteRepository(ctx, repo); err != nil { desc := fmt.Sprintf("Delete repository files (%s): %v", repo.FullName(), err) if err = system_model.CreateNotice(graceful.GetManager().ShutdownContext(), system_model.NoticeRepository, desc); err != nil { log.Error("CreateRepositoryNotice: %v", err) @@ -318,7 +318,7 @@ func DeleteRepositoryDirectly(ctx context.Context, repoID int64, ignoreOrgTeams } // Remove wiki files if it exists. - if err := gitrepo.DeleteRepository(ctx, repo.WikiStorageRepo()); err != nil { + if err := git.DeleteRepository(ctx, repo.WikiStorageRepo()); err != nil { desc := fmt.Sprintf("Delete wiki repository files (%s): %v", repo.FullName(), err) // Note we use the db.DefaultContext here rather than passing in a context as the context may be cancelled if err = system_model.CreateNotice(graceful.GetManager().ShutdownContext(), system_model.NoticeRepository, desc); err != nil { diff --git a/services/repository/files/cherry_pick.go b/services/repository/files/cherry_pick.go index 935fa1ee307..b866f936c2c 100644 --- a/services/repository/files/cherry_pick.go +++ b/services/repository/files/cherry_pick.go @@ -12,7 +12,6 @@ import ( repo_model "gitea.dev/models/repo" user_model "gitea.dev/models/user" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" "gitea.dev/modules/structs" "gitea.dev/services/pull" @@ -36,7 +35,7 @@ func (err ErrCommitIDDoesNotMatch) Error() string { // CherryPick cherry-picks or reverts a commit to the given repository func CherryPick(ctx context.Context, repo *repo_model.Repository, doer *user_model.User, revert bool, opts *ApplyDiffPatchOptions) (*structs.FileResponse, error) { - gitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, repo) + gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, repo) if err != nil { return nil, err } diff --git a/services/repository/files/content.go b/services/repository/files/content.go index e2676a757b7..3f161a9aca1 100644 --- a/services/repository/files/content.go +++ b/services/repository/files/content.go @@ -13,7 +13,6 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/modules/cache" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/lfs" "gitea.dev/modules/setting" api "gitea.dev/modules/structs" @@ -125,7 +124,7 @@ func GetFileContents(ctx context.Context, repo *repo_model.Repository, gitRepo * func addLastCommitCache(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, cacheKey, fullName, sha string) error { if gitRepo.LastCommitCache == nil { commitsCount, err := cache.GetInt64(cacheKey, func() (int64, error) { - return gitrepo.CommitsCountOfCommit(ctx, repo, sha) + return git.CommitsCountOfCommit(ctx, repo, sha) }) if err != nil { return err diff --git a/services/repository/files/patch.go b/services/repository/files/patch.go index c18dacea6ef..0be007f1f7d 100644 --- a/services/repository/files/patch.go +++ b/services/repository/files/patch.go @@ -13,7 +13,6 @@ import ( user_model "gitea.dev/models/user" "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" "gitea.dev/modules/structs" "gitea.dev/modules/util" @@ -117,7 +116,7 @@ func ApplyDiffPatch(ctx context.Context, repo *repo_model.Repository, doer *user return nil, err } - gitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, repo) + gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, repo) if err != nil { return nil, err } diff --git a/services/repository/files/temp_repo.go b/services/repository/files/temp_repo.go index f3db2221719..dfe627527ac 100644 --- a/services/repository/files/temp_repo.go +++ b/services/repository/files/temp_repo.go @@ -18,7 +18,6 @@ import ( user_model "gitea.dev/models/user" "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" repo_module "gitea.dev/modules/repository" "gitea.dev/modules/setting" @@ -37,7 +36,7 @@ type TemporaryUploadRepository struct { // NewTemporaryUploadRepository creates a new temporary upload repository func NewTemporaryUploadRepository(repo *repo_model.Repository) (*TemporaryUploadRepository, error) { - basePath, cleanup, err := repo_module.CreateTemporaryPath("upload") + basePath, _, cleanup, err := repo_module.CreateTemporaryGitRepo("upload") if err != nil { return nil, err } @@ -59,7 +58,7 @@ func (t *TemporaryUploadRepository) Close() { // Clone the base repository to our path and set branch as the HEAD func (t *TemporaryUploadRepository) Clone(ctx context.Context, branch string, bare bool) error { - if err := gitrepo.CloneRepoToLocal(ctx, t.repo, t.basePath, git.CloneRepoOptions{ + if err := git.CloneRepoToLocal(ctx, t.repo, t.basePath, git.CloneRepoOptions{ Bare: bare, Branch: branch, Shared: true, @@ -89,7 +88,7 @@ func (t *TemporaryUploadRepository) Clone(ctx context.Context, branch string, ba // Init the repository func (t *TemporaryUploadRepository) Init(ctx context.Context, objectFormatName string) error { - if err := git.InitRepository(ctx, t.basePath, false, objectFormatName); err != nil { + if err := git.InitRepositoryLocal(ctx, t.basePath, false, objectFormatName); err != nil { return err } gitRepo, err := git.OpenRepositoryLocal(t.basePath) @@ -342,7 +341,7 @@ func (t *TemporaryUploadRepository) CommitTree(ctx context.Context, opts *Commit func (t *TemporaryUploadRepository) Push(ctx context.Context, doer *user_model.User, commitHash, branch string, force bool) error { // Because calls hooks we need to pass in the environment env := repo_module.PushingEnvironment(doer, t.repo) - if err := gitrepo.PushFromLocal(ctx, t.basePath, t.repo, git.PushOptions{ + if err := git.PushFromLocal(ctx, t.basePath, t.repo, git.PushOptions{ Branch: strings.TrimSpace(commitHash) + ":" + git.BranchPrefix + strings.TrimSpace(branch), Env: env, Force: force, diff --git a/services/repository/files/update.go b/services/repository/files/update.go index 33cd2bf682c..5221203e58d 100644 --- a/services/repository/files/update.go +++ b/services/repository/files/update.go @@ -17,7 +17,6 @@ import ( user_model "gitea.dev/models/user" "gitea.dev/modules/git" "gitea.dev/modules/git/attribute" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/lfs" "gitea.dev/modules/log" "gitea.dev/modules/setting" @@ -105,7 +104,7 @@ func ChangeRepoFiles(ctx context.Context, repo *repo_model.Repository, doer *use opts.NewBranch = opts.OldBranch } - gitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, repo) + gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, repo) if err != nil { return nil, err } diff --git a/services/repository/fork.go b/services/repository/fork.go index d038dd41056..762c123bd10 100644 --- a/services/repository/fork.go +++ b/services/repository/fork.go @@ -15,7 +15,6 @@ import ( "gitea.dev/models/unit" user_model "gitea.dev/models/user" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" repo_module "gitea.dev/modules/repository" "gitea.dev/modules/structs" @@ -130,7 +129,7 @@ func ForkRepository(ctx context.Context, doer, owner *user_model.User, opts Fork // 2 - check whether the repository with the same storage exists var isExist bool - isExist, err = gitrepo.IsRepositoryExist(ctx, repo) + isExist, err = git.IsRepositoryExist(ctx, repo) if err != nil { log.Error("Unable to check if %s exists. Error: %v", repo.FullName(), err) return nil, err @@ -154,7 +153,7 @@ func ForkRepository(ctx context.Context, doer, owner *user_model.User, opts Fork cloneOpts.SingleBranch = true cloneOpts.Branch = opts.SingleBranch } - if err = gitrepo.CloneManaged(ctx, opts.BaseRepo, repo, cloneOpts); err != nil { + if err = git.CloneManaged(ctx, opts.BaseRepo, repo, cloneOpts); err != nil { log.Error("Fork Repository (git clone) Failed for %v (from %v):\nError: %v", repo, opts.BaseRepo, err) return nil, fmt.Errorf("git clone: %w", err) } @@ -165,13 +164,13 @@ func ForkRepository(ctx context.Context, doer, owner *user_model.User, opts Fork } // 5 - Create hooks - if err = gitrepo.CreateDelegateHooks(ctx, repo); err != nil { + if err = git.CreateDelegateHooks(ctx, repo); err != nil { return nil, fmt.Errorf("createDelegateHooks: %w", err) } // 6 - Sync the repository branches and tags var gitRepo *git.Repository - gitRepo, err = gitrepo.OpenRepository(repo) + gitRepo, err = git.OpenRepository(repo) if err != nil { return nil, fmt.Errorf("OpenRepository: %w", err) } diff --git a/services/repository/generate.go b/services/repository/generate.go index 361f7cc3d56..998958ecfae 100644 --- a/services/repository/generate.go +++ b/services/repository/generate.go @@ -21,7 +21,6 @@ import ( git_model "gitea.dev/models/git" repo_model "gitea.dev/models/repo" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/glob" "gitea.dev/modules/log" repo_module "gitea.dev/modules/repository" @@ -211,7 +210,7 @@ func generateRepoCommit(ctx context.Context, repo, templateRepo, generateRepo *r repo.DefaultBranch = util.IfZero(repo.DefaultBranch, util.IfZero(templateRepo.DefaultBranch, setting.Repository.DefaultBranch)) // Clone to temporary path and do the init commit. - if err := gitrepo.CloneRepoToLocal(ctx, templateRepo, tmpDir, git.CloneRepoOptions{ + if err := git.CloneRepoToLocal(ctx, templateRepo, tmpDir, git.CloneRepoOptions{ Depth: 1, Branch: templateRepo.DefaultBranch, }); err != nil { @@ -241,7 +240,7 @@ func generateRepoCommit(ctx context.Context, repo, templateRepo, generateRepo *r return fmt.Errorf("readGiteaTemplateFile: %w", err) } - if err = git.InitRepository(ctx, tmpDir, false, templateRepo.ObjectFormatName); err != nil { + if err = git.InitRepositoryLocal(ctx, tmpDir, false, templateRepo.ObjectFormatName); err != nil { return err } @@ -263,7 +262,7 @@ func GenerateGitContent(ctx context.Context, templateRepo, generateRepo *repo_mo if err = generateRepoCommit(ctx, generateRepo, templateRepo, generateRepo, tmpDir); err != nil { return fmt.Errorf("generateRepoCommit: %w", err) } - if err = gitrepo.SetDefaultBranch(ctx, generateRepo, generateRepo.DefaultBranch); err != nil { + if err = git.SetDefaultBranch(ctx, generateRepo, generateRepo.DefaultBranch); err != nil { return fmt.Errorf("setDefaultBranch: %w", err) } if err = repo_model.UpdateRepositoryColsNoAutoTime(ctx, generateRepo, "default_branch"); err != nil { diff --git a/services/repository/gitgraph/graph.go b/services/repository/gitgraph/graph.go index c744a13de2b..982f20c86ce 100644 --- a/services/repository/gitgraph/graph.go +++ b/services/repository/gitgraph/graph.go @@ -14,7 +14,7 @@ import ( ) // GetCommitGraph return a list of commit (GraphItems) from all branches -func GetCommitGraph(ctx context.Context, r *git.Repository, page, maxAllowedColors int, hidePRRefs bool, branches, files []string) (*Graph, error) { +func GetCommitGraph(ctx context.Context, gitRepo *git.Repository, page, maxAllowedColors int, hidePRRefs bool, branches, files []string) (*Graph, error) { format := "DATA:%D|%H|%ad|%h|%s" if page == 0 { @@ -48,7 +48,7 @@ func GetCommitGraph(ctx context.Context, r *git.Repository, page, maxAllowedColo stdoutReader, stdoutReaderClose := graphCmd.MakeStdoutPipe() defer stdoutReaderClose() if err := graphCmd. - WithDir(r.Path). + WithRepo(gitRepo). WithPipelineFunc(func(ctx gitcmd.Context) error { scanner := bufio.NewScanner(stdoutReader) parser := &Parser{} diff --git a/services/repository/hooks.go b/services/repository/hooks.go index 919781cabe7..81473c48c42 100644 --- a/services/repository/hooks.go +++ b/services/repository/hooks.go @@ -10,7 +10,7 @@ import ( "gitea.dev/models/db" repo_model "gitea.dev/models/repo" "gitea.dev/models/webhook" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/log" "xorm.io/builder" @@ -31,12 +31,12 @@ func SyncRepositoryHooks(ctx context.Context) error { default: } - if err := gitrepo.CreateDelegateHooks(ctx, repo); err != nil { + if err := git.CreateDelegateHooks(ctx, repo); err != nil { return fmt.Errorf("CreateDelegateHooks: %w", err) } if HasWiki(ctx, repo) { - if err := gitrepo.CreateDelegateHooks(ctx, repo.WikiStorageRepo()); err != nil { + if err := git.CreateDelegateHooks(ctx, repo.WikiStorageRepo()); err != nil { return fmt.Errorf("CreateDelegateHooks: %w", err) } } @@ -52,13 +52,13 @@ func SyncRepositoryHooks(ctx context.Context) error { // GenerateGitHooks generates git hooks from a template repository func GenerateGitHooks(ctx context.Context, templateRepo, generateRepo *repo_model.Repository) error { - generateGitRepo, err := gitrepo.OpenRepository(generateRepo) + generateGitRepo, err := git.OpenRepository(generateRepo) if err != nil { return err } defer generateGitRepo.Close() - templateGitRepo, err := gitrepo.OpenRepository(templateRepo) + templateGitRepo, err := git.OpenRepository(templateRepo) if err != nil { return err } diff --git a/services/repository/init.go b/services/repository/init.go index e32041c647e..8db359f0547 100644 --- a/services/repository/init.go +++ b/services/repository/init.go @@ -13,7 +13,6 @@ import ( user_model "gitea.dev/models/user" "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" repo_module "gitea.dev/modules/repository" asymkey_service "gitea.dev/services/asymkey" @@ -68,7 +67,7 @@ func initRepoCommit(ctx context.Context, tmpPath string, repo *repo_model.Reposi return fmt.Errorf("git commit: %w", err) } - if err := gitrepo.PushFromLocal(ctx, tmpPath, repo, git.PushOptions{ + if err := git.PushFromLocal(ctx, tmpPath, repo, git.PushOptions{ LocalRefName: "HEAD", Branch: repo.DefaultBranch, Env: repo_module.InternalPushingEnvironment(u, repo), diff --git a/services/repository/lfs.go b/services/repository/lfs.go index 0de365864d8..5fd13a979ad 100644 --- a/services/repository/lfs.go +++ b/services/repository/lfs.go @@ -12,7 +12,6 @@ import ( git_model "gitea.dev/models/git" repo_model "gitea.dev/models/repo" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/lfs" "gitea.dev/modules/log" "gitea.dev/modules/setting" @@ -70,7 +69,7 @@ func GarbageCollectLFSMetaObjectsForRepo(ctx context.Context, repo *repo_model.R } }() - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) if err != nil { log.Error("Unable to open git repository %-v: %v", repo, err) return err diff --git a/services/repository/license.go b/services/repository/license.go index 95059e1d015..6f75b1120ea 100644 --- a/services/repository/license.go +++ b/services/repository/license.go @@ -12,7 +12,6 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/modules/container" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/graceful" "gitea.dev/modules/log" "gitea.dev/modules/options" @@ -72,7 +71,7 @@ func repoLicenseUpdater(items ...*LicenseUpdaterOptions) []*LicenseUpdaterOption continue } - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) if err != nil { log.Error("repoLicenseUpdater [%d] failed: OpenRepository: %v", opts.RepoID, err) continue diff --git a/services/repository/merge_upstream.go b/services/repository/merge_upstream.go index cabd2ca3078..cceb842995e 100644 --- a/services/repository/merge_upstream.go +++ b/services/repository/merge_upstream.go @@ -13,7 +13,6 @@ import ( "gitea.dev/models/unit" user_model "gitea.dev/models/user" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" repo_module "gitea.dev/modules/repository" "gitea.dev/modules/reqctx" "gitea.dev/modules/util" @@ -47,7 +46,7 @@ func MergeUpstream(ctx reqctx.RequestContext, doer *user_model.User, repo *repo_ return "up-to-date", nil } - err = gitrepo.PushManaged(ctx, repo.BaseRepo, repo, git.PushOptions{ + err = git.PushManaged(ctx, repo.BaseRepo, repo, git.PushOptions{ Branch: fmt.Sprintf("%s:%s", divergingInfo.BaseBranchName, branch), Env: repo_module.PushingEnvironment(doer, repo), }) diff --git a/services/repository/migrate.go b/services/repository/migrate.go index d029ce148da..c329073c9ac 100644 --- a/services/repository/migrate.go +++ b/services/repository/migrate.go @@ -17,7 +17,6 @@ import ( user_model "gitea.dev/models/user" "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/lfs" "gitea.dev/modules/log" "gitea.dev/modules/migration" @@ -35,16 +34,16 @@ func cloneWiki(ctx context.Context, repo *repo_model.Repository, opts migration. storageRepo := repo.WikiStorageRepo() - if err := gitrepo.DeleteRepository(ctx, storageRepo); err != nil { + if err := git.DeleteRepository(ctx, storageRepo); err != nil { return "", fmt.Errorf("failed to remove existing wiki for repo %q, err: %w", repo.FullName(), err) } cleanIncompleteWikiPath := func() { - if err := gitrepo.DeleteRepository(ctx, storageRepo); err != nil { + if err := git.DeleteRepository(ctx, storageRepo); err != nil { log.Error("Failed to remove incomplete wiki for repo %q, err: %v", repo.FullName(), err) } } - if err := gitrepo.CloneExternalRepo(ctx, wikiRemoteURL, storageRepo, git.CloneRepoOptions{ + if err := git.CloneExternalRepo(ctx, wikiRemoteURL, storageRepo, git.CloneRepoOptions{ Mirror: true, Quiet: true, Timeout: migrateTimeout, @@ -60,7 +59,7 @@ func cloneWiki(ctx context.Context, repo *repo_model.Repository, opts migration. return "", err } - defaultBranch, err := gitrepo.GetDefaultBranch(ctx, storageRepo) + defaultBranch, err := git.GetDefaultBranch(ctx, storageRepo) if err != nil { cleanIncompleteWikiPath() return "", fmt.Errorf("failed to get wiki repo default branch for %q, err: %w", repo.FullName(), err) @@ -86,11 +85,11 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User, migrateTimeout := time.Duration(setting.Git.Timeout.Migrate) * time.Second - if err := gitrepo.DeleteRepository(ctx, repo); err != nil { + if err := git.DeleteRepository(ctx, repo); err != nil { return repo, fmt.Errorf("failed to remove existing repo dir %q, err: %w", repo.FullName(), err) } - if err := gitrepo.CloneExternalRepo(ctx, opts.CloneAddr, repo, git.CloneRepoOptions{ + if err := git.CloneExternalRepo(ctx, opts.CloneAddr, repo, git.CloneRepoOptions{ Mirror: true, Quiet: true, Timeout: migrateTimeout, @@ -122,7 +121,7 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User, return nil, fmt.Errorf("updateGitRepoAfterCreate: %w", err) } - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) if err != nil { return repo, fmt.Errorf("OpenRepository: %w", err) } @@ -136,7 +135,7 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User, if !repo.IsEmpty { if len(repo.DefaultBranch) == 0 { // Try to get HEAD branch and set it as default branch. - headBranchName, err := gitrepo.GetDefaultBranch(ctx, repo) + headBranchName, err := git.GetDefaultBranch(ctx, repo) if err != nil { return repo, fmt.Errorf("GetHEADBranch: %w", err) } @@ -262,24 +261,24 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User, // CleanUpMigrateInfo finishes migrating repository and/or wiki with things that don't need to be done for mirrors. func CleanUpMigrateInfo(ctx context.Context, repo *repo_model.Repository) (*repo_model.Repository, error) { - if err := gitrepo.CreateDelegateHooks(ctx, repo); err != nil { + if err := git.CreateDelegateHooks(ctx, repo); err != nil { return repo, fmt.Errorf("createDelegateHooks: %w", err) } hasWiki := HasWiki(ctx, repo) if hasWiki { - if err := gitrepo.CreateDelegateHooks(ctx, repo.WikiStorageRepo()); err != nil { + if err := git.CreateDelegateHooks(ctx, repo.WikiStorageRepo()); err != nil { return repo, fmt.Errorf("createDelegateHooks.(wiki): %w", err) } } - err := gitrepo.ManagedRemoteRemove(ctx, repo, "origin") + err := git.ManagedRemoteRemove(ctx, repo, "origin") if err != nil && !git.IsRemoteNotExistError(err) { return repo, fmt.Errorf("CleanUpMigrateInfo: %w", err) } if hasWiki { - err = gitrepo.ManagedRemoteRemove(ctx, repo.WikiStorageRepo(), "origin") + err = git.ManagedRemoteRemove(ctx, repo.WikiStorageRepo(), "origin") if err != nil && !git.IsRemoteNotExistError(err) { return repo, fmt.Errorf("cleanUpMigrateGitConfig (wiki): %w", err) } diff --git a/services/repository/push.go b/services/repository/push.go index ae9963143f4..8e93bfa4d93 100644 --- a/services/repository/push.go +++ b/services/repository/push.go @@ -15,7 +15,6 @@ import ( user_model "gitea.dev/models/user" "gitea.dev/modules/cache" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/graceful" "gitea.dev/modules/log" "gitea.dev/modules/process" @@ -74,7 +73,7 @@ func pushQueueHandleUpdates(optsList []*repo_module.PushUpdateOptions) error { return fmt.Errorf("GetRepositoryByOwnerAndName failed: %w", err) } - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) if err != nil { return fmt.Errorf("OpenRepository[%s]: %w", repo.FullName(), err) } @@ -269,7 +268,7 @@ func pushNewBranch(ctx context.Context, repo *repo_model.Repository, gitRepo *gi repo.DefaultBranch = opts.RefName() repo.IsEmpty = false if repo.DefaultBranch != setting.Repository.DefaultBranch { - if err := gitrepo.SetDefaultBranch(ctx, repo, repo.DefaultBranch); err != nil { + if err := git.SetDefaultBranch(ctx, repo, repo.DefaultBranch); err != nil { return nil, err } } diff --git a/services/repository/repository.go b/services/repository/repository.go index 450f06c50cc..8a9bb520d91 100644 --- a/services/repository/repository.go +++ b/services/repository/repository.go @@ -18,7 +18,7 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/models/unit" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + git2 "gitea.dev/modules/git" "gitea.dev/modules/graceful" issue_indexer "gitea.dev/modules/indexer/issues" "gitea.dev/modules/log" @@ -217,7 +217,7 @@ func CheckDaemonExportOK(ctx context.Context, repo *repo_model.Repository) error // Create/Remove git-daemon-export-ok for git-daemon... daemonExportFile := `git-daemon-export-ok` - isExist, err := gitrepo.IsRepoFileExist(ctx, repo, daemonExportFile) + isExist, err := git2.IsRepoFileExist(ctx, repo, daemonExportFile) if err != nil { log.Error("Unable to check if %s exists. Error: %v", daemonExportFile, err) return err @@ -225,11 +225,11 @@ func CheckDaemonExportOK(ctx context.Context, repo *repo_model.Repository) error isPublic := !repo.IsPrivate && repo.Owner.Visibility == structs.VisibleTypePublic if !isPublic && isExist { - if err = gitrepo.RemoveRepoFileOrDir(ctx, repo, daemonExportFile); err != nil { + if err = git2.RemoveRepoFileOrDir(ctx, repo, daemonExportFile); err != nil { log.Error("Failed to remove %s: %v", daemonExportFile, err) } } else if isPublic && !isExist { - if f, err := gitrepo.CreateRepoFile(ctx, repo, daemonExportFile); err != nil { + if f, err := git2.CreateRepoFile(ctx, repo, daemonExportFile); err != nil { log.Error("Failed to create %s: %v", daemonExportFile, err) } else { f.Close() @@ -308,7 +308,7 @@ func updateRepository(ctx context.Context, repo *repo_model.Repository, visibili } func HasWiki(ctx context.Context, repo *repo_model.Repository) bool { - hasWiki, err := gitrepo.IsRepositoryExist(ctx, repo.WikiStorageRepo()) + hasWiki, err := git2.IsRepositoryExist(ctx, repo.WikiStorageRepo()) if err != nil { log.Error("gitrepo.IsRepositoryExist: %v", err) } @@ -332,7 +332,7 @@ func CheckCreateRepository(ctx context.Context, doer, owner *user_model.User, na return repo_model.ErrRepoAlreadyExist{Uname: owner.Name, Name: name} } repo := repo_model.CodeRepoByName(owner.Name, name) - isExist, err := gitrepo.IsRepositoryExist(ctx, repo) + isExist, err := git2.IsRepositoryExist(ctx, repo) if err != nil { log.Error("Unable to check if repo %s/%s exists, error: %v", owner.Name, name, err) return err diff --git a/services/repository/template.go b/services/repository/template.go index 96f7cdb4493..a8ead0f41d9 100644 --- a/services/repository/template.go +++ b/services/repository/template.go @@ -13,7 +13,7 @@ import ( issues_model "gitea.dev/models/issues" repo_model "gitea.dev/models/repo" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/log" notify_service "gitea.dev/services/notify" ) @@ -107,7 +107,7 @@ func GenerateRepository(ctx context.Context, doer, owner *user_model.User, templ }() // 2 - check whether the repository with the same storage exists - isExist, err := gitrepo.IsRepositoryExist(ctx, generateRepo) + isExist, err := git.IsRepositoryExist(ctx, generateRepo) if err != nil { log.Error("Unable to check if %s exists. Error: %v", generateRepo.FullName(), err) return nil, err @@ -122,9 +122,9 @@ func GenerateRepository(ctx context.Context, doer, owner *user_model.User, templ } // 3 -Init git bare new repository. - if err = gitrepo.InitRepository(ctx, generateRepo, generateRepo.ObjectFormatName); err != nil { + if err = git.InitRepository(ctx, generateRepo, generateRepo.ObjectFormatName); err != nil { return nil, fmt.Errorf("git.InitRepository: %w", err) - } else if err = gitrepo.CreateDelegateHooks(ctx, generateRepo); err != nil { + } else if err = git.CreateDelegateHooks(ctx, generateRepo); err != nil { return nil, fmt.Errorf("createDelegateHooks: %w", err) } diff --git a/services/repository/transfer.go b/services/repository/transfer.go index 025768e0b32..70f89a4d714 100644 --- a/services/repository/transfer.go +++ b/services/repository/transfer.go @@ -17,7 +17,7 @@ import ( project_model "gitea.dev/models/project" repo_model "gitea.dev/models/repo" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/globallock" "gitea.dev/modules/log" "gitea.dev/modules/util" @@ -95,7 +95,7 @@ func isRepositoryModelOrDirExist(ctx context.Context, u *user_model.User, repoNa return false, err } repo := repo_model.CodeRepoByName(u.Name, repoName) - isExist, err := gitrepo.IsRepositoryExist(ctx, repo) + isExist, err := git.IsRepositoryExist(ctx, repo) return has || isExist, err } @@ -119,7 +119,7 @@ func transferOwnership(ctx context.Context, doer *user_model.User, newOwnerName // revert the rename from := repo_model.CodeRepoByName(newOwnerName, repo.Name) to := repo_model.CodeRepoByName(oldOwnerName, repo.Name) - if err := gitrepo.RenameRepository(ctx, from, to); err != nil { + if err := git.RenameRepository(ctx, from, to); err != nil { log.Error("Unable to revert repository %s/%s to %s/%s: %v", newOwnerName, repo.Name, oldOwnerName, repo.Name, err) } } @@ -127,7 +127,7 @@ func transferOwnership(ctx context.Context, doer *user_model.User, newOwnerName if wikiRenamed { from := repo_model.WikiRepoByName(newOwnerName, repo.Name) to := repo_model.WikiRepoByName(oldOwnerName, repo.Name) - if err := gitrepo.RenameRepository(ctx, from, to); err != nil { + if err := git.RenameRepository(ctx, from, to); err != nil { log.Error("Unable to revert wiki repository %s/%s to %s/%s: %v", newOwnerName, repo.Name, oldOwnerName, repo.Name, err) } } @@ -305,19 +305,19 @@ func transferOwnership(ctx context.Context, doer *user_model.User, newOwnerName // Rename remote repository to new path and delete local copy. oldCodeRepo := repo_model.CodeRepoByName(oldOwner.Name, repo.Name) newCodeRepo := repo_model.CodeRepoByName(newOwner.Name, repo.Name) - if err := gitrepo.RenameRepository(ctx, oldCodeRepo, newCodeRepo); err != nil { + if err := git.RenameRepository(ctx, oldCodeRepo, newCodeRepo); err != nil { return fmt.Errorf("rename repository directory: %w", err) } repoRenamed = true // Rename remote wiki repository to new path and delete local copy. oldWikiRepo := repo_model.WikiRepoByName(oldOwner.Name, repo.Name) - if isExist, err := gitrepo.IsRepositoryExist(ctx, oldWikiRepo); err != nil { + if isExist, err := git.IsRepositoryExist(ctx, oldWikiRepo); err != nil { log.Error("Unable to check if wiki of repo %s/%s exists. Error: %v", oldOwner.Name, repo.Name, err) return err } else if isExist { newWikiRepo := repo_model.WikiRepoByName(newOwner.Name, repo.Name) - if err := gitrepo.RenameRepository(ctx, oldWikiRepo, newWikiRepo); err != nil { + if err := git.RenameRepository(ctx, oldWikiRepo, newWikiRepo); err != nil { return fmt.Errorf("rename repository wiki: %w", err) } wikiRenamed = true @@ -377,13 +377,13 @@ func changeRepositoryName(ctx context.Context, repo *repo_model.Repository, newR } newCodeRepo := repo_model.CodeRepoByName(repo.OwnerName, newRepoName) - if err = gitrepo.RenameRepository(ctx, repo, newCodeRepo); err != nil { + if err = git.RenameRepository(ctx, repo, newCodeRepo); err != nil { return fmt.Errorf("rename repository directory: %w", err) } if HasWiki(ctx, repo) { newWikiRepo := repo_model.WikiRepoByName(repo.OwnerName, newRepoName) - if err = gitrepo.RenameRepository(ctx, repo.WikiStorageRepo(), newWikiRepo); err != nil { + if err = git.RenameRepository(ctx, repo.WikiStorageRepo(), newWikiRepo); err != nil { return fmt.Errorf("rename repository wiki: %w", err) } } diff --git a/services/wiki/wiki.go b/services/wiki/wiki.go index 0b20617ab8d..40fdd91bbd7 100644 --- a/services/wiki/wiki.go +++ b/services/wiki/wiki.go @@ -15,7 +15,6 @@ import ( user_model "gitea.dev/models/user" "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/globallock" "gitea.dev/modules/graceful" "gitea.dev/modules/log" @@ -33,18 +32,18 @@ func getWikiWorkingLockKey(repoID int64) string { // it does nothing when repository already has wiki. func InitWiki(ctx context.Context, repo *repo_model.Repository) error { // don't use HasWiki because the error should not be ignored. - if exist, err := gitrepo.IsRepositoryExist(ctx, repo.WikiStorageRepo()); err != nil { + if exist, err := git.IsRepositoryExist(ctx, repo.WikiStorageRepo()); err != nil { return err } else if exist { return nil } // wiki's object format should be the same as repository's - if err := gitrepo.InitRepository(ctx, repo.WikiStorageRepo(), repo.ObjectFormatName); err != nil { + if err := git.InitRepository(ctx, repo.WikiStorageRepo(), repo.ObjectFormatName); err != nil { return fmt.Errorf("InitRepository: %w", err) - } else if err = gitrepo.CreateDelegateHooks(ctx, repo.WikiStorageRepo()); err != nil { + } else if err = git.CreateDelegateHooks(ctx, repo.WikiStorageRepo()); err != nil { return fmt.Errorf("createDelegateHooks: %w", err) - } else if err = gitrepo.SetDefaultBranch(ctx, repo.WikiStorageRepo(), repo.DefaultWikiBranch); err != nil { + } else if err = git.SetDefaultBranch(ctx, repo.WikiStorageRepo(), repo.DefaultWikiBranch); err != nil { return fmt.Errorf("unable to set default wiki branch to %q: %w", repo.DefaultWikiBranch, err) } return nil @@ -101,9 +100,9 @@ func updateWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model return fmt.Errorf("InitWiki: %w", err) } - hasDefaultBranch := gitrepo.IsBranchExist(ctx, repo.WikiStorageRepo(), repo.DefaultWikiBranch) + hasDefaultBranch := git.IsBranchExist(ctx, repo.WikiStorageRepo(), repo.DefaultWikiBranch) - basePath, cleanup, err := repo_module.CreateTemporaryPath("update-wiki") + basePath, _, cleanup, err := repo_module.CreateTemporaryGitRepo("update-wiki") if err != nil { return err } @@ -118,7 +117,7 @@ func updateWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model cloneOpts.Branch = repo.DefaultWikiBranch } - if err := gitrepo.CloneRepoToLocal(ctx, repo.WikiStorageRepo(), basePath, cloneOpts); err != nil { + if err := git.CloneRepoToLocal(ctx, repo.WikiStorageRepo(), basePath, cloneOpts); err != nil { log.Error("Failed to clone repository: %s (%v)", repo.FullName(), err) return fmt.Errorf("failed to clone repository: %s (%w)", repo.FullName(), err) } @@ -193,7 +192,7 @@ func updateWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model committer := doer.NewGitSig() - originalGitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, repo.WikiStorageRepo()) + originalGitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, repo.WikiStorageRepo()) if err != nil { return fmt.Errorf("unable to open wiki repository: %w", err) } @@ -218,7 +217,7 @@ func updateWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model return err } - if err := gitrepo.PushFromLocal(ctx, basePath, repo.WikiStorageRepo(), git.PushOptions{ + if err := git.PushFromLocal(ctx, basePath, repo.WikiStorageRepo(), git.PushOptions{ Branch: fmt.Sprintf("%s:%s%s", commitHash.String(), git.BranchPrefix, repo.DefaultWikiBranch), Env: repo_module.FullPushingEnvironment( doer, @@ -267,13 +266,13 @@ func DeleteWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model return fmt.Errorf("InitWiki: %w", err) } - basePath, cleanup, err := repo_module.CreateTemporaryPath("update-wiki") + basePath, _, cleanup, err := repo_module.CreateTemporaryGitRepo("update-wiki") if err != nil { return err } defer cleanup() - if err := gitrepo.CloneRepoToLocal(ctx, repo.WikiStorageRepo(), basePath, git.CloneRepoOptions{ + if err := git.CloneRepoToLocal(ctx, repo.WikiStorageRepo(), basePath, git.CloneRepoOptions{ Bare: true, Shared: true, Branch: repo.DefaultWikiBranch, @@ -321,7 +320,7 @@ func DeleteWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model committer := doer.NewGitSig() - originalGitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, repo.WikiStorageRepo()) + originalGitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, repo.WikiStorageRepo()) if err != nil { return fmt.Errorf("unable to open wiki repository: %w", err) } @@ -342,7 +341,7 @@ func DeleteWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model return err } - if err := gitrepo.PushFromLocal(ctx, basePath, repo.WikiStorageRepo(), git.PushOptions{ + if err := git.PushFromLocal(ctx, basePath, repo.WikiStorageRepo(), git.PushOptions{ Branch: fmt.Sprintf("%s:%s%s", commitHash.String(), git.BranchPrefix, repo.DefaultWikiBranch), Env: repo_module.FullPushingEnvironment( doer, @@ -368,7 +367,7 @@ func DeleteWiki(ctx context.Context, repo *repo_model.Repository) error { return err } - if err := gitrepo.DeleteRepository(ctx, repo.WikiStorageRepo()); err != nil { + if err := git.DeleteRepository(ctx, repo.WikiStorageRepo()); err != nil { desc := fmt.Sprintf("Delete wiki repository files (%s): %v", repo.FullName(), err) // Note we use the db.DefaultContext here rather than passing in a context as the context may be cancelled if err = system_model.CreateNotice(graceful.GetManager().ShutdownContext(), system_model.NoticeRepository, desc); err != nil { @@ -393,7 +392,7 @@ func ChangeDefaultWikiBranch(ctx context.Context, repo *repo_model.Repository, n return nil } - oldDefBranch, err := gitrepo.GetDefaultBranch(ctx, repo.WikiStorageRepo()) + oldDefBranch, err := git.GetDefaultBranch(ctx, repo.WikiStorageRepo()) if err != nil { return fmt.Errorf("unable to get default branch: %w", err) } @@ -401,7 +400,7 @@ func ChangeDefaultWikiBranch(ctx context.Context, repo *repo_model.Repository, n return nil } - err = gitrepo.RenameBranch(ctx, repo.WikiStorageRepo(), oldDefBranch, newBranch) + err = git.RenameBranch(ctx, repo.WikiStorageRepo(), oldDefBranch, newBranch) if err != nil { return fmt.Errorf("unable to rename default branch: %w", err) } diff --git a/services/wiki/wiki_test.go b/services/wiki/wiki_test.go index 36889c7318e..58b1b7391e5 100644 --- a/services/wiki/wiki_test.go +++ b/services/wiki/wiki_test.go @@ -12,7 +12,6 @@ import ( "gitea.dev/models/unittest" user_model "gitea.dev/models/user" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" repo_service "gitea.dev/services/repository" _ "gitea.dev/models/actions" @@ -167,7 +166,7 @@ func TestRepository_AddWikiPage(t *testing.T) { webPath := UserTitleToWebPath("", userTitle) assert.NoError(t, AddWikiPage(t.Context(), doer, repo, webPath, wikiContent, commitMsg)) // Now need to show that the page has been added: - gitRepo, err := gitrepo.OpenRepository(repo.WikiStorageRepo()) + gitRepo, err := git.OpenRepository(repo.WikiStorageRepo()) require.NoError(t, err) defer gitRepo.Close() @@ -214,7 +213,7 @@ func TestRepository_EditWikiPage(t *testing.T) { assert.NoError(t, EditWikiPage(t.Context(), doer, repo, "Home", webPath, newWikiContent, commitMsg)) // Now need to show that the page has been added: - gitRepo, err := gitrepo.OpenRepository(repo.WikiStorageRepo()) + gitRepo, err := git.OpenRepository(repo.WikiStorageRepo()) assert.NoError(t, err) masterTree, err := gitRepo.GetTree(t.Context(), repo.DefaultWikiBranch) assert.NoError(t, err) @@ -238,7 +237,7 @@ func TestRepository_DeleteWikiPage(t *testing.T) { assert.NoError(t, DeleteWikiPage(t.Context(), doer, repo, "Home")) // Now need to show that the page has been added: - gitRepo, err := gitrepo.OpenRepository(repo.WikiStorageRepo()) + gitRepo, err := git.OpenRepository(repo.WikiStorageRepo()) require.NoError(t, err) defer gitRepo.Close() @@ -252,7 +251,7 @@ func TestRepository_DeleteWikiPage(t *testing.T) { func TestPrepareWikiFileName(t *testing.T) { unittest.PrepareTestEnv(t) repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - gitRepo, err := gitrepo.OpenRepository(repo.WikiStorageRepo()) + gitRepo, err := git.OpenRepository(repo.WikiStorageRepo()) require.NoError(t, err) defer gitRepo.Close() @@ -302,7 +301,7 @@ func TestPrepareWikiFileName_FirstPage(t *testing.T) { // Now create a temporaryDirectory tmpDir := t.TempDir() - err := git.InitRepository(t.Context(), tmpDir, true, git.Sha1ObjectFormat.Name()) + err := git.InitRepositoryLocal(t.Context(), tmpDir, true, git.Sha1ObjectFormat.Name()) assert.NoError(t, err) gitRepo, err := git.OpenRepositoryLocal(tmpDir) diff --git a/tests/integration/actions_reusable_workflow_test.go b/tests/integration/actions_reusable_workflow_test.go index 39e14b6d7da..632b41f2b37 100644 --- a/tests/integration/actions_reusable_workflow_test.go +++ b/tests/integration/actions_reusable_workflow_test.go @@ -17,7 +17,7 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/models/unittest" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/json" api "gitea.dev/modules/structs" @@ -539,7 +539,7 @@ jobs: assert.True(t, crossJob.IsExpanded) // cross_job's children come from libRepo/lib.yaml - their source must be libRepo + libRepo's commit. - libHead, err := gitrepo.GetBranchCommitID(t.Context(), libRepo, libRepo.DefaultBranch) + libHead, err := git.GetBranchCommitID(t.Context(), libRepo, libRepo.DefaultBranch) require.NoError(t, err) callUtilJob := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRunJob{RunID: run.ID, JobID: "call_util_in_lib", ParentJobID: crossJob.ID}) assert.True(t, callUtilJob.IsReusableCaller) diff --git a/tests/integration/actions_trigger_test.go b/tests/integration/actions_trigger_test.go index bea15994f40..aa192490d54 100644 --- a/tests/integration/actions_trigger_test.go +++ b/tests/integration/actions_trigger_test.go @@ -23,7 +23,7 @@ import ( user_model "gitea.dev/models/user" actions_module "gitea.dev/modules/actions" "gitea.dev/modules/commitstatus" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/json" "gitea.dev/modules/setting" api "gitea.dev/modules/structs" @@ -477,7 +477,7 @@ jobs: assert.NotEmpty(t, addWorkflowToBaseResp) // Get the commit ID of the default branch - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() branch, err := git_model.GetBranch(t.Context(), repo.ID, repo.DefaultBranch) @@ -881,7 +881,7 @@ jobs: assert.NoError(t, err) // submit an approval review as user4 - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() @@ -961,7 +961,7 @@ jobs: assert.NotEmpty(t, addWorkflowToBaseResp) // Get the commit ID of the default branch - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() branch, err := git_model.GetBranch(t.Context(), repo.ID, repo.DefaultBranch) @@ -1132,7 +1132,7 @@ jobs: assert.NotEmpty(t, addWorkflowToBaseResp) // Get the commit ID of the default branch - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() branch, err := git_model.GetBranch(t.Context(), repo.ID, repo.DefaultBranch) @@ -1223,7 +1223,7 @@ jobs: assert.NotEmpty(t, addWorkflowToBaseResp) // Get the commit ID of the default branch - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() branch, err := git_model.GetBranch(t.Context(), repo.ID, repo.DefaultBranch) @@ -1309,7 +1309,7 @@ jobs: assert.NotEmpty(t, addWorkflowToBaseResp) // Get the commit ID of the default branch - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() branch, err := git_model.GetBranch(t.Context(), repo.ID, repo.DefaultBranch) @@ -1439,7 +1439,7 @@ jobs: assert.NotEmpty(t, addWorkflowToBaseResp) // Get the commit ID of the dispatch branch - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() commit, err := gitRepo.GetBranchCommit(t.Context(), "dispatch") @@ -1637,7 +1637,7 @@ jobs: assert.Equal(t, workflows.Workflows[0].State, workflow.State) // Get the commit ID of the default branch - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() branch, err := git_model.GetBranch(t.Context(), repo.ID, repo.DefaultBranch) @@ -1806,7 +1806,7 @@ jobs: assert.NoError(t, err) assert.NotEmpty(t, addWorkflowToBaseResp) - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() @@ -1884,7 +1884,7 @@ jobs: assert.NoError(t, err) assert.NotEmpty(t, addWorkflowToBaseResp) - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() diff --git a/tests/integration/api_packages_cargo_test.go b/tests/integration/api_packages_cargo_test.go index 9b6b810cb70..bf4cf018529 100644 --- a/tests/integration/api_packages_cargo_test.go +++ b/tests/integration/api_packages_cargo_test.go @@ -16,7 +16,7 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/models/unittest" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/json" cargo_module "gitea.dev/modules/packages/cargo" "gitea.dev/modules/setting" @@ -76,7 +76,7 @@ func testPackageCargo(t *testing.T, _ *neturl.URL) { assert.NoError(t, err) readGitContent := func(t *testing.T, path string) string { - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() diff --git a/tests/integration/api_pull_review_test.go b/tests/integration/api_pull_review_test.go index e48a109b00b..497738141f2 100644 --- a/tests/integration/api_pull_review_test.go +++ b/tests/integration/api_pull_review_test.go @@ -15,7 +15,7 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/models/unittest" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/json" api "gitea.dev/modules/structs" issue_service "gitea.dev/services/issue" @@ -375,7 +375,7 @@ func TestAPIPullReviewCommentResolveEndpoints(t *testing.T) { doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: pullIssue.PosterID}) require.NoError(t, pullIssue.LoadPullRequest(ctx)) - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) require.NoError(t, err) defer gitRepo.Close() @@ -536,7 +536,7 @@ func testAPIPullReviewCommentReply(t *testing.T) { require.NoError(t, pullIssue.LoadRepo(t.Context())) require.NoError(t, pullIssue.LoadPullRequest(t.Context())) doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - gitRepo, err := gitrepo.OpenRepository(pullIssue.Repo) + gitRepo, err := git.OpenRepository(pullIssue.Repo) require.NoError(t, err) defer gitRepo.Close() diff --git a/tests/integration/api_releases_test.go b/tests/integration/api_releases_test.go index ffb92b82934..96127ae285a 100644 --- a/tests/integration/api_releases_test.go +++ b/tests/integration/api_releases_test.go @@ -20,7 +20,7 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/models/unittest" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/setting" api "gitea.dev/modules/structs" "gitea.dev/modules/test" @@ -186,7 +186,7 @@ func TestAPICreateAndUpdateRelease(t *testing.T) { session := loginUser(t, owner.LowerName) token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() @@ -237,7 +237,7 @@ func TestAPICreateProtectedTagRelease(t *testing.T) { session := loginUser(t, writer.LowerName) token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() @@ -273,7 +273,7 @@ func TestAPICreateReleaseToDefaultBranchOnExistingTag(t *testing.T) { session := loginUser(t, owner.LowerName) token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() diff --git a/tests/integration/api_repo_edit_test.go b/tests/integration/api_repo_edit_test.go index d30063bdf9e..74db4fb1ef7 100644 --- a/tests/integration/api_repo_edit_test.go +++ b/tests/integration/api_repo_edit_test.go @@ -15,7 +15,7 @@ import ( unit_model "gitea.dev/models/unit" "gitea.dev/models/unittest" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" api "gitea.dev/modules/structs" mirror_service "gitea.dev/services/mirror" "gitea.dev/tests" @@ -471,7 +471,7 @@ func TestAPIRepoEdit(t *testing.T) { updatedRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: mirrorRepo.ID}) assert.Equal(t, "https://example.com/user2/repo1.git", updatedRepo.OriginalURL) - remoteURL, err := gitrepo.GitRemoteGetURL(ctx, updatedRepo, updatedMirror.GetRemoteName()) + remoteURL, err := git.ParseRemoteAddressURL(ctx, updatedRepo, updatedMirror.GetRemoteName()) require.NoError(t, err) require.NotNil(t, remoteURL.User) assert.Equal(t, "existing-user", remoteURL.User.Username()) @@ -495,7 +495,7 @@ func TestAPIRepoEdit(t *testing.T) { updatedRepo = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: mirrorRepo.ID}) assert.Equal(t, "https://example.com/user2/repo1.git", updatedRepo.OriginalURL) - remoteURL, err = gitrepo.GitRemoteGetURL(ctx, updatedRepo, updatedMirror.GetRemoteName()) + remoteURL, err = git.ParseRemoteAddressURL(ctx, updatedRepo, updatedMirror.GetRemoteName()) require.NoError(t, err) require.NotNil(t, remoteURL.User) assert.Empty(t, remoteURL.User.Username()) diff --git a/tests/integration/api_repo_file_create_test.go b/tests/integration/api_repo_file_create_test.go index 0a9cd65fa58..e7ae4061559 100644 --- a/tests/integration/api_repo_file_create_test.go +++ b/tests/integration/api_repo_file_create_test.go @@ -16,7 +16,7 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/models/unittest" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/setting" api "gitea.dev/modules/structs" "gitea.dev/services/context" @@ -153,7 +153,7 @@ func TestAPICreateFile(t *testing.T) { req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s", user2.Name, repo1.Name, treePath), &createFileOptions). AddTokenAuth(token2) resp := MakeRequest(t, req, http.StatusCreated) - gitRepo, _ := gitrepo.OpenRepository(repo1) + gitRepo, _ := git.OpenRepository(repo1) defer gitRepo.Close() commitID, _ := gitRepo.GetBranchCommitID(t.Context(), createFileOptions.NewBranchName) lastCommit, _ := gitRepo.GetCommitByPath(t.Context(), treePath) @@ -276,7 +276,7 @@ func TestAPICreateFile(t *testing.T) { AddTokenAuth(token2) resp = MakeRequest(t, req, http.StatusCreated) emptyRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerName: "user2", Name: "empty-repo"}) // public repo - gitRepo, _ := gitrepo.OpenRepository(emptyRepo) + gitRepo, _ := git.OpenRepository(emptyRepo) defer gitRepo.Close() commitID, _ := gitRepo.GetBranchCommitID(t.Context(), createFileOptions.NewBranchName) latestCommit, _ := gitRepo.GetCommitByPath(t.Context(), treePath) diff --git a/tests/integration/api_repo_file_update_test.go b/tests/integration/api_repo_file_update_test.go index 53326ea626f..84cce398bf7 100644 --- a/tests/integration/api_repo_file_update_test.go +++ b/tests/integration/api_repo_file_update_test.go @@ -15,7 +15,7 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/models/unittest" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/setting" api "gitea.dev/modules/structs" "gitea.dev/services/context" @@ -136,7 +136,7 @@ func TestAPIUpdateFile(t *testing.T) { req := NewRequestWithJSON(t, "PUT", fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s", user2.Name, repo1.Name, treePath), &updateFileOptions). AddTokenAuth(token2) resp := MakeRequest(t, req, http.StatusOK) - gitRepo, _ := gitrepo.OpenRepository(repo1) + gitRepo, _ := git.OpenRepository(repo1) defer gitRepo.Close() commitID, _ := gitRepo.GetBranchCommitID(t.Context(), updateFileOptions.NewBranchName) lasCommit, _ := gitRepo.GetCommitByPath(t.Context(), treePath) diff --git a/tests/integration/api_repo_files_change_test.go b/tests/integration/api_repo_files_change_test.go index 9911053a07b..e71ebc0cc41 100644 --- a/tests/integration/api_repo_files_change_test.go +++ b/tests/integration/api_repo_files_change_test.go @@ -14,7 +14,7 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/models/unittest" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/setting" api "gitea.dev/modules/structs" "gitea.dev/services/context" @@ -93,7 +93,7 @@ func TestAPIChangeFiles(t *testing.T) { req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/%s/contents", user2.Name, repo1.Name), &changeFilesOptions). AddTokenAuth(token2) resp := MakeRequest(t, req, http.StatusCreated) - gitRepo, _ := gitrepo.OpenRepository(repo1) + gitRepo, _ := git.OpenRepository(repo1) defer gitRepo.Close() commitID, _ := gitRepo.GetBranchCommitID(t.Context(), changeFilesOptions.NewBranchName) createLasCommit, _ := gitRepo.GetCommitByPath(t.Context(), createTreePath) diff --git a/tests/integration/api_repo_files_get_test.go b/tests/integration/api_repo_files_get_test.go index b8cc8ac0443..8c197a9cc4c 100644 --- a/tests/integration/api_repo_files_get_test.go +++ b/tests/integration/api_repo_files_get_test.go @@ -13,7 +13,7 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/models/unittest" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/json" "gitea.dev/modules/setting" api "gitea.dev/modules/structs" @@ -42,7 +42,7 @@ func TestAPIGetRequestedFiles(t *testing.T) { session = loginUser(t, user4.Name) token4 := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) - gitRepo, err := gitrepo.OpenRepository(repo1) + gitRepo, err := git.OpenRepository(repo1) assert.NoError(t, err) defer gitRepo.Close() lastCommit, _ := gitRepo.GetCommitByPath(t.Context(), "README.md") diff --git a/tests/integration/api_repo_get_contents_list_test.go b/tests/integration/api_repo_get_contents_list_test.go index 5e17644403f..a883d510d1a 100644 --- a/tests/integration/api_repo_get_contents_list_test.go +++ b/tests/integration/api_repo_get_contents_list_test.go @@ -14,7 +14,7 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/models/unittest" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/setting" api "gitea.dev/modules/structs" repo_service "gitea.dev/services/repository" @@ -73,7 +73,7 @@ func testAPIGetContentsList(t *testing.T, u *url.URL) { token4 := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository) // Get the commit ID of the default branch - gitRepo, err := gitrepo.OpenRepository(repo1) + gitRepo, err := git.OpenRepository(repo1) assert.NoError(t, err) defer gitRepo.Close() diff --git a/tests/integration/api_repo_get_contents_test.go b/tests/integration/api_repo_get_contents_test.go index 8a1c993cd87..92d90d8edaa 100644 --- a/tests/integration/api_repo_get_contents_test.go +++ b/tests/integration/api_repo_get_contents_test.go @@ -15,7 +15,7 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/models/unittest" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/setting" api "gitea.dev/modules/structs" repo_service "gitea.dev/services/repository" @@ -78,7 +78,7 @@ func testAPIGetContents(t *testing.T, _ *url.URL) { token4 := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository) // Get the commit ID of the default branch - gitRepo, err := gitrepo.OpenRepository(repo1) + gitRepo, err := git.OpenRepository(repo1) require.NoError(t, err) defer gitRepo.Close() diff --git a/tests/integration/api_repo_git_tags_test.go b/tests/integration/api_repo_git_tags_test.go index db983762498..ef16442577e 100644 --- a/tests/integration/api_repo_git_tags_test.go +++ b/tests/integration/api_repo_git_tags_test.go @@ -12,7 +12,7 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/models/unittest" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" api "gitea.dev/modules/structs" "gitea.dev/tests" @@ -28,10 +28,10 @@ func TestAPIGitTags(t *testing.T) { token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository) // Set up git config for the tagger - _ = gitrepo.ManagedConfigSet(t.Context(), repo, "user.name", user.Name) - _ = gitrepo.ManagedConfigSet(t.Context(), repo, "user.email", user.Email) + _ = git.ManagedConfigSet(t.Context(), repo, "user.name", user.Name) + _ = git.ManagedConfigSet(t.Context(), repo, "user.email", user.Email) - gitRepo, _ := gitrepo.OpenRepository(repo) + gitRepo, _ := git.OpenRepository(repo) defer gitRepo.Close() commit, _ := gitRepo.GetBranchCommit(t.Context(), "master") diff --git a/tests/integration/change_default_branch_test.go b/tests/integration/change_default_branch_test.go index bcc517cbe94..f4521ed1cbe 100644 --- a/tests/integration/change_default_branch_test.go +++ b/tests/integration/change_default_branch_test.go @@ -12,7 +12,7 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/models/unittest" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/tests" "github.com/stretchr/testify/assert" @@ -39,7 +39,7 @@ func TestChangeDefaultBranch(t *testing.T) { session.MakeRequest(t, req, http.StatusNotFound) } -func checkDivergence(t *testing.T, session *TestSession, branchesURL, expectedDefaultBranch string, expectedBranchToDivergence map[string]*gitrepo.DivergeObject) { +func checkDivergence(t *testing.T, session *TestSession, branchesURL, expectedDefaultBranch string, expectedBranchToDivergence map[string]*git.DivergeObject) { req := NewRequest(t, "GET", branchesURL) resp := session.MakeRequest(t, req, http.StatusOK) @@ -88,7 +88,7 @@ func TestChangeDefaultBranchDivergence(t *testing.T) { settingsBranchesURL := fmt.Sprintf("/%s/%s/settings/branches", owner.Name, repo.Name) // check branch divergence before switching default branch - expectedBranchToDivergenceBefore := map[string]*gitrepo.DivergeObject{ + expectedBranchToDivergenceBefore := map[string]*git.DivergeObject{ "not-signed": { Ahead: 0, Behind: 0, @@ -113,7 +113,7 @@ func TestChangeDefaultBranchDivergence(t *testing.T) { session.MakeRequest(t, req, http.StatusSeeOther) // check branch divergence after switching default branch - expectedBranchToDivergenceAfter := map[string]*gitrepo.DivergeObject{ + expectedBranchToDivergenceAfter := map[string]*git.DivergeObject{ "master": { Ahead: 1, Behind: 0, diff --git a/tests/integration/compare_test.go b/tests/integration/compare_test.go index e2b9b549188..817d7ea5367 100644 --- a/tests/integration/compare_test.go +++ b/tests/integration/compare_test.go @@ -13,8 +13,8 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/models/unittest" user_model "gitea.dev/models/user" + "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/test" "gitea.dev/modules/util" "gitea.dev/routers/common" @@ -182,7 +182,7 @@ func TestResolveRefWithSuffixContract(t *testing.T) { defer tests.PrepareTestEnv(t)() repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 31}) - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) require.NoError(t, err) defer gitRepo.Close() diff --git a/tests/integration/editor_test.go b/tests/integration/editor_test.go index 12199131674..2a368891d93 100644 --- a/tests/integration/editor_test.go +++ b/tests/integration/editor_test.go @@ -20,7 +20,6 @@ import ( "gitea.dev/models/unittest" user_model "gitea.dev/models/user" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/test" "gitea.dev/modules/translation" "gitea.dev/modules/util" @@ -221,7 +220,7 @@ func testEditorWebGitCommitEmail(t *testing.T) { require.True(t, user.KeepEmailPrivate) repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - gitRepo, _ := gitrepo.OpenRepository(repo1) + gitRepo, _ := git.OpenRepository(repo1) defer gitRepo.Close() getLastCommit := func(t *testing.T) *git.Commit { c, err := gitRepo.GetBranchCommit(t.Context(), "master") diff --git a/tests/integration/git_helper_for_declarative_test.go b/tests/integration/git_helper_for_declarative_test.go index e649899ea56..f137795d767 100644 --- a/tests/integration/git_helper_for_declarative_test.go +++ b/tests/integration/git_helper_for_declarative_test.go @@ -169,7 +169,7 @@ func doGitCloneFail(u *url.URL) func(*testing.T) { func doGitInitTestRepository(dstPath string) func(*testing.T) { return func(t *testing.T) { // Init repository in dstPath - assert.NoError(t, git.InitRepository(t.Context(), dstPath, false, git.Sha1ObjectFormat.Name())) + assert.NoError(t, git.InitRepositoryLocal(t.Context(), dstPath, false, git.Sha1ObjectFormat.Name())) // forcibly set default branch to master _, _, err := gitcmd.NewCommand("symbolic-ref", "HEAD", git.BranchPrefix+"master"). WithDir(dstPath). diff --git a/tests/integration/git_misc_test.go b/tests/integration/git_misc_test.go index bb5985e32e0..0d0cc1677c8 100644 --- a/tests/integration/git_misc_test.go +++ b/tests/integration/git_misc_test.go @@ -17,7 +17,6 @@ import ( user_model "gitea.dev/models/user" "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/gitrepo" files_service "gitea.dev/services/repository/files" "github.com/stretchr/testify/assert" @@ -44,7 +43,7 @@ func TestDataAsyncDoubleRead_Issue29101(t *testing.T) { sha := resp.Commit.SHA - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) assert.NoError(t, err) commit, err := gitRepo.GetCommit(t.Context(), sha) @@ -219,7 +218,7 @@ func TestAgitReviewStaleness(t *testing.T) { // For AGit PRs, HeadCommitID must be loaded from git references baseRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - baseGitRepo, err := gitrepo.OpenRepository(baseRepo) + baseGitRepo, err := git.OpenRepository(baseRepo) assert.NoError(t, err) defer baseGitRepo.Close() diff --git a/tests/integration/migrate_test.go b/tests/integration/migrate_test.go index 71a99dd1973..fa4d0ddf94c 100644 --- a/tests/integration/migrate_test.go +++ b/tests/integration/migrate_test.go @@ -24,7 +24,7 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/models/unittest" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/setting" "gitea.dev/modules/structs" "gitea.dev/modules/test" @@ -336,7 +336,7 @@ func Test_MigrateFromGiteaToGitea(t *testing.T) { assert.False(t, pr13.HasMerged) assert.True(t, pr13.Issue.IsLocked) - gitRepo, err := gitrepo.OpenRepository(migratedRepo) + gitRepo, err := git.OpenRepository(migratedRepo) require.NoError(t, err) defer gitRepo.Close() diff --git a/tests/integration/mirror_pull_test.go b/tests/integration/mirror_pull_test.go index 5b1b301e31c..ecc3f316abf 100644 --- a/tests/integration/mirror_pull_test.go +++ b/tests/integration/mirror_pull_test.go @@ -15,7 +15,7 @@ import ( "gitea.dev/models/unit" "gitea.dev/models/unittest" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/migration" "gitea.dev/modules/setting" "gitea.dev/modules/test" @@ -66,7 +66,7 @@ func TestMirrorPull(t *testing.T) { assert.True(t, slices.ContainsFunc(mirrorRepo.Units, func(u *repo_model.RepoUnit) bool { return u.Type == unit.TypeReleases })) assert.True(t, slices.ContainsFunc(mirrorRepo.Units, func(u *repo_model.RepoUnit) bool { return u.Type == unit.TypeWiki })) - gitRepo, err := gitrepo.OpenRepository(repo) + gitRepo, err := git.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() diff --git a/tests/integration/mirror_push_test.go b/tests/integration/mirror_push_test.go index dfcb2ac2251..07bca8b7d6e 100644 --- a/tests/integration/mirror_push_test.go +++ b/tests/integration/mirror_push_test.go @@ -15,7 +15,7 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/models/unittest" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" "gitea.dev/modules/setting" "gitea.dev/modules/test" "gitea.dev/services/migrations" @@ -60,14 +60,14 @@ func testMirrorPush(t *testing.T, u *url.URL) { ok := mirror_service.SyncPushMirror(t.Context(), mirrors[0].ID) assert.True(t, ok) - srcGitRepo, err := gitrepo.OpenRepository(srcRepo) + srcGitRepo, err := git.OpenRepository(srcRepo) assert.NoError(t, err) defer srcGitRepo.Close() srcCommit, err := srcGitRepo.GetBranchCommit(t.Context(), "master") assert.NoError(t, err) - mirrorGitRepo, err := gitrepo.OpenRepository(mirrorRepo) + mirrorGitRepo, err := git.OpenRepository(mirrorRepo) assert.NoError(t, err) defer mirrorGitRepo.Close() @@ -101,9 +101,9 @@ func testMirrorPushWikiDefaultBranchMismatch(t *testing.T, u *url.URL) { mirrorRepo.DefaultBranch = "mirror-head" assert.NoError(t, repo_model.UpdateRepositoryColsNoAutoTime(t.Context(), mirrorRepo, "default_branch")) - wikiCommitID, err := gitrepo.GetBranchCommitID(t.Context(), mirrorRepo.WikiStorageRepo(), mirrorRepo.DefaultWikiBranch) + wikiCommitID, err := git.GetBranchCommitID(t.Context(), mirrorRepo.WikiStorageRepo(), mirrorRepo.DefaultWikiBranch) assert.NoError(t, err) - assert.NoError(t, gitrepo.CreateBranch(t.Context(), mirrorRepo.WikiStorageRepo(), "mirror-head", wikiCommitID)) + assert.NoError(t, git.CreateBranch(t.Context(), mirrorRepo.WikiStorageRepo(), "mirror-head", wikiCommitID)) session := loginUser(t, user.Name) diff --git a/tests/integration/pull_merge_test.go b/tests/integration/pull_merge_test.go index 7ac4254250e..d775269dbb1 100644 --- a/tests/integration/pull_merge_test.go +++ b/tests/integration/pull_merge_test.go @@ -29,7 +29,6 @@ import ( "gitea.dev/modules/commitstatus" "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/json" "gitea.dev/modules/queue" "gitea.dev/modules/setting" @@ -838,7 +837,7 @@ func TestPullAutoMergeAfterCommitStatusSucceed(t *testing.T) { assert.Empty(t, pr.MergedCommitID) // update commit status to success, then it should be merged automatically - baseGitRepo, err := gitrepo.OpenRepository(baseRepo) + baseGitRepo, err := git.OpenRepository(baseRepo) assert.NoError(t, err) sha, err := baseGitRepo.GetRefCommitID(t.Context(), pr.GetGitHeadRefName()) assert.NoError(t, err) @@ -910,7 +909,7 @@ func TestPullAutoMergeAfterCommitStatusSucceedAndApproval(t *testing.T) { assert.Empty(t, pr.MergedCommitID) // update commit status to success, then it should be merged automatically - baseGitRepo, err := gitrepo.OpenRepository(baseRepo) + baseGitRepo, err := git.OpenRepository(baseRepo) assert.NoError(t, err) sha, err := baseGitRepo.GetRefCommitID(t.Context(), pr.GetGitHeadRefName()) assert.NoError(t, err) @@ -1023,7 +1022,7 @@ func TestPullAutoMergeAfterCommitStatusSucceedAndApprovalForAgitFlow(t *testing. assert.Empty(t, pr.MergedCommitID) // update commit status to success, then it should be merged automatically - baseGitRepo, err := gitrepo.OpenRepository(baseRepo) + baseGitRepo, err := git.OpenRepository(baseRepo) assert.NoError(t, err) sha, err := baseGitRepo.GetRefCommitID(t.Context(), pr.GetGitHeadRefName()) assert.NoError(t, err) diff --git a/tests/integration/pull_review_test.go b/tests/integration/pull_review_test.go index 45172bd6c70..528502c5817 100644 --- a/tests/integration/pull_review_test.go +++ b/tests/integration/pull_review_test.go @@ -18,7 +18,6 @@ import ( "gitea.dev/models/unittest" user_model "gitea.dev/models/user" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/test" issue_service "gitea.dev/services/issue" repo_service "gitea.dev/services/repository" @@ -100,7 +99,7 @@ func TestPullView_CodeOwner(t *testing.T) { // capture the current PR head ref so we can wait for the async // refs/pull/N/head sync triggered by the next push to complete - baseGitRepo, err := gitrepo.OpenRepository(repo) + baseGitRepo, err := git.OpenRepository(repo) require.NoError(t, err) defer baseGitRepo.Close() headRefBefore, err := baseGitRepo.GetRefCommitID(t.Context(), pr.GetGitHeadRefName()) diff --git a/tests/integration/pull_update_test.go b/tests/integration/pull_update_test.go index f67084b860c..393259446bc 100644 --- a/tests/integration/pull_update_test.go +++ b/tests/integration/pull_update_test.go @@ -17,7 +17,7 @@ import ( "gitea.dev/models/unit" "gitea.dev/models/unittest" user_model "gitea.dev/models/user" - "gitea.dev/modules/gitrepo" + "gitea.dev/modules/git" pull_service "gitea.dev/services/pull" repo_service "gitea.dev/services/repository" files_service "gitea.dev/services/repository/files" @@ -36,7 +36,7 @@ func TestAPIPullUpdate(t *testing.T) { require.NoError(t, pr.LoadIssue(t.Context())) // Test GetDiverging - diffCount, err := gitrepo.GetDivergingCommits(t.Context(), pr.BaseRepo, pr.BaseBranch, pr.GetGitHeadRefName()) + diffCount, err := git.GetDivergingCommits(t.Context(), pr.BaseRepo, pr.BaseBranch, pr.GetGitHeadRefName()) require.NoError(t, err) assert.Equal(t, 1, diffCount.Behind) assert.Equal(t, 1, diffCount.Ahead) @@ -50,7 +50,7 @@ func TestAPIPullUpdate(t *testing.T) { session.MakeRequest(t, req, http.StatusOK) // Test GetDiverging after update - diffCount, err = gitrepo.GetDivergingCommits(t.Context(), pr.BaseRepo, pr.BaseBranch, pr.GetGitHeadRefName()) + diffCount, err = git.GetDivergingCommits(t.Context(), pr.BaseRepo, pr.BaseBranch, pr.GetGitHeadRefName()) require.NoError(t, err) assert.Equal(t, 0, diffCount.Behind) assert.Equal(t, 2, diffCount.Ahead) @@ -84,7 +84,7 @@ func TestAPIPullUpdatePublicOnlyToken(t *testing.T) { MakeRequest(t, req, http.StatusNotFound) // the head branch must still be outdated (no push happened) - diffCount, err := gitrepo.GetDivergingCommits(t.Context(), pr.BaseRepo, pr.BaseBranch, pr.GetGitHeadRefName()) + diffCount, err := git.GetDivergingCommits(t.Context(), pr.BaseRepo, pr.BaseBranch, pr.GetGitHeadRefName()) require.NoError(t, err) assert.Equal(t, 1, diffCount.Behind) @@ -133,7 +133,7 @@ func TestAPIPullUpdateByRebase(t *testing.T) { assert.NoError(t, pr.LoadBaseRepo(t.Context())) // Test GetDiverging - diffCount, err := gitrepo.GetDivergingCommits(t.Context(), pr.BaseRepo, pr.BaseBranch, pr.GetGitHeadRefName()) + diffCount, err := git.GetDivergingCommits(t.Context(), pr.BaseRepo, pr.BaseBranch, pr.GetGitHeadRefName()) assert.NoError(t, err) assert.Equal(t, 1, diffCount.Behind) assert.Equal(t, 1, diffCount.Ahead) @@ -168,7 +168,7 @@ func TestAPIPullUpdateByRebase(t *testing.T) { session.MakeRequest(t, req, http.StatusOK) // Test GetDiverging after update - diffCount, err = gitrepo.GetDivergingCommits(t.Context(), pr.BaseRepo, pr.BaseBranch, pr.GetGitHeadRefName()) + diffCount, err = git.GetDivergingCommits(t.Context(), pr.BaseRepo, pr.BaseBranch, pr.GetGitHeadRefName()) assert.NoError(t, err) assert.Equal(t, 0, diffCount.Behind) assert.Equal(t, 1, diffCount.Ahead) @@ -208,7 +208,7 @@ func TestAPIPullUpdateStyleSettings(t *testing.T) { // merge update produces a merge commit on top of the head commit (Ahead=2), // rebase update would replay the head commit alone (Ahead=1). - diffCount, err := gitrepo.GetDivergingCommits(t.Context(), pr.BaseRepo, pr.BaseBranch, pr.GetGitHeadRefName()) + diffCount, err := git.GetDivergingCommits(t.Context(), pr.BaseRepo, pr.BaseBranch, pr.GetGitHeadRefName()) require.NoError(t, err) assert.Equal(t, 0, diffCount.Behind) assert.Equal(t, 2, diffCount.Ahead) diff --git a/tests/integration/repo_webhook_test.go b/tests/integration/repo_webhook_test.go index b146c29dd36..2aa0c98ea18 100644 --- a/tests/integration/repo_webhook_test.go +++ b/tests/integration/repo_webhook_test.go @@ -26,7 +26,6 @@ import ( "gitea.dev/models/webhook" "gitea.dev/modules/commitstatus" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/json" "gitea.dev/modules/setting" api "gitea.dev/modules/structs" @@ -410,7 +409,7 @@ func Test_WebhookPushDevBranch(t *testing.T) { assert.Empty(t, payloads) repo1 := unittest.AssertExistsAndLoadBean(t, &repo.Repository{ID: 1}) - gitRepo, err := gitrepo.OpenRepository(repo1) + gitRepo, err := git.OpenRepository(repo1) assert.NoError(t, err) defer gitRepo.Close() @@ -461,7 +460,7 @@ func Test_WebhookPushToNewBranch(t *testing.T) { testAPICreateWebhookForRepo(t, session, "user2", "repo1", provider.URL(), "push", "new_branch") repo1 := unittest.AssertExistsAndLoadBean(t, &repo.Repository{ID: 1}) - gitRepo, err := gitrepo.OpenRepository(repo1) + gitRepo, err := git.OpenRepository(repo1) assert.NoError(t, err) defer gitRepo.Close() @@ -926,7 +925,7 @@ func Test_WebhookStatus(t *testing.T) { repo1 := unittest.AssertExistsAndLoadBean(t, &repo.Repository{ID: 1}) - gitRepo1, err := gitrepo.OpenRepository(repo1) + gitRepo1, err := git.OpenRepository(repo1) assert.NoError(t, err) commitID, err := gitRepo1.GetBranchCommitID(t.Context(), repo1.DefaultBranch) assert.NoError(t, err) @@ -999,7 +998,7 @@ func Test_WebhookWorkflowJob(t *testing.T) { repo1 := unittest.AssertExistsAndLoadBean(t, &repo.Repository{ID: 1}) - gitRepo1, err := gitrepo.OpenRepository(repo1) + gitRepo1, err := git.OpenRepository(repo1) assert.NoError(t, err) runner := newMockRunner() @@ -1191,7 +1190,7 @@ func testWorkflowRunEvents(t *testing.T, webhookData *workflowRunWebhook) { repo1 := unittest.AssertExistsAndLoadBean(t, &repo.Repository{ID: 1}) - gitRepo1, err := gitrepo.OpenRepository(repo1) + gitRepo1, err := git.OpenRepository(repo1) assert.NoError(t, err) // 2.2 trigger the webhooks @@ -1316,7 +1315,7 @@ func testWorkflowRunEventsOnRerun(t *testing.T, webhookData *workflowRunWebhook) repo1 := unittest.AssertExistsAndLoadBean(t, &repo.Repository{ID: 1}) - gitRepo1, err := gitrepo.OpenRepository(repo1) + gitRepo1, err := git.OpenRepository(repo1) assert.NoError(t, err) // 2.2 trigger the webhooks @@ -1486,7 +1485,7 @@ func testWorkflowRunEventsOnCancellingAbandonedRun(t *testing.T, webhookData *wo testAPICreateWebhookForRepo(t, session, "user2", repoName, webhookData.URL, "workflow_run") ctx := t.Context() - gitRepo, err := gitrepo.OpenRepository(testRepo) + gitRepo, err := git.OpenRepository(testRepo) assert.NoError(t, err) // 2.2 trigger the webhooks @@ -1704,7 +1703,7 @@ func testWebhookWorkflowRun(t *testing.T, webhookData *workflowRunWebhook) { repo1 := unittest.AssertExistsAndLoadBean(t, &repo.Repository{ID: 1}) - gitRepo1, err := gitrepo.OpenRepository(repo1) + gitRepo1, err := git.OpenRepository(repo1) assert.NoError(t, err) runner := newMockRunner() @@ -1805,7 +1804,7 @@ func testWebhookWorkflowRunDepthLimit(t *testing.T, webhookData *workflowRunWebh repo1 := unittest.AssertExistsAndLoadBean(t, &repo.Repository{ID: 1}) - gitRepo1, err := gitrepo.OpenRepository(repo1) + gitRepo1, err := git.OpenRepository(repo1) assert.NoError(t, err) // 2. trigger the webhooks diff --git a/tests/integration/repofiles_change_test.go b/tests/integration/repofiles_change_test.go index fa978edab6a..b8ded7c86f1 100644 --- a/tests/integration/repofiles_change_test.go +++ b/tests/integration/repofiles_change_test.go @@ -14,7 +14,6 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/setting" api "gitea.dev/modules/structs" "gitea.dev/services/contexttest" @@ -362,7 +361,7 @@ func TestChangeRepoFilesForCreate(t *testing.T) { // asserts assert.NoError(t, err) - gitRepo, _ := gitrepo.OpenRepository(repo) + gitRepo, _ := git.OpenRepository(repo) defer gitRepo.Close() commitID, _ := gitRepo.GetBranchCommitID(t.Context(), opts.NewBranch) @@ -399,7 +398,7 @@ func TestChangeRepoFilesForUpdate(t *testing.T) { // asserts assert.NoError(t, err) - gitRepo, _ := gitrepo.OpenRepository(repo) + gitRepo, _ := git.OpenRepository(repo) defer gitRepo.Close() commit, _ := gitRepo.GetBranchCommit(t.Context(), opts.NewBranch) @@ -435,7 +434,7 @@ func TestChangeRepoFilesForUpdateWithFileMove(t *testing.T) { // asserts assert.NoError(t, err) - gitRepo, _ := gitrepo.OpenRepository(repo) + gitRepo, _ := git.OpenRepository(repo) defer gitRepo.Close() commit, _ := gitRepo.GetBranchCommit(t.Context(), opts.NewBranch) @@ -481,7 +480,7 @@ func TestChangeRepoFilesForUpdateWithFileRename(t *testing.T) { // asserts assert.NoError(t, err) - gitRepo, _ := gitrepo.OpenRepository(repo) + gitRepo, _ := git.OpenRepository(repo) defer gitRepo.Close() commit, _ := gitRepo.GetBranchCommit(t.Context(), repo.DefaultBranch) @@ -518,7 +517,7 @@ func TestChangeRepoFilesWithoutBranchNames(t *testing.T) { // asserts assert.NoError(t, err) - gitRepo, _ := gitrepo.OpenRepository(repo) + gitRepo, _ := git.OpenRepository(repo) defer gitRepo.Close() commit, _ := gitRepo.GetBranchCommit(t.Context(), repo.DefaultBranch)