@@ -2,6 +2,8 @@ package gitlabop
2
2
3
3
import (
4
4
"context"
5
+ "fmt"
6
+ "strings"
5
7
"time"
6
8
7
9
"github.com/pkg/errors"
@@ -37,7 +39,12 @@ func (g gitlabOperator) CreateBranch(ctx context.Context, req *CreateBranchReque
37
39
}
38
40
branch , _ , err := g .gitlab .Branches .CreateBranch (req .ProjectID , opt )
39
41
if err != nil {
40
- return nil , errors .Wrap (err , "create branch failed" )
42
+ // if create failed then query from remote, if got then return
43
+ var err2 error
44
+ branch , _ , err2 = g .gitlab .Branches .GetBranch (req .ProjectID , req .TargetBranch )
45
+ if err2 != nil {
46
+ return nil , fmt .Errorf ("create branch failed: %v, query failed: %v" , err , err2 )
47
+ }
41
48
}
42
49
43
50
return & CreateBranchResult {
@@ -54,8 +61,34 @@ func (g gitlabOperator) CreateMilestone(ctx context.Context, req *CreateMileston
54
61
DueDate : nil ,
55
62
}
56
63
milestone , _ , err := g .gitlab .Milestones .CreateMilestone (req .ProjectID , opt )
57
- if err != nil {
58
- return nil , errors .Wrap (err , "CreateMilestone failed" )
64
+ if err != nil || milestone == nil {
65
+ // if create failed then query from remote, if got then return
66
+ opt := gogitlab.ListMilestonesOptions {
67
+ ListOptions : gogitlab.ListOptions {
68
+ Page : 1 ,
69
+ PerPage : 20 ,
70
+ },
71
+ Title : & req .Title ,
72
+ Search : & req .Title ,
73
+ }
74
+ milestones , _ , err2 := g .gitlab .Milestones .ListMilestones (req .ProjectID , & opt )
75
+ if err2 != nil {
76
+ return nil , fmt .Errorf ("create milestone failed: %v, query failed: %v" , err , err2 )
77
+ }
78
+
79
+ matched := false
80
+ for idx , v := range milestones {
81
+ if strings .Compare (req .Title , v .Title ) == 0 &&
82
+ strings .Compare (req .Desc , v .Description ) == 0 {
83
+ // matched
84
+ milestone = milestones [idx ]
85
+ matched = true
86
+ }
87
+ }
88
+
89
+ if ! matched || milestone == nil {
90
+ return nil , fmt .Errorf ("[matched: %v] create milestone failed: %v" , matched , err )
91
+ }
59
92
}
60
93
61
94
return & CreateMilestoneResult {
@@ -138,8 +171,34 @@ func (g gitlabOperator) CreateIssue(ctx context.Context, req *CreateIssueRequest
138
171
CreatedAt : & now ,
139
172
}
140
173
issue , _ , err := g .gitlab .Issues .CreateIssue (req .ProjectID , opt3 )
141
- if err != nil {
142
- return nil , errors .Wrap (err , "create Issue failed" )
174
+ if err != nil || issue == nil {
175
+ // if create failed then query from remote, if got then return
176
+ opt := gogitlab.ListProjectIssuesOptions {
177
+ ListOptions : gogitlab.ListOptions {
178
+ Page : 1 ,
179
+ PerPage : 20 ,
180
+ },
181
+ Search : & req .Title ,
182
+ }
183
+ issues , _ , err2 := g .gitlab .Issues .ListProjectIssues (req .ProjectID , & opt )
184
+ if err2 != nil {
185
+ return nil , fmt .Errorf ("create issue failed: %v, query failed: %v" , err , err2 )
186
+ }
187
+
188
+ matched := false
189
+ for idx , v := range issues {
190
+ if strings .Compare (req .Title , v .Title ) == 0 &&
191
+ strings .Compare (req .Desc , v .Description ) == 0 {
192
+ // matched
193
+ issue = issues [idx ]
194
+ matched = true
195
+ }
196
+ }
197
+
198
+ if ! matched || issue == nil {
199
+ return nil , fmt .Errorf ("[matched: %v] create issue failed: %v" , matched , err )
200
+ }
201
+
143
202
}
144
203
145
204
return & CreateIssueResult {
@@ -162,8 +221,36 @@ func (g gitlabOperator) CreateMergeRequest(ctx context.Context, req *CreateMerge
162
221
// RemoveSourceBranch: true,
163
222
}
164
223
mr , _ , err := g .gitlab .MergeRequests .CreateMergeRequest (req .ProjectID , opt5 )
165
- if err != nil {
166
- return nil , errors .Wrap (err , "create merge request failed" )
224
+ if err != nil || mr == nil {
225
+ // if create failed then query from remote, if got then return
226
+ opt := gogitlab.ListProjectMergeRequestsOptions {
227
+ ListOptions : gogitlab.ListOptions {
228
+ Page : 1 ,
229
+ PerPage : 20 ,
230
+ },
231
+ Search : & req .Title ,
232
+ TargetBranch : & req .TargetBranch ,
233
+ SourceBranch : & req .SrcBranch ,
234
+ //IIDs: []int{req.IssueIID},
235
+ }
236
+ mergeRequests , _ , err2 := g .gitlab .MergeRequests .ListProjectMergeRequests (req .ProjectID , & opt )
237
+ if err2 != nil {
238
+ return nil , fmt .Errorf ("create merge request failed: %v, query failed: %v" , err , err2 )
239
+ }
240
+
241
+ matched := false
242
+ for idx , v := range mergeRequests {
243
+ if strings .Compare (req .Title , v .Title ) == 0 &&
244
+ strings .Compare (req .Desc , v .Description ) == 0 {
245
+ // matched
246
+ mr = mergeRequests [idx ]
247
+ matched = true
248
+ }
249
+ }
250
+
251
+ if ! matched || mr == nil {
252
+ return nil , fmt .Errorf ("[matched: %v] create merge request failed: %v" , matched , err )
253
+ }
167
254
}
168
255
169
256
return & CreateMergeResult {
0 commit comments