mirror of
https://github.com/Threnklyn/jira.git
synced 2026-06-06 21:20:48 +02:00
Merge branch 'master' into vote_support
This commit is contained in:
@@ -2,6 +2,7 @@ package jira
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"crypto/tls"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/kballard/go-shellquote"
|
"github.com/kballard/go-shellquote"
|
||||||
@@ -36,15 +37,26 @@ func New(opts map[string]interface{}) *Cli {
|
|||||||
endpoint, _ := opts["endpoint"].(string)
|
endpoint, _ := opts["endpoint"].(string)
|
||||||
url, _ := url.Parse(strings.TrimRight(endpoint, "/"))
|
url, _ := url.Parse(strings.TrimRight(endpoint, "/"))
|
||||||
|
|
||||||
|
transport := &http.Transport{
|
||||||
|
TLSClientConfig: &tls.Config{},
|
||||||
|
}
|
||||||
|
|
||||||
if project, ok := opts["project"].(string); ok {
|
if project, ok := opts["project"].(string); ok {
|
||||||
opts["project"] = strings.ToUpper(project)
|
opts["project"] = strings.ToUpper(project)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if insecureSkipVerify, ok := opts["insecure"].(bool); ok {
|
||||||
|
transport.TLSClientConfig.InsecureSkipVerify = insecureSkipVerify
|
||||||
|
}
|
||||||
|
|
||||||
cli := &Cli{
|
cli := &Cli{
|
||||||
endpoint: url,
|
endpoint: url,
|
||||||
opts: opts,
|
opts: opts,
|
||||||
cookieFile: fmt.Sprintf("%s/.jira.d/cookies.js", homedir),
|
cookieFile: fmt.Sprintf("%s/.jira.d/cookies.js", homedir),
|
||||||
ua: &http.Client{Jar: cookieJar},
|
ua: &http.Client{
|
||||||
|
Jar: cookieJar,
|
||||||
|
Transport: transport,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
cli.ua.Jar.SetCookies(url, cli.loadCookies())
|
cli.ua.Jar.SetCookies(url, cli.loadCookies())
|
||||||
|
|||||||
+70
@@ -233,6 +233,11 @@ func (c *Cli) CmdCreate() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if val, ok = val.([]interface{})[0].(map[string]interface{})["issuetypes"]; ok {
|
if val, ok = val.([]interface{})[0].(map[string]interface{})["issuetypes"]; ok {
|
||||||
|
if len(val.([]interface{})) == 0 {
|
||||||
|
err = fmt.Errorf("Project '%s' does not support issuetype '%s'. Unable to create issue.", project, issuetype)
|
||||||
|
log.Error("%s", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
issueData["meta"] = val.([]interface{})[0]
|
issueData["meta"] = val.([]interface{})[0]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -598,6 +603,71 @@ func (c *Cli) CmdComment(issue string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Cli) CmdLabels(action string, issue string, labels []string) error {
|
||||||
|
log.Debug("label called")
|
||||||
|
|
||||||
|
if action != "add" && action != "remove" && action != "set" {
|
||||||
|
return fmt.Errorf("action must be 'add', 'set' or 'remove': %q is invalid", action)
|
||||||
|
}
|
||||||
|
|
||||||
|
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 action == "set" {
|
||||||
|
labelsActions := make([]map[string][]string, 1)
|
||||||
|
labelsActions[0] = map[string][]string{
|
||||||
|
"set": labels,
|
||||||
|
}
|
||||||
|
labels_json, err = jsonEncode(map[string]interface{}{
|
||||||
|
"labels": labelsActions,
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
labelsActions := make([]map[string]string, len(labels))
|
||||||
|
for i, label := range labels {
|
||||||
|
labelActionMap := map[string]string{
|
||||||
|
action: label,
|
||||||
|
}
|
||||||
|
labelsActions[i] = labelActionMap
|
||||||
|
}
|
||||||
|
labels_json, err = jsonEncode(map[string]interface{}{
|
||||||
|
"labels": labelsActions,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
json := fmt.Sprintf("{ \"update\": %s }", labels_json)
|
||||||
|
return handlePut(json)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Cli) CmdAssign(issue string, user string) error {
|
func (c *Cli) CmdAssign(issue string, user string) error {
|
||||||
log.Debug("assign called")
|
log.Debug("assign called")
|
||||||
|
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ Usage:
|
|||||||
jira start ISSUE [--edit] <Edit Options>
|
jira start ISSUE [--edit] <Edit Options>
|
||||||
jira stop ISSUE [--edit] <Edit Options>
|
jira stop ISSUE [--edit] <Edit Options>
|
||||||
jira comment ISSUE [--noedit] <Edit Options>
|
jira comment ISSUE [--noedit] <Edit Options>
|
||||||
|
jira (set,add,remove) labels ISSUE [LABEL] ...
|
||||||
jira take ISSUE
|
jira take ISSUE
|
||||||
jira (assign|give) ISSUE ASSIGNEE
|
jira (assign|give) ISSUE ASSIGNEE
|
||||||
jira fields
|
jira fields
|
||||||
@@ -83,6 +84,7 @@ Usage:
|
|||||||
General Options:
|
General Options:
|
||||||
-b --browse Open your browser to the Jira issue
|
-b --browse Open your browser to the Jira issue
|
||||||
-e --endpoint=URI URI to use for jira
|
-e --endpoint=URI URI to use for jira
|
||||||
|
-k --insecure disable TLS certificate verification
|
||||||
-h --help Show this usage
|
-h --help Show this usage
|
||||||
-t --template=FILE Template file to use for output/editing
|
-t --template=FILE Template file to use for output/editing
|
||||||
-u --user=USER Username to use for authenticaion (default: %s)
|
-u --user=USER Username to use for authenticaion (default: %s)
|
||||||
@@ -136,6 +138,8 @@ Command Options:
|
|||||||
"start": "start",
|
"start": "start",
|
||||||
"stop": "stop",
|
"stop": "stop",
|
||||||
"comment": "comment",
|
"comment": "comment",
|
||||||
|
"label": "labels",
|
||||||
|
"labels": "labels",
|
||||||
"take": "take",
|
"take": "take",
|
||||||
"assign": "assign",
|
"assign": "assign",
|
||||||
"give": "assign",
|
"give": "assign",
|
||||||
@@ -184,6 +188,7 @@ Command Options:
|
|||||||
"editor=s": setopt,
|
"editor=s": setopt,
|
||||||
"u|user=s": setopt,
|
"u|user=s": setopt,
|
||||||
"endpoint=s": setopt,
|
"endpoint=s": setopt,
|
||||||
|
"k|insecure": setopt,
|
||||||
"t|template=s": setopt,
|
"t|template=s": setopt,
|
||||||
"q|query=s": setopt,
|
"q|query=s": setopt,
|
||||||
"p|project=s": setopt,
|
"p|project=s": setopt,
|
||||||
@@ -218,6 +223,7 @@ Command Options:
|
|||||||
args = args[1:]
|
args = args[1:]
|
||||||
} else if len(args) > 1 {
|
} else if len(args) > 1 {
|
||||||
// look at second arg for "dups" and "blocks" commands
|
// look at second arg for "dups" and "blocks" commands
|
||||||
|
// also for 'set/add/remove' actions like 'labels'
|
||||||
if alias, ok := jiraCommands[args[1]]; ok {
|
if alias, ok := jiraCommands[args[1]]; ok {
|
||||||
command = alias
|
command = alias
|
||||||
args = append(args[:1], args[2:]...)
|
args = append(args[:1], args[2:]...)
|
||||||
@@ -379,6 +385,12 @@ Command Options:
|
|||||||
requireArgs(1)
|
requireArgs(1)
|
||||||
setEditing(true)
|
setEditing(true)
|
||||||
err = c.CmdComment(args[0])
|
err = c.CmdComment(args[0])
|
||||||
|
case "labels":
|
||||||
|
requireArgs(2)
|
||||||
|
action := args[0]
|
||||||
|
issue := args[1]
|
||||||
|
labels := args[2:]
|
||||||
|
err = c.CmdLabels(action, issue, labels)
|
||||||
case "take":
|
case "take":
|
||||||
requireArgs(1)
|
requireArgs(1)
|
||||||
err = c.CmdAssign(args[0], opts["user"].(string))
|
err = c.CmdAssign(args[0], opts["user"].(string))
|
||||||
|
|||||||
Reference in New Issue
Block a user