Skip to content

Commit 93dc87f

Browse files
committed
feat: create remote resource enhance...
1 parent a569dab commit 93dc87f

File tree

6 files changed

+215
-13
lines changed

6 files changed

+215
-13
lines changed

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,5 @@ testdata/
1919
gitlab-flow
2020
flow-debug
2121
flow2
22-
!gitlab-flow/
22+
!gitlab-flow/
23+
secret

internal/flow_impl.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -634,9 +634,9 @@ func (f flowImpl) createBranch(
634634
req := gitlabop.CreateBranchRequest{
635635
TargetBranch: targetBranchName,
636636
SrcBranch: srcBranch,
637-
MilestoneID: milestoneID,
638-
IssueID: issueIID,
639637
ProjectID: f.ctx.Project.ID,
638+
//MilestoneID: milestoneID,
639+
//IssueID: issueIID,
640640
}
641641

642642
result, err := f.gitlabOperator.CreateBranch(ctx, &req)

internal/gitlab-operator/gitlab_operator.go

+10-2
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,23 @@ import "context"
55
// IGitlabOperator contains all operations those manage repository,
66
// milestones, branch, issue and merge requests.
77
type IGitlabOperator interface {
8+
// CreateBranch create a branch on remote gitlab repository, but this would check remote
9+
// resource if create failed.
810
CreateBranch(ctx context.Context, req *CreateBranchRequest) (*CreateBranchResult, error)
911

12+
// CreateMilestone create a milestone on remote gitlab repository, but this would check remote
13+
// resource if create failed.
1014
CreateMilestone(ctx context.Context, req *CreateMilestoneRequest) (*CreateMilestoneResult, error)
1115
GetMilestone(ctx context.Context, req *GetMilestoneRequest) (*GetMilestoneResult, error)
1216
GetMilestoneMergeRequests(
1317
ctx context.Context, req *GetMilestoneMergeRequestsRequest) (*GetMilestoneMergeRequestsResult, error)
1418
GetMilestoneIssues(ctx context.Context, req *GetMilestoneIssuesRequest) (*GetMilestoneIssuesResult, error)
1519

20+
// CreateIssue create an issue on remote repository, but this would check remote
21+
// resource if create failed.
1622
CreateIssue(ctx context.Context, req *CreateIssueRequest) (*CreateIssueResult, error)
23+
// CreateMergeRequest create an merge request on remote repository, but this would check remote
24+
// resource if create failed.
1725
CreateMergeRequest(ctx context.Context, req *CreateMergeRequest) (*CreateMergeResult, error)
1826

1927
ListMilestones(ctx context.Context, req *ListMilestoneRequest) (*ListMilestoneResult, error)
@@ -24,9 +32,9 @@ type IGitlabOperator interface {
2432
type CreateBranchRequest struct {
2533
TargetBranch string
2634
SrcBranch string
27-
MilestoneID int
28-
IssueID int
2935
ProjectID int
36+
//MilestoneID int
37+
//IssueID int
3038
}
3139

3240
type CreateBranchResult struct {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package gitlabop
2+
3+
import (
4+
"context"
5+
"io/ioutil"
6+
"os"
7+
"strings"
8+
"testing"
9+
10+
"github.com/yeqown/gitlab-flow/internal/types"
11+
12+
"github.com/stretchr/testify/suite"
13+
)
14+
15+
type gitlabOperatorTestSuite struct {
16+
suite.Suite
17+
18+
op IGitlabOperator
19+
projectID int
20+
milestoneID int
21+
issueIID int
22+
}
23+
24+
func (g *gitlabOperatorTestSuite) SetupSuite() {
25+
r, err := os.Open("./secret")
26+
g.Require().Nil(err)
27+
28+
data, err := ioutil.ReadAll(r)
29+
g.Require().Nil(err)
30+
31+
arr := strings.Split(string(data), "\n")
32+
g.Require().Equal(2, len(arr))
33+
g.T().Logf("%+v", arr)
34+
g.op = NewGitlabOperator(arr[0], arr[1])
35+
36+
// this only could be test locally
37+
g.projectID = 851
38+
g.milestoneID = 1140
39+
g.issueIID = 18
40+
}
41+
42+
func (g *gitlabOperatorTestSuite) TearDownSuite() {
43+
// do nothing
44+
}
45+
46+
func (g gitlabOperatorTestSuite) Test_CreateBranch() {
47+
ctx := context.Background()
48+
req := CreateBranchRequest{
49+
TargetBranch: "feature/branch",
50+
SrcBranch: types.MasterBranch.String(),
51+
ProjectID: g.projectID,
52+
}
53+
result, err := g.op.CreateBranch(ctx, &req)
54+
g.Nil(err)
55+
g.NotNil(result)
56+
g.T().Logf("result=%+v", result)
57+
}
58+
59+
func (g gitlabOperatorTestSuite) Test_CreateMilestone() {
60+
ctx := context.Background()
61+
req := CreateMilestoneRequest{
62+
Title: "milestoneTest",
63+
Desc: "milestoneDesc",
64+
ProjectID: g.projectID,
65+
}
66+
result, err := g.op.CreateMilestone(ctx, &req)
67+
g.Nil(err)
68+
g.NotNil(result)
69+
g.T().Logf("result=%+v", result)
70+
}
71+
72+
func (g gitlabOperatorTestSuite) Test_CreateIssue() {
73+
ctx := context.Background()
74+
req := CreateIssueRequest{
75+
Title: "milestoneTest",
76+
Desc: "milestoneDesc",
77+
RelatedBranch: "feature/branch",
78+
MilestoneID: g.milestoneID,
79+
ProjectID: g.projectID,
80+
}
81+
result, err := g.op.CreateIssue(ctx, &req)
82+
g.Nil(err)
83+
g.NotNil(result)
84+
g.T().Logf("result=%+v", result)
85+
}
86+
87+
func (g gitlabOperatorTestSuite) Test_CreateMergeRequest() {
88+
ctx := context.Background()
89+
req := CreateMergeRequest{
90+
Title: "MR Title",
91+
Desc: "MR Desc",
92+
SrcBranch: "feature/branch",
93+
TargetBranch: types.MasterBranch.String(),
94+
MilestoneID: g.milestoneID,
95+
IssueIID: g.issueIID,
96+
ProjectID: g.projectID,
97+
}
98+
result, err := g.op.CreateMergeRequest(ctx, &req)
99+
g.Nil(err)
100+
g.NotNil(result)
101+
g.T().Logf("result=%+v", result)
102+
}
103+
104+
func Test_gitlabOperator(t *testing.T) {
105+
suite.Run(t, new(gitlabOperatorTestSuite))
106+
}

internal/gitlab-operator/gitlba_operator_impl.go

+94-7
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package gitlabop
22

33
import (
44
"context"
5+
"fmt"
6+
"strings"
57
"time"
68

79
"github.com/pkg/errors"
@@ -37,7 +39,12 @@ func (g gitlabOperator) CreateBranch(ctx context.Context, req *CreateBranchReque
3739
}
3840
branch, _, err := g.gitlab.Branches.CreateBranch(req.ProjectID, opt)
3941
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+
}
4148
}
4249

4350
return &CreateBranchResult{
@@ -54,8 +61,34 @@ func (g gitlabOperator) CreateMilestone(ctx context.Context, req *CreateMileston
5461
DueDate: nil,
5562
}
5663
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+
}
5992
}
6093

6194
return &CreateMilestoneResult{
@@ -138,8 +171,34 @@ func (g gitlabOperator) CreateIssue(ctx context.Context, req *CreateIssueRequest
138171
CreatedAt: &now,
139172
}
140173
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+
143202
}
144203

145204
return &CreateIssueResult{
@@ -162,8 +221,36 @@ func (g gitlabOperator) CreateMergeRequest(ctx context.Context, req *CreateMerge
162221
// RemoveSourceBranch: true,
163222
}
164223
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+
}
167254
}
168255

169256
return &CreateMergeResult{

internal/repository/flow_repo_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ type flowRepoTestSuite struct {
1616

1717
func (s *flowRepoTestSuite) SetupTest() {
1818
s.T().Log("called")
19-
s.repo = impl.NewBasedSqlite3(impl.ConnectDB("./testdata", true))
19+
s.repo = impl.NewBasedSqlite3(impl.ConnectDB("./secret", true))
2020
s.T().Logf("%+v", s.repo)
2121
}
2222

0 commit comments

Comments
 (0)