diff --git a/server/events/event_parser.go b/server/events/event_parser.go index 87cf264672..194e5344c8 100644 --- a/server/events/event_parser.go +++ b/server/events/event_parser.go @@ -617,15 +617,23 @@ func (e *EventParser) ParseGitlabMergeRequestEvent(event gitlab.MergeEvent) (pul BaseRepo: baseRepo, } - switch event.ObjectAttributes.Action { - case "open": - eventType = models.OpenedPullEvent - case "update": - eventType = e.ParseGitlabMergeRequestUpdateEvent(event) - case "merge", "close": - eventType = models.ClosedPullEvent - default: + // If it's a draft PR we ignore it for auto-planning if configured to do so + // however it's still possible for users to run plan on it manually via a + // comment so if any draft PR is closed we still need to check if we need + // to delete its locks. + if event.ObjectAttributes.WorkInProgress && event.ObjectAttributes.Action != "close" && !e.AllowDraftPRs { eventType = models.OtherPullEvent + } else { + switch event.ObjectAttributes.Action { + case "open": + eventType = models.OpenedPullEvent + case "update": + eventType = e.ParseGitlabMergeRequestUpdateEvent(event) + case "merge", "close": + eventType = models.ClosedPullEvent + default: + eventType = models.OtherPullEvent + } } user = models.User{ diff --git a/server/events/event_parser_test.go b/server/events/event_parser_test.go index d3e979a473..6df7046158 100644 --- a/server/events/event_parser_test.go +++ b/server/events/event_parser_test.go @@ -164,11 +164,19 @@ func TestParseGithubPullEvent(t *testing.T) { } func TestParseGithubPullEventFromDraft(t *testing.T) { + // verify that close event treated as 'close' events by default + closeEvent := deepcopy.Copy(PullEvent).(github.PullRequestEvent) + closeEvent.Action = github.String("closed") + closeEvent.PullRequest.Draft = github.Bool(true) + + _, evType, _, _, _, err := parser.ParseGithubPullEvent(&closeEvent) + Ok(t, err) + Equals(t, models.ClosedPullEvent, evType) + // verify that draft PRs are treated as 'other' events by default testEvent := deepcopy.Copy(PullEvent).(github.PullRequestEvent) - draftPR := true - testEvent.PullRequest.Draft = &draftPR - _, evType, _, _, _, err := parser.ParseGithubPullEvent(&testEvent) + testEvent.PullRequest.Draft = github.Bool(true) + _, evType, _, _, _, err = parser.ParseGithubPullEvent(&testEvent) Ok(t, err) Equals(t, models.OtherPullEvent, evType) // verify that drafts are planned if requested @@ -380,6 +388,29 @@ func TestParseGitlabMergeEvent(t *testing.T) { Equals(t, models.ClosedPullState, pull.State) } +func TestParseGitlabMergeEventFromDraft(t *testing.T) { + path := filepath.Join("testdata", "gitlab-merge-request-event.json") + bytes, err := os.ReadFile(path) + Ok(t, err) + + var event gitlab.MergeEvent + err = json.Unmarshal(bytes, &event) + Ok(t, err) + + testEvent := deepcopy.Copy(event).(gitlab.MergeEvent) + testEvent.ObjectAttributes.WorkInProgress = true + + _, evType, _, _, _, err := parser.ParseGitlabMergeRequestEvent(testEvent) + Ok(t, err) + Equals(t, models.OtherPullEvent, evType) + + parser.AllowDraftPRs = true + defer func() { parser.AllowDraftPRs = false }() + _, evType, _, _, _, err = parser.ParseGitlabMergeRequestEvent(testEvent) + Ok(t, err) + Equals(t, models.OpenedPullEvent, evType) +} + // Should be able to parse a merge event from a repo that is in a subgroup, // i.e. instead of under an owner/repo it's under an owner/group/subgroup/repo. func TestParseGitlabMergeEvent_Subgroup(t *testing.T) {