From da93424ea7dc5314834e089026f6d06a89412cc8 Mon Sep 17 00:00:00 2001 From: Peter Amstutz Date: Fri, 5 Apr 2024 16:20:37 -0400 Subject: [PATCH] Add set-sprint subcommand to 'art', no issue # Arvados-DCO-1.1-Signed-off-by: Peter Amstutz --- cmd/art/redmine.go | 61 +++++++++++++++++++++++++++++++++++++++++++ lib/redmine/issues.go | 14 ++++++++++ 2 files changed, 75 insertions(+) diff --git a/cmd/art/redmine.go b/cmd/art/redmine.go index 1ad293b..a170a6e 100644 --- a/cmd/art/redmine.go +++ b/cmd/art/redmine.go @@ -44,6 +44,19 @@ func init() { } issuesCmd.AddCommand(associateIssueCmd) + + setIssueSprintCmd.Flags().IntP("sprint", "r", 0, "Redmine sprint ID") + err = setIssueSprintCmd.MarkFlagRequired("sprint") + if err != nil { + log.Fatalf(err.Error()) + } + setIssueSprintCmd.Flags().IntP("issue", "i", 0, "Redmine issue ID") + err = setIssueSprintCmd.MarkFlagRequired("issue") + if err != nil { + log.Fatalf(err.Error()) + } + issuesCmd.AddCommand(setIssueSprintCmd) + associateOrphans.Flags().IntP("release", "r", 0, "Redmine release ID") err = associateOrphans.MarkFlagRequired("release") if err != nil { @@ -312,6 +325,54 @@ var associateIssueCmd = &cobra.Command{ }, } + +var setIssueSprintCmd = &cobra.Command{ + Use: "set-sprint", + Short: "Set sprint for issue", + Long: "Set the sprint for an issue.\n" + + "\nThe REDMINE_ENDPOINT environment variable must be set to the base URL of your redmine server." + + "\nThe REDMINE_APIKEY environment variable must be set to your redmine API key.", + Run: func(cmd *cobra.Command, args []string) { + issueID, err := cmd.Flags().GetInt("issue") + if err != nil { + fmt.Printf("Error converting Redmine issue ID to integer: %s", err) + os.Exit(1) + } + + sprintID, err := cmd.Flags().GetInt("sprint") + if err != nil { + fmt.Printf("Error converting Redmine sprint ID to integer: %s", err) + os.Exit(1) + } + + redmine := redmine.NewClient(conf.Endpoint, conf.Apikey) + + i, err := redmine.GetIssue(issueID) + if err != nil { + fmt.Printf("%s\n", err.Error()) + os.Exit(1) + } + + var setIt bool + if i.FixedVersion == nil { + setIt = true + } else if i.FixedVersion.ID != sprintID { + setIt = true + } + if setIt { + err = redmine.SetSprint(*i, sprintID) + if err != nil { + fmt.Printf("%s\n", err.Error()) + os.Exit(1) + } else { + fmt.Printf("[changed] sprint for issue %d set to %d\n", i.ID, sprintID) + } + } else { + fmt.Printf("[ok] sprint for issue %d was already set to %d, not updating\n", i.ID, i.FixedVersion.ID) + } + }, +} + func checkError(err error) { if err != nil { fmt.Printf("%s\n", err.Error()) diff --git a/lib/redmine/issues.go b/lib/redmine/issues.go index ea2f584..5e02272 100644 --- a/lib/redmine/issues.go +++ b/lib/redmine/issues.go @@ -233,3 +233,17 @@ func (c *Client) SetRelease(issue Issue, release int) error { issue.Release = nil return c.UpdateIssue(issue) } + +// SetSprint updates the sprint (fixed_version) for an issue +func (c *Client) SetSprint(issue Issue, version int) error { + issue.FixedVersionID = version + issue.FixedVersion = nil + return c.UpdateIssue(issue) +} + +// SetStatus updates the status for an issue +func (c *Client) SetStatus(issue Issue, status int) error { + issue.StatusID = status + issue.Status = nil + return c.UpdateIssue(issue) +} -- 2.30.2