diff options
author | Lunny Xiao <xiaolunwen@gmail.com> | 2019-12-15 11:28:51 +0800 |
---|---|---|
committer | Antoine GIRARD <sapk@users.noreply.github.com> | 2019-12-15 04:28:51 +0100 |
commit | ce2d488c9497c12105935d363b66136a0c2bd0b5 (patch) | |
tree | 65f73708a844d3fb7a5e05290fc6c0ddf5cfafdd /services | |
parent | 6715677b2bf7a065d0184ea7f2647e70ca2598d4 (diff) | |
download | gitea-ce2d488c9497c12105935d363b66136a0c2bd0b5.tar.gz gitea-ce2d488c9497c12105935d363b66136a0c2bd0b5.zip |
Move PushToBaseRepo from models to services/pull (#9352)
Diffstat (limited to 'services')
-rw-r--r-- | services/pull/pull.go | 50 | ||||
-rw-r--r-- | services/pull/pull_test.go | 8 |
2 files changed, 57 insertions, 1 deletions
diff --git a/services/pull/pull.go b/services/pull/pull.go index df44402ad8..6447c8a87f 100644 --- a/services/pull/pull.go +++ b/services/pull/pull.go @@ -6,6 +6,8 @@ package pull import ( "fmt" + "os" + "path" "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/git" @@ -33,6 +35,10 @@ func NewPullRequest(repo *models.Repository, pull *models.Issue, labelIDs []int6 pr.Issue = pull pull.PullRequest = pr + if err := PushToBaseRepo(pr); err != nil { + return err + } + notification.NotifyNewPullRequest(pr) return nil @@ -60,7 +66,7 @@ func checkForInvalidation(requests models.PullRequestList, repoID int64, doer *m func addHeadRepoTasks(prs []*models.PullRequest) { for _, pr := range prs { log.Trace("addHeadRepoTasks[%d]: composing new test task", pr.ID) - if err := pr.PushToBaseRepo(); err != nil { + if err := PushToBaseRepo(pr); err != nil { log.Error("PushToBaseRepo: %v", err) continue } @@ -107,3 +113,45 @@ func AddTestPullRequestTask(doer *models.User, repoID int64, branch string, isSy AddToTaskQueue(pr) } } + +// PushToBaseRepo pushes commits from branches of head repository to +// corresponding branches of base repository. +// FIXME: Only push branches that are actually updates? +func PushToBaseRepo(pr *models.PullRequest) (err error) { + log.Trace("PushToBaseRepo[%d]: pushing commits to base repo '%s'", pr.BaseRepoID, pr.GetGitRefName()) + + headRepoPath := pr.HeadRepo.RepoPath() + headGitRepo, err := git.OpenRepository(headRepoPath) + if err != nil { + return fmt.Errorf("OpenRepository: %v", err) + } + defer headGitRepo.Close() + + tmpRemoteName := fmt.Sprintf("tmp-pull-%d", pr.ID) + if err = headGitRepo.AddRemote(tmpRemoteName, pr.BaseRepo.RepoPath(), false); err != nil { + return 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("PushToBaseRepo: RemoveRemote: %s", err) + } + }() + + headFile := pr.GetGitRefName() + + // Remove head in case there is a conflict. + file := path.Join(pr.BaseRepo.RepoPath(), headFile) + + _ = os.Remove(file) + + if err = git.Push(headRepoPath, git.PushOptions{ + Remote: tmpRemoteName, + Branch: fmt.Sprintf("%s:%s", pr.HeadBranch, headFile), + Force: true, + }); err != nil { + return fmt.Errorf("Push: %v", err) + } + + return nil +} diff --git a/services/pull/pull_test.go b/services/pull/pull_test.go new file mode 100644 index 0000000000..64920e3550 --- /dev/null +++ b/services/pull/pull_test.go @@ -0,0 +1,8 @@ +// Copyright 2019 The Gitea Authors. +// All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package pull + +// TODO TestPullRequest_PushToBaseRepo |