Skip to content

Commit 409649c

Browse files
authored
Merge pull request #401 from diggerhq/fix-custom-workflow-issue
Fix custom workflow issue
2 parents 2fec950 + c5d07bf commit 409649c

File tree

8 files changed

+113
-24
lines changed

8 files changed

+113
-24
lines changed

pkg/azure/azure.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,18 @@ func (a *AzureReposService) IsClosed(prNumber int) (bool, error) {
295295
if err != nil {
296296
return false, err
297297
}
298-
return *pullRequest.Status == git.PullRequestStatusValues.Completed || *pullRequest.Status == git.PullRequestStatusValues.Abandoned, nil
298+
return *pullRequest.Status == git.PullRequestStatusValues.Abandoned, nil
299+
}
300+
301+
func (a *AzureReposService) IsMerged(prNumber int) (bool, error) {
302+
pullRequest, err := a.Client.GetPullRequestById(context.Background(), git.GetPullRequestByIdArgs{
303+
Project: &a.ProjectName,
304+
PullRequestId: &prNumber,
305+
})
306+
if err != nil {
307+
return false, err
308+
}
309+
return *pullRequest.Status == git.PullRequestStatusValues.Completed, nil
299310
}
300311

301312
func ProcessAzureReposEvent(azureEvent interface{}, diggerConfig *configuration.DiggerConfig, ciService ci.CIService) ([]configuration.Project, *configuration.Project, int, error) {

pkg/ci/ci.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ type CIService interface {
77
SetStatus(prNumber int, status string, statusContext string) error
88
GetCombinedPullRequestStatus(prNumber int) (string, error)
99
MergePullRequest(prNumber int) error
10+
// IsMergeable is still open and ready to be merged
1011
IsMergeable(prNumber int) (bool, error)
12+
// IsMerged merged and closed
13+
IsMerged(prNumber int) (bool, error)
14+
// IsClosed closed without merging
1115
IsClosed(prNumber int) (bool, error)
1216
}

pkg/digger/digger.go

Lines changed: 54 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ func RunCommandsPerProject(
7676
plansToPublish := make([]string, 0)
7777
for _, projectCommands := range commandsPerProject {
7878
for _, command := range projectCommands.Commands {
79+
fmt.Printf("Running '%s' for project '%s'\n", command, projectCommands.ProjectName)
80+
7981
policyInput := map[string]interface{}{"user": requestedBy, "action": command}
8082

8183
allowedToPerformCommand, err := policyChecker.Check(projectNamespace, projectCommands.ProjectName, policyInput)
@@ -124,14 +126,24 @@ func RunCommandsPerProject(
124126
projectLock,
125127
planStorage,
126128
}
129+
127130
switch command {
128131
case "digger plan":
129-
usage.SendUsageRecord(requestedBy, eventName, "plan")
130-
ciService.SetStatus(prNumber, "pending", projectCommands.ProjectName+"/plan")
132+
err := usage.SendUsageRecord(requestedBy, eventName, "plan")
133+
if err != nil {
134+
return false, false, fmt.Errorf("failed to send usage report. %v", err)
135+
}
136+
err = ciService.SetStatus(prNumber, "pending", projectCommands.ProjectName+"/plan")
137+
if err != nil {
138+
return false, false, fmt.Errorf("failed to set PR status. %v", err)
139+
}
131140
planPerformed, plan, err := diggerExecutor.Plan()
132141
if err != nil {
133142
log.Printf("Failed to run digger plan command. %v", err)
134-
ciService.SetStatus(prNumber, "failure", projectCommands.ProjectName+"/plan")
143+
err := ciService.SetStatus(prNumber, "failure", projectCommands.ProjectName+"/plan")
144+
if err != nil {
145+
return false, false, fmt.Errorf("failed to set PR status. %v", err)
146+
}
135147
return false, false, fmt.Errorf("failed to run digger plan command. %v", err)
136148
} else if planPerformed {
137149
if plan != "" {
@@ -145,45 +157,73 @@ func RunCommandsPerProject(
145157
}
146158
}
147159
}
148-
ciService.SetStatus(prNumber, "success", projectCommands.ProjectName+"/plan")
160+
err := ciService.SetStatus(prNumber, "success", projectCommands.ProjectName+"/plan")
161+
if err != nil {
162+
return false, false, fmt.Errorf("failed to set PR status. %v", err)
163+
}
149164
}
150165
case "digger apply":
151166
appliesPerProject[projectCommands.ProjectName] = false
152-
usage.SendUsageRecord(requestedBy, eventName, "apply")
153-
ciService.SetStatus(prNumber, "pending", projectCommands.ProjectName+"/apply")
167+
err := usage.SendUsageRecord(requestedBy, eventName, "apply")
168+
if err != nil {
169+
return false, false, fmt.Errorf("failed to send usage report. %v", err)
170+
}
171+
err = ciService.SetStatus(prNumber, "pending", projectCommands.ProjectName+"/apply")
172+
if err != nil {
173+
return false, false, fmt.Errorf("failed to set PR status. %v", err)
174+
}
175+
176+
isMerged, err := ciService.IsMerged(prNumber)
177+
if err != nil {
178+
return false, false, fmt.Errorf("error checking if PR is merged: %v", err)
179+
}
154180

155181
// this might go into some sort of "appliability" plugin later
156182
isMergeable, err := ciService.IsMergeable(prNumber)
157183
if err != nil {
158184
return false, false, fmt.Errorf("error validating is PR is mergeable: %v", err)
159185
}
160-
if !isMergeable {
186+
fmt.Printf("PR status, mergeable: %v, merged: %v\n", isMergeable, isMerged)
187+
if !isMergeable && !isMerged {
161188
comment := "Cannot perform Apply since the PR is not currently mergeable."
189+
fmt.Println(comment)
162190
err = ciService.PublishComment(prNumber, comment)
163191
if err != nil {
164-
fmt.Printf("error publishing comment: %v", err)
192+
fmt.Printf("error publishing comment: %v\n", err)
165193
}
166194
return false, false, nil
167195
} else {
168196
applyPerformed, err := diggerExecutor.Apply()
169197
if err != nil {
170198
log.Printf("Failed to run digger apply command. %v", err)
171-
ciService.SetStatus(prNumber, "failure", projectCommands.ProjectName+"/apply")
199+
err := ciService.SetStatus(prNumber, "failure", projectCommands.ProjectName+"/apply")
200+
if err != nil {
201+
return false, false, fmt.Errorf("failed to set PR status. %v", err)
202+
}
172203
return false, false, fmt.Errorf("failed to run digger apply command. %v", err)
173204
} else if applyPerformed {
174-
ciService.SetStatus(prNumber, "success", projectCommands.ProjectName+"/apply")
205+
err := ciService.SetStatus(prNumber, "success", projectCommands.ProjectName+"/apply")
206+
if err != nil {
207+
return false, false, fmt.Errorf("failed to set PR status. %v", err)
208+
}
175209
appliesPerProject[projectCommands.ProjectName] = true
176210
}
177211
}
178212
case "digger unlock":
179-
usage.SendUsageRecord(requestedBy, eventName, "unlock")
180-
err := diggerExecutor.Unlock()
213+
err := usage.SendUsageRecord(requestedBy, eventName, "unlock")
214+
if err != nil {
215+
return false, false, fmt.Errorf("failed to send usage report. %v", err)
216+
}
217+
err = diggerExecutor.Unlock()
181218
if err != nil {
182219
return false, false, fmt.Errorf("failed to unlock project. %v", err)
183220
}
184221
case "digger lock":
185-
usage.SendUsageRecord(requestedBy, eventName, "lock")
186-
err := diggerExecutor.Lock()
222+
err := usage.SendUsageRecord(requestedBy, eventName, "lock")
223+
if err != nil {
224+
return false, false, fmt.Errorf("failed to send usage report. %v", err)
225+
}
226+
err = diggerExecutor.Lock()
187227
if err != nil {
188228
return false, false, fmt.Errorf("failed to lock project. %v", err)
189229
}

pkg/digger/digger_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,11 @@ func (m *MockPRManager) DownloadLatestPlans(prNumber int) (string, error) {
9090
return "plan", nil
9191
}
9292

93+
func (m *MockPRManager) IsMerged(prNumber int) (bool, error) {
94+
m.Commands = append(m.Commands, RunInfo{"IsClosed", strconv.Itoa(prNumber), time.Now()})
95+
return false, nil
96+
}
97+
9398
func (m *MockPRManager) IsClosed(prNumber int) (bool, error) {
9499
m.Commands = append(m.Commands, RunInfo{"IsClosed", strconv.Itoa(prNumber), time.Now()})
95100
return false, nil

pkg/github/github.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,15 +109,26 @@ func (svc *GithubService) IsMergeable(prNumber int) (bool, error) {
109109
pr, _, err := svc.Client.PullRequests.Get(context.Background(), svc.Owner, svc.RepoName, prNumber)
110110
if err != nil {
111111
log.Fatalf("error getting pull request: %v", err)
112+
return false, err
112113
}
113114

114115
return pr.GetMergeable() && isMergeableState(pr.GetMergeableState()), nil
115116
}
116117

118+
func (svc *GithubService) IsMerged(prNumber int) (bool, error) {
119+
pr, _, err := svc.Client.PullRequests.Get(context.Background(), svc.Owner, svc.RepoName, prNumber)
120+
if err != nil {
121+
log.Fatalf("error getting pull request: %v", err)
122+
return false, err
123+
}
124+
return *pr.Merged, nil
125+
}
126+
117127
func (svc *GithubService) IsClosed(prNumber int) (bool, error) {
118128
pr, _, err := svc.Client.PullRequests.Get(context.Background(), svc.Owner, svc.RepoName, prNumber)
119129
if err != nil {
120130
log.Fatalf("error getting pull request: %v", err)
131+
return false, err
121132
}
122133

123134
return pr.GetState() == "closed", nil

pkg/gitlab/gitlab.go

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -208,23 +208,32 @@ func (gitlabService GitLabService) IsMergeable(mergeRequestID int) (bool, error)
208208
}
209209

210210
func (gitlabService GitLabService) IsClosed(mergeRequestID int) (bool, error) {
211+
mergeRequest := getMergeRequest(gitlabService)
212+
if mergeRequest.State == "closed" {
213+
return true, nil
214+
}
215+
return false, nil
216+
}
217+
218+
func (gitlabService GitLabService) IsMerged(mergeRequestID int) (bool, error) {
219+
mergeRequest := getMergeRequest(gitlabService)
220+
if mergeRequest.State == "merged" {
221+
return true, nil
222+
}
223+
return false, nil
224+
}
225+
226+
func getMergeRequest(gitlabService GitLabService) *go_gitlab.MergeRequest {
211227
projectId := *gitlabService.Context.ProjectId
212228
mergeRequestIID := *gitlabService.Context.MergeRequestIId
213-
214-
fmt.Printf("IsClosed mergeRequestIID : %d, projectId: %d \n", mergeRequestIID, projectId)
229+
fmt.Printf("getMergeRequest mergeRequestIID : %d, projectId: %d \n", mergeRequestIID, projectId)
215230
opt := &go_gitlab.GetMergeRequestsOptions{}
216-
217231
mergeRequest, _, err := gitlabService.Client.MergeRequests.GetMergeRequest(projectId, mergeRequestIID, opt)
218-
219232
if err != nil {
220233
fmt.Printf("Failed to get a MergeRequest: %d, %v \n", mergeRequestIID, err)
221234
print(err.Error())
222235
}
223-
224-
if mergeRequest.State == "closed" || mergeRequest.State == "merged" {
225-
return true, nil
226-
}
227-
return false, nil
236+
return mergeRequest
228237
}
229238

230239
type GitLabEvent struct {

pkg/utils/mocks.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ func (t MockPullRequestManager) IsMergeable(prNumber int) (bool, error) {
7373
return true, nil
7474
}
7575

76+
func (t MockPullRequestManager) IsMerged(prNumber int) (bool, error) {
77+
return false, nil
78+
}
79+
7680
func (t MockPullRequestManager) DownloadLatestPlans(prNumber int) (string, error) {
7781
return "", nil
7882
}

pkg/utils/pullrequestmanager_mock.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,8 @@ func (mockGithubPullrequestManager *MockGithubPullrequestManager) IsClosed(prNum
4343
mockGithubPullrequestManager.commands = append(mockGithubPullrequestManager.commands, "IsClosed")
4444
return false, nil
4545
}
46+
47+
func (mockGithubPullrequestManager *MockGithubPullrequestManager) IsMerged(prNumber int) (bool, error) {
48+
mockGithubPullrequestManager.commands = append(mockGithubPullrequestManager.commands, "IsClosed")
49+
return false, nil
50+
}

0 commit comments

Comments
 (0)