mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 05:11:41 +01:00 
			
		
		
		
	models/action.go: add action reopen for #462
- models/issue.go: format comment type names
This commit is contained in:
		
							parent
							
								
									afccd0a3ee
								
							
						
					
					
						commit
						5a99e9a37b
					
				| @ -41,13 +41,20 @@ var ( | ||||
| 
 | ||||
| var ( | ||||
| 	// Same as Github. See https://help.github.com/articles/closing-issues-via-commit-messages | ||||
| 	IssueCloseKeywords        = []string{"close", "closes", "closed", "fix", "fixes", "fixed", "resolve", "resolves", "resolved"} | ||||
| 	IssueCloseKeywordsPat     *regexp.Regexp | ||||
| 	IssueReferenceKeywordsPat *regexp.Regexp | ||||
| 	IssueCloseKeywords  = []string{"close", "closes", "closed", "fix", "fixes", "fixed", "resolve", "resolves", "resolved"} | ||||
| 	IssueReopenKeywords = []string{"reopen", "reopens", "reopened"} | ||||
| 
 | ||||
| 	IssueCloseKeywordsPat, IssueReopenKeywordsPat *regexp.Regexp | ||||
| 	IssueReferenceKeywordsPat                     *regexp.Regexp | ||||
| ) | ||||
| 
 | ||||
| func assembleKeywordsPattern(words []string) string { | ||||
| 	return fmt.Sprintf(`(?i)(?:%s) \S+`, strings.Join(words, "|")) | ||||
| } | ||||
| 
 | ||||
| func init() { | ||||
| 	IssueCloseKeywordsPat = regexp.MustCompile(fmt.Sprintf(`(?i)(?:%s) \S+`, strings.Join(IssueCloseKeywords, "|"))) | ||||
| 	IssueCloseKeywordsPat = regexp.MustCompile(assembleKeywordsPattern(IssueCloseKeywords)) | ||||
| 	IssueReopenKeywordsPat = regexp.MustCompile(assembleKeywordsPattern(IssueReopenKeywords)) | ||||
| 	IssueReferenceKeywordsPat = regexp.MustCompile(`(?i)(?:)(^| )\S+`) | ||||
| } | ||||
| 
 | ||||
| @ -112,11 +119,9 @@ func (a Action) GetIssueInfos() []string { | ||||
| 
 | ||||
| func updateIssuesCommit(userId, repoId int64, repoUserName, repoName string, commits []*base.PushCommit) error { | ||||
| 	for _, c := range commits { | ||||
| 		references := IssueReferenceKeywordsPat.FindAllString(c.Message, -1) | ||||
| 
 | ||||
| 		// FIXME: should not be a reference when it comes with action. | ||||
| 		// e.g. fixes #1 will not have duplicated reference message. | ||||
| 		for _, ref := range references { | ||||
| 		for _, ref := range IssueReferenceKeywordsPat.FindAllString(c.Message, -1) { | ||||
| 			ref := ref[strings.IndexByte(ref, byte(' '))+1:] | ||||
| 			ref = strings.TrimRightFunc(ref, func(c rune) bool { | ||||
| 				return !unicode.IsDigit(c) | ||||
| @ -137,22 +142,18 @@ func updateIssuesCommit(userId, repoId int64, repoUserName, repoName string, com | ||||
| 			} | ||||
| 
 | ||||
| 			issue, err := GetIssueByRef(ref) | ||||
| 
 | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 
 | ||||
| 			url := fmt.Sprintf("%s/%s/%s/commit/%s", setting.AppSubUrl, repoUserName, repoName, c.Sha1) | ||||
| 			message := fmt.Sprintf(`<a href="%s">%s</a>`, url, c.Message) | ||||
| 
 | ||||
| 			if _, err = CreateComment(userId, issue.RepoId, issue.Id, 0, 0, COMMIT, message, nil); err != nil { | ||||
| 			if _, err = CreateComment(userId, issue.RepoId, issue.Id, 0, 0, COMMENT_TYPE_COMMIT, message, nil); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		closes := IssueCloseKeywordsPat.FindAllString(c.Message, -1) | ||||
| 
 | ||||
| 		for _, ref := range closes { | ||||
| 		for _, ref := range IssueCloseKeywordsPat.FindAllString(c.Message, -1) { | ||||
| 			ref := ref[strings.IndexByte(ref, byte(' '))+1:] | ||||
| 			ref = strings.TrimRightFunc(ref, func(c rune) bool { | ||||
| 				return !unicode.IsDigit(c) | ||||
| @ -173,7 +174,6 @@ func updateIssuesCommit(userId, repoId int64, repoUserName, repoName string, com | ||||
| 			} | ||||
| 
 | ||||
| 			issue, err := GetIssueByRef(ref) | ||||
| 
 | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| @ -182,7 +182,6 @@ func updateIssuesCommit(userId, repoId int64, repoUserName, repoName string, com | ||||
| 				if issue.IsClosed { | ||||
| 					continue | ||||
| 				} | ||||
| 
 | ||||
| 				issue.IsClosed = true | ||||
| 
 | ||||
| 				if err = UpdateIssue(issue); err != nil { | ||||
| @ -196,14 +195,60 @@ func updateIssuesCommit(userId, repoId int64, repoUserName, repoName string, com | ||||
| 				} | ||||
| 
 | ||||
| 				// If commit happened in the referenced repository, it means the issue can be closed. | ||||
| 				if _, err = CreateComment(userId, repoId, issue.Id, 0, 0, CLOSE, "", nil); err != nil { | ||||
| 				if _, err = CreateComment(userId, repoId, issue.Id, 0, 0, COMMENT_TYPE_CLOSE, "", nil); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 	} | ||||
| 		for _, ref := range IssueReopenKeywordsPat.FindAllString(c.Message, -1) { | ||||
| 			ref := ref[strings.IndexByte(ref, byte(' '))+1:] | ||||
| 			ref = strings.TrimRightFunc(ref, func(c rune) bool { | ||||
| 				return !unicode.IsDigit(c) | ||||
| 			}) | ||||
| 
 | ||||
| 			if len(ref) == 0 { | ||||
| 				continue | ||||
| 			} | ||||
| 
 | ||||
| 			// Add repo name if missing | ||||
| 			if ref[0] == '#' { | ||||
| 				ref = fmt.Sprintf("%s/%s%s", repoUserName, repoName, ref) | ||||
| 			} else if strings.Contains(ref, "/") == false { | ||||
| 				// We don't support User#ID syntax yet | ||||
| 				// return ErrNotImplemented | ||||
| 
 | ||||
| 				continue | ||||
| 			} | ||||
| 
 | ||||
| 			issue, err := GetIssueByRef(ref) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 
 | ||||
| 			if issue.RepoId == repoId { | ||||
| 				if !issue.IsClosed { | ||||
| 					continue | ||||
| 				} | ||||
| 				issue.IsClosed = false | ||||
| 
 | ||||
| 				if err = UpdateIssue(issue); err != nil { | ||||
| 					return err | ||||
| 				} else if err = UpdateIssueUserPairsByStatus(issue.Id, issue.IsClosed); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 
 | ||||
| 				if err = ChangeMilestoneIssueStats(issue); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 
 | ||||
| 				// If commit happened in the referenced repository, it means the issue can be closed. | ||||
| 				if _, err = CreateComment(userId, repoId, issue.Id, 0, 0, COMMENT_TYPE_REOPEN, "", nil); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -859,22 +859,16 @@ type CommentType int | ||||
| 
 | ||||
| const ( | ||||
| 	// Plain comment, can be associated with a commit (CommitId > 0) and a line (Line > 0) | ||||
| 	COMMENT CommentType = iota | ||||
| 
 | ||||
| 	// Reopen action | ||||
| 	REOPEN | ||||
| 
 | ||||
| 	// Close action | ||||
| 	CLOSE | ||||
| 
 | ||||
| 	// Reference from another issue | ||||
| 	ISSUE | ||||
| 	COMMENT_TYPE_COMMENT CommentType = iota | ||||
| 	COMMENT_TYPE_REOPEN | ||||
| 	COMMENT_TYPE_CLOSE | ||||
| 
 | ||||
| 	// References. | ||||
| 	COMMENT_TYPE_ISSUE | ||||
| 	// Reference from some commit (not part of a pull request) | ||||
| 	COMMIT | ||||
| 
 | ||||
| 	COMMENT_TYPE_COMMIT | ||||
| 	// Reference from some pull request | ||||
| 	PULL | ||||
| 	COMMENT_TYPE_PULL | ||||
| ) | ||||
| 
 | ||||
| // Comment represents a comment in commit and issue page. | ||||
| @ -908,7 +902,7 @@ func CreateComment(userId, repoId, issueId, commitId, line int64, cmtType Commen | ||||
| 
 | ||||
| 	// Check comment type. | ||||
| 	switch cmtType { | ||||
| 	case COMMENT: | ||||
| 	case COMMENT_TYPE_COMMENT: | ||||
| 		rawSql := "UPDATE `issue` SET num_comments = num_comments + 1 WHERE id = ?" | ||||
| 		if _, err := sess.Exec(rawSql, issueId); err != nil { | ||||
| 			sess.Rollback() | ||||
| @ -929,13 +923,13 @@ func CreateComment(userId, repoId, issueId, commitId, line int64, cmtType Commen | ||||
| 				return nil, err | ||||
| 			} | ||||
| 		} | ||||
| 	case REOPEN: | ||||
| 	case COMMENT_TYPE_REOPEN: | ||||
| 		rawSql := "UPDATE `repository` SET num_closed_issues = num_closed_issues - 1 WHERE id = ?" | ||||
| 		if _, err := sess.Exec(rawSql, repoId); err != nil { | ||||
| 			sess.Rollback() | ||||
| 			return nil, err | ||||
| 		} | ||||
| 	case CLOSE: | ||||
| 	case COMMENT_TYPE_CLOSE: | ||||
| 		rawSql := "UPDATE `repository` SET num_closed_issues = num_closed_issues + 1 WHERE id = ?" | ||||
| 		if _, err := sess.Exec(rawSql, repoId); err != nil { | ||||
| 			sess.Rollback() | ||||
|  | ||||
| @ -424,7 +424,7 @@ func ViewIssue(ctx *middleware.Context) { | ||||
| 		} | ||||
| 		comments[i].Poster = u | ||||
| 
 | ||||
| 		if comments[i].Type == models.COMMENT { | ||||
| 		if comments[i].Type == models.COMMENT_TYPE_COMMENT { | ||||
| 			comments[i].Content = string(base.RenderMarkdown([]byte(comments[i].Content), ctx.Repo.RepoLink)) | ||||
| 		} | ||||
| 	} | ||||
| @ -774,9 +774,9 @@ func Comment(ctx *middleware.Context) { | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			cmtType := models.CLOSE | ||||
| 			cmtType := models.COMMENT_TYPE_CLOSE | ||||
| 			if !issue.IsClosed { | ||||
| 				cmtType = models.REOPEN | ||||
| 				cmtType = models.COMMENT_TYPE_REOPEN | ||||
| 			} | ||||
| 
 | ||||
| 			if _, err = models.CreateComment(ctx.User.Id, ctx.Repo.Repository.Id, issue.Id, 0, 0, cmtType, "", nil); err != nil { | ||||
| @ -795,7 +795,7 @@ func Comment(ctx *middleware.Context) { | ||||
| 	if len(content) > 0 || len(ctx.Req.MultipartForm.File["attachments"]) > 0 { | ||||
| 		switch ctx.Params(":action") { | ||||
| 		case "new": | ||||
| 			if comment, err = models.CreateComment(ctx.User.Id, ctx.Repo.Repository.Id, issue.Id, 0, 0, models.COMMENT, content, nil); err != nil { | ||||
| 			if comment, err = models.CreateComment(ctx.User.Id, ctx.Repo.Repository.Id, issue.Id, 0, 0, models.COMMENT_TYPE_COMMENT, content, nil); err != nil { | ||||
| 				send(500, nil, err) | ||||
| 				return | ||||
| 			} | ||||
| @ -1122,18 +1122,18 @@ func IssueGetAttachment(ctx *middleware.Context) { | ||||
| 
 | ||||
| // testing route handler for new issue ui page | ||||
| // todo : move to Issue() function | ||||
| func Issues2(ctx *middleware.Context){ | ||||
| 	ctx.HTML(200,"repo/issue2/list") | ||||
| func Issues2(ctx *middleware.Context) { | ||||
| 	ctx.HTML(200, "repo/issue2/list") | ||||
| } | ||||
| 
 | ||||
| func PullRequest2(ctx *middleware.Context){ | ||||
| 	ctx.HTML(200,"repo/pr2/list") | ||||
| func PullRequest2(ctx *middleware.Context) { | ||||
| 	ctx.HTML(200, "repo/pr2/list") | ||||
| } | ||||
| 
 | ||||
| func Labels2(ctx *middleware.Context){ | ||||
| 	ctx.HTML(200,"repo/issue2/labels") | ||||
| func Labels2(ctx *middleware.Context) { | ||||
| 	ctx.HTML(200, "repo/issue2/labels") | ||||
| } | ||||
| 
 | ||||
| func Milestones2(ctx *middleware.Context){ | ||||
| 	ctx.HTML(200,"repo/milestone2/list") | ||||
| func Milestones2(ctx *middleware.Context) { | ||||
| 	ctx.HTML(200, "repo/milestone2/list") | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user