From 383847a9d66bcbc539b385c9e4ada44e8558dff1 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 b4686add..6d8baad8 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 f628f569..589f3b67 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 ff1f27b8..f58979c7 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)