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)