@@ -28,38 +28,13 @@ import (
2828
2929// UpdateIssueCols updates cols of issue
3030func UpdateIssueCols (ctx context.Context , issue * Issue , cols ... string ) error {
31- if _ , err := db .GetEngine (ctx ).ID (issue .ID ).Cols (cols ... ).Update (issue ); err != nil {
32- return err
33- }
34- return nil
35- }
36-
37- func ChangeIssueStatus (ctx context.Context , issue * Issue , doer * user_model.User , isClosed , isMergePull bool ) (* Comment , error ) {
38- // Reload the issue
39- currentIssue , err := GetIssueByID (ctx , issue .ID )
40- if err != nil {
41- return nil , err
42- }
43-
44- // Nothing should be performed if current status is same as target status
45- if currentIssue .IsClosed == isClosed {
46- if ! issue .IsPull {
47- return nil , ErrIssueWasClosed {
48- ID : issue .ID ,
49- }
50- }
51- return nil , ErrPullWasClosed {
52- ID : issue .ID ,
53- }
54- }
55-
56- issue .IsClosed = isClosed
57- return doChangeIssueStatus (ctx , issue , doer , isMergePull )
31+ _ , err := db .GetEngine (ctx ).ID (issue .ID ).Cols (cols ... ).Update (issue )
32+ return err
5833}
5934
60- func doChangeIssueStatus (ctx context.Context , issue * Issue , doer * user_model.User , isMergePull bool ) (* Comment , error ) {
35+ func closeIssue (ctx context.Context , issue * Issue , doer * user_model.User , isMergePull bool ) (* Comment , error ) {
6136 // Check for open dependencies
62- if issue .IsClosed && issue . Repo .IsDependenciesEnabled (ctx ) {
37+ if issue .Repo .IsDependenciesEnabled (ctx ) {
6338 // 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
6439 noDeps , err := IssueNoDependenciesLeft (ctx , issue )
6540 if err != nil {
@@ -71,16 +46,36 @@ func doChangeIssueStatus(ctx context.Context, issue *Issue, doer *user_model.Use
7146 }
7247 }
7348
74- if issue .IsClosed {
75- issue .ClosedUnix = timeutil .TimeStampNow ()
76- } else {
77- issue .ClosedUnix = 0
49+ issue .IsClosed = true
50+ issue .ClosedUnix = timeutil .TimeStampNow ()
51+
52+ if cnt , err := db .GetEngine (ctx ).ID (issue .ID ).Cols ("is_closed" , "closed_unix" ).
53+ Where ("is_closed == ?" , false ).
54+ Update (issue ); err != nil {
55+ return nil , err
56+ } else if cnt != 1 {
57+ return nil , ErrIssueAlreadyChanged
7858 }
7959
80- if err := UpdateIssueCols (ctx , issue , "is_closed" , "closed_unix" ); err != nil {
60+ return updateIssueNumbers (ctx , issue , doer , util .Iif (isMergePull , CommentTypeMergePull , CommentTypeClose ))
61+ }
62+
63+ func SetIssueAsReopen (ctx context.Context , issue * Issue , doer * user_model.User , isMergePull bool ) (* Comment , error ) {
64+ issue .IsClosed = false
65+ issue .ClosedUnix = 0
66+
67+ if cnt , err := db .GetEngine (ctx ).ID (issue .ID ).Cols ("is_closed" , "closed_unix" ).
68+ Where ("is_closed == ?" , true ).
69+ Update (issue ); err != nil {
8170 return nil , err
71+ } else if cnt != 1 {
72+ return nil , ErrIssueAlreadyChanged
8273 }
8374
75+ return updateIssueNumbers (ctx , issue , doer , CommentTypeReopen )
76+ }
77+
78+ func updateIssueNumbers (ctx context.Context , issue * Issue , doer * user_model.User , cmtType CommentType ) (* Comment , error ) {
8479 // Update issue count of labels
8580 if err := issue .LoadLabels (ctx ); err != nil {
8681 return nil , err
@@ -103,14 +98,6 @@ func doChangeIssueStatus(ctx context.Context, issue *Issue, doer *user_model.Use
10398 return nil , err
10499 }
105100
106- // New action comment
107- cmtType := CommentTypeClose
108- if ! issue .IsClosed {
109- cmtType = CommentTypeReopen
110- } else if isMergePull {
111- cmtType = CommentTypeMergePull
112- }
113-
114101 return CreateComment (ctx , & CreateCommentOptions {
115102 Type : cmtType ,
116103 Doer : doer ,
@@ -134,7 +121,7 @@ func CloseIssue(ctx context.Context, issue *Issue, doer *user_model.User) (*Comm
134121 }
135122 defer committer .Close ()
136123
137- comment , err := ChangeIssueStatus (ctx , issue , doer , true , false )
124+ comment , err := closeIssue (ctx , issue , doer , false )
138125 if err != nil {
139126 return nil , err
140127 }
@@ -159,7 +146,7 @@ func ReopenIssue(ctx context.Context, issue *Issue, doer *user_model.User) (*Com
159146 }
160147 defer committer .Close ()
161148
162- comment , err := ChangeIssueStatus (ctx , issue , doer , false , false )
149+ comment , err := SetIssueAsReopen (ctx , issue , doer , false )
163150 if err != nil {
164151 return nil , err
165152 }
0 commit comments