@@ -218,23 +218,39 @@ func AddTestPullRequestTask(doer *models.User, repoID int64, branch string, isSy
218
218
func PushToBaseRepo (pr * models.PullRequest ) (err error ) {
219
219
log .Trace ("PushToBaseRepo[%d]: pushing commits to base repo '%s'" , pr .BaseRepoID , pr .GetGitRefName ())
220
220
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
+
221
234
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 )
223
246
if err != nil {
224
247
return fmt .Errorf ("OpenRepository: %v" , err )
225
248
}
226
- defer headGitRepo .Close ()
227
249
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 )
231
252
}
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 ()
238
254
239
255
headFile := pr .GetGitRefName ()
240
256
@@ -250,14 +266,14 @@ func PushToBaseRepo(pr *models.PullRequest) (err error) {
250
266
return fmt .Errorf ("unable to load poster %d for pr %d: %v" , pr .Issue .PosterID , pr .ID , err )
251
267
}
252
268
253
- if err = git .Push (headRepoPath , git.PushOptions {
254
- Remote : tmpRemoteName ,
269
+ if err = git .Push (tmpBasePath , git.PushOptions {
270
+ Remote : "base" ,
255
271
Branch : fmt .Sprintf ("%s:%s" , pr .HeadBranch , headFile ),
256
272
Force : true ,
257
273
// Use InternalPushingEnvironment here because we know that pre-receive and post-receive do not run on a refs/pulls/...
258
274
Env : models .InternalPushingEnvironment (pr .Issue .Poster , pr .BaseRepo ),
259
275
}); 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 )
261
277
}
262
278
263
279
return nil
0 commit comments