|
|
@ -73,70 +73,55 @@ func (issue *Issue) BeforeUpdate() { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (issue *Issue) AfterSet(colName string, _ xorm.Cell) { |
|
|
|
func (issue *Issue) AfterSet(colName string, _ xorm.Cell) { |
|
|
|
var err error |
|
|
|
|
|
|
|
switch colName { |
|
|
|
switch colName { |
|
|
|
case "id": |
|
|
|
case "deadline_unix": |
|
|
|
issue.Attachments, err = GetAttachmentsByIssueID(issue.ID) |
|
|
|
issue.Deadline = time.Unix(issue.DeadlineUnix, 0).Local() |
|
|
|
if err != nil { |
|
|
|
case "created_unix": |
|
|
|
log.Error(3, "GetAttachmentsByIssueID[%d]: %v", issue.ID, err) |
|
|
|
issue.Created = time.Unix(issue.CreatedUnix, 0).Local() |
|
|
|
|
|
|
|
case "updated_unix": |
|
|
|
|
|
|
|
issue.Updated = time.Unix(issue.UpdatedUnix, 0).Local() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
issue.Comments, err = GetCommentsByIssueID(issue.ID) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
log.Error(3, "GetCommentsByIssueID[%d]: %v", issue.ID, err) |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
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 { |
|
|
|
if err != nil { |
|
|
|
log.Error(3, "GetLabelsByIssueID[%d]: %v", issue.ID, err) |
|
|
|
return fmt.Errorf("getRepositoryByID [%d]: %v", issue.RepoID, err) |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
case "poster_id": |
|
|
|
if issue.Poster == nil { |
|
|
|
issue.Poster, err = GetUserByID(issue.PosterID) |
|
|
|
issue.Poster, err = getUserByID(e, issue.PosterID) |
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|
if IsErrUserNotExist(err) { |
|
|
|
if IsErrUserNotExist(err) { |
|
|
|
issue.PosterID = -1 |
|
|
|
issue.PosterID = -1 |
|
|
|
issue.Poster = NewGhostUser() |
|
|
|
issue.Poster = NewGhostUser() |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
log.Error(3, "GetUserByID[%d]: %v", issue.ID, err) |
|
|
|
return fmt.Errorf("getUserByID.(poster) [%d]: %v", issue.PosterID, err) |
|
|
|
} |
|
|
|
} |
|
|
|
return |
|
|
|
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 { |
|
|
|
if err != nil { |
|
|
|
log.Error(3, "GetMilestoneById[%d]: %v", issue.ID, err) |
|
|
|
return fmt.Errorf("getLabelsByIssueID [%d]: %v", issue.ID, err) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
case "assignee_id": |
|
|
|
|
|
|
|
if issue.AssigneeID == 0 { |
|
|
|
|
|
|
|
return |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
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 { |
|
|
|
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.Assignee == nil && issue.AssigneeID > 0 { |
|
|
|
if issue.Repo == nil { |
|
|
|
issue.Assignee, err = getUserByID(e, issue.AssigneeID) |
|
|
|
issue.Repo, err = getRepositoryByID(e, issue.RepoID) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
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 |
|
|
|
return nil |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -757,8 +756,8 @@ func GetIssueByRef(ref string) (*Issue, error) { |
|
|
|
return issue, issue.LoadAttributes() |
|
|
|
return issue, issue.LoadAttributes() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// GetIssueByIndex returns issue by given index in repository.
|
|
|
|
// GetIssueByIndex returns raw issue without loading attributes by index in a repository.
|
|
|
|
func GetIssueByIndex(repoID, index int64) (*Issue, error) { |
|
|
|
func GetRawIssueByIndex(repoID, index int64) (*Issue, error) { |
|
|
|
issue := &Issue{ |
|
|
|
issue := &Issue{ |
|
|
|
RepoID: repoID, |
|
|
|
RepoID: repoID, |
|
|
|
Index: index, |
|
|
|
Index: index, |
|
|
@ -769,6 +768,15 @@ func GetIssueByIndex(repoID, index int64) (*Issue, error) { |
|
|
|
} else if !has { |
|
|
|
} else if !has { |
|
|
|
return nil, ErrIssueNotExist{0, repoID, index} |
|
|
|
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() |
|
|
|
return issue, issue.LoadAttributes() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -868,7 +876,18 @@ func Issues(opts *IssuesOptions) ([]*Issue, error) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
issues := make([]*Issue, 0, setting.UI.IssuePagingNum) |
|
|
|
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 |
|
|
|
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) { |
|
|
|
func GetMilestoneByRepoID(repoID, id int64) (*Milestone, error) { |
|
|
|
return getMilestoneByRepoID(x, repoID, id) |
|
|
|
return getMilestoneByRepoID(x, repoID, id) |
|
|
|
} |
|
|
|
} |
|
|
@ -1721,10 +1740,14 @@ func GetAttachmentByUUID(uuid string) (*Attachment, error) { |
|
|
|
return getAttachmentByUUID(x, uuid) |
|
|
|
return getAttachmentByUUID(x, uuid) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// GetAttachmentsByIssueID returns all attachments for given issue by ID.
|
|
|
|
func getAttachmentsByIssueID(e Engine, issueID int64) ([]*Attachment, error) { |
|
|
|
func GetAttachmentsByIssueID(issueID int64) ([]*Attachment, error) { |
|
|
|
|
|
|
|
attachments := make([]*Attachment, 0, 10) |
|
|
|
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.
|
|
|
|
// GetAttachmentsByCommentID returns all attachments if comment by given ID.
|
|
|
|