@@ -600,28 +600,35 @@ func updateIssueCols(e Engine, issue *Issue, cols ...string) error {
600600 return nil
601601}
602602
603- func (issue * Issue ) changeStatus (e * xorm.Session , doer * User , isClosed bool ) (err error ) {
603+ func (issue * Issue ) changeStatus (e * xorm.Session , doer * User , isClosed bool ) (* Comment , error ) {
604604 // Reload the issue
605605 currentIssue , err := getIssueByID (e , issue .ID )
606606 if err != nil {
607- return err
607+ return nil , err
608608 }
609609
610610 // Nothing should be performed if current status is same as target status
611611 if currentIssue .IsClosed == isClosed {
612- return nil
612+ if ! issue .IsPull {
613+ return nil , ErrIssueWasClosed {
614+ ID : issue .ID ,
615+ }
616+ }
617+ return nil , ErrPullWasClosed {
618+ ID : issue .ID ,
619+ }
613620 }
614621
615622 // Check for open dependencies
616623 if isClosed && issue .Repo .isDependenciesEnabled (e ) {
617624 // 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
618625 noDeps , err := issueNoDependenciesLeft (e , issue )
619626 if err != nil {
620- return err
627+ return nil , err
621628 }
622629
623630 if ! noDeps {
624- return ErrDependenciesLeft {issue .ID }
631+ return nil , ErrDependenciesLeft {issue .ID }
625632 }
626633 }
627634
@@ -633,22 +640,22 @@ func (issue *Issue) changeStatus(e *xorm.Session, doer *User, isClosed bool) (er
633640 }
634641
635642 if err = updateIssueCols (e , issue , "is_closed" , "closed_unix" ); err != nil {
636- return err
643+ return nil , err
637644 }
638645
639646 // Update issue count of labels
640647 if err = issue .getLabels (e ); err != nil {
641- return err
648+ return nil , err
642649 }
643650 for idx := range issue .Labels {
644651 if err = updateLabel (e , issue .Labels [idx ]); err != nil {
645- return err
652+ return nil , err
646653 }
647654 }
648655
649656 // Update issue count of milestone
650657 if err := updateMilestoneClosedNum (e , issue .MilestoneID ); err != nil {
651- return err
658+ return nil , err
652659 }
653660
654661 // New action comment
@@ -657,43 +664,39 @@ func (issue *Issue) changeStatus(e *xorm.Session, doer *User, isClosed bool) (er
657664 cmtType = CommentTypeReopen
658665 }
659666
660- var opts = & CreateCommentOptions {
667+ return createCommentWithNoAction ( e , & CreateCommentOptions {
661668 Type : cmtType ,
662669 Doer : doer ,
663670 Repo : issue .Repo ,
664671 Issue : issue ,
665- }
666- comment , err := createCommentWithNoAction (e , opts )
667- if err != nil {
668- return err
669- }
670- return sendCreateCommentAction (e , opts , comment )
672+ })
671673}
672674
673675// ChangeStatus changes issue status to open or closed.
674- func (issue * Issue ) ChangeStatus (doer * User , isClosed bool ) (err error ) {
676+ func (issue * Issue ) ChangeStatus (doer * User , isClosed bool ) (* Comment , error ) {
675677 sess := x .NewSession ()
676678 defer sess .Close ()
677- if err = sess .Begin (); err != nil {
678- return err
679+ if err : = sess .Begin (); err != nil {
680+ return nil , err
679681 }
680682
681- if err = issue .loadRepo (sess ); err != nil {
682- return err
683+ if err : = issue .loadRepo (sess ); err != nil {
684+ return nil , err
683685 }
684- if err = issue .loadPoster (sess ); err != nil {
685- return err
686+ if err : = issue .loadPoster (sess ); err != nil {
687+ return nil , err
686688 }
687689
688- if err = issue .changeStatus (sess , doer , isClosed ); err != nil {
689- return err
690+ comment , err := issue .changeStatus (sess , doer , isClosed )
691+ if err != nil {
692+ return nil , err
690693 }
691694
692695 if err = sess .Commit (); err != nil {
693- return fmt .Errorf ("Commit: %v" , err )
696+ return nil , fmt .Errorf ("Commit: %v" , err )
694697 }
695698
696- return nil
699+ return comment , nil
697700}
698701
699702// ChangeTitle changes the title of this issue, as the given user.
0 commit comments