diff options
Diffstat (limited to 'models/issue.go')
-rw-r--r-- | models/issue.go | 116 |
1 files changed, 61 insertions, 55 deletions
diff --git a/models/issue.go b/models/issue.go index ef31f416ad..1b9d35d1e3 100644 --- a/models/issue.go +++ b/models/issue.go @@ -15,6 +15,7 @@ import ( "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/issues" + repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unit" "code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/log" @@ -60,11 +61,11 @@ type Issue struct { UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"` ClosedUnix timeutil.TimeStamp `xorm:"INDEX"` - Attachments []*Attachment `xorm:"-"` - Comments []*Comment `xorm:"-"` - Reactions ReactionList `xorm:"-"` - TotalTrackedTime int64 `xorm:"-"` - Assignees []*User `xorm:"-"` + Attachments []*repo_model.Attachment `xorm:"-"` + Comments []*Comment `xorm:"-"` + Reactions ReactionList `xorm:"-"` + TotalTrackedTime int64 `xorm:"-"` + Assignees []*User `xorm:"-"` // IsLocked limits commenting abilities to users on an issue // with write access @@ -273,7 +274,8 @@ func (issue *Issue) loadMilestone(e db.Engine) (err error) { return nil } -func (issue *Issue) loadAttributes(e db.Engine) (err error) { +func (issue *Issue) loadAttributes(ctx context.Context) (err error) { + e := db.GetEngine(ctx) if err = issue.loadRepo(e); err != nil { return } @@ -304,7 +306,7 @@ func (issue *Issue) loadAttributes(e db.Engine) (err error) { } if issue.Attachments == nil { - issue.Attachments, err = getAttachmentsByIssueID(e, issue.ID) + issue.Attachments, err = repo_model.GetAttachmentsByIssueIDCtx(ctx, issue.ID) if err != nil { return fmt.Errorf("getAttachmentsByIssueID [%d]: %v", issue.ID, err) } @@ -328,7 +330,7 @@ func (issue *Issue) loadAttributes(e db.Engine) (err error) { // LoadAttributes loads the attribute of this issue. func (issue *Issue) LoadAttributes() error { - return issue.loadAttributes(db.GetEngine(db.DefaultContext)) + return issue.loadAttributes(db.DefaultContext) } // LoadMilestone load milestone of this issue. @@ -426,12 +428,12 @@ func (issue *Issue) HasLabel(labelID int64) bool { return issue.hasLabel(db.GetEngine(db.DefaultContext), labelID) } -func (issue *Issue) addLabel(e db.Engine, label *Label, doer *User) error { - return newIssueLabel(e, issue, label, doer) +func (issue *Issue) addLabel(ctx context.Context, label *Label, doer *User) error { + return newIssueLabel(ctx, issue, label, doer) } -func (issue *Issue) addLabels(e db.Engine, labels []*Label, doer *User) error { - return newIssueLabels(e, issue, labels, doer) +func (issue *Issue) addLabels(ctx context.Context, labels []*Label, doer *User) error { + return newIssueLabels(ctx, issue, labels, doer) } func (issue *Issue) getLabels(e db.Engine) (err error) { @@ -446,17 +448,17 @@ func (issue *Issue) getLabels(e db.Engine) (err error) { return nil } -func (issue *Issue) removeLabel(e db.Engine, doer *User, label *Label) error { - return deleteIssueLabel(e, issue, label, doer) +func (issue *Issue) removeLabel(ctx context.Context, doer *User, label *Label) error { + return deleteIssueLabel(ctx, issue, label, doer) } -func (issue *Issue) clearLabels(e db.Engine, doer *User) (err error) { - if err = issue.getLabels(e); err != nil { +func (issue *Issue) clearLabels(ctx context.Context, doer *User) (err error) { + if err = issue.getLabels(db.GetEngine(ctx)); err != nil { return fmt.Errorf("getLabels: %v", err) } for i := range issue.Labels { - if err = issue.removeLabel(e, doer, issue.Labels[i]); err != nil { + if err = issue.removeLabel(ctx, doer, issue.Labels[i]); err != nil { return fmt.Errorf("removeLabel: %v", err) } } @@ -487,7 +489,7 @@ func (issue *Issue) ClearLabels(doer *User) (err error) { return ErrRepoLabelNotExist{} } - if err = issue.clearLabels(db.GetEngine(ctx), doer); err != nil { + if err = issue.clearLabels(ctx, doer); err != nil { return err } @@ -561,13 +563,13 @@ func (issue *Issue) ReplaceLabels(labels []*Label, doer *User) (err error) { toRemove = append(toRemove, issue.Labels[removeIndex:]...) if len(toAdd) > 0 { - if err = issue.addLabels(db.GetEngine(ctx), toAdd, doer); err != nil { + if err = issue.addLabels(ctx, toAdd, doer); err != nil { return fmt.Errorf("addLabels: %v", err) } } for _, l := range toRemove { - if err = issue.removeLabel(db.GetEngine(ctx), doer, l); err != nil { + if err = issue.removeLabel(ctx, doer, l); err != nil { return fmt.Errorf("removeLabel: %v", err) } } @@ -596,9 +598,9 @@ func updateIssueCols(e db.Engine, issue *Issue, cols ...string) error { return nil } -func (issue *Issue) changeStatus(e db.Engine, doer *User, isClosed, isMergePull bool) (*Comment, error) { +func (issue *Issue) changeStatus(ctx context.Context, doer *User, isClosed, isMergePull bool) (*Comment, error) { // Reload the issue - currentIssue, err := getIssueByID(e, issue.ID) + currentIssue, err := getIssueByID(db.GetEngine(ctx), issue.ID) if err != nil { return nil, err } @@ -616,10 +618,11 @@ func (issue *Issue) changeStatus(e db.Engine, doer *User, isClosed, isMergePull } issue.IsClosed = isClosed - return issue.doChangeStatus(e, doer, isMergePull) + return issue.doChangeStatus(ctx, doer, isMergePull) } -func (issue *Issue) doChangeStatus(e db.Engine, doer *User, isMergePull bool) (*Comment, error) { +func (issue *Issue) doChangeStatus(ctx context.Context, doer *User, isMergePull bool) (*Comment, error) { + e := db.GetEngine(ctx) // Check for open dependencies if issue.IsClosed && issue.Repo.isDependenciesEnabled(e) { // only check if dependencies are enabled and we're about to close an issue, otherwise reopening an issue would fail when there are unsatisfied dependencies @@ -672,7 +675,7 @@ func (issue *Issue) doChangeStatus(e db.Engine, doer *User, isMergePull bool) (* cmtType = CommentTypeMergePull } - return createComment(e, &CreateCommentOptions{ + return createComment(ctx, &CreateCommentOptions{ Type: cmtType, Doer: doer, Repo: issue.Repo, @@ -695,7 +698,7 @@ func (issue *Issue) ChangeStatus(doer *User, isClosed bool) (*Comment, error) { return nil, err } - comment, err := issue.changeStatus(db.GetEngine(ctx), doer, isClosed, false) + comment, err := issue.changeStatus(ctx, doer, isClosed, false) if err != nil { return nil, err } @@ -731,10 +734,10 @@ func (issue *Issue) ChangeTitle(doer *User, oldTitle string) (err error) { OldTitle: oldTitle, NewTitle: issue.Title, } - if _, err = createComment(db.GetEngine(ctx), opts); err != nil { + if _, err = createComment(ctx, opts); err != nil { return fmt.Errorf("createComment: %v", err) } - if err = issue.addCrossReferences(db.GetEngine(ctx), doer, true); err != nil { + if err = issue.addCrossReferences(ctx, doer, true); err != nil { return err } @@ -767,7 +770,7 @@ func (issue *Issue) ChangeRef(doer *User, oldRef string) (err error) { OldRef: oldRefFriendly, NewRef: newRefFriendly, } - if _, err = createComment(db.GetEngine(ctx), opts); err != nil { + if _, err = createComment(ctx, opts); err != nil { return fmt.Errorf("createComment: %v", err) } @@ -792,7 +795,7 @@ func AddDeletePRBranchComment(doer *User, repo *Repository, issueID int64, branc Issue: issue, OldRef: branchName, } - if _, err = createComment(db.GetEngine(ctx), opts); err != nil { + if _, err = createComment(ctx, opts); err != nil { return err } @@ -806,13 +809,13 @@ func (issue *Issue) UpdateAttachments(uuids []string) (err error) { return err } defer committer.Close() - attachments, err := getAttachmentsByUUIDs(db.GetEngine(ctx), uuids) + attachments, err := repo_model.GetAttachmentsByUUIDs(ctx, uuids) if err != nil { return fmt.Errorf("getAttachmentsByUUIDs [uuids: %v]: %v", uuids, err) } for i := 0; i < len(attachments); i++ { attachments[i].IssueID = issue.ID - if err := updateAttachment(db.GetEngine(ctx), attachments[i]); err != nil { + if err := repo_model.UpdateAttachmentCtx(ctx, attachments[i]); err != nil { return fmt.Errorf("update attachment [id: %d]: %v", attachments[i].ID, err) } } @@ -838,7 +841,7 @@ func (issue *Issue) ChangeContent(doer *User, content string) (err error) { return fmt.Errorf("SaveIssueContentHistory: %v", err) } - if err = issue.addCrossReferences(ctx.Engine(), doer, true); err != nil { + if err = issue.addCrossReferences(ctx, doer, true); err != nil { return fmt.Errorf("addCrossReferences: %v", err) } @@ -908,7 +911,8 @@ type NewIssueOptions struct { IsPull bool } -func newIssue(e db.Engine, doer *User, opts NewIssueOptions) (err error) { +func newIssue(ctx context.Context, doer *User, opts NewIssueOptions) (err error) { + e := db.GetEngine(ctx) opts.Issue.Title = strings.TrimSpace(opts.Issue.Title) if opts.Issue.MilestoneID > 0 { @@ -949,7 +953,7 @@ func newIssue(e db.Engine, doer *User, opts NewIssueOptions) (err error) { OldMilestoneID: 0, MilestoneID: opts.Issue.MilestoneID, } - if _, err = createComment(e, opts); err != nil { + if _, err = createComment(ctx, opts); err != nil { return err } } @@ -981,7 +985,7 @@ func newIssue(e db.Engine, doer *User, opts NewIssueOptions) (err error) { continue } - if err = opts.Issue.addLabel(e, label, opts.Issue.Poster); err != nil { + if err = opts.Issue.addLabel(ctx, label, opts.Issue.Poster); err != nil { return fmt.Errorf("addLabel [id: %d]: %v", label.ID, err) } } @@ -992,7 +996,7 @@ func newIssue(e db.Engine, doer *User, opts NewIssueOptions) (err error) { } if len(opts.Attachments) > 0 { - attachments, err := getAttachmentsByUUIDs(e, opts.Attachments) + attachments, err := repo_model.GetAttachmentsByUUIDs(ctx, opts.Attachments) if err != nil { return fmt.Errorf("getAttachmentsByUUIDs [uuids: %v]: %v", opts.Attachments, err) } @@ -1004,7 +1008,7 @@ func newIssue(e db.Engine, doer *User, opts NewIssueOptions) (err error) { } } } - if err = opts.Issue.loadAttributes(e); err != nil { + if err = opts.Issue.loadAttributes(ctx); err != nil { return err } @@ -1013,7 +1017,7 @@ func newIssue(e db.Engine, doer *User, opts NewIssueOptions) (err error) { return err } - return opts.Issue.addCrossReferences(e, doer, false) + return opts.Issue.addCrossReferences(ctx, doer, false) } // RecalculateIssueIndexForRepo create issue_index for repo if not exist and @@ -1056,7 +1060,7 @@ func NewIssue(repo *Repository, issue *Issue, labelIDs []int64, uuids []string) } defer committer.Close() - if err = newIssue(db.GetEngine(ctx), issue.Poster, NewIssueOptions{ + if err = newIssue(ctx, issue.Poster, NewIssueOptions{ Repo: repo, Issue: issue, LabelIDs: labelIDs, @@ -1119,7 +1123,7 @@ func GetIssueWithAttrsByID(id int64) (*Issue, error) { if err != nil { return nil, err } - return issue, issue.loadAttributes(db.GetEngine(db.DefaultContext)) + return issue, issue.loadAttributes(db.DefaultContext) } // GetIssueByID returns an issue by given ID. @@ -1838,11 +1842,12 @@ func SearchIssueIDsByKeyword(kw string, repoIDs []int64, limit, start int) (int6 // If the issue status is changed a statusChangeComment is returned // similarly if the title is changed the titleChanged bool is set to true func UpdateIssueByAPI(issue *Issue, doer *User) (statusChangeComment *Comment, titleChanged bool, err error) { - sess := db.NewSession(db.DefaultContext) - defer sess.Close() - if err := sess.Begin(); err != nil { + ctx, committer, err := db.TxContext() + if err != nil { return nil, false, err } + defer committer.Close() + sess := db.GetEngine(ctx) if err := issue.loadRepo(sess); err != nil { return nil, false, fmt.Errorf("loadRepo: %v", err) @@ -1871,23 +1876,23 @@ func UpdateIssueByAPI(issue *Issue, doer *User) (statusChangeComment *Comment, t OldTitle: currentIssue.Title, NewTitle: issue.Title, } - _, err := createComment(sess, opts) + _, err := createComment(ctx, opts) if err != nil { return nil, false, fmt.Errorf("createComment: %v", err) } } if currentIssue.IsClosed != issue.IsClosed { - statusChangeComment, err = issue.doChangeStatus(sess, doer, false) + statusChangeComment, err = issue.doChangeStatus(ctx, doer, false) if err != nil { return nil, false, err } } - if err := issue.addCrossReferences(sess, doer, true); err != nil { + if err := issue.addCrossReferences(ctx, doer, true); err != nil { return nil, false, err } - return statusChangeComment, titleChanged, sess.Commit() + return statusChangeComment, titleChanged, committer.Commit() } // UpdateIssueDeadline updates an issue deadline and adds comments. Setting a deadline to 0 means deleting it. @@ -1897,11 +1902,12 @@ func UpdateIssueDeadline(issue *Issue, deadlineUnix timeutil.TimeStamp, doer *Us return nil } - sess := db.NewSession(db.DefaultContext) - defer sess.Close() - if err := sess.Begin(); err != nil { + ctx, committer, err := db.TxContext() + if err != nil { return err } + defer committer.Close() + sess := db.GetEngine(ctx) // Update the deadline if err = updateIssueCols(sess, &Issue{ID: issue.ID, DeadlineUnix: deadlineUnix}, "deadline_unix"); err != nil { @@ -1909,11 +1915,11 @@ func UpdateIssueDeadline(issue *Issue, deadlineUnix timeutil.TimeStamp, doer *Us } // Make the comment - if _, err = createDeadlineComment(sess, doer, issue, deadlineUnix); err != nil { + if _, err = createDeadlineComment(ctx, doer, issue, deadlineUnix); err != nil { return fmt.Errorf("createRemovedDueDateComment: %v", err) } - return sess.Commit() + return committer.Commit() } // DependencyInfo represents high level information about an issue which is a dependency of another issue. @@ -2244,7 +2250,7 @@ func deleteIssuesByRepoID(sess db.Engine, repoID int64) (attachmentPaths []strin return } - var attachments []*Attachment + var attachments []*repo_model.Attachment if err = sess.In("issue_id", deleteCond). Find(&attachments); err != nil { return @@ -2255,7 +2261,7 @@ func deleteIssuesByRepoID(sess db.Engine, repoID int64) (attachmentPaths []strin } if _, err = sess.In("issue_id", deleteCond). - Delete(&Attachment{}); err != nil { + Delete(&repo_model.Attachment{}); err != nil { return } |