Skip to content

Commit 4b11f96

Browse files
authored
PRs: Move to use a temporary repo for pushing new prs (#10009) (#10042)
* Move to use a temporary repo for pushing new prs
1 parent 1e73dd2 commit 4b11f96

File tree

1 file changed

+30
-14
lines changed

1 file changed

+30
-14
lines changed

services/pull/pull.go

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -218,23 +218,39 @@ func AddTestPullRequestTask(doer *models.User, repoID int64, branch string, isSy
218218
func PushToBaseRepo(pr *models.PullRequest) (err error) {
219219
log.Trace("PushToBaseRepo[%d]: pushing commits to base repo '%s'", pr.BaseRepoID, pr.GetGitRefName())
220220

221+
// Clone base repo.
222+
tmpBasePath, err := models.CreateTemporaryPath("pull")
223+
if err != nil {
224+
log.Error("CreateTemporaryPath: %v", err)
225+
return err
226+
}
227+
defer func() {
228+
err := models.RemoveTemporaryPath(tmpBasePath)
229+
if err != nil {
230+
log.Error("Error whilst removing temporary path: %s Error: %v", tmpBasePath, err)
231+
}
232+
}()
233+
221234
headRepoPath := pr.HeadRepo.RepoPath()
222-
headGitRepo, err := git.OpenRepository(headRepoPath)
235+
236+
if err := git.Clone(headRepoPath, tmpBasePath, git.CloneRepoOptions{
237+
Bare: true,
238+
Shared: true,
239+
Branch: pr.HeadBranch,
240+
Quiet: true,
241+
}); err != nil {
242+
log.Error("git clone tmpBasePath: %v", err)
243+
return err
244+
}
245+
gitRepo, err := git.OpenRepository(tmpBasePath)
223246
if err != nil {
224247
return fmt.Errorf("OpenRepository: %v", err)
225248
}
226-
defer headGitRepo.Close()
227249

228-
tmpRemoteName := fmt.Sprintf("tmp-pull-%d", pr.ID)
229-
if err = headGitRepo.AddRemote(tmpRemoteName, pr.BaseRepo.RepoPath(), false); err != nil {
230-
return fmt.Errorf("headGitRepo.AddRemote: %v", err)
250+
if err := gitRepo.AddRemote("base", pr.BaseRepo.RepoPath(), false); err != nil {
251+
return fmt.Errorf("tmpGitRepo.AddRemote: %v", err)
231252
}
232-
// Make sure to remove the remote even if the push fails
233-
defer func() {
234-
if err := headGitRepo.RemoveRemote(tmpRemoteName); err != nil {
235-
log.Error("PushToBaseRepo: RemoveRemote: %s", err)
236-
}
237-
}()
253+
defer gitRepo.Close()
238254

239255
headFile := pr.GetGitRefName()
240256

@@ -250,14 +266,14 @@ func PushToBaseRepo(pr *models.PullRequest) (err error) {
250266
return fmt.Errorf("unable to load poster %d for pr %d: %v", pr.Issue.PosterID, pr.ID, err)
251267
}
252268

253-
if err = git.Push(headRepoPath, git.PushOptions{
254-
Remote: tmpRemoteName,
269+
if err = git.Push(tmpBasePath, git.PushOptions{
270+
Remote: "base",
255271
Branch: fmt.Sprintf("%s:%s", pr.HeadBranch, headFile),
256272
Force: true,
257273
// Use InternalPushingEnvironment here because we know that pre-receive and post-receive do not run on a refs/pulls/...
258274
Env: models.InternalPushingEnvironment(pr.Issue.Poster, pr.BaseRepo),
259275
}); err != nil {
260-
return fmt.Errorf("Push: %v", err)
276+
return fmt.Errorf("Push: %s:%s %s:%s %v", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), headFile, err)
261277
}
262278

263279
return nil

0 commit comments

Comments
 (0)