@@ -25,20 +25,30 @@ type crossReferencesContext struct {
25
25
Doer * User
26
26
OrigIssue * Issue
27
27
OrigComment * Comment
28
+ RemoveOld bool
28
29
}
29
30
30
- func neuterCrossReferences (e Engine , issueID int64 , commentID int64 ) error {
31
+ func findOldCrossReferences (e Engine , issueID int64 , commentID int64 ) ([] * Comment , error ) {
31
32
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 ).
33
34
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 {
36
42
return err
37
43
}
38
44
ids := make ([]int64 , len (active ))
39
45
for i , c := range active {
40
46
ids [i ] = c .ID
41
47
}
48
+ return neuterCrossReferencesIds (e , ids )
49
+ }
50
+
51
+ func neuterCrossReferencesIds (e Engine , ids []int64 ) error {
42
52
_ , err := e .In ("id" , ids ).Cols ("`ref_action`" ).Update (& Comment {RefAction : references .XRefActionNeutered })
43
53
return err
44
54
}
@@ -51,7 +61,7 @@ func neuterCrossReferences(e Engine, issueID int64, commentID int64) error {
51
61
// \/ \/ \/
52
62
//
53
63
54
- func (issue * Issue ) addCrossReferences (e * xorm.Session , doer * User ) error {
64
+ func (issue * Issue ) addCrossReferences (e * xorm.Session , doer * User , removeOld bool ) error {
55
65
var commentType CommentType
56
66
if issue .IsPull {
57
67
commentType = CommentTypePullRef
@@ -62,6 +72,7 @@ func (issue *Issue) addCrossReferences(e *xorm.Session, doer *User) error {
62
72
Type : commentType ,
63
73
Doer : doer ,
64
74
OrigIssue : issue ,
75
+ RemoveOld : removeOld ,
65
76
}
66
77
return issue .createCrossReferences (e , ctx , issue .Title , issue .Content )
67
78
}
@@ -71,6 +82,35 @@ func (issue *Issue) createCrossReferences(e *xorm.Session, ctx *crossReferencesC
71
82
if err != nil {
72
83
return err
73
84
}
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
+ }
74
114
for _ , xref := range xreflist {
75
115
var refCommentID int64
76
116
if ctx .OrigComment != nil {
@@ -193,10 +233,6 @@ func (issue *Issue) verifyReferencedIssue(e Engine, ctx *crossReferencesContext,
193
233
return refIssue , refAction , nil
194
234
}
195
235
196
- func (issue * Issue ) neuterCrossReferences (e Engine ) error {
197
- return neuterCrossReferences (e , issue .ID , 0 )
198
- }
199
-
200
236
// _________ __
201
237
// \_ ___ \ ____ _____ _____ ____ _____/ |_
202
238
// / \ \/ / _ \ / \ / \_/ __ \ / \ __\
@@ -205,7 +241,7 @@ func (issue *Issue) neuterCrossReferences(e Engine) error {
205
241
// \/ \/ \/ \/ \/
206
242
//
207
243
208
- func (comment * Comment ) addCrossReferences (e * xorm.Session , doer * User ) error {
244
+ func (comment * Comment ) addCrossReferences (e * xorm.Session , doer * User , removeOld bool ) error {
209
245
if comment .Type != CommentTypeCode && comment .Type != CommentTypeComment {
210
246
return nil
211
247
}
@@ -217,6 +253,7 @@ func (comment *Comment) addCrossReferences(e *xorm.Session, doer *User) error {
217
253
Doer : doer ,
218
254
OrigIssue : comment .Issue ,
219
255
OrigComment : comment ,
256
+ RemoveOld : removeOld ,
220
257
}
221
258
return comment .Issue .createCrossReferences (e , ctx , "" , comment .Content )
222
259
}
0 commit comments