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)