@ -6,34 +6,54 @@ package issue
import (
"context"
"code.gitea.io/gitea/models/db"
issues_model "code.gitea.io/gitea/models/issues"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/log"
notify_service "code.gitea.io/gitea/services/notify"
)
// ChangeStatus changes issue status to open or closed.
// closed means the target status
// Fix me: you should check whether the current issue status is same to the target status before call this function
// as in function changeIssueStatus we will return WasClosedError, even the issue status and target status are both open
func ChangeStatus ( ctx context . Context , issue * issues_model . Issue , doer * user_model . User , commitID string , closed bool ) error {
comment , err := issues_model . ChangeIssueStatus ( ctx , issue , doer , closed )
// CloseIssue close an issue.
func CloseIssue ( ctx context . Context , issue * issues_model . Issue , doer * user_model . User , commitID string ) error {
dbCtx , committer , err := db . TxContext ( ctx )
if err != nil {
if issues_model . IsErrDependenciesLeft ( err ) && closed {
if err := issues_model . FinishIssueStopwatchIfPossible ( ctx , doer , issue ) ; err != nil {
return err
}
defer committer . Close ( )
comment , err := issues_model . CloseIssue ( dbCtx , issue , doer )
if err != nil {
if issues_model . IsErrDependenciesLeft ( err ) {
if err := issues_model . FinishIssueStopwatchIfPossible ( dbCtx , doer , issue ) ; err != nil {
log . Error ( "Unable to stop stopwatch for issue[%d]#%d: %v" , issue . ID , issue . Index , err )
}
}
return err
}
if closed {
if err := issues_model . FinishIssueStopwatchIfPossible ( ctx , doer , issue ) ; err != nil {
return err
}
if err := issues_model . FinishIssueStopwatchIfPossible ( dbCtx , doer , issue ) ; err != nil {
return err
}
if err := committer . Commit ( ) ; err != nil {
return err
}
committer . Close ( )
notify_service . IssueChangeStatus ( ctx , doer , commitID , issue , comment , true )
return nil
}
// ReopenIssue reopen an issue.
// FIXME: If some issues dependent this one are closed, should we also reopen them?
func ReopenIssue ( ctx context . Context , issue * issues_model . Issue , doer * user_model . User , commitID string ) error {
comment , err := issues_model . ReopenIssue ( ctx , issue , doer )
if err != nil {
return err
}
notify_service . IssueChangeStatus ( ctx , doer , commitID , issue , comment , closed )
notify_service . IssueChangeStatus ( ctx , doer , commitID , issue , comment , false )
return nil
}