From 766fc1b08d07d6e329b1480c9755ca8606abfd5a Mon Sep 17 00:00:00 2001 From: Lukas Hass Date: Thu, 8 Feb 2024 16:03:36 +0100 Subject: [PATCH 1/4] feat: add check for milestone --- README.md | 24 +++++++++++++++--- config/lassie.schema.json | 9 +++++++ plugins/auto_merge/checks/has_milestone.go | 25 +++++++++++++++++++ .../auto_merge/config/auto_merge_config.go | 1 + plugins/auto_merge/merge_checks.go | 17 +++++++++++-- 5 files changed, 71 insertions(+), 5 deletions(-) create mode 100644 plugins/auto_merge/checks/has_milestone.go diff --git a/README.md b/README.md index 88665be..81b153e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Lassie > :dog: Lassie loves :hotdog: `s and her doghouse is in the garden of Gitlab, - but as a Rough Collie she has more to offer: +> but as a Rough Collie she has more to offer: - She can check your progress on Merge-Requests, merge them and hand out treats for diligent contributors - More to come ... @@ -53,13 +53,31 @@ helm delete my-lassie-bot-dog Lassie can be controlled with a config file. To enable lassie for a project you have to create this file called `lassie.json` at the top-level of the repository. -```json5 +```json { "$schema": "https://geprog.github.io/lassie-bot-dog/lassie.schema.json", "plugins": { "auto_merge": { "squash": true, - "neededLabels": ["👀 Ready for Review"] + "neededLabels": ["👀 Ready for Review"], + "neededApprovals": [ + { + "label": "*", + "users": ["maintainer", "maintainer-2"], + "atLeast": 1 + } + ], + // "ignoredChecks": [ + // "has-milestone", + // "has-assignee", + // "has-labels", + // "passes-ci", + // "is-title-using-conventional-commit", + // "is-not-work-in-progress", + // "has-no-open-discussions", + // "has-conflicts", + // "has-enough-approvals" + // ] } } } diff --git a/config/lassie.schema.json b/config/lassie.schema.json index 1ca20b3..b345140 100644 --- a/config/lassie.schema.json +++ b/config/lassie.schema.json @@ -59,6 +59,15 @@ }, "minItems": 1, "uniqueItems": true + }, + "ignoredChecks": { + "description": "Checks that are ignored when auto merging", + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true } } } diff --git a/plugins/auto_merge/checks/has_milestone.go b/plugins/auto_merge/checks/has_milestone.go new file mode 100644 index 0000000..42b8f3e --- /dev/null +++ b/plugins/auto_merge/checks/has_milestone.go @@ -0,0 +1,25 @@ +package checks + +import ( + "github.com/GEPROG/lassie-bot-dog/plugins/auto_merge/config" + "github.com/xanzy/go-gitlab" +) + +type HasMilestone struct { +} + +func (check HasMilestone) Check(_ *config.AutoMergeConfig, _ *gitlab.Project, mergeRequest *gitlab.MergeRequest) bool { + return mergeRequest.Milestone != nil +} + +func (check HasMilestone) Name() string { + return "has-milestone" +} + +func (check HasMilestone) PassedText(_ int) string { + return "Your Merge-Request has a milestone assigned" +} + +func (check HasMilestone) FailedText(_ int) string { + return "Your Merge-Request has no milestone assigned" +} diff --git a/plugins/auto_merge/config/auto_merge_config.go b/plugins/auto_merge/config/auto_merge_config.go index f25af47..19003e0 100644 --- a/plugins/auto_merge/config/auto_merge_config.go +++ b/plugins/auto_merge/config/auto_merge_config.go @@ -10,4 +10,5 @@ type AutoMergeConfig struct { Squash bool `json:"squash"` NeededLabels []string `json:"neededLabels"` NeededApprovals []NeededApproval `json:"neededApprovals"` + IgnoredChecks []string `json:"ignoredChecks"` } diff --git a/plugins/auto_merge/merge_checks.go b/plugins/auto_merge/merge_checks.go index b91bc5e..5bf5f39 100644 --- a/plugins/auto_merge/merge_checks.go +++ b/plugins/auto_merge/merge_checks.go @@ -30,7 +30,7 @@ type mergeStatus struct { func (plugin AutoMergePlugin) checkMergeRequest(project *gitlab.Project, mergeRequest *gitlab.MergeRequest) *mergeStatus { // TODO: find better place to load this - plugin.setupMergeChecks() + plugin.setupMergeChecks(plugin.loadedConfig) status := &mergeStatus{ mergeRequestID: mergeRequest.ID, @@ -57,7 +57,7 @@ func (plugin AutoMergePlugin) checkMergeRequest(project *gitlab.Project, mergeRe return status } -func (plugin AutoMergePlugin) setupMergeChecks() { +func (plugin AutoMergePlugin) setupMergeChecks(config *config.AutoMergeConfig) { if mergeChecks != nil { return } @@ -71,9 +71,22 @@ func (plugin AutoMergePlugin) setupMergeChecks() { checks.HasNoOpenDiscussionsCheck{Client: plugin.Client}, checks.IsNotWorkInProgressCheck{}, checks.HasAssignee{}, + checks.HasMilestone{}, checks.PassesCICheck{ Client: plugin.Client, }, checks.IsTitleUsingConventionalCommit{}, } + + if config.IgnoredChecks != nil { + // filter out ignored checks + mergeChecks = mergeChecks.filter(func(check mergeCheck) bool { + for _, ignoredCheck := range config.IgnoredChecks { + if check.Name() == ignoredCheck { + return false + } + } + return true + }) + } } From db18dc98bc04dc05776b6b27da213c2b919566d0 Mon Sep 17 00:00:00 2001 From: Lukas Hass Date: Thu, 8 Feb 2024 19:52:00 +0100 Subject: [PATCH 2/4] filter merge checks --- plugins/auto_merge/merge_checks.go | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/plugins/auto_merge/merge_checks.go b/plugins/auto_merge/merge_checks.go index 5bf5f39..7c646a1 100644 --- a/plugins/auto_merge/merge_checks.go +++ b/plugins/auto_merge/merge_checks.go @@ -3,6 +3,7 @@ package auto_merge import ( "github.com/GEPROG/lassie-bot-dog/plugins/auto_merge/checks" "github.com/GEPROG/lassie-bot-dog/plugins/auto_merge/config" + "github.com/GEPROG/lassie-bot-dog/utils" "github.com/xanzy/go-gitlab" ) @@ -58,11 +59,7 @@ func (plugin AutoMergePlugin) checkMergeRequest(project *gitlab.Project, mergeRe } func (plugin AutoMergePlugin) setupMergeChecks(config *config.AutoMergeConfig) { - if mergeChecks != nil { - return - } - - mergeChecks = []mergeCheck{ + allMergeChecks := []mergeCheck{ checks.HasEnoughApprovalsCheck{ Client: plugin.Client, }, @@ -80,13 +77,14 @@ func (plugin AutoMergePlugin) setupMergeChecks(config *config.AutoMergeConfig) { if config.IgnoredChecks != nil { // filter out ignored checks - mergeChecks = mergeChecks.filter(func(check mergeCheck) bool { - for _, ignoredCheck := range config.IgnoredChecks { - if check.Name() == ignoredCheck { - return false - } + var _mergeChecks []mergeCheck + for _, check := range allMergeChecks { + if utils.StringInSlice(check.Name(), config.IgnoredChecks) { + mergeChecks = append(mergeChecks, check) } - return true - }) + } + mergeChecks = _mergeChecks + } else { + mergeChecks = allMergeChecks } } From 3b04486c9dc829eb508b11dca125282e65ea540a Mon Sep 17 00:00:00 2001 From: Lukas Hass Date: Thu, 8 Feb 2024 19:56:17 +0100 Subject: [PATCH 3/4] remove milestone check --- plugins/auto_merge/checks/has_milestone.go | 25 ---------------------- plugins/auto_merge/merge_checks.go | 1 - 2 files changed, 26 deletions(-) delete mode 100644 plugins/auto_merge/checks/has_milestone.go diff --git a/plugins/auto_merge/checks/has_milestone.go b/plugins/auto_merge/checks/has_milestone.go deleted file mode 100644 index 42b8f3e..0000000 --- a/plugins/auto_merge/checks/has_milestone.go +++ /dev/null @@ -1,25 +0,0 @@ -package checks - -import ( - "github.com/GEPROG/lassie-bot-dog/plugins/auto_merge/config" - "github.com/xanzy/go-gitlab" -) - -type HasMilestone struct { -} - -func (check HasMilestone) Check(_ *config.AutoMergeConfig, _ *gitlab.Project, mergeRequest *gitlab.MergeRequest) bool { - return mergeRequest.Milestone != nil -} - -func (check HasMilestone) Name() string { - return "has-milestone" -} - -func (check HasMilestone) PassedText(_ int) string { - return "Your Merge-Request has a milestone assigned" -} - -func (check HasMilestone) FailedText(_ int) string { - return "Your Merge-Request has no milestone assigned" -} diff --git a/plugins/auto_merge/merge_checks.go b/plugins/auto_merge/merge_checks.go index 7c646a1..988ec37 100644 --- a/plugins/auto_merge/merge_checks.go +++ b/plugins/auto_merge/merge_checks.go @@ -68,7 +68,6 @@ func (plugin AutoMergePlugin) setupMergeChecks(config *config.AutoMergeConfig) { checks.HasNoOpenDiscussionsCheck{Client: plugin.Client}, checks.IsNotWorkInProgressCheck{}, checks.HasAssignee{}, - checks.HasMilestone{}, checks.PassesCICheck{ Client: plugin.Client, }, From d95125db2c3a6eb2abbf63ae494754afb0eda1ef Mon Sep 17 00:00:00 2001 From: Lukas Hass Date: Thu, 8 Feb 2024 19:57:20 +0100 Subject: [PATCH 4/4] remove milestone from docs --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 81b153e..53d1469 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,6 @@ Lassie can be controlled with a config file. To enable lassie for a project you } ], // "ignoredChecks": [ - // "has-milestone", // "has-assignee", // "has-labels", // "passes-ci",