diff --git a/pkg/provider/gitlab/detect.go b/pkg/provider/gitlab/detect.go index 3eed737fb4..4aded68ef5 100644 --- a/pkg/provider/gitlab/detect.go +++ b/pkg/provider/gitlab/detect.go @@ -90,7 +90,7 @@ func (v *Provider) Detect(req *http.Request, payload string, logger *zap.Sugared func hasOnlyLabelsChanged(gitEvent *gitlab.MergeEvent) bool { changes := gitEvent.Changes - labelsChanged := len(changes.Labels.Previous) > 0 || len(changes.Labels.Current) > 0 + labelsChanged := isNewLabelAdded(changes.Labels.Previous, changes.Labels.Current) // Only Labels can change — everything else must be zero or nil onlyUpdatedAtOrLabels := labelsChanged && @@ -108,3 +108,21 @@ func hasOnlyLabelsChanged(gitEvent *gitlab.MergeEvent) bool { return onlyUpdatedAtOrLabels } + +func isNewLabelAdded(previous, current []*gitlab.EventLabel) bool { + newLabels := 0 + for _, label := range current { + found := false + for _, previousLabel := range previous { + if label.Title == previousLabel.Title { + found = true + break + } + } + if !found { + newLabels++ + } + } + + return newLabels > 0 +} diff --git a/pkg/provider/gitlab/detect_test.go b/pkg/provider/gitlab/detect_test.go index eae0b1b1ab..16b5fbf62c 100644 --- a/pkg/provider/gitlab/detect_test.go +++ b/pkg/provider/gitlab/detect_test.go @@ -13,6 +13,12 @@ import ( const largeComment = "/Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s" +func mrEventWithChanges(sample thelp.TEvent, changesJSON string) string { + base := sample.MREventAsJSON("update", "") + idx := strings.LastIndex(base, "}") + return base[:idx] + `,"changes": {` + changesJSON + `}}` +} + func TestProviderDetect(t *testing.T) { sample := thelp.TEvent{ Username: "foo", @@ -173,6 +179,37 @@ func TestProviderDetect(t *testing.T) { isGL: true, processReq: true, }, + { + name: "good/mergeRequest update Event with label addition", + event: mrEventWithChanges(sample, `"labels": {"previous": [], "current": [{"id": 1, "title": "bug"}]}`), + eventType: gitlab.EventTypeMergeRequest, + isGL: true, + processReq: true, + }, + { + name: "bad/mergeRequest update Event with label removal", + event: mrEventWithChanges(sample, `"labels": {"previous": [{"id": 1, "title": "bug"}], "current": []}`), + eventType: gitlab.EventTypeMergeRequest, + isGL: true, + processReq: false, + wantReason: "this 'Merge Request' update event changes are not supported", + }, + { + name: "bad/mergeRequest update Event with label removal partial", + event: mrEventWithChanges(sample, `"labels": {"previous": [{"id": 1, "title": "bug"}, {"id": 2, "title": "feature"}], "current": [{"id": 1, "title": "bug"}]}`), + eventType: gitlab.EventTypeMergeRequest, + isGL: true, + processReq: false, + wantReason: "this 'Merge Request' update event changes are not supported", + }, + { + name: "bad/mergeRequest update Event with label addition and description change", + event: mrEventWithChanges(sample, `"labels": {"previous": [], "current": [{"id": 1, "title": "bug"}]}, "description": {"previous": "old", "current": "new"}`), + eventType: gitlab.EventTypeMergeRequest, + isGL: true, + processReq: false, + wantReason: "this 'Merge Request' update event changes are not supported", + }, { name: "good/commit comment /retest command", event: sample.CommitNoteEventAsJSON("/retest", "create", "null"),