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