From 1ea40f5e5cf7f0e1e76e0925a0b6bcc9ecc1d913 Mon Sep 17 00:00:00 2001 From: Marcel Blijleven Date: Tue, 18 Jan 2022 15:25:37 +0100 Subject: [PATCH 1/4] chore: add filter slice function --- pkg/util.go | 32 +++++++++++++++++++++++- pkg/util_test.go | 63 +++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 88 insertions(+), 7 deletions(-) diff --git a/pkg/util.go b/pkg/util.go index 4c5fcb3..9340f0e 100644 --- a/pkg/util.go +++ b/pkg/util.go @@ -63,6 +63,35 @@ func removeDuplicates(items []string) []string { return filtered } +func filterSlice(main []string, filter []string) []string { + var filtered []string + + if len(filter) == 0 { + return main + } + + for _, i := range main { + include := true + + for _, f := range filter { + if i == f { + include = false + break + } + } + + if include { + filtered = append(filtered, i) + } + } + + if filtered == nil { + return []string{} + } + + return filtered +} + // extractIssuesFromText gathers all issue numbers from the provided text func extractIssuesFromText(text string) []string { r := regexp.MustCompile("[A-Z]+-[0-9]+") @@ -71,9 +100,10 @@ func extractIssuesFromText(text string) []string { // AssignVersions extracts the issues from the provided release body and calls the AssignVersion endpoint of the // jira client. -func AssignVersions(releaseBody, version string, client *JiraClient, issues ...string) error { +func AssignVersions(releaseBody, version string, client *JiraClient, issues []string, filter []string) error { issues = append(issues, extractIssuesFromText(releaseBody)...) issues = removeDuplicates(issues) + issues = filterSlice(issues, filter) for _, issue := range issues { if err := client.AssignVersion(issue, version); err != nil { diff --git a/pkg/util_test.go b/pkg/util_test.go index 0f37ab4..b282f21 100644 --- a/pkg/util_test.go +++ b/pkg/util_test.go @@ -80,7 +80,7 @@ For changes in this version, see the changelog Merge commit that triggered this release: feat: marcel introduces c0ffee (MB-1337)` - err = AssignVersions(releaseBody, "My first version", jiraClient) + err = AssignVersions(releaseBody, "My first version", jiraClient, nil, nil) assert.NoError(t, err) assert.Equal(t, 1, mockClient.CalledTimes) assert.Equal(t, "{\"update\":{\"fixVersions\":[{\"add\":{\"name\":\"My first version\"}}]}}", mockClient.CalledWith[0]) @@ -99,7 +99,7 @@ For changes in this version, see the changelog Merge commit that triggered this release: feat: marcel introduces c0ffee (MB-1337, MB-1338)` - err = AssignVersions(releaseBody, "My first version", jiraClient) + err = AssignVersions(releaseBody, "My first version", jiraClient, nil, nil) assert.NoError(t, err) assert.Equal(t, 2, mockClient.CalledTimes) assert.Equal(t, []string{ @@ -116,7 +116,7 @@ func TestAssignVersions_singleIssue(t *testing.T) { log.Fatalln(err) } - err = AssignVersions("", "My first version", jiraClient, "MB-1234") + err = AssignVersions("", "My first version", jiraClient, []string{"MB-1234"}, nil) assert.NoError(t, err) assert.Equal(t, 1, mockClient.CalledTimes) assert.Equal(t, []string{ @@ -132,7 +132,7 @@ func TestAssignVersions_duplicateIssue(t *testing.T) { log.Fatalln(err) } - err = AssignVersions("", "My first version", jiraClient, "MB-1234", "MB-1234") + err = AssignVersions("", "My first version", jiraClient, []string{"MB-1234", "MB-1234"}, nil) assert.NoError(t, err) assert.Equal(t, 1, mockClient.CalledTimes) assert.Equal(t, []string{ @@ -153,7 +153,7 @@ For changes in this version, see the changelog Merge commit that triggered this release: feat: marcel introduces c0ffee (MB-1337, MB-1338)` - err = AssignVersions(releaseBody, "My first version", jiraClient, "MB-1339", "MB-1340") + err = AssignVersions(releaseBody, "My first version", jiraClient, []string{"MB-1339", "MB-1340"}, nil) assert.NoError(t, err) assert.Equal(t, 4, mockClient.CalledTimes) assert.Equal(t, []string{ @@ -177,7 +177,7 @@ For changes in this version, see the changelog Merge commit that triggered this release: feat: marcel introduces c0ffee (MB-1337, MB-1338)` - err = AssignVersions(releaseBody, "My first version", jiraClient, "MB-1337", "MB-1338") + err = AssignVersions(releaseBody, "My first version", jiraClient, []string{"MB-1337", "MB-1338"}, nil) assert.NoError(t, err) assert.Equal(t, 2, mockClient.CalledTimes) assert.Equal(t, []string{ @@ -199,3 +199,54 @@ func Test_handleJiraError_unreadableResponse(t *testing.T) { err := handleJiraError(res) assert.EqualError(t, err, "request unsuccessful (Bad request), could not read response: invalid character 'e' in literal true (expecting 'r')") } + +func Test_filterSlice(t *testing.T) { + type args struct { + main []string + filter []string + } + tests := []struct { + name string + args args + want []string + }{ + { + name: "empty filter", + args: args{ + main: []string{"a", "b", "c"}, + filter: []string{}, + }, + want: []string{"a", "b", "c"}, + }, + { + name: "nil filter", + args: args{ + main: []string{"a", "b", "c"}, + filter: nil, + }, + want: []string{"a", "b", "c"}, + }, + { + name: "filter some", + args: args{ + main: []string{"a", "b", "c"}, + filter: []string{"b"}, + }, + want: []string{"a", "c"}, + }, + { + name: "filter all", + args: args{ + main: []string{"a", "b", "c"}, + filter: []string{"a", "b", "c"}, + }, + want: []string{}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := filterSlice(tt.args.main, tt.args.filter) + assert.Equal(t, tt.want, got, "filterSlice() = %v, want %v", got, tt.want) + }) + } +} From c9ad245ac99a3cbf30c7b1f2952116d9f4ecd7d1 Mon Sep 17 00:00:00 2001 From: Marcel Blijleven Date: Tue, 18 Jan 2022 15:25:53 +0100 Subject: [PATCH 2/4] chore: add filter flag vars and values --- cmd/vars.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmd/vars.go b/cmd/vars.go index 0d0a949..a13cd29 100644 --- a/cmd/vars.go +++ b/cmd/vars.go @@ -8,6 +8,7 @@ var ( version string body string issues []string + filter []string ) const ( @@ -38,4 +39,8 @@ const ( issuesFlagName = "issues" issuesShorthand = "i" issuesUsage = "The issues you want to assign to release to, can be a single issue or comma separated" + + filterFlagName = "filter" + filterShorthand = "f" + filterUsage = "The filter flag allows you to ignore issues when assigning a release" ) From aaaa17f4388d7ef9c94ce4a407b1e27e05d00229 Mon Sep 17 00:00:00 2001 From: Marcel Blijleven Date: Tue, 18 Jan 2022 15:26:07 +0100 Subject: [PATCH 3/4] docs: update README.md with filter flag usage --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 4b09ac8..11b56ef 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,7 @@ Aliases: assignRelease, assignVersion Flags: +-f, --filter strings The filter flag allows you to ignore issues when assigning a release -h, --help help for assignRelease -i, --issues strings The issues you want to assign to release to, can be a single issue or comma separated -b, --releaseBody string The body of text which contains Jira issues, e.g. a GitHub release body @@ -112,6 +113,7 @@ Usage: jira-helper createAndAssign [flags] Flags: +-f, --filter strings The filter flag allows you to ignore issues when assigning a release -h, --help help for createAndAssign -i, --issues strings The issues you want to assign to release to, can be a single issue or comma separated -b, --releaseBody string The body of text which contains Jira issues, e.g. a GitHub release body From acabd5a02267727d32274890683d6a82f23eef79 Mon Sep 17 00:00:00 2001 From: Marcel Blijleven Date: Tue, 18 Jan 2022 15:26:19 +0100 Subject: [PATCH 4/4] feat: add filter flag to assign commands --- cmd/assignRelease.go | 3 ++- cmd/createAndAssign.go | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/cmd/assignRelease.go b/cmd/assignRelease.go index c6e256d..131638a 100644 --- a/cmd/assignRelease.go +++ b/cmd/assignRelease.go @@ -40,7 +40,7 @@ the provided release body.`, httpClient.Timeout = time.Second * 15 client, err := pkg.NewJiraClient(host, user, token, httpClient) cobra.CheckErr(err) - cobra.CheckErr(pkg.AssignVersions(body, version, client, issues...)) + cobra.CheckErr(pkg.AssignVersions(body, version, client, issues, filter)) }, } @@ -49,4 +49,5 @@ func init() { assignReleaseCmd.Aliases = []string{"assignVersion"} assignReleaseCmd.Flags().StringVarP(&body, bodyFlagName, bodyShorthand, "", bodyUsage) assignReleaseCmd.Flags().StringSliceVarP(&issues, issuesFlagName, issuesShorthand, []string{}, issuesUsage) + assignReleaseCmd.Flags().StringSliceVarP(&filter, filterFlagName, filterShorthand, []string{}, filterUsage) } diff --git a/cmd/createAndAssign.go b/cmd/createAndAssign.go index e32b0c1..c93d3c1 100644 --- a/cmd/createAndAssign.go +++ b/cmd/createAndAssign.go @@ -43,7 +43,7 @@ today.`, client, err := pkg.NewJiraClient(host, user, token, httpClient) cobra.CheckErr(err) cobra.CheckErr(client.CreateFixVersion(version, project)) - cobra.CheckErr(pkg.AssignVersions(body, version, client, issues...)) + cobra.CheckErr(pkg.AssignVersions(body, version, client, issues, filter)) }, } @@ -51,4 +51,5 @@ func init() { rootCmd.AddCommand(createAndAssignCmd) createAndAssignCmd.Flags().StringVarP(&body, bodyFlagName, bodyShorthand, "", bodyUsage) createAndAssignCmd.Flags().StringSliceVarP(&issues, issuesFlagName, issuesShorthand, []string{}, issuesUsage) + createAndAssignCmd.Flags().StringSliceVarP(&filter, filterFlagName, filterShorthand, []string{}, filterUsage) }