@@ -7,8 +7,6 @@ package models | |||
import ( | |||
"fmt" | |||
"os" | |||
"path" | |||
"strings" | |||
"code.gitea.io/gitea/modules/git" | |||
@@ -631,48 +629,6 @@ func (pr *PullRequest) UpdateCols(cols ...string) error { | |||
return err | |||
} | |||
// PushToBaseRepo pushes commits from branches of head repository to | |||
// corresponding branches of base repository. | |||
// FIXME: Only push branches that are actually updates? | |||
func (pr *PullRequest) PushToBaseRepo() (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 | |||
} | |||
// IsWorkInProgress determine if the Pull Request is a Work In Progress by its title | |||
func (pr *PullRequest) IsWorkInProgress() bool { | |||
if err := pr.LoadIssue(); err != nil { |
@@ -190,8 +190,6 @@ func TestPullRequest_UpdateCols(t *testing.T) { | |||
CheckConsistencyFor(t, pr) | |||
} | |||
// TODO TestPullRequest_PushToBaseRepo | |||
func TestPullRequestList_LoadAttributes(t *testing.T) { | |||
assert.NoError(t, PrepareTestDatabase()) | |||
@@ -307,9 +307,6 @@ func CreatePullRequest(ctx *context.APIContext, form api.CreatePullRequestOption | |||
} | |||
ctx.Error(500, "NewPullRequest", err) | |||
return | |||
} else if err := pr.PushToBaseRepo(); err != nil { | |||
ctx.Error(500, "PushToBaseRepo", err) | |||
return | |||
} | |||
notification.NotifyNewPullRequest(pr) |
@@ -813,9 +813,6 @@ func CompareAndPullRequestPost(ctx *context.Context, form auth.CreateIssueForm) | |||
} | |||
ctx.ServerError("NewPullRequest", err) | |||
return | |||
} else if err := pullRequest.PushToBaseRepo(); err != nil { | |||
ctx.ServerError("PushToBaseRepo", err) | |||
return | |||
} | |||
notification.NotifyNewPullRequest(pullRequest) |
@@ -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 | |||
} |
@@ -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 |