@ -16,7 +16,7 @@ import (
admin_model "code.gitea.io/gitea/models/admin"
admin_model "code.gitea.io/gitea/models/admin"
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/foreignreference"
"code.gitea.io/gitea/models/foreignreference"
"code.gitea.io/gitea/models/issues"
issues_model "code.gitea.io/gitea/models/issues"
"code.gitea.io/gitea/models/organization"
"code.gitea.io/gitea/models/organization"
"code.gitea.io/gitea/models/perm"
"code.gitea.io/gitea/models/perm"
project_model "code.gitea.io/gitea/models/project"
project_model "code.gitea.io/gitea/models/project"
@ -46,14 +46,14 @@ type Issue struct {
PosterID int64 ` xorm:"INDEX" `
PosterID int64 ` xorm:"INDEX" `
Poster * user_model . User ` xorm:"-" `
Poster * user_model . User ` xorm:"-" `
OriginalAuthor string
OriginalAuthor string
OriginalAuthorID int64 ` xorm:"index" `
OriginalAuthorID int64 ` xorm:"index" `
Title string ` xorm:"name" `
Title string ` xorm:"name" `
Content string ` xorm:"LONGTEXT" `
Content string ` xorm:"LONGTEXT" `
RenderedContent string ` xorm:"-" `
RenderedContent string ` xorm:"-" `
Labels [ ] * Label ` xorm:"-" `
Labels [ ] * Label ` xorm:"-" `
MilestoneID int64 ` xorm:"INDEX" `
MilestoneID int64 ` xorm:"INDEX" `
Milestone * Milestone ` xorm:"-" `
Milestone * issues_model . Milestone ` xorm:"-" `
Project * project_model . Project ` xorm:"-" `
Project * project_model . Project ` xorm:"-" `
Priority int
Priority int
AssigneeID int64 ` xorm:"-" `
AssigneeID int64 ` xorm:"-" `
Assignee * user_model . User ` xorm:"-" `
Assignee * user_model . User ` xorm:"-" `
@ -72,7 +72,7 @@ type Issue struct {
Attachments [ ] * repo_model . Attachment ` xorm:"-" `
Attachments [ ] * repo_model . Attachment ` xorm:"-" `
Comments [ ] * Comment ` xorm:"-" `
Comments [ ] * Comment ` xorm:"-" `
Reactions issues . ReactionList ` xorm:"-" `
Reactions issues_model . ReactionList ` xorm:"-" `
TotalTrackedTime int64 ` xorm:"-" `
TotalTrackedTime int64 ` xorm:"-" `
Assignees [ ] * user_model . User ` xorm:"-" `
Assignees [ ] * user_model . User ` xorm:"-" `
ForeignReference * foreignreference . ForeignReference ` xorm:"-" `
ForeignReference * foreignreference . ForeignReference ` xorm:"-" `
@ -124,11 +124,7 @@ func (issue *Issue) IsOverdue() bool {
}
}
// LoadRepo loads issue's repository
// LoadRepo loads issue's repository
func ( issue * Issue ) LoadRepo ( ) error {
func ( issue * Issue ) LoadRepo ( ctx context . Context ) ( err error ) {
return issue . loadRepo ( db . DefaultContext )
}
func ( issue * Issue ) loadRepo ( ctx context . Context ) ( err error ) {
if issue . Repo == nil {
if issue . Repo == nil {
issue . Repo , err = repo_model . GetRepositoryByIDCtx ( ctx , issue . RepoID )
issue . Repo , err = repo_model . GetRepositoryByIDCtx ( ctx , issue . RepoID )
if err != nil {
if err != nil {
@ -144,7 +140,7 @@ func (issue *Issue) IsTimetrackerEnabled() bool {
}
}
func ( issue * Issue ) isTimetrackerEnabled ( ctx context . Context ) bool {
func ( issue * Issue ) isTimetrackerEnabled ( ctx context . Context ) bool {
if err := issue . l oadRepo( ctx ) ; err != nil {
if err := issue . L oadRepo( ctx ) ; err != nil {
log . Error ( fmt . Sprintf ( "loadRepo: %v" , err ) )
log . Error ( fmt . Sprintf ( "loadRepo: %v" , err ) )
return false
return false
}
}
@ -244,17 +240,17 @@ func (issue *Issue) loadReactions(ctx context.Context) (err error) {
if issue . Reactions != nil {
if issue . Reactions != nil {
return nil
return nil
}
}
reactions , _ , err := issues . FindReactions ( ctx , issues . FindReactionsOptions {
reactions , _ , err := issues_model . FindReactions ( ctx , issues_model . FindReactionsOptions {
IssueID : issue . ID ,
IssueID : issue . ID ,
} )
} )
if err != nil {
if err != nil {
return err
return err
}
}
if err = issue . l oadRepo( ctx ) ; err != nil {
if err = issue . L oadRepo( ctx ) ; err != nil {
return err
return err
}
}
// Load reaction user data
// Load reaction user data
if _ , err := issues . ReactionList ( reactions ) . LoadUsers ( ctx , issue . Repo ) ; err != nil {
if _ , err := issues_model . ReactionList ( reactions ) . LoadUsers ( ctx , issue . Repo ) ; err != nil {
return err
return err
}
}
@ -297,10 +293,10 @@ func (issue *Issue) loadForeignReference(ctx context.Context) (err error) {
return nil
return nil
}
}
func ( issue * Issue ) loadMilestone ( e db . Engine ) ( err error ) {
func ( issue * Issue ) loadMilestone ( ctx context . Context ) ( err error ) {
if ( issue . Milestone == nil || issue . Milestone . ID != issue . MilestoneID ) && issue . MilestoneID > 0 {
if ( issue . Milestone == nil || issue . Milestone . ID != issue . MilestoneID ) && issue . MilestoneID > 0 {
issue . Milestone , err = getMilestoneByRepoID ( e , issue . RepoID , issue . MilestoneID )
issue . Milestone , err = issues_model . GetMilestoneByRepoID ( ctx , issue . RepoID , issue . MilestoneID )
if err != nil && ! IsErrMilestoneNotExist ( err ) {
if err != nil && ! issues_model . IsErrMilestoneNotExist ( err ) {
return fmt . Errorf ( "getMilestoneByRepoID [repo_id: %d, milestone_id: %d]: %v" , issue . RepoID , issue . MilestoneID , err )
return fmt . Errorf ( "getMilestoneByRepoID [repo_id: %d, milestone_id: %d]: %v" , issue . RepoID , issue . MilestoneID , err )
}
}
}
}
@ -309,7 +305,7 @@ func (issue *Issue) loadMilestone(e db.Engine) (err error) {
func ( issue * Issue ) loadAttributes ( ctx context . Context ) ( err error ) {
func ( issue * Issue ) loadAttributes ( ctx context . Context ) ( err error ) {
e := db . GetEngine ( ctx )
e := db . GetEngine ( ctx )
if err = issue . l oadRepo( ctx ) ; err != nil {
if err = issue . L oadRepo( ctx ) ; err != nil {
return
return
}
}
@ -321,7 +317,7 @@ func (issue *Issue) loadAttributes(ctx context.Context) (err error) {
return
return
}
}
if err = issue . loadMilestone ( e ) ; err != nil {
if err = issue . loadMilestone ( ctx ) ; err != nil {
return
return
}
}
@ -372,7 +368,7 @@ func (issue *Issue) LoadAttributes() error {
// LoadMilestone load milestone of this issue.
// LoadMilestone load milestone of this issue.
func ( issue * Issue ) LoadMilestone ( ) error {
func ( issue * Issue ) LoadMilestone ( ) error {
return issue . loadMilestone ( db . GetEngine ( db . DefaultContext ) )
return issue . loadMilestone ( db . DefaultContext )
}
}
// GetIsRead load the `IsRead` field of the issue
// GetIsRead load the `IsRead` field of the issue
@ -391,7 +387,7 @@ func (issue *Issue) GetIsRead(userID int64) error {
// APIURL returns the absolute APIURL to this issue.
// APIURL returns the absolute APIURL to this issue.
func ( issue * Issue ) APIURL ( ) string {
func ( issue * Issue ) APIURL ( ) string {
if issue . Repo == nil {
if issue . Repo == nil {
err := issue . LoadRepo ( )
err := issue . LoadRepo ( db . DefaultContext )
if err != nil {
if err != nil {
log . Error ( "Issue[%d].APIURL(): %v" , issue . ID , err )
log . Error ( "Issue[%d].APIURL(): %v" , issue . ID , err )
return ""
return ""
@ -491,7 +487,7 @@ func ClearIssueLabels(issue *Issue, doer *user_model.User) (err error) {
}
}
defer committer . Close ( )
defer committer . Close ( )
if err := issue . l oadRepo( ctx ) ; err != nil {
if err := issue . L oadRepo( ctx ) ; err != nil {
return err
return err
} else if err = issue . loadPullRequest ( db . GetEngine ( ctx ) ) ; err != nil {
} else if err = issue . loadPullRequest ( db . GetEngine ( ctx ) ) ; err != nil {
return err
return err
@ -539,7 +535,7 @@ func ReplaceIssueLabels(issue *Issue, labels []*Label, doer *user_model.User) (e
}
}
defer committer . Close ( )
defer committer . Close ( )
if err = issue . l oadRepo( ctx ) ; err != nil {
if err = issue . L oadRepo( ctx ) ; err != nil {
return err
return err
}
}
@ -607,7 +603,8 @@ func (issue *Issue) ReadBy(userID int64) error {
return setIssueNotificationStatusReadIfUnread ( db . GetEngine ( db . DefaultContext ) , userID , issue . ID )
return setIssueNotificationStatusReadIfUnread ( db . GetEngine ( db . DefaultContext ) , userID , issue . ID )
}
}
func updateIssueCols ( ctx context . Context , issue * Issue , cols ... string ) error {
// UpdateIssueCols updates cols of issue
func UpdateIssueCols ( ctx context . Context , issue * Issue , cols ... string ) error {
if _ , err := db . GetEngine ( ctx ) . ID ( issue . ID ) . Cols ( cols ... ) . Update ( issue ) ; err != nil {
if _ , err := db . GetEngine ( ctx ) . ID ( issue . ID ) . Cols ( cols ... ) . Update ( issue ) ; err != nil {
return err
return err
}
}
@ -658,7 +655,7 @@ func doChangeIssueStatus(ctx context.Context, issue *Issue, doer *user_model.Use
issue . ClosedUnix = 0
issue . ClosedUnix = 0
}
}
if err := u pdateIssueCols( ctx , issue , "is_closed" , "closed_unix" ) ; err != nil {
if err := U pdateIssueCols( ctx , issue , "is_closed" , "closed_unix" ) ; err != nil {
return nil , err
return nil , err
}
}
@ -674,7 +671,7 @@ func doChangeIssueStatus(ctx context.Context, issue *Issue, doer *user_model.Use
// Update issue count of milestone
// Update issue count of milestone
if issue . MilestoneID > 0 {
if issue . MilestoneID > 0 {
if err := u pdateMilestoneCounters( ctx , issue . MilestoneID ) ; err != nil {
if err := issues_model . U pdateMilestoneCounters( ctx , issue . MilestoneID ) ; err != nil {
return nil , err
return nil , err
}
}
}
}
@ -691,7 +688,7 @@ func doChangeIssueStatus(ctx context.Context, issue *Issue, doer *user_model.Use
cmtType = CommentTypeMergePull
cmtType = CommentTypeMergePull
}
}
return createComment ( ctx , & CreateCommentOptions {
return CreateCommentCtx ( ctx , & CreateCommentOptions {
Type : cmtType ,
Type : cmtType ,
Doer : doer ,
Doer : doer ,
Repo : issue . Repo ,
Repo : issue . Repo ,
@ -707,7 +704,7 @@ func ChangeIssueStatus(issue *Issue, doer *user_model.User, isClosed bool) (*Com
}
}
defer committer . Close ( )
defer committer . Close ( )
if err := issue . l oadRepo( ctx ) ; err != nil {
if err := issue . L oadRepo( ctx ) ; err != nil {
return nil , err
return nil , err
}
}
if err := issue . loadPoster ( db . GetEngine ( ctx ) ) ; err != nil {
if err := issue . loadPoster ( db . GetEngine ( ctx ) ) ; err != nil {
@ -734,11 +731,11 @@ func ChangeIssueTitle(issue *Issue, doer *user_model.User, oldTitle string) (err
}
}
defer committer . Close ( )
defer committer . Close ( )
if err = u pdateIssueCols( ctx , issue , "name" ) ; err != nil {
if err = U pdateIssueCols( ctx , issue , "name" ) ; err != nil {
return fmt . Errorf ( "updateIssueCols: %v" , err )
return fmt . Errorf ( "updateIssueCols: %v" , err )
}
}
if err = issue . l oadRepo( ctx ) ; err != nil {
if err = issue . L oadRepo( ctx ) ; err != nil {
return fmt . Errorf ( "loadRepo: %v" , err )
return fmt . Errorf ( "loadRepo: %v" , err )
}
}
@ -750,7 +747,7 @@ func ChangeIssueTitle(issue *Issue, doer *user_model.User, oldTitle string) (err
OldTitle : oldTitle ,
OldTitle : oldTitle ,
NewTitle : issue . Title ,
NewTitle : issue . Title ,
}
}
if _ , err = createComment ( ctx , opts ) ; err != nil {
if _ , err = CreateCommentCtx ( ctx , opts ) ; err != nil {
return fmt . Errorf ( "createComment: %v" , err )
return fmt . Errorf ( "createComment: %v" , err )
}
}
if err = issue . addCrossReferences ( ctx , doer , true ) ; err != nil {
if err = issue . addCrossReferences ( ctx , doer , true ) ; err != nil {
@ -768,11 +765,11 @@ func ChangeIssueRef(issue *Issue, doer *user_model.User, oldRef string) (err err
}
}
defer committer . Close ( )
defer committer . Close ( )
if err = u pdateIssueCols( ctx , issue , "ref" ) ; err != nil {
if err = U pdateIssueCols( ctx , issue , "ref" ) ; err != nil {
return fmt . Errorf ( "updateIssueCols: %v" , err )
return fmt . Errorf ( "updateIssueCols: %v" , err )
}
}
if err = issue . l oadRepo( ctx ) ; err != nil {
if err = issue . L oadRepo( ctx ) ; err != nil {
return fmt . Errorf ( "loadRepo: %v" , err )
return fmt . Errorf ( "loadRepo: %v" , err )
}
}
oldRefFriendly := strings . TrimPrefix ( oldRef , git . BranchPrefix )
oldRefFriendly := strings . TrimPrefix ( oldRef , git . BranchPrefix )
@ -786,7 +783,7 @@ func ChangeIssueRef(issue *Issue, doer *user_model.User, oldRef string) (err err
OldRef : oldRefFriendly ,
OldRef : oldRefFriendly ,
NewRef : newRefFriendly ,
NewRef : newRefFriendly ,
}
}
if _ , err = createComment ( ctx , opts ) ; err != nil {
if _ , err = CreateCommentCtx ( ctx , opts ) ; err != nil {
return fmt . Errorf ( "createComment: %v" , err )
return fmt . Errorf ( "createComment: %v" , err )
}
}
@ -811,7 +808,7 @@ func AddDeletePRBranchComment(doer *user_model.User, repo *repo_model.Repository
Issue : issue ,
Issue : issue ,
OldRef : branchName ,
OldRef : branchName ,
}
}
if _ , err = createComment ( ctx , opts ) ; err != nil {
if _ , err = CreateCommentCtx ( ctx , opts ) ; err != nil {
return err
return err
}
}
@ -846,12 +843,12 @@ func ChangeIssueContent(issue *Issue, doer *user_model.User, content string) (er
}
}
defer committer . Close ( )
defer committer . Close ( )
hasContentHistory , err := issues . HasIssueContentHistory ( ctx , issue . ID , 0 )
hasContentHistory , err := issues_model . HasIssueContentHistory ( ctx , issue . ID , 0 )
if err != nil {
if err != nil {
return fmt . Errorf ( "HasIssueContentHistory: %v" , err )
return fmt . Errorf ( "HasIssueContentHistory: %v" , err )
}
}
if ! hasContentHistory {
if ! hasContentHistory {
if err = issues . SaveIssueContentHistory ( db . GetEngine ( ctx ) , issue . PosterID , issue . ID , 0 ,
if err = issues_model . SaveIssueContentHistory ( db . GetEngine ( ctx ) , issue . PosterID , issue . ID , 0 ,
issue . CreatedUnix , issue . Content , true ) ; err != nil {
issue . CreatedUnix , issue . Content , true ) ; err != nil {
return fmt . Errorf ( "SaveIssueContentHistory: %v" , err )
return fmt . Errorf ( "SaveIssueContentHistory: %v" , err )
}
}
@ -859,11 +856,11 @@ func ChangeIssueContent(issue *Issue, doer *user_model.User, content string) (er
issue . Content = content
issue . Content = content
if err = u pdateIssueCols( ctx , issue , "content" ) ; err != nil {
if err = U pdateIssueCols( ctx , issue , "content" ) ; err != nil {
return fmt . Errorf ( "UpdateIssueCols: %v" , err )
return fmt . Errorf ( "UpdateIssueCols: %v" , err )
}
}
if err = issues . SaveIssueContentHistory ( db . GetEngine ( ctx ) , doer . ID , issue . ID , 0 ,
if err = issues_model . SaveIssueContentHistory ( db . GetEngine ( ctx ) , doer . ID , issue . ID , 0 ,
timeutil . TimeStampNow ( ) , issue . Content , false ) ; err != nil {
timeutil . TimeStampNow ( ) , issue . Content , false ) ; err != nil {
return fmt . Errorf ( "SaveIssueContentHistory: %v" , err )
return fmt . Errorf ( "SaveIssueContentHistory: %v" , err )
}
}
@ -943,8 +940,8 @@ func newIssue(ctx context.Context, doer *user_model.User, opts NewIssueOptions)
opts . Issue . Title = strings . TrimSpace ( opts . Issue . Title )
opts . Issue . Title = strings . TrimSpace ( opts . Issue . Title )
if opts . Issue . MilestoneID > 0 {
if opts . Issue . MilestoneID > 0 {
milestone , err := getMilestoneByRepoID ( e , opts . Issue . RepoID , opts . Issue . MilestoneID )
milestone , err := issues_model . GetMilestoneByRepoID ( ctx , opts . Issue . RepoID , opts . Issue . MilestoneID )
if err != nil && ! IsErrMilestoneNotExist ( err ) {
if err != nil && ! issues_model . IsErrMilestoneNotExist ( err ) {
return fmt . Errorf ( "getMilestoneByID: %v" , err )
return fmt . Errorf ( "getMilestoneByID: %v" , err )
}
}
@ -968,7 +965,7 @@ func newIssue(ctx context.Context, doer *user_model.User, opts NewIssueOptions)
}
}
if opts . Issue . MilestoneID > 0 {
if opts . Issue . MilestoneID > 0 {
if err := u pdateMilestoneCounters( ctx , opts . Issue . MilestoneID ) ; err != nil {
if err := issues_model . U pdateMilestoneCounters( ctx , opts . Issue . MilestoneID ) ; err != nil {
return err
return err
}
}
@ -980,7 +977,7 @@ func newIssue(ctx context.Context, doer *user_model.User, opts NewIssueOptions)
OldMilestoneID : 0 ,
OldMilestoneID : 0 ,
MilestoneID : opts . Issue . MilestoneID ,
MilestoneID : opts . Issue . MilestoneID ,
}
}
if _ , err = createComment ( ctx , opts ) ; err != nil {
if _ , err = CreateCommentCtx ( ctx , opts ) ; err != nil {
return err
return err
}
}
}
}
@ -1956,7 +1953,7 @@ func UpdateIssueByAPI(issue *Issue, doer *user_model.User) (statusChangeComment
defer committer . Close ( )
defer committer . Close ( )
sess := db . GetEngine ( ctx )
sess := db . GetEngine ( ctx )
if err := issue . l oadRepo( ctx ) ; err != nil {
if err := issue . L oadRepo( ctx ) ; err != nil {
return nil , false , fmt . Errorf ( "loadRepo: %v" , err )
return nil , false , fmt . Errorf ( "loadRepo: %v" , err )
}
}
@ -1983,7 +1980,7 @@ func UpdateIssueByAPI(issue *Issue, doer *user_model.User) (statusChangeComment
OldTitle : currentIssue . Title ,
OldTitle : currentIssue . Title ,
NewTitle : issue . Title ,
NewTitle : issue . Title ,
}
}
_ , err := createComment ( ctx , opts )
_ , err := CreateCommentCtx ( ctx , opts )
if err != nil {
if err != nil {
return nil , false , fmt . Errorf ( "createComment: %v" , err )
return nil , false , fmt . Errorf ( "createComment: %v" , err )
}
}
@ -2015,7 +2012,7 @@ func UpdateIssueDeadline(issue *Issue, deadlineUnix timeutil.TimeStamp, doer *us
defer committer . Close ( )
defer committer . Close ( )
// Update the deadline
// Update the deadline
if err = u pdateIssueCols( ctx , & Issue { ID : issue . ID , DeadlineUnix : deadlineUnix } , "deadline_unix" ) ; err != nil {
if err = U pdateIssueCols( ctx , & Issue { ID : issue . ID , DeadlineUnix : deadlineUnix } , "deadline_unix" ) ; err != nil {
return err
return err
}
}
@ -2104,14 +2101,14 @@ func deleteIssue(ctx context.Context, issue *Issue) error {
// delete all database data still assigned to this issue
// delete all database data still assigned to this issue
if err := deleteInIssue ( e , issue . ID ,
if err := deleteInIssue ( e , issue . ID ,
& issues . ContentHistory { } ,
& issues_model . ContentHistory { } ,
& Comment { } ,
& Comment { } ,
& IssueLabel { } ,
& IssueLabel { } ,
& IssueDependency { } ,
& IssueDependency { } ,
& IssueAssignees { } ,
& IssueAssignees { } ,
& IssueUser { } ,
& IssueUser { } ,
& Notification { } ,
& Notification { } ,
& issues . Reaction { } ,
& issues_model . Reaction { } ,
& IssueWatch { } ,
& IssueWatch { } ,
& Stopwatch { } ,
& Stopwatch { } ,
& TrackedTime { } ,
& TrackedTime { } ,
@ -2242,7 +2239,7 @@ func ResolveIssueMentionsByVisibility(ctx context.Context, issue *Issue, doer *u
if len ( mentions ) == 0 {
if len ( mentions ) == 0 {
return
return
}
}
if err = issue . l oadRepo( ctx ) ; err != nil {
if err = issue . L oadRepo( ctx ) ; err != nil {
return
return
}
}
@ -2401,7 +2398,7 @@ func deleteIssuesByRepoID(sess db.Engine, repoID int64) (attachmentPaths []strin
// Delete content histories
// Delete content histories
if _ , err = sess . In ( "issue_id" , deleteCond ) .
if _ , err = sess . In ( "issue_id" , deleteCond ) .
Delete ( & issues . ContentHistory { } ) ; err != nil {
Delete ( & issues_model . ContentHistory { } ) ; err != nil {
return
return
}
}
@ -2429,7 +2426,7 @@ func deleteIssuesByRepoID(sess db.Engine, repoID int64) (attachmentPaths []strin
}
}
if _ , err = sess . In ( "issue_id" , deleteCond ) .
if _ , err = sess . In ( "issue_id" , deleteCond ) .
Delete ( & issues . Reaction { } ) ; err != nil {
Delete ( & issues_model . Reaction { } ) ; err != nil {
return
return
}
}