summaryrefslogtreecommitdiffstats
path: root/models/issue.go
diff options
context:
space:
mode:
Diffstat (limited to 'models/issue.go')
-rw-r--r--models/issue.go121
1 files changed, 72 insertions, 49 deletions
diff --git a/models/issue.go b/models/issue.go
index 1446056e5d..a90ebaf866 100644
--- a/models/issue.go
+++ b/models/issue.go
@@ -73,70 +73,55 @@ func (issue *Issue) BeforeUpdate() {
}
func (issue *Issue) AfterSet(colName string, _ xorm.Cell) {
- var err error
switch colName {
- case "id":
- issue.Attachments, err = GetAttachmentsByIssueID(issue.ID)
- if err != nil {
- log.Error(3, "GetAttachmentsByIssueID[%d]: %v", issue.ID, err)
- }
-
- issue.Comments, err = GetCommentsByIssueID(issue.ID)
- if err != nil {
- log.Error(3, "GetCommentsByIssueID[%d]: %v", issue.ID, err)
- }
+ case "deadline_unix":
+ issue.Deadline = time.Unix(issue.DeadlineUnix, 0).Local()
+ case "created_unix":
+ issue.Created = time.Unix(issue.CreatedUnix, 0).Local()
+ case "updated_unix":
+ issue.Updated = time.Unix(issue.UpdatedUnix, 0).Local()
+ }
+}
- issue.Labels, err = GetLabelsByIssueID(issue.ID)
+func (issue *Issue) loadAttributes(e Engine) (err error) {
+ if issue.Repo == nil {
+ issue.Repo, err = getRepositoryByID(e, issue.RepoID)
if err != nil {
- log.Error(3, "GetLabelsByIssueID[%d]: %v", issue.ID, err)
+ return fmt.Errorf("getRepositoryByID [%d]: %v", issue.RepoID, err)
}
+ }
- case "poster_id":
- issue.Poster, err = GetUserByID(issue.PosterID)
+ if issue.Poster == nil {
+ issue.Poster, err = getUserByID(e, issue.PosterID)
if err != nil {
if IsErrUserNotExist(err) {
issue.PosterID = -1
issue.Poster = NewGhostUser()
} else {
- log.Error(3, "GetUserByID[%d]: %v", issue.ID, err)
+ return fmt.Errorf("getUserByID.(poster) [%d]: %v", issue.PosterID, err)
}
return
}
+ }
- case "milestone_id":
- if issue.MilestoneID == 0 {
- return
- }
-
- issue.Milestone, err = GetMilestoneByRepoID(issue.RepoID, issue.MilestoneID)
+ if issue.Labels == nil {
+ issue.Labels, err = getLabelsByIssueID(e, issue.ID)
if err != nil {
- log.Error(3, "GetMilestoneById[%d]: %v", issue.ID, err)
- }
-
- case "assignee_id":
- if issue.AssigneeID == 0 {
- return
+ return fmt.Errorf("getLabelsByIssueID [%d]: %v", issue.ID, err)
}
+ }
- issue.Assignee, err = GetUserByID(issue.AssigneeID)
+ if issue.Milestone == nil && issue.MilestoneID > 0 {
+ issue.Milestone, err = getMilestoneByRepoID(e, issue.RepoID, issue.MilestoneID)
if err != nil {
- log.Error(3, "GetUserByID[%d]: %v", issue.ID, err)
+ return fmt.Errorf("getMilestoneByRepoID [repo_id: %d, milestone_id: %d]: %v", issue.RepoID, issue.MilestoneID, err)
}
-
- case "deadline_unix":
- issue.Deadline = time.Unix(issue.DeadlineUnix, 0).Local()
- case "created_unix":
- issue.Created = time.Unix(issue.CreatedUnix, 0).Local()
- case "updated_unix":
- issue.Updated = time.Unix(issue.UpdatedUnix, 0).Local()
}
-}
-func (issue *Issue) loadAttributes(e Engine) (err error) {
- if issue.Repo == nil {
- issue.Repo, err = getRepositoryByID(e, issue.RepoID)
+ if issue.Assignee == nil && issue.AssigneeID > 0 {
+ issue.Assignee, err = getUserByID(e, issue.AssigneeID)
if err != nil {
- return fmt.Errorf("getRepositoryByID [%d]: %v", issue.RepoID, err)
+ return fmt.Errorf("getUserByID.(assignee) [%d]: %v", issue.AssigneeID, err)
}
}
@@ -148,6 +133,20 @@ func (issue *Issue) loadAttributes(e Engine) (err error) {
}
}
+ if issue.Attachments == nil {
+ issue.Attachments, err = getAttachmentsByIssueID(e, issue.ID)
+ if err != nil {
+ return fmt.Errorf("getAttachmentsByIssueID [%d]: %v", issue.ID, err)
+ }
+ }
+
+ if issue.Comments == nil {
+ issue.Comments, err = getCommentsByIssueID(e, issue.ID)
+ if err != nil {
+ return fmt.Errorf("getCommentsByIssueID [%d]: %v", issue.ID, err)
+ }
+ }
+
return nil
}
@@ -757,8 +756,8 @@ func GetIssueByRef(ref string) (*Issue, error) {
return issue, issue.LoadAttributes()
}
-// GetIssueByIndex returns issue by given index in repository.
-func GetIssueByIndex(repoID, index int64) (*Issue, error) {
+// GetIssueByIndex returns raw issue without loading attributes by index in a repository.
+func GetRawIssueByIndex(repoID, index int64) (*Issue, error) {
issue := &Issue{
RepoID: repoID,
Index: index,
@@ -769,6 +768,15 @@ func GetIssueByIndex(repoID, index int64) (*Issue, error) {
} else if !has {
return nil, ErrIssueNotExist{0, repoID, index}
}
+ return issue, nil
+}
+
+// GetIssueByIndex returns issue by index in a repository.
+func GetIssueByIndex(repoID, index int64) (*Issue, error) {
+ issue, err := GetRawIssueByIndex(repoID, index)
+ if err != nil {
+ return nil, err
+ }
return issue, issue.LoadAttributes()
}
@@ -868,7 +876,18 @@ func Issues(opts *IssuesOptions) ([]*Issue, error) {
}
issues := make([]*Issue, 0, setting.UI.IssuePagingNum)
- return issues, sess.Find(&issues)
+ if err := sess.Find(&issues); err != nil {
+ return nil, fmt.Errorf("Find: %v", err)
+ }
+
+ // FIXME: use IssueList to improve performance.
+ for i := range issues {
+ if err := issues[i].LoadAttributes(); err != nil {
+ return nil, fmt.Errorf("LoadAttributes [%d]: %v", issues[i].ID, err)
+ }
+ }
+
+ return issues, nil
}
// .___ ____ ___
@@ -1412,7 +1431,7 @@ func getMilestoneByRepoID(e Engine, repoID, id int64) (*Milestone, error) {
return m, nil
}
-// GetWebhookByRepoID returns milestone of repository by given ID.
+// GetWebhookByRepoID returns the milestone in a repository.
func GetMilestoneByRepoID(repoID, id int64) (*Milestone, error) {
return getMilestoneByRepoID(x, repoID, id)
}
@@ -1721,10 +1740,14 @@ func GetAttachmentByUUID(uuid string) (*Attachment, error) {
return getAttachmentByUUID(x, uuid)
}
-// GetAttachmentsByIssueID returns all attachments for given issue by ID.
-func GetAttachmentsByIssueID(issueID int64) ([]*Attachment, error) {
+func getAttachmentsByIssueID(e Engine, issueID int64) ([]*Attachment, error) {
attachments := make([]*Attachment, 0, 10)
- return attachments, x.Where("issue_id=? AND comment_id=0", issueID).Find(&attachments)
+ return attachments, e.Where("issue_id = ? AND comment_id = 0", issueID).Find(&attachments)
+}
+
+// GetAttachmentsByIssueID returns all attachments of an issue.
+func GetAttachmentsByIssueID(issueID int64) ([]*Attachment, error) {
+ return getAttachmentsByIssueID(x, issueID)
}
// GetAttachmentsByCommentID returns all attachments if comment by given ID.