@@ -414,35 +414,53 @@ func MergePullRequest(ctx *middleware.Context) {
414
414
}
415
415
416
416
func ParseCompareInfo (ctx * middleware.Context ) (* models.User , * models.Repository , * git.Repository , * git.PullRequestInfo , string , string ) {
417
- // Get compare branch information.
417
+ // Get compared branches information
418
+ // format: <base branch>...[<head repo>:]<head branch>
419
+ // base<-head: master...head:feature
420
+ // same repo: master...feature
418
421
infos := strings .Split (ctx .Params ("*" ), "..." )
419
422
if len (infos ) != 2 {
423
+ log .Trace ("Not enough compared branches information: %s" , infos )
420
424
ctx .Handle (404 , "CompareAndPullRequest" , nil )
421
425
return nil , nil , nil , nil , "" , ""
422
426
}
423
427
424
428
baseBranch := infos [0 ]
425
429
ctx .Data ["BaseBranch" ] = baseBranch
426
430
431
+ var (
432
+ headUser * models.User
433
+ headBranch string
434
+ isSameRepo bool
435
+ err error
436
+ )
437
+
438
+ // If there is no head repository, it means pull request between same repository.
427
439
headInfos := strings .Split (infos [1 ], ":" )
428
- if len (headInfos ) != 2 {
429
- ctx .Handle (404 , "CompareAndPullRequest" , nil )
430
- return nil , nil , nil , nil , "" , ""
431
- }
432
- headUsername := headInfos [0 ]
433
- headBranch := headInfos [1 ]
434
- ctx .Data ["HeadBranch" ] = headBranch
440
+ if len (headInfos ) == 1 {
441
+ isSameRepo = true
442
+ headUser = ctx .Repo .Owner
443
+ headBranch = headInfos [0 ]
435
444
436
- headUser , err := models .GetUserByName (headUsername )
437
- if err != nil {
438
- if models .IsErrUserNotExist (err ) {
439
- ctx .Handle (404 , "GetUserByName" , nil )
440
- } else {
441
- ctx .Handle (500 , "GetUserByName" , err )
445
+ } else if len (headInfos ) == 2 {
446
+ headUser , err = models .GetUserByName (headInfos [0 ])
447
+ if err != nil {
448
+ if models .IsErrUserNotExist (err ) {
449
+ ctx .Handle (404 , "GetUserByName" , nil )
450
+ } else {
451
+ ctx .Handle (500 , "GetUserByName" , err )
452
+ }
453
+ return nil , nil , nil , nil , "" , ""
442
454
}
455
+ headBranch = headInfos [1 ]
456
+
457
+ } else {
458
+ ctx .Handle (404 , "CompareAndPullRequest" , nil )
443
459
return nil , nil , nil , nil , "" , ""
444
460
}
445
461
ctx .Data ["HeadUser" ] = headUser
462
+ ctx .Data ["HeadBranch" ] = headBranch
463
+ ctx .Data ["IsBetweenBranches" ] = isSameRepo
446
464
447
465
repo := ctx .Repo .Repository
448
466
@@ -452,17 +470,23 @@ func ParseCompareInfo(ctx *middleware.Context) (*models.User, *models.Repository
452
470
return nil , nil , nil , nil , "" , ""
453
471
}
454
472
455
- // Check if current user has fork of repository.
473
+ // Check if current user has fork of repository or in the same repository .
456
474
headRepo , has := models .HasForkedRepo (headUser .Id , repo .ID )
457
- if ! has || (! ctx .User .IsAdminOfRepo (headRepo ) && ! ctx .User .IsAdmin ) {
475
+ if ( ! has && ! isSameRepo ) || (! ctx .User .CanWriteTo (headRepo ) && ! ctx .User .IsAdmin ) {
458
476
ctx .Handle (404 , "HasForkedRepo" , nil )
459
477
return nil , nil , nil , nil , "" , ""
460
478
}
461
479
462
- headGitRepo , err := git .OpenRepository (models .RepoPath (headUser .Name , headRepo .Name ))
463
- if err != nil {
464
- ctx .Handle (500 , "OpenRepository" , err )
465
- return nil , nil , nil , nil , "" , ""
480
+ var headGitRepo * git.Repository
481
+ if isSameRepo {
482
+ headRepo = ctx .Repo .Repository
483
+ headGitRepo = ctx .Repo .GitRepo
484
+ } else {
485
+ headGitRepo , err = git .OpenRepository (models .RepoPath (headUser .Name , headRepo .Name ))
486
+ if err != nil {
487
+ ctx .Handle (500 , "OpenRepository" , err )
488
+ return nil , nil , nil , nil , "" , ""
489
+ }
466
490
}
467
491
468
492
// Check if head branch is valid.
@@ -648,8 +672,7 @@ func CompareAndPullRequestPost(ctx *middleware.Context, form auth.CreateIssueFor
648
672
if err := models .NewPullRequest (repo , pullIssue , labelIDs , attachments , pullRequest , patch ); err != nil {
649
673
ctx .Handle (500 , "NewPullRequest" , err )
650
674
return
651
- }
652
- if err := pullRequest .PushToBaseRepo (); err != nil {
675
+ } else if err := pullRequest .PushToBaseRepo (); err != nil {
653
676
ctx .Handle (500 , "PushToBaseRepo" , err )
654
677
return
655
678
}
0 commit comments