@@ -25,20 +25,30 @@ type crossReferencesContext struct {
2525 Doer * User
2626 OrigIssue * Issue
2727 OrigComment * Comment
28+ RemoveOld bool
2829}
2930
30- func neuterCrossReferences (e Engine , issueID int64 , commentID int64 ) error {
31+ func findOldCrossReferences (e Engine , issueID int64 , commentID int64 ) ([] * Comment , error ) {
3132 active := make ([]* Comment , 0 , 10 )
32- sess := e .Where ("`ref_action` IN (?, ?, ?)" , references .XRefActionNone , references .XRefActionCloses , references .XRefActionReopens ).
33+ return active , e .Where ("`ref_action` IN (?, ?, ?)" , references .XRefActionNone , references .XRefActionCloses , references .XRefActionReopens ).
3334 And ("`ref_issue_id` = ?" , issueID ).
34- And ("`ref_comment_id` = ?" , commentID )
35- if err := sess .Find (& active ); err != nil || len (active ) == 0 {
35+ And ("`ref_comment_id` = ?" , commentID ).
36+ Find (& active )
37+ }
38+
39+ func neuterCrossReferences (e Engine , issueID int64 , commentID int64 ) error {
40+ active , err := findOldCrossReferences (e , issueID , commentID )
41+ if err != nil {
3642 return err
3743 }
3844 ids := make ([]int64 , len (active ))
3945 for i , c := range active {
4046 ids [i ] = c .ID
4147 }
48+ return neuterCrossReferencesIds (e , ids )
49+ }
50+
51+ func neuterCrossReferencesIds (e Engine , ids []int64 ) error {
4252 _ , err := e .In ("id" , ids ).Cols ("`ref_action`" ).Update (& Comment {RefAction : references .XRefActionNeutered })
4353 return err
4454}
@@ -51,7 +61,7 @@ func neuterCrossReferences(e Engine, issueID int64, commentID int64) error {
5161// \/ \/ \/
5262//
5363
54- func (issue * Issue ) addCrossReferences (e * xorm.Session , doer * User ) error {
64+ func (issue * Issue ) addCrossReferences (e * xorm.Session , doer * User , removeOld bool ) error {
5565 var commentType CommentType
5666 if issue .IsPull {
5767 commentType = CommentTypePullRef
@@ -62,6 +72,7 @@ func (issue *Issue) addCrossReferences(e *xorm.Session, doer *User) error {
6272 Type : commentType ,
6373 Doer : doer ,
6474 OrigIssue : issue ,
75+ RemoveOld : removeOld ,
6576 }
6677 return issue .createCrossReferences (e , ctx , issue .Title , issue .Content )
6778}
@@ -71,6 +82,35 @@ func (issue *Issue) createCrossReferences(e *xorm.Session, ctx *crossReferencesC
7182 if err != nil {
7283 return err
7384 }
85+ if ctx .RemoveOld {
86+ var commentID int64
87+ if ctx .OrigComment != nil {
88+ commentID = ctx .OrigComment .ID
89+ }
90+ active , err := findOldCrossReferences (e , ctx .OrigIssue .ID , commentID )
91+ if err != nil {
92+ return err
93+ }
94+ ids := make ([]int64 , 0 , len (active ))
95+ for _ , c := range active {
96+ found := false
97+ for i , x := range xreflist {
98+ if x .Issue .ID == c .IssueID && x .Action == c .RefAction {
99+ found = true
100+ xreflist = append (xreflist [:i ], xreflist [i + 1 :]... )
101+ break
102+ }
103+ }
104+ if ! found {
105+ ids = append (ids , c .ID )
106+ }
107+ }
108+ if len (ids ) > 0 {
109+ if err = neuterCrossReferencesIds (e , ids ); err != nil {
110+ return err
111+ }
112+ }
113+ }
74114 for _ , xref := range xreflist {
75115 var refCommentID int64
76116 if ctx .OrigComment != nil {
@@ -193,10 +233,6 @@ func (issue *Issue) verifyReferencedIssue(e Engine, ctx *crossReferencesContext,
193233 return refIssue , refAction , nil
194234}
195235
196- func (issue * Issue ) neuterCrossReferences (e Engine ) error {
197- return neuterCrossReferences (e , issue .ID , 0 )
198- }
199-
200236// _________ __
201237// \_ ___ \ ____ _____ _____ ____ _____/ |_
202238// / \ \/ / _ \ / \ / \_/ __ \ / \ __\
@@ -205,7 +241,7 @@ func (issue *Issue) neuterCrossReferences(e Engine) error {
205241// \/ \/ \/ \/ \/
206242//
207243
208- func (comment * Comment ) addCrossReferences (e * xorm.Session , doer * User ) error {
244+ func (comment * Comment ) addCrossReferences (e * xorm.Session , doer * User , removeOld bool ) error {
209245 if comment .Type != CommentTypeCode && comment .Type != CommentTypeComment {
210246 return nil
211247 }
@@ -217,6 +253,7 @@ func (comment *Comment) addCrossReferences(e *xorm.Session, doer *User) error {
217253 Doer : doer ,
218254 OrigIssue : comment .Issue ,
219255 OrigComment : comment ,
256+ RemoveOld : removeOld ,
220257 }
221258 return comment .Issue .createCrossReferences (e , ctx , "" , comment .Content )
222259}
0 commit comments