|
|
|
@@ -7,6 +7,7 @@ package models |
|
|
|
import ( |
|
|
|
"fmt" |
|
|
|
"path" |
|
|
|
"regexp" |
|
|
|
"sort" |
|
|
|
"strings" |
|
|
|
|
|
|
|
@@ -54,6 +55,19 @@ type Issue struct { |
|
|
|
Reactions ReactionList `xorm:"-"` |
|
|
|
} |
|
|
|
|
|
|
|
var ( |
|
|
|
issueTasksPat *regexp.Regexp |
|
|
|
issueTasksDonePat *regexp.Regexp |
|
|
|
) |
|
|
|
|
|
|
|
const issueTasksRegexpStr = `(^\s*-\s\[[\sx]\]\s)|(\n\s*-\s\[[\sx]\]\s)` |
|
|
|
const issueTasksDoneRegexpStr = `(^\s*-\s\[[x]\]\s)|(\n\s*-\s\[[x]\]\s)` |
|
|
|
|
|
|
|
func init() { |
|
|
|
issueTasksPat = regexp.MustCompile(issueTasksRegexpStr) |
|
|
|
issueTasksDonePat = regexp.MustCompile(issueTasksDoneRegexpStr) |
|
|
|
} |
|
|
|
|
|
|
|
func (issue *Issue) loadRepo(e Engine) (err error) { |
|
|
|
if issue.Repo == nil { |
|
|
|
issue.Repo, err = getRepositoryByID(e, issue.RepoID) |
|
|
|
@@ -741,6 +755,7 @@ func AddDeletePRBranchComment(doer *User, repo *Repository, issueID int64, branc |
|
|
|
func (issue *Issue) ChangeContent(doer *User, content string) (err error) { |
|
|
|
oldContent := issue.Content |
|
|
|
issue.Content = content |
|
|
|
|
|
|
|
if err = UpdateIssueCols(issue, "content"); err != nil { |
|
|
|
return fmt.Errorf("UpdateIssueCols: %v", err) |
|
|
|
} |
|
|
|
@@ -818,6 +833,16 @@ func (issue *Issue) ChangeAssignee(doer *User, assigneeID int64) (err error) { |
|
|
|
return nil |
|
|
|
} |
|
|
|
|
|
|
|
// GetTasks returns the amount of tasks in the issues content |
|
|
|
func (issue *Issue) GetTasks() int { |
|
|
|
return len(issueTasksPat.FindAllStringIndex(issue.Content, -1)) |
|
|
|
} |
|
|
|
|
|
|
|
// GetTasksDone returns the amount of completed tasks in the issues content |
|
|
|
func (issue *Issue) GetTasksDone() int { |
|
|
|
return len(issueTasksDonePat.FindAllStringIndex(issue.Content, -1)) |
|
|
|
} |
|
|
|
|
|
|
|
// NewIssueOptions represents the options of a new issue. |
|
|
|
type NewIssueOptions struct { |
|
|
|
Repo *Repository |
|
|
|
|