From f7eb04e36d3f00624156d7fc7c15efd9beab20dc Mon Sep 17 00:00:00 2001 From: Mike Pountney Date: Sun, 24 Jan 2016 02:56:36 +0000 Subject: [PATCH] Tweak the CmdWatch contract and add watcher remove support This adjusts the CmdWatch interface as per discussion in https://github.com/Netflix-Skunkworks/go-jira/pull/26 It also exposes public versions of the c.getOptString and c.getOptBool utility functions, again as discussed. The interface to CmdWatch now includes the user to be watched (rather than depending on the opt[] map. This makes CmdWatch more useful externally. A '--remove' option has been created, to allow for removal of a given watcher. This was deliberately not included in the defaults map, as it is specifically only used for 'watch' command right now. It should be moved up to a default if it becomes a more common option, I guess (as 'remove is false' isn't a bad default) --- cli.go | 8 ++++++++ commands.go | 32 ++++++++++++++++++++++++-------- main/main.go | 7 +++++-- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/cli.go b/cli.go index b4686ad..6d8baad 100644 --- a/cli.go +++ b/cli.go @@ -474,6 +474,10 @@ func (c *Cli) FindIssues() (interface{}, error) { } } +func (c *Cli) GetOptString(optName string, dflt string) string { + return c.getOptString(optName, dflt) +} + func (c *Cli) getOptString(optName string, dflt string) string { if val, ok := c.opts[optName].(string); ok { return val @@ -482,6 +486,10 @@ func (c *Cli) getOptString(optName string, dflt string) string { } } +func (c *Cli) GetOptBool(optName string, dflt bool) bool { + return c.getOptBool(optName, dflt) +} + func (c *Cli) getOptBool(optName string, dflt bool) bool { if val, ok := c.opts[optName].(bool); ok { return val diff --git a/commands.go b/commands.go index f628f56..589f3b6 100644 --- a/commands.go +++ b/commands.go @@ -385,22 +385,34 @@ func (c *Cli) CmdDups(duplicate string, issue string) error { return nil } -func (c *Cli) CmdWatch(issue string) error { - watcher := c.getOptString("watcher", c.opts["user"].(string)) - log.Debug("watch called") +func (c *Cli) CmdWatch(issue string, watcher string, remove bool) error { + log.Debug("watch called: watcher: %q, remove: %n", watcher, remove) + var uri string json, err := jsonEncode(watcher) if err != nil { return err } - uri := fmt.Sprintf("%s/rest/api/2/issue/%s/watchers", c.endpoint, issue) if c.getOptBool("dryrun", false) { - log.Debug("POST: %s", json) - log.Debug("Dryrun mode, skipping POST") + if !remove { + log.Debug("POST: %s", json) + log.Debug("Dryrun mode, skipping POST") + } else { + log.Debug("DELETE: %s", watcher) + log.Debug("Dryrun mode, skipping POST") + } return nil } - resp, err := c.post(uri, json) + + var resp *http.Response + if !remove { + uri = fmt.Sprintf("%s/rest/api/2/issue/%s/watchers", c.endpoint, issue) + resp, err = c.post(uri, json) + } else { + uri = fmt.Sprintf("%s/rest/api/2/issue/%s/watchers?username=%s", c.endpoint, issue, watcher) + resp, err = c.delete(uri) + } if err != nil { return err } @@ -412,7 +424,11 @@ func (c *Cli) CmdWatch(issue string) error { } else { logBuffer := bytes.NewBuffer(make([]byte, 0)) resp.Write(logBuffer) - err := fmt.Errorf("Unexpected Response From POST") + if !remove { + err = fmt.Errorf("Unexpected Response From POST") + } else { + err = fmt.Errorf("Unexpected Response From DELETE") + } log.Error("%s:\n%s", err, logBuffer) return err } diff --git a/main/main.go b/main/main.go index ff1f27b..f58979c 100644 --- a/main/main.go +++ b/main/main.go @@ -56,8 +56,8 @@ Usage: jira create [--noedit] [-p PROJECT] jira DUPLICATE dups ISSUE jira BLOCKER blocks ISSUE - jira watch ISSUE [-w WATCHER] jira vote ISSUE [--down] + jira watch ISSUE [-w WATCHER] [--remove] jira (trans|transition) TRANSITION ISSUE [--noedit] jira ack ISSUE [--edit] jira close ISSUE [--edit] @@ -196,6 +196,7 @@ Command Options: "a|assignee=s": setopt, "i|issuetype=s": setopt, "w|watcher=s": setopt, + "remove": setopt, "r|reporter=s": setopt, "f|queryfields=s": setopt, "s|sort=s": setopt, @@ -353,7 +354,9 @@ Command Options: } case "watch": requireArgs(1) - err = c.CmdWatch(args[0]) + watcher := c.GetOptString("watcher", opts["user"].(string)) + remove := c.GetOptBool("remove", false) + err = c.CmdWatch(args[0], watcher, remove) case "transition": requireArgs(2) setEditing(true)