From 4dc6285715ccd1e90cb4e437a3c2b1d0b13d47cb Mon Sep 17 00:00:00 2001
From: Unknwon <u@gogs.io>
Date: Sun, 18 Oct 2015 17:18:45 -0400
Subject: [PATCH] add new status: checking

---
 gogs.go              |  2 +-
 models/issue.go      | 20 ++++++++++++++++----
 routers/repo/pull.go |  2 +-
 templates/.VERSION   |  2 +-
 4 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/gogs.go b/gogs.go
index a7d44a2aa..8abca9f50 100644
--- a/gogs.go
+++ b/gogs.go
@@ -17,7 +17,7 @@ import (
 	"github.com/gogits/gogs/modules/setting"
 )
 
-const APP_VER = "0.6.16.1017 Beta"
+const APP_VER = "0.6.16.1018 Beta"
 
 func init() {
 	runtime.GOMAXPROCS(runtime.NumCPU())
diff --git a/models/issue.go b/models/issue.go
index 0dd0b6637..5357cbf7b 100644
--- a/models/issue.go
+++ b/models/issue.go
@@ -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)
 		}
diff --git a/routers/repo/pull.go b/routers/repo/pull.go
index 40c83351c..13236a219 100644
--- a/routers/repo/pull.go
+++ b/routers/repo/pull.go
@@ -374,7 +374,7 @@ func MergePullRequest(ctx *middleware.Context) {
 		return
 	}
 
-	if !pr.CanAutoMerge || pr.HasMerged {
+	if !pr.CanAutoMerge() || pr.HasMerged {
 		ctx.Handle(404, "MergePullRequest", nil)
 		return
 	}
diff --git a/templates/.VERSION b/templates/.VERSION
index ddb56b4d0..df1adfbcb 100644
--- a/templates/.VERSION
+++ b/templates/.VERSION
@@ -1 +1 @@
-0.6.16.1017 Beta
\ No newline at end of file
+0.6.16.1018 Beta
\ No newline at end of file