diff --git a/modules/git/repo_compare.go b/modules/git/repo_compare.go index f60696a763..8d26f1e9e7 100644 --- a/modules/git/repo_compare.go +++ b/modules/git/repo_compare.go @@ -18,32 +18,6 @@ import ( "code.gitea.io/gitea/modules/git/gitcmd" ) -// GetMergeBase checks and returns merge base of two branches and the reference used as base. -func (repo *Repository) GetMergeBase(tmpRemote, base, head string) (string, string, error) { - if tmpRemote == "" { - tmpRemote = "origin" - } - - if tmpRemote != "origin" { - tmpBaseName := RemotePrefix + tmpRemote + "/tmp_" + base - // Fetch commit into a temporary branch in order to be able to handle commits and tags - _, _, err := gitcmd.NewCommand("fetch", "--no-tags"). - AddDynamicArguments(tmpRemote). - AddDashesAndList(base + ":" + tmpBaseName). - WithDir(repo.Path). - RunStdString(repo.Ctx) - if err == nil { - base = tmpBaseName - } - } - - stdout, _, err := gitcmd.NewCommand("merge-base"). - AddDashesAndList(base, head). - WithDir(repo.Path). - RunStdString(repo.Ctx) - return strings.TrimSpace(stdout), base, err -} - type lineCountWriter struct { numLines int } diff --git a/modules/gitrepo/merge.go b/modules/gitrepo/merge.go index 3c317491e5..2d83a1eb2b 100644 --- a/modules/gitrepo/merge.go +++ b/modules/gitrepo/merge.go @@ -12,23 +12,23 @@ import ( ) // MergeBase checks and returns merge base of two commits. -func MergeBase(ctx context.Context, repo Repository, commit1, commit2 string) (string, error) { +func MergeBase(ctx context.Context, repo Repository, baseCommitID, headCommitID string) (string, error) { mergeBase, err := RunCmdString(ctx, repo, gitcmd.NewCommand("merge-base"). - AddDashesAndList(commit1, commit2)) + AddDashesAndList(baseCommitID, headCommitID)) if err != nil { - return "", fmt.Errorf("get merge-base of %s and %s failed: %w", commit1, commit2, err) + return "", fmt.Errorf("get merge-base of %s and %s failed: %w", baseCommitID, headCommitID, err) } return strings.TrimSpace(mergeBase), nil } // MergeBaseFromRemote checks and returns merge base of two commits from different repositories. -func MergeBaseFromRemote(ctx context.Context, repo, remoteRepo Repository, commit1, commit2 string) (string, error) { +func MergeBaseFromRemote(ctx context.Context, baseRepo, headRepo Repository, baseCommitID, headCommitID string) (string, error) { // fetch head commit id into the current repository if the repositories are different - if repo.RelativePath() != remoteRepo.RelativePath() { - if err := FetchRemoteCommit(ctx, repo, remoteRepo, commit2); err != nil { + if baseRepo.RelativePath() != headRepo.RelativePath() { + if err := FetchRemoteCommit(ctx, baseRepo, headRepo, headCommitID); err != nil { return "", fmt.Errorf("FetchRemoteCommit: %w", err) } } - return MergeBase(ctx, repo, commit1, commit2) + return MergeBase(ctx, baseRepo, baseCommitID, headCommitID) } diff --git a/services/migrations/gitea_uploader.go b/services/migrations/gitea_uploader.go index 9e1a1f2e95..b7b1631d8d 100644 --- a/services/migrations/gitea_uploader.go +++ b/services/migrations/gitea_uploader.go @@ -736,7 +736,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 = g.gitRepo.GetMergeBase("", git.BranchPrefix+pr.Base.Ref, pr.Head.SHA) + pr.Base.SHA, err = gitrepo.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/pull/pull.go b/services/pull/pull.go index ecc0b2c7ce..165e275021 100644 --- a/services/pull/pull.go +++ b/services/pull/pull.go @@ -510,14 +510,7 @@ func checkIfPRContentChanged(ctx context.Context, pr *issues_model.PullRequest, } defer cancel() - tmpRepo, err := git.OpenRepository(ctx, prCtx.tmpBasePath) - if err != nil { - return false, "", fmt.Errorf("OpenRepository: %w", err) - } - defer tmpRepo.Close() - - // Find the merge-base - mergeBase, _, err = tmpRepo.GetMergeBase("", "base", "tracking") + mergeBase, err = gitrepo.MergeBaseFromRemote(ctx, pr.BaseRepo, pr.HeadRepo, pr.BaseBranch, pr.HeadBranch) if err != nil { return false, "", fmt.Errorf("GetMergeBase: %w", err) }