@@ -311,23 +311,39 @@ func checkIfPRContentChanged(pr *models.PullRequest, oldCommitID, newCommitID st
311
311
func PushToBaseRepo (pr * models.PullRequest ) (err error ) {
312
312
log .Trace ("PushToBaseRepo[%d]: pushing commits to base repo '%s'" , pr .BaseRepoID , pr .GetGitRefName ())
313
313
314
+ // Clone base repo.
315
+ tmpBasePath , err := models .CreateTemporaryPath ("pull" )
316
+ if err != nil {
317
+ log .Error ("CreateTemporaryPath: %v" , err )
318
+ return err
319
+ }
320
+ defer func () {
321
+ err := models .RemoveTemporaryPath (tmpBasePath )
322
+ if err != nil {
323
+ log .Error ("Error whilst removing temporary path: %s Error: %v" , tmpBasePath , err )
324
+ }
325
+ }()
326
+
314
327
headRepoPath := pr .HeadRepo .RepoPath ()
315
- headGitRepo , err := git .OpenRepository (headRepoPath )
328
+
329
+ if err := git .Clone (headRepoPath , tmpBasePath , git.CloneRepoOptions {
330
+ Bare : true ,
331
+ Shared : true ,
332
+ Branch : pr .HeadBranch ,
333
+ Quiet : true ,
334
+ }); err != nil {
335
+ log .Error ("git clone tmpBasePath: %v" , err )
336
+ return err
337
+ }
338
+ gitRepo , err := git .OpenRepository (tmpBasePath )
316
339
if err != nil {
317
340
return fmt .Errorf ("OpenRepository: %v" , err )
318
341
}
319
- defer headGitRepo .Close ()
320
342
321
- tmpRemoteName := fmt .Sprintf ("tmp-pull-%d" , pr .ID )
322
- if err = headGitRepo .AddRemote (tmpRemoteName , pr .BaseRepo .RepoPath (), false ); err != nil {
323
- return fmt .Errorf ("headGitRepo.AddRemote: %v" , err )
343
+ if err := gitRepo .AddRemote ("base" , pr .BaseRepo .RepoPath (), false ); err != nil {
344
+ return fmt .Errorf ("tmpGitRepo.AddRemote: %v" , err )
324
345
}
325
- // Make sure to remove the remote even if the push fails
326
- defer func () {
327
- if err := headGitRepo .RemoveRemote (tmpRemoteName ); err != nil {
328
- log .Error ("PushToBaseRepo: RemoveRemote: %s" , err )
329
- }
330
- }()
346
+ defer gitRepo .Close ()
331
347
332
348
headFile := pr .GetGitRefName ()
333
349
@@ -343,14 +359,14 @@ func PushToBaseRepo(pr *models.PullRequest) (err error) {
343
359
return fmt .Errorf ("unable to load poster %d for pr %d: %v" , pr .Issue .PosterID , pr .ID , err )
344
360
}
345
361
346
- if err = git .Push (headRepoPath , git.PushOptions {
347
- Remote : tmpRemoteName ,
362
+ if err = git .Push (tmpBasePath , git.PushOptions {
363
+ Remote : "base" ,
348
364
Branch : fmt .Sprintf ("%s:%s" , pr .HeadBranch , headFile ),
349
365
Force : true ,
350
366
// Use InternalPushingEnvironment here because we know that pre-receive and post-receive do not run on a refs/pulls/...
351
367
Env : models .InternalPushingEnvironment (pr .Issue .Poster , pr .BaseRepo ),
352
368
}); err != nil {
353
- return fmt .Errorf ("Push: %v" , err )
369
+ return fmt .Errorf ("Push: %s:%s %s:%s %v" , pr . HeadRepo . FullName (), pr . HeadBranch , pr . BaseRepo . FullName (), headFile , err )
354
370
}
355
371
356
372
return nil
0 commit comments