diff --git a/cli.go b/cli.go index 3413a81..b4686ad 100644 --- a/cli.go +++ b/cli.go @@ -118,6 +118,24 @@ func (c *Cli) put(uri string, content string) (*http.Response, error) { return c.makeRequestWithContent("PUT", uri, content) } +func (c *Cli) delete(uri string) (*http.Response, error) { + method := "DELETE" + req, _ := http.NewRequest(method, uri, nil) + log.Info("%s %s", req.Method, req.URL.String()) + if resp, err := c.makeRequest(req); err != nil { + return nil, err + } else { + if resp.StatusCode == 401 { + if err := c.CmdLogin(); err != nil { + return nil, err + } + req, _ = http.NewRequest(method, uri, nil) + return c.makeRequest(req) + } + return resp, err + } +} + func (c *Cli) makeRequestWithContent(method string, uri string, content string) (*http.Response, error) { buffer := bytes.NewBufferString(content) req, _ := http.NewRequest(method, uri, buffer) diff --git a/commands.go b/commands.go index 860df1a..f628f56 100644 --- a/commands.go +++ b/commands.go @@ -419,6 +419,49 @@ func (c *Cli) CmdWatch(issue string) error { return nil } +func (c *Cli) CmdVote(issue string, up bool) error { + log.Debug("vote called, with up: %n", up) + + uri := fmt.Sprintf("%s/rest/api/2/issue/%s/votes", c.endpoint, issue) + if c.getOptBool("dryrun", false) { + if up { + log.Debug("POST: %s", "") + log.Debug("Dryrun mode, skipping POST") + } else { + log.Debug("DELETE: %s", "") + log.Debug("Dryrun mode, skipping DELETE") + } + return nil + } + var resp *http.Response + var err error + if up { + resp, err = c.post(uri, "") + } else { + resp, err = c.delete(uri) + } + if err != nil { + return err + } + if resp.StatusCode == 204 { + c.Browse(issue) + if !c.opts["quiet"].(bool) { + fmt.Printf("OK %s %s/browse/%s\n", issue, c.endpoint, issue) + } + } else { + logBuffer := bytes.NewBuffer(make([]byte, 0)) + resp.Write(logBuffer) + if up { + err = fmt.Errorf("Unexpected Response From POST") + } else { + err = fmt.Errorf("Unexpected Response From DELETE") + } + log.Error("%s:\n%s", err, logBuffer) + return err + } + return nil +} + func (c *Cli) CmdTransition(issue string, trans string) error { log.Debug("transition called") uri := fmt.Sprintf("%s/rest/api/2/issue/%s/transitions?expand=transitions.fields", c.endpoint, issue) diff --git a/main/main.go b/main/main.go index bc5504f..ff1f27b 100644 --- a/main/main.go +++ b/main/main.go @@ -57,6 +57,7 @@ Usage: jira DUPLICATE dups ISSUE jira BLOCKER blocks ISSUE jira watch ISSUE [-w WATCHER] + jira vote ISSUE [--down] jira (trans|transition) TRANSITION ISSUE [--noedit] jira ack ISSUE [--edit] jira close ISSUE [--edit] @@ -155,6 +156,7 @@ Command Options: "login": "login", "req": "request", "request": "request", + "vote": "vote", } defaults := map[string]interface{}{ @@ -206,6 +208,7 @@ Command Options: "M|method=s": setopt, "S|saveFile=s": setopt, "Q|quiet": setopt, + "down": setopt, }) if err := op.ProcessAll(os.Args[1:]); err != nil { @@ -404,6 +407,13 @@ Command Options: case "view": requireArgs(1) err = c.CmdView(args[0]) + case "vote": + requireArgs(1) + if val, ok := opts["down"]; ok { + err = c.CmdVote(args[0], !val.(bool)) + } else { + err = c.CmdVote(args[0], true) + } case "request": requireArgs(1) data := ""