|
@@ -904,10 +904,18 @@ func UpdateIssueUsersByMentions(uids []int64, iid int64) error {
|
|
|
type PullRequestType int
|
|
|
|
|
|
const (
|
|
|
- PULL_REQUEST_GOGS = iota
|
|
|
+ PULL_REQUEST_GOGS PullRequestType = iota
|
|
|
PLLL_ERQUEST_GIT
|
|
|
)
|
|
|
|
|
|
+type PullRequestStatus int
|
|
|
+
|
|
|
+const (
|
|
|
+ PULL_REQUEST_STATUS_CONFLICT PullRequestStatus = iota
|
|
|
+ PULL_REQUEST_STATUS_CHECKING
|
|
|
+ PULL_REQUEST_STATUS_MERGEABLE
|
|
|
+)
|
|
|
+
|
|
|
// PullRequest represents relation between pull request and repositories.
|
|
|
type PullRequest struct {
|
|
|
ID int64 `xorm:"pk autoincr"`
|
|
@@ -923,7 +931,7 @@ type PullRequest struct {
|
|
|
MergeBase string `xorm:"VARCHAR(40)"`
|
|
|
MergedCommitID string `xorm:"VARCHAR(40)"`
|
|
|
Type PullRequestType
|
|
|
- CanAutoMerge bool
|
|
|
+ Status PullRequestStatus
|
|
|
HasMerged bool
|
|
|
Merged time.Time
|
|
|
MergerID int64
|
|
@@ -963,6 +971,10 @@ func (pr *PullRequest) AfterSet(colName string, _ xorm.Cell) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+func (pr *PullRequest) CanAutoMerge() bool {
|
|
|
+ return pr.Status == PULL_REQUEST_STATUS_MERGEABLE
|
|
|
+}
|
|
|
+
|
|
|
// Merge merges pull request to base repository.
|
|
|
func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository) (err error) {
|
|
|
sess := x.NewSession()
|
|
@@ -1076,13 +1088,13 @@ func NewPullRequest(repo *Repository, pull *Issue, labelIDs []int64, uuids []str
|
|
|
return fmt.Errorf("save patch: %v", err)
|
|
|
}
|
|
|
|
|
|
- pr.CanAutoMerge = true
|
|
|
+ pr.Status = PULL_REQUEST_STATUS_MERGEABLE
|
|
|
_, stderr, err := process.ExecDir(-1, repo.LocalCopyPath(),
|
|
|
fmt.Sprintf("NewPullRequest(git apply --check): %d", repo.ID),
|
|
|
"git", "apply", "--check", patchPath)
|
|
|
if err != nil {
|
|
|
if strings.Contains(stderr, "patch does not apply") {
|
|
|
- pr.CanAutoMerge = false
|
|
|
+ pr.Status = PULL_REQUEST_STATUS_CONFLICT
|
|
|
} else {
|
|
|
return fmt.Errorf("git apply --check: %v - %s", err, stderr)
|
|
|
}
|