2020-01-17 09:03:40 +03:00
// Copyright 2020 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package pull
import (
"fmt"
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/log"
)
// Update updates pull request with base branch.
func Update ( pull * models . PullRequest , doer * models . User , message string ) error {
//use merge functions but switch repo's and branch's
pr := & models . PullRequest {
HeadRepoID : pull . BaseRepoID ,
BaseRepoID : pull . HeadRepoID ,
HeadBranch : pull . BaseBranch ,
BaseBranch : pull . HeadBranch ,
}
if err := pr . LoadHeadRepo ( ) ; err != nil {
log . Error ( "LoadHeadRepo: %v" , err )
return fmt . Errorf ( "LoadHeadRepo: %v" , err )
} else if err = pr . LoadBaseRepo ( ) ; err != nil {
log . Error ( "LoadBaseRepo: %v" , err )
return fmt . Errorf ( "LoadBaseRepo: %v" , err )
}
diffCount , err := GetDiverging ( pull )
if err != nil {
return err
} else if diffCount . Behind == 0 {
return fmt . Errorf ( "HeadBranch of PR %d is up to date" , pull . Index )
}
2020-02-10 02:09:31 +03:00
_ , err = rawMerge ( pr , doer , models . MergeStyleMerge , message )
2020-01-17 09:03:40 +03:00
defer func ( ) {
go AddTestPullRequestTask ( doer , pr . HeadRepo . ID , pr . HeadBranch , false , "" , "" )
} ( )
2020-02-10 02:09:31 +03:00
return err
2020-01-17 09:03:40 +03:00
}
// IsUserAllowedToUpdate check if user is allowed to update PR with given permissions and branch protections
func IsUserAllowedToUpdate ( pull * models . PullRequest , user * models . User ) ( bool , error ) {
headRepoPerm , err := models . GetUserRepoPermission ( pull . HeadRepo , user )
if err != nil {
return false , err
}
pr := & models . PullRequest {
HeadRepoID : pull . BaseRepoID ,
BaseRepoID : pull . HeadRepoID ,
HeadBranch : pull . BaseBranch ,
BaseBranch : pull . HeadBranch ,
}
2020-05-17 03:48:30 +03:00
err = pr . LoadProtectedBranch ( )
if err != nil {
return false , err
}
// Update function need push permission
if pr . ProtectedBranch != nil && ! pr . ProtectedBranch . CanUserPush ( user . ID ) {
return false , nil
}
2020-01-17 09:03:40 +03:00
return IsUserAllowedToMerge ( pr , headRepoPerm , user )
}
// GetDiverging determines how many commits a PR is ahead or behind the PR base branch
func GetDiverging ( pr * models . PullRequest ) ( * git . DivergeObject , error ) {
2020-04-01 22:03:08 +03:00
log . Trace ( "GetDiverging[%d]: compare commits" , pr . ID )
2020-01-17 09:03:40 +03:00
if err := pr . LoadBaseRepo ( ) ; err != nil {
return nil , err
}
if err := pr . LoadHeadRepo ( ) ; err != nil {
return nil , err
}
2020-04-01 22:03:08 +03:00
tmpRepo , err := createTemporaryRepo ( pr )
2020-01-17 09:03:40 +03:00
if err != nil {
2020-04-01 22:03:08 +03:00
log . Error ( "CreateTemporaryPath: %v" , err )
return nil , err
2020-01-17 09:03:40 +03:00
}
defer func ( ) {
2020-04-01 22:03:08 +03:00
if err := models . RemoveTemporaryPath ( tmpRepo ) ; err != nil {
log . Error ( "Merge: RemoveTemporaryPath: %s" , err )
2020-01-17 09:03:40 +03:00
}
} ( )
2020-04-01 22:03:08 +03:00
diff , err := git . GetDivergingCommits ( tmpRepo , "base" , "tracking" )
return & diff , err
2020-01-17 09:03:40 +03:00
}