adding --browse option to most command which should open the issue in your favorite browser

This commit is contained in:
Cory Bennett
2015-02-16 10:34:04 -08:00
parent b7bdb43471
commit 21d9f74635
4 changed files with 74 additions and 47 deletions
+28 -27
View File
@@ -77,50 +77,51 @@ hard-coded templates with `jira export-templates` which will write them to **~/.
``` ```
Usage: Usage:
jira [-v ...] [-u USER] [-e URI] [-t FILE] (ls|list) ( [-q JQL] | [-p PROJECT] [-c COMPONENT] [-a ASSIGNEE] [-i ISSUETYPE]) jira [-v ...] [-u USER] [-e URI] [-t FILE] (ls|list) ( [-q JQL] | [-p PROJECT] [-c COMPONENT] [-a ASSIGNEE] [-i ISSUETYPE])
jira [-v ...] [-u USER] [-e URI] [-t FILE] view ISSUE jira [-v ...] [-u USER] [-e URI] [-b] [-t FILE] view ISSUE
jira [-v ...] [-u USER] [-e URI] [-t FILE] edit ISSUE [-m COMMENT] [-o KEY=VAL]... jira [-v ...] [-u USER] [-e URI] [-b] [-t FILE] edit ISSUE [-m COMMENT] [-o KEY=VAL]...
jira [-v ...] [-u USER] [-e URI] [-t FILE] create [-p PROJECT] [-i ISSUETYPE] [-o KEY=VAL]... jira [-v ...] [-u USER] [-e URI] [-b] [-t FILE] create [-p PROJECT] [-i ISSUETYPE] [-o KEY=VAL]...
jira [-v ...] [-u USER] [-e URI] DUPLICATE dups ISSUE jira [-v ...] [-u USER] [-e URI] [-b] DUPLICATE dups ISSUE
jira [-v ...] [-u USER] [-e URI] BLOCKER blocks ISSUE jira [-v ...] [-u USER] [-e URI] [-b] BLOCKER blocks ISSUE
jira [-v ...] [-u USER] [-e URI] watch ISSUE [-w WATCHER] jira [-v ...] [-u USER] [-e URI] [-b] watch ISSUE [-w WATCHER]
jira [-v ...] [-u USER] [-e URI] (trans|transition) TRANSITION ISSUE [-m COMMENT] jira [-v ...] [-u USER] [-e URI] [-b] (trans|transition) TRANSITION ISSUE [-m COMMENT]
jira [-v ...] [-u USER] [-e URI] ack ISSUE [-m COMMENT] jira [-v ...] [-u USER] [-e URI] [-b] ack ISSUE [-m COMMENT]
jira [-v ...] [-u USER] [-e URI] close ISSUE [-m COMMENT] jira [-v ...] [-u USER] [-e URI] [-b] close ISSUE [-m COMMENT]
jira [-v ...] [-u USER] [-e URI] resolve ISSUE [-m COMMENT] jira [-v ...] [-u USER] [-e URI] [-b] resolve ISSUE [-m COMMENT]
jira [-v ...] [-u USER] [-e URI] reopen ISSUE [-m COMMENT] jira [-v ...] [-u USER] [-e URI] [-b] reopen ISSUE [-m COMMENT]
jira [-v ...] [-u USER] [-e URI] start ISSUE [-m COMMENT] jira [-v ...] [-u USER] [-e URI] [-b] start ISSUE [-m COMMENT]
jira [-v ...] [-u USER] [-e URI] stop ISSUE [-m COMMENT] jira [-v ...] [-u USER] [-e URI] [-b] stop ISSUE [-m COMMENT]
jira [-v ...] [-u USER] [-e URI] [-t FILE] comment ISSUE [-m COMMENT] jira [-v ...] [-u USER] [-e URI] [-b] [-t FILE] comment ISSUE [-m COMMENT]
jira [-v ...] [-u USER] [-e URI] take ISSUE jira [-v ...] [-u USER] [-e URI] [-b] take ISSUE
jira [-v ...] [-u USER] [-e URI] (assign|give) ISSUE ASSIGNEE jira [-v ...] [-u USER] [-e URI] [-b] (assign|give) ISSUE ASSIGNEE
jira [-v ...] [-u USER] [-e URI] [-t FILE] fields jira [-v ...] [-u USER] [-e URI] [-t FILE] fields
jira [-v ...] [-u USER] [-e URI] [-t FILE] issuelinktypes jira [-v ...] [-u USER] [-e URI] [-t FILE] issuelinktypes
jira [-v ...] [-u USER] [-e URI] [-t FILE] transmeta ISSUE jira [-v ...] [-u USER] [-e URI] [-b][-t FILE] transmeta ISSUE
jira [-v ...] [-u USER] [-e URI] [-t FILE] editmeta ISSUE jira [-v ...] [-u USER] [-e URI] [-b] [-t FILE] editmeta ISSUE
jira [-v ...] [-u USER] [-e URI] [-t FILE] issuetypes [-p PROJECT] jira [-v ...] [-u USER] [-e URI] [-t FILE] issuetypes [-p PROJECT]
jira [-v ...] [-u USER] [-e URI] [-t FILE] createmeta [-p PROJECT] [-i ISSUETYPE] jira [-v ...] [-u USER] [-e URI] [-t FILE] createmeta [-p PROJECT] [-i ISSUETYPE]
jira [-v ...] [-u USER] [-e URI] [-t FILE] transitions ISSUE jira [-v ...] [-u USER] [-e URI] [-b] [-t FILE] transitions ISSUE
jira [-v ...] export-templates [-d DIR] jira [-v ...] export-templates [-d DIR]
jira [-v ...] [-u USER] [-e URI] [-t FILE] login jira [-v ...] [-u USER] [-e URI] [-t FILE] login
jira [-v ...] [-u USER] [-e URI] [-t FILE] ISSUE jira [-v ...] [-u USER] [-e URI] [-b] [-t FILE] ISSUE
General Options: General Options:
-e --endpoint=URI URI to use for jira -e --endpoint=URI URI to use for jira
-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: $USER) -u --user=USER Username to use for authenticaion (default: cbennett)
-v --verbose Increase output logging -v --verbose Increase output logging
--version Show this version --version Show this version
Command Options: Command Options:
-a --assignee=USER Username assigned the issue -a --assignee=USER Username assigned the issue
-b --browse Open your browser to the Jira issue
-c --component=COMPONENT Component to Search for -c --component=COMPONENT Component to Search for
-d --directory=DIR Directory to export templates to (default: $HOME/.jira.d/templates) -d --directory=DIR Directory to export templates to (default: /Users/cbennett/.jira.d/templates)
-i --issuetype=ISSUETYPE Jira Issue Type (default: Bug) -i --issuetype=ISSUETYPE Jira Issue Type (default: Bug)
-m --comment=COMMENT Comment message for transition -m --comment=COMMENT Comment message for transition
-o --override=KEY:VAL Set custom key/value pairs -o --override=KEY:VAL Set custom key/value pairs
-p --project=PROJECT Project to Search for -p --project=PROJECT Project to Search for
-q --query=JQL Jira Query Language expression for the search -q --query=JQL Jira Query Language expression for the search
-w --watcher=USER Watcher to add to issue (default: $USER) -w --watcher=USER Watcher to add to issue (default: cbennett)
``` ```
+10
View File
@@ -297,3 +297,13 @@ func (c *Cli) editTemplate(template string, tmpFilePrefix string, templateData m
} }
return nil return nil
} }
func (c *Cli) Browse(issue string) {
if val, ok := c.opts["browse"]; ok && val == "true" {
if runtime.GOOS == "darwin" {
exec.Command("open", fmt.Sprintf("%s/browse/%s", c.endpoint, issue)).Run()
} else if runtime.GOOS == "linux" {
exec.Command("xdg-open", fmt.Sprintf("%s/browse/%s", c.endpoint, issue)).Run()
}
}
}
+13
View File
@@ -105,6 +105,7 @@ func (c *Cli) CmdList() error {
func (c *Cli) CmdView(issue string) error { func (c *Cli) CmdView(issue string) error {
log.Debug("view called") log.Debug("view called")
c.Browse(issue)
uri := fmt.Sprintf("%s/rest/api/2/issue/%s", c.endpoint, issue) uri := fmt.Sprintf("%s/rest/api/2/issue/%s", c.endpoint, issue)
data, err := responseToJson(c.get(uri)) data, err := responseToJson(c.get(uri))
if err != nil { if err != nil {
@@ -145,6 +146,7 @@ func (c *Cli) CmdEdit(issue string) error {
} }
if resp.StatusCode == 204 { if resp.StatusCode == 204 {
c.Browse(issueData["key"].(string))
fmt.Printf("OK %s %s/browse/%s\n", issueData["key"], c.endpoint, issueData["key"]) fmt.Printf("OK %s %s/browse/%s\n", issueData["key"], c.endpoint, issueData["key"])
return nil return nil
} else { } else {
@@ -160,6 +162,7 @@ func (c *Cli) CmdEdit(issue string) error {
func (c *Cli) CmdEditMeta(issue string) error { func (c *Cli) CmdEditMeta(issue string) error {
log.Debug("editMeta called") log.Debug("editMeta called")
c.Browse(issue)
uri := fmt.Sprintf("%s/rest/api/2/issue/%s/editmeta", c.endpoint, issue) uri := fmt.Sprintf("%s/rest/api/2/issue/%s/editmeta", c.endpoint, issue)
data, err := responseToJson(c.get(uri)) data, err := responseToJson(c.get(uri))
if err != nil { if err != nil {
@@ -171,6 +174,7 @@ func (c *Cli) CmdEditMeta(issue string) error {
func (c *Cli) CmdTransitionMeta(issue string) error { func (c *Cli) CmdTransitionMeta(issue string) error {
log.Debug("tranisionMeta called") log.Debug("tranisionMeta called")
c.Browse(issue)
uri := fmt.Sprintf("%s/rest/api/2/issue/%s/transitions?expand=transitions.fields", c.endpoint, issue) uri := fmt.Sprintf("%s/rest/api/2/issue/%s/transitions?expand=transitions.fields", c.endpoint, issue)
data, err := responseToJson(c.get(uri)) data, err := responseToJson(c.get(uri))
if err != nil { if err != nil {
@@ -210,6 +214,7 @@ func (c *Cli) CmdCreateMeta(project string, issuetype string) error {
func (c *Cli) CmdTransitions(issue string) error { func (c *Cli) CmdTransitions(issue string) error {
log.Debug("Transitions called") log.Debug("Transitions called")
c.Browse(issue)
uri := fmt.Sprintf("%s/rest/api/2/issue/%s/transitions", c.endpoint, issue) uri := fmt.Sprintf("%s/rest/api/2/issue/%s/transitions", c.endpoint, issue)
data, err := responseToJson(c.get(uri)) data, err := responseToJson(c.get(uri))
if err != nil { if err != nil {
@@ -255,7 +260,9 @@ func (c *Cli) CmdCreate(project string, issuetype string) error {
return err return err
} else { } else {
key := json.(map[string]interface{})["key"] key := json.(map[string]interface{})["key"]
c.Browse(key.(string))
fmt.Printf("OK %s %s/browse/%s\n", key, c.endpoint, key) fmt.Printf("OK %s %s/browse/%s\n", key, c.endpoint, key)
} }
return nil return nil
} else { } else {
@@ -304,6 +311,7 @@ func (c *Cli) CmdBlocks(blocker string, issue string) error {
return err return err
} }
if resp.StatusCode == 201 { if resp.StatusCode == 201 {
c.Browse(issue)
fmt.Printf("OK %s %s/browse/%s\n", issue, c.endpoint, issue) fmt.Printf("OK %s %s/browse/%s\n", issue, c.endpoint, issue)
} else { } else {
logBuffer := bytes.NewBuffer(make([]byte, 0)) logBuffer := bytes.NewBuffer(make([]byte, 0))
@@ -339,6 +347,7 @@ func (c *Cli) CmdDups(duplicate string, issue string) error {
return err return err
} }
if resp.StatusCode == 201 { if resp.StatusCode == 201 {
c.Browse(issue)
fmt.Printf("OK %s %s/browse/%s\n", issue, c.endpoint, issue) fmt.Printf("OK %s %s/browse/%s\n", issue, c.endpoint, issue)
} else { } else {
logBuffer := bytes.NewBuffer(make([]byte, 0)) logBuffer := bytes.NewBuffer(make([]byte, 0))
@@ -364,6 +373,7 @@ func (c *Cli) CmdWatch(issue string, watcher string) error {
return err return err
} }
if resp.StatusCode == 204 { if resp.StatusCode == 204 {
c.Browse(issue)
fmt.Printf("OK %s %s/browse/%s\n", issue, c.endpoint, issue) fmt.Printf("OK %s %s/browse/%s\n", issue, c.endpoint, issue)
} else { } else {
logBuffer := bytes.NewBuffer(make([]byte, 0)) logBuffer := bytes.NewBuffer(make([]byte, 0))
@@ -429,6 +439,7 @@ func (c *Cli) CmdTransition(issue string, trans string) error {
return err return err
} }
if resp.StatusCode == 204 { if resp.StatusCode == 204 {
c.Browse(issue)
fmt.Printf("OK %s %s/browse/%s\n", issue, c.endpoint, issue) fmt.Printf("OK %s %s/browse/%s\n", issue, c.endpoint, issue)
} else { } else {
logBuffer := bytes.NewBuffer(make([]byte, 0)) logBuffer := bytes.NewBuffer(make([]byte, 0))
@@ -452,6 +463,7 @@ func (c *Cli) CmdComment(issue string) error {
} }
if resp.StatusCode == 201 { if resp.StatusCode == 201 {
c.Browse(issue)
fmt.Printf("OK %s %s/browse/%s\n", issue, c.endpoint, issue) fmt.Printf("OK %s %s/browse/%s\n", issue, c.endpoint, issue)
return nil return nil
} else { } else {
@@ -498,6 +510,7 @@ func (c *Cli) CmdAssign(issue string, user string) error {
return err return err
} }
if resp.StatusCode == 204 { if resp.StatusCode == 204 {
c.Browse(issue)
fmt.Printf("OK %s %s/browse/%s\n", issue, c.endpoint, issue) fmt.Printf("OK %s %s/browse/%s\n", issue, c.endpoint, issue)
} else { } else {
logBuffer := bytes.NewBuffer(make([]byte, 0)) logBuffer := bytes.NewBuffer(make([]byte, 0))
+23 -20
View File
@@ -20,32 +20,32 @@ func main() {
usage := fmt.Sprintf(` usage := fmt.Sprintf(`
Usage: Usage:
jira [-v ...] [-u USER] [-e URI] [-t FILE] (ls|list) ( [-q JQL] | [-p PROJECT] [-c COMPONENT] [-a ASSIGNEE] [-i ISSUETYPE]) jira [-v ...] [-u USER] [-e URI] [-t FILE] (ls|list) ( [-q JQL] | [-p PROJECT] [-c COMPONENT] [-a ASSIGNEE] [-i ISSUETYPE])
jira [-v ...] [-u USER] [-e URI] [-t FILE] view ISSUE jira [-v ...] [-u USER] [-e URI] [-b] [-t FILE] view ISSUE
jira [-v ...] [-u USER] [-e URI] [-t FILE] edit ISSUE [-m COMMENT] [-o KEY=VAL]... jira [-v ...] [-u USER] [-e URI] [-b] [-t FILE] edit ISSUE [-m COMMENT] [-o KEY=VAL]...
jira [-v ...] [-u USER] [-e URI] [-t FILE] create [-p PROJECT] [-i ISSUETYPE] [-o KEY=VAL]... jira [-v ...] [-u USER] [-e URI] [-b] [-t FILE] create [-p PROJECT] [-i ISSUETYPE] [-o KEY=VAL]...
jira [-v ...] [-u USER] [-e URI] DUPLICATE dups ISSUE jira [-v ...] [-u USER] [-e URI] [-b] DUPLICATE dups ISSUE
jira [-v ...] [-u USER] [-e URI] BLOCKER blocks ISSUE jira [-v ...] [-u USER] [-e URI] [-b] BLOCKER blocks ISSUE
jira [-v ...] [-u USER] [-e URI] watch ISSUE [-w WATCHER] jira [-v ...] [-u USER] [-e URI] [-b] watch ISSUE [-w WATCHER]
jira [-v ...] [-u USER] [-e URI] (trans|transition) TRANSITION ISSUE [-m COMMENT] jira [-v ...] [-u USER] [-e URI] [-b] (trans|transition) TRANSITION ISSUE [-m COMMENT]
jira [-v ...] [-u USER] [-e URI] ack ISSUE [-m COMMENT] jira [-v ...] [-u USER] [-e URI] [-b] ack ISSUE [-m COMMENT]
jira [-v ...] [-u USER] [-e URI] close ISSUE [-m COMMENT] jira [-v ...] [-u USER] [-e URI] [-b] close ISSUE [-m COMMENT]
jira [-v ...] [-u USER] [-e URI] resolve ISSUE [-m COMMENT] jira [-v ...] [-u USER] [-e URI] [-b] resolve ISSUE [-m COMMENT]
jira [-v ...] [-u USER] [-e URI] reopen ISSUE [-m COMMENT] jira [-v ...] [-u USER] [-e URI] [-b] reopen ISSUE [-m COMMENT]
jira [-v ...] [-u USER] [-e URI] start ISSUE [-m COMMENT] jira [-v ...] [-u USER] [-e URI] [-b] start ISSUE [-m COMMENT]
jira [-v ...] [-u USER] [-e URI] stop ISSUE [-m COMMENT] jira [-v ...] [-u USER] [-e URI] [-b] stop ISSUE [-m COMMENT]
jira [-v ...] [-u USER] [-e URI] [-t FILE] comment ISSUE [-m COMMENT] jira [-v ...] [-u USER] [-e URI] [-b] [-t FILE] comment ISSUE [-m COMMENT]
jira [-v ...] [-u USER] [-e URI] take ISSUE jira [-v ...] [-u USER] [-e URI] [-b] take ISSUE
jira [-v ...] [-u USER] [-e URI] (assign|give) ISSUE ASSIGNEE jira [-v ...] [-u USER] [-e URI] [-b] (assign|give) ISSUE ASSIGNEE
jira [-v ...] [-u USER] [-e URI] [-t FILE] fields jira [-v ...] [-u USER] [-e URI] [-t FILE] fields
jira [-v ...] [-u USER] [-e URI] [-t FILE] issuelinktypes jira [-v ...] [-u USER] [-e URI] [-t FILE] issuelinktypes
jira [-v ...] [-u USER] [-e URI] [-t FILE] transmeta ISSUE jira [-v ...] [-u USER] [-e URI] [-b][-t FILE] transmeta ISSUE
jira [-v ...] [-u USER] [-e URI] [-t FILE] editmeta ISSUE jira [-v ...] [-u USER] [-e URI] [-b] [-t FILE] editmeta ISSUE
jira [-v ...] [-u USER] [-e URI] [-t FILE] issuetypes [-p PROJECT] jira [-v ...] [-u USER] [-e URI] [-t FILE] issuetypes [-p PROJECT]
jira [-v ...] [-u USER] [-e URI] [-t FILE] createmeta [-p PROJECT] [-i ISSUETYPE] jira [-v ...] [-u USER] [-e URI] [-t FILE] createmeta [-p PROJECT] [-i ISSUETYPE]
jira [-v ...] [-u USER] [-e URI] [-t FILE] transitions ISSUE jira [-v ...] [-u USER] [-e URI] [-b] [-t FILE] transitions ISSUE
jira [-v ...] export-templates [-d DIR] jira [-v ...] export-templates [-d DIR]
jira [-v ...] [-u USER] [-e URI] [-t FILE] login jira [-v ...] [-u USER] [-e URI] [-t FILE] login
jira [-v ...] [-u USER] [-e URI] [-t FILE] ISSUE jira [-v ...] [-u USER] [-e URI] [-b] [-t FILE] ISSUE
General Options: General Options:
-e --endpoint=URI URI to use for jira -e --endpoint=URI URI to use for jira
@@ -57,6 +57,7 @@ General Options:
Command Options: Command Options:
-a --assignee=USER Username assigned the issue -a --assignee=USER Username assigned the issue
-b --browse Open your browser to the Jira issue
-c --component=COMPONENT Component to Search for -c --component=COMPONENT Component to Search for
-d --directory=DIR Directory to export templates to (default: %s) -d --directory=DIR Directory to export templates to (default: %s)
-i --issuetype=ISSUETYPE Jira Issue Type (default: Bug) -i --issuetype=ISSUETYPE Jira Issue Type (default: Bug)
@@ -114,6 +115,8 @@ Command Options:
opts[opt] = v opts[opt] = v
case int: case int:
opts[opt] = fmt.Sprintf("%d", v) opts[opt] = fmt.Sprintf("%d", v)
case bool:
opts[opt] = fmt.Sprintf("%t", v)
} }
} }
} }