@@ -580,8 +580,13 @@ func (issue *Issue) changeStatus(e *xorm.Session, doer *User, isClosed, isMergeP
580
580
}
581
581
}
582
582
583
+ issue .IsClosed = isClosed
584
+ return issue .doChangeStatus (e , doer , isMergePull )
585
+ }
586
+
587
+ func (issue * Issue ) doChangeStatus (e * xorm.Session , doer * User , isMergePull bool ) (* Comment , error ) {
583
588
// Check for open dependencies
584
- if isClosed && issue .Repo .isDependenciesEnabled (e ) {
589
+ if issue . IsClosed && issue .Repo .isDependenciesEnabled (e ) {
585
590
// 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
586
591
noDeps , err := issueNoDependenciesLeft (e , issue )
587
592
if err != nil {
@@ -593,23 +598,22 @@ func (issue *Issue) changeStatus(e *xorm.Session, doer *User, isClosed, isMergeP
593
598
}
594
599
}
595
600
596
- issue .IsClosed = isClosed
597
- if isClosed {
601
+ if issue .IsClosed {
598
602
issue .ClosedUnix = timeutil .TimeStampNow ()
599
603
} else {
600
604
issue .ClosedUnix = 0
601
605
}
602
606
603
- if err = updateIssueCols (e , issue , "is_closed" , "closed_unix" ); err != nil {
607
+ if err : = updateIssueCols (e , issue , "is_closed" , "closed_unix" ); err != nil {
604
608
return nil , err
605
609
}
606
610
607
611
// Update issue count of labels
608
- if err = issue .getLabels (e ); err != nil {
612
+ if err : = issue .getLabels (e ); err != nil {
609
613
return nil , err
610
614
}
611
615
for idx := range issue .Labels {
612
- if err = updateLabelCols (e , issue .Labels [idx ], "num_issues" , "num_closed_issue" ); err != nil {
616
+ if err : = updateLabelCols (e , issue .Labels [idx ], "num_issues" , "num_closed_issue" ); err != nil {
613
617
return nil , err
614
618
}
615
619
}
@@ -1607,28 +1611,59 @@ func SearchIssueIDsByKeyword(kw string, repoIDs []int64, limit, start int) (int6
1607
1611
}
1608
1612
1609
1613
// UpdateIssueByAPI updates all allowed fields of given issue.
1610
- func UpdateIssueByAPI (issue * Issue ) error {
1614
+ // If the issue status is changed a statusChangeComment is returned
1615
+ // similarly if the title is changed the titleChanged bool is set to true
1616
+ func UpdateIssueByAPI (issue * Issue , doer * User ) (statusChangeComment * Comment , titleChanged bool , err error ) {
1611
1617
sess := x .NewSession ()
1612
1618
defer sess .Close ()
1613
1619
if err := sess .Begin (); err != nil {
1614
- return err
1620
+ return nil , false , err
1621
+ }
1622
+
1623
+ if err := issue .loadRepo (sess ); err != nil {
1624
+ return nil , false , fmt .Errorf ("loadRepo: %v" , err )
1625
+ }
1626
+
1627
+ // Reload the issue
1628
+ currentIssue , err := getIssueByID (sess , issue .ID )
1629
+ if err != nil {
1630
+ return nil , false , err
1615
1631
}
1616
1632
1617
1633
if _ , err := sess .ID (issue .ID ).Cols (
1618
- "name" , "is_closed" , " content" , "milestone_id" , "priority" ,
1619
- "deadline_unix" , "updated_unix" , "closed_unix" , " is_locked" ).
1634
+ "name" , "content" , "milestone_id" , "priority" ,
1635
+ "deadline_unix" , "updated_unix" , "is_locked" ).
1620
1636
Update (issue ); err != nil {
1621
- return err
1637
+ return nil , false , err
1622
1638
}
1623
1639
1624
- if err := issue .loadPoster (sess ); err != nil {
1625
- return err
1640
+ titleChanged = currentIssue .Title != issue .Title
1641
+ if titleChanged {
1642
+ var opts = & CreateCommentOptions {
1643
+ Type : CommentTypeChangeTitle ,
1644
+ Doer : doer ,
1645
+ Repo : issue .Repo ,
1646
+ Issue : issue ,
1647
+ OldTitle : currentIssue .Title ,
1648
+ NewTitle : issue .Title ,
1649
+ }
1650
+ _ , err := createComment (sess , opts )
1651
+ if err != nil {
1652
+ return nil , false , fmt .Errorf ("createComment: %v" , err )
1653
+ }
1626
1654
}
1627
1655
1628
- if err := issue .addCrossReferences (sess , issue .Poster , true ); err != nil {
1629
- return err
1656
+ if currentIssue .IsClosed != issue .IsClosed {
1657
+ statusChangeComment , err = issue .doChangeStatus (sess , doer , false )
1658
+ if err != nil {
1659
+ return nil , false , err
1660
+ }
1630
1661
}
1631
- return sess .Commit ()
1662
+
1663
+ if err := issue .addCrossReferences (sess , doer , true ); err != nil {
1664
+ return nil , false , err
1665
+ }
1666
+ return statusChangeComment , titleChanged , sess .Commit ()
1632
1667
}
1633
1668
1634
1669
// UpdateIssueDeadline updates an issue deadline and adds comments. Setting a deadline to 0 means deleting it.
0 commit comments