@@ -2991,14 +2991,16 @@ func UpdateIssueStatus(ctx *context.Context) {
29912991 return
29922992 }
29932993
2994- var isClosed bool
2994+ var closeOrReopen bool // true: close, false: reopen
29952995 switch action := ctx .FormString ("action" ); action {
29962996 case "open" :
2997- isClosed = false
2997+ closeOrReopen = false
29982998 case "close" :
2999- isClosed = true
2999+ closeOrReopen = true
30003000 default :
30013001 log .Warn ("Unrecognized action: %s" , action )
3002+ ctx .JSONOK ()
3003+ return
30023004 }
30033005
30043006 if _ , err := issues .LoadRepositories (ctx ); err != nil {
@@ -3014,15 +3016,20 @@ func UpdateIssueStatus(ctx *context.Context) {
30143016 if issue .IsPull && issue .PullRequest .HasMerged {
30153017 continue
30163018 }
3017- if issue .IsClosed != isClosed {
3018- if err := issue_service .ChangeStatus (ctx , issue , ctx .Doer , "" , isClosed ); err != nil {
3019+ if closeOrReopen && ! issue .IsClosed {
3020+ if err := issue_service .CloseIssue (ctx , issue , ctx .Doer , "" ); err != nil {
30193021 if issues_model .IsErrDependenciesLeft (err ) {
30203022 ctx .JSON (http .StatusPreconditionFailed , map [string ]any {
30213023 "error" : ctx .Tr ("repo.issues.dependency.issue_batch_close_blocked" , issue .Index ),
30223024 })
30233025 return
30243026 }
3025- ctx .ServerError ("ChangeStatus" , err )
3027+ ctx .ServerError ("CloseIssue" , err )
3028+ return
3029+ }
3030+ } else if ! closeOrReopen && issue .IsClosed {
3031+ if err := issue_service .ReopenIssue (ctx , issue , ctx .Doer , "" ); err != nil {
3032+ ctx .ServerError ("ReopenIssue" , err )
30263033 return
30273034 }
30283035 }
@@ -3158,25 +3165,29 @@ func NewComment(ctx *context.Context) {
31583165 if pr != nil {
31593166 ctx .Flash .Info (ctx .Tr ("repo.pulls.open_unmerged_pull_exists" , pr .Index ))
31603167 } else {
3161- isClosed := form .Status == "close"
3162- if err := issue_service .ChangeStatus (ctx , issue , ctx .Doer , "" , isClosed ); err != nil {
3163- log .Error ("ChangeStatus: %v" , err )
3164-
3165- if issues_model .IsErrDependenciesLeft (err ) {
3166- if issue .IsPull {
3167- ctx .JSONError (ctx .Tr ("repo.issues.dependency.pr_close_blocked" ))
3168- } else {
3169- ctx .JSONError (ctx .Tr ("repo.issues.dependency.issue_close_blocked" ))
3168+ closeOrReopen := form .Status == "close"
3169+ if closeOrReopen {
3170+ if err := issue_service .CloseIssue (ctx , issue , ctx .Doer , "" ); err != nil {
3171+ log .Error ("CloseIssue: %v" , err )
3172+ if issues_model .IsErrDependenciesLeft (err ) {
3173+ if issue .IsPull {
3174+ ctx .JSONError (ctx .Tr ("repo.issues.dependency.pr_close_blocked" ))
3175+ } else {
3176+ ctx .JSONError (ctx .Tr ("repo.issues.dependency.issue_close_blocked" ))
3177+ }
3178+ return
31703179 }
3171- return
3180+ } else {
3181+ if err := stopTimerIfAvailable (ctx , ctx .Doer , issue ); err != nil {
3182+ ctx .ServerError ("stopTimerIfAvailable" , err )
3183+ return
3184+ }
3185+ log .Trace ("Issue [%d] status changed to closed: %v" , issue .ID , issue .IsClosed )
31723186 }
31733187 } else {
3174- if err := stopTimerIfAvailable (ctx , ctx .Doer , issue ); err != nil {
3175- ctx .ServerError ("CreateOrStopIssueStopwatch" , err )
3176- return
3188+ if err := issue_service .ReopenIssue (ctx , issue , ctx .Doer , "" ); err != nil {
3189+ log .Error ("ReopenIssue: %v" , err )
31773190 }
3178-
3179- log .Trace ("Issue [%d] status changed to closed: %v" , issue .ID , issue .IsClosed )
31803191 }
31813192 }
31823193 }
0 commit comments