From 8e26807e076fa4f9de745688ecf572ce6c8f0cd0 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Wed, 1 Apr 2020 13:22:14 +0200 Subject: [PATCH 1/5] add docu how to use func **createTemporaryRepo** --- services/pull/temp_repo.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/services/pull/temp_repo.go b/services/pull/temp_repo.go index ffac92ade5e07..91f48d0626816 100644 --- a/services/pull/temp_repo.go +++ b/services/pull/temp_repo.go @@ -16,6 +16,8 @@ import ( "code.gitea.io/gitea/modules/log" ) +// createTemporaryRepo 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 createTemporaryRepo(pr *models.PullRequest) (string, error) { if err := pr.LoadHeadRepo(); err != nil { log.Error("LoadHeadRepo: %v", err) From abd363941bc6eea816266ed3a2bb9153905a4835 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Wed, 1 Apr 2020 13:27:03 +0200 Subject: [PATCH 2/5] fix by using createTemporaryRepo --- services/pull/update.go | 53 ++++------------------------------------- 1 file changed, 4 insertions(+), 49 deletions(-) diff --git a/services/pull/update.go b/services/pull/update.go index 66921abefa2f2..6898010673c10 100644 --- a/services/pull/update.go +++ b/services/pull/update.go @@ -6,8 +6,6 @@ package pull import ( "fmt" - "strconv" - "strings" "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/git" @@ -74,54 +72,11 @@ func GetDiverging(pr *models.PullRequest) (*git.DivergeObject, error) { return nil, err } - headRepoPath := pr.HeadRepo.RepoPath() - headGitRepo, err := git.OpenRepository(headRepoPath) + tmpRepo, err := createTemporaryRepo(pr) if err != nil { - return nil, fmt.Errorf("OpenRepository: %v", err) - } - defer headGitRepo.Close() - - if pr.IsSameRepo() { - diff, err := git.GetDivergingCommits(pr.HeadRepo.RepoPath(), pr.BaseBranch, pr.HeadBranch) - return &diff, err - } - - tmpRemoteName := fmt.Sprintf("tmp-pull-%d-base", pr.ID) - if err = headGitRepo.AddRemote(tmpRemoteName, pr.BaseRepo.RepoPath(), true); err != nil { - return nil, fmt.Errorf("headGitRepo.AddRemote: %v", err) - } - // Make sure to remove the remote even if the push fails - defer func() { - if err := headGitRepo.RemoveRemote(tmpRemoteName); err != nil { - log.Error("CountDiverging: RemoveRemote: %s", err) - } - }() - - // $(git rev-list --count tmp-pull-1-base/master..feature) commits ahead of master - ahead, errorAhead := checkDivergence(headRepoPath, fmt.Sprintf("%s/%s", tmpRemoteName, pr.BaseBranch), pr.HeadBranch) - if errorAhead != nil { - return &git.DivergeObject{}, errorAhead - } - - // $(git rev-list --count feature..tmp-pull-1-base/master) commits behind master - behind, errorBehind := checkDivergence(headRepoPath, pr.HeadBranch, fmt.Sprintf("%s/%s", tmpRemoteName, pr.BaseBranch)) - if errorBehind != nil { - return &git.DivergeObject{}, errorBehind + return nil, err } - return &git.DivergeObject{Ahead: ahead, Behind: behind}, nil -} - -func checkDivergence(repoPath string, baseBranch string, targetBranch string) (int, error) { - branches := fmt.Sprintf("%s..%s", baseBranch, targetBranch) - cmd := git.NewCommand("rev-list", "--count", branches) - stdout, err := cmd.RunInDir(repoPath) - if err != nil { - return -1, err - } - outInteger, errInteger := strconv.Atoi(strings.Trim(stdout, "\n")) - if errInteger != nil { - return -1, errInteger - } - return outInteger, nil + diff, err := git.GetDivergingCommits(tmpRepo, "base", "tracking") + return &diff, err } From 4ee6846e829c568c4922409e7c778525eaf1afd7 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Wed, 1 Apr 2020 13:27:17 +0200 Subject: [PATCH 3/5] correct Trace Log --- services/pull/update.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/pull/update.go b/services/pull/update.go index 6898010673c10..52871863393d2 100644 --- a/services/pull/update.go +++ b/services/pull/update.go @@ -64,7 +64,7 @@ func IsUserAllowedToUpdate(pull *models.PullRequest, user *models.User) (bool, e // GetDiverging determines how many commits a PR is ahead or behind the PR base branch func GetDiverging(pr *models.PullRequest) (*git.DivergeObject, error) { - log.Trace("PushToBaseRepo[%d]: pushing commits to base repo '%s'", pr.BaseRepoID, pr.GetGitRefName()) + log.Trace("GetDiverging[%d]: compare commits", pr.ID) if err := pr.LoadBaseRepo(); err != nil { return nil, err } From abd1e93f36e29e6853cffb2f62796811288d4b21 Mon Sep 17 00:00:00 2001 From: zeripath Date: Wed, 1 Apr 2020 17:24:25 +0100 Subject: [PATCH 4/5] Remove the temporary repo at the end of the function --- services/pull/update.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/services/pull/update.go b/services/pull/update.go index 52871863393d2..e778f609c5c4d 100644 --- a/services/pull/update.go +++ b/services/pull/update.go @@ -76,6 +76,11 @@ func GetDiverging(pr *models.PullRequest) (*git.DivergeObject, error) { if err != nil { return nil, err } + defer func() { + if err := models.RemoveTemporaryPath(tmpRepo); err != nil { + log.Error("Merge: RemoveTemporaryPath: %s", err) + } + }() diff, err := git.GetDivergingCommits(tmpRepo, "base", "tracking") return &diff, err From cc65627fb4310efcbb9c258918b995f165e29d6b Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Wed, 1 Apr 2020 18:25:00 +0200 Subject: [PATCH 5/5] delete tmp afterwards --- services/pull/update.go | 1 + 1 file changed, 1 insertion(+) diff --git a/services/pull/update.go b/services/pull/update.go index e778f609c5c4d..2ccbcf00a322e 100644 --- a/services/pull/update.go +++ b/services/pull/update.go @@ -74,6 +74,7 @@ func GetDiverging(pr *models.PullRequest) (*git.DivergeObject, error) { tmpRepo, err := createTemporaryRepo(pr) if err != nil { + log.Error("CreateTemporaryPath: %v", err) return nil, err } defer func() {