diff --git a/commands.go b/commands.go index 64d25df..fa74d25 100644 --- a/commands.go +++ b/commands.go @@ -544,6 +544,71 @@ func (c *Cli) CmdComment(issue string) error { return nil } +func (c *Cli) CmdLabels(issue string, command string, labels []string) error { + log.Debug("label called") + + if command != "add" && command != "remove" && command != "set" { + return fmt.Errorf("command must be 'add', 'set' or 'remove': %q is invalid", command) + } + + handlePut := func(json string) error { + log.Debug("JSON: %s", json) + uri := fmt.Sprintf("%s/rest/api/2/issue/%s", c.endpoint, issue) + if c.getOptBool("dryrun", false) { + log.Debug("PUT: %s", json) + log.Debug("Dryrun mode, skipping POST") + return nil + } + resp, err := c.put(uri, json) + 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) + } + return nil + } else { + logBuffer := bytes.NewBuffer(make([]byte, 0)) + resp.Write(logBuffer) + err := fmt.Errorf("Unexpected Response From PUT") + log.Error("%s:\n%s", err, logBuffer) + return err + } + } + + var labels_json string + var err error + if command == "set" { + labelsCommands := make([]map[string][]string, 1) + labelsCommands[0] = map[string][]string{ + "set": labels, + } + labels_json, err = jsonEncode(map[string]interface{}{ + "labels": labelsCommands, + }) + } else { + labelsCommands := make([]map[string]string, len(labels)) + for i, label := range labels { + labelCommandMap := map[string]string{ + command: label, + } + labelsCommands[i] = labelCommandMap + } + labels_json, err = jsonEncode(map[string]interface{}{ + "labels": labelsCommands, + }) + } + if err != nil { + return err + } + json := fmt.Sprintf("{ \"update\": %s }", labels_json) + return handlePut(json) + +} + func (c *Cli) CmdAssign(issue string, user string) error { log.Debug("assign called") diff --git a/main/main.go b/main/main.go index 17f6f5c..8b14235 100644 --- a/main/main.go +++ b/main/main.go @@ -14,8 +14,8 @@ import ( ) var ( - log = logging.MustGetLogger("jira") - format = "%{color}%{time:2006-01-02T15:04:05.000Z07:00} %{level:-5s} [%{shortfile}]%{color:reset} %{message}" + log = logging.MustGetLogger("jira") + format = "%{color}%{time:2006-01-02T15:04:05.000Z07:00} %{level:-5s} [%{shortfile}]%{color:reset} %{message}" ) func main() { @@ -65,6 +65,7 @@ Usage: jira start ISSUE [--edit] jira stop ISSUE [--edit] jira comment ISSUE [--noedit] + jira labels ISSUE set,add,remove [LABEL] ... jira take ISSUE jira (assign|give) ISSUE ASSIGNEE jira fields @@ -136,6 +137,8 @@ Command Options: "start": "start", "stop": "stop", "comment": "comment", + "label": "labels", + "labels": "labels", "take": "take", "assign": "assign", "give": "assign", @@ -377,6 +380,9 @@ Command Options: requireArgs(1) setEditing(true) err = c.CmdComment(args[0]) + case "labels": + requireArgs(2) + err = c.CmdLabels(args[0], args[1], args[2:]) case "take": requireArgs(1) err = c.CmdAssign(args[0], opts["user"].(string))