@@ -414,35 +414,53 @@ func MergePullRequest(ctx *middleware.Context) {
414414}
415415
416416func 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
418421 infos := strings .Split (ctx .Params ("*" ), "..." )
419422 if len (infos ) != 2 {
423+ log .Trace ("Not enough compared branches information: %s" , infos )
420424 ctx .Handle (404 , "CompareAndPullRequest" , nil )
421425 return nil , nil , nil , nil , "" , ""
422426 }
423427
424428 baseBranch := infos [0 ]
425429 ctx .Data ["BaseBranch" ] = baseBranch
426430
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.
427439 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 ]
435444
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 , "" , ""
442454 }
455+ headBranch = headInfos [1 ]
456+
457+ } else {
458+ ctx .Handle (404 , "CompareAndPullRequest" , nil )
443459 return nil , nil , nil , nil , "" , ""
444460 }
445461 ctx .Data ["HeadUser" ] = headUser
462+ ctx .Data ["HeadBranch" ] = headBranch
463+ ctx .Data ["IsBetweenBranches" ] = isSameRepo
446464
447465 repo := ctx .Repo .Repository
448466
@@ -452,17 +470,23 @@ func ParseCompareInfo(ctx *middleware.Context) (*models.User, *models.Repository
452470 return nil , nil , nil , nil , "" , ""
453471 }
454472
455- // Check if current user has fork of repository.
473+ // Check if current user has fork of repository or in the same repository .
456474 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 ) {
458476 ctx .Handle (404 , "HasForkedRepo" , nil )
459477 return nil , nil , nil , nil , "" , ""
460478 }
461479
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+ }
466490 }
467491
468492 // Check if head branch is valid.
@@ -648,8 +672,7 @@ func CompareAndPullRequestPost(ctx *middleware.Context, form auth.CreateIssueFor
648672 if err := models .NewPullRequest (repo , pullIssue , labelIDs , attachments , pullRequest , patch ); err != nil {
649673 ctx .Handle (500 , "NewPullRequest" , err )
650674 return
651- }
652- if err := pullRequest .PushToBaseRepo (); err != nil {
675+ } else if err := pullRequest .PushToBaseRepo (); err != nil {
653676 ctx .Handle (500 , "PushToBaseRepo" , err )
654677 return
655678 }
0 commit comments