From 21d9f74635d628b38e33d76bd8e4e1e9eaa5879f Mon Sep 17 00:00:00 2001 From: Cory Bennett Date: Mon, 16 Feb 2015 10:34:04 -0800 Subject: [PATCH] adding --browse option to most command which should open the issue in your favorite browser --- README.md | 55 ++++++++++++++++++++++---------------------- jira/cli/cli.go | 10 ++++++++ jira/cli/commands.go | 13 +++++++++++ jira/main.go | 43 ++++++++++++++++++---------------- 4 files changed, 74 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index 14bad99..d801d8f 100644 --- a/README.md +++ b/README.md @@ -77,50 +77,51 @@ hard-coded templates with `jira export-templates` which will write them to **~/. ``` 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] view ISSUE - jira [-v ...] [-u USER] [-e URI] [-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] DUPLICATE dups ISSUE - jira [-v ...] [-u USER] [-e URI] BLOCKER blocks ISSUE - jira [-v ...] [-u USER] [-e URI] watch ISSUE [-w WATCHER] - jira [-v ...] [-u USER] [-e URI] (trans|transition) TRANSITION ISSUE [-m COMMENT] - jira [-v ...] [-u USER] [-e URI] ack ISSUE [-m COMMENT] - jira [-v ...] [-u USER] [-e URI] close ISSUE [-m COMMENT] - jira [-v ...] [-u USER] [-e URI] resolve ISSUE [-m COMMENT] - jira [-v ...] [-u USER] [-e URI] reopen ISSUE [-m COMMENT] - jira [-v ...] [-u USER] [-e URI] start ISSUE [-m COMMENT] - jira [-v ...] [-u USER] [-e URI] stop ISSUE [-m COMMENT] - jira [-v ...] [-u USER] [-e URI] [-t FILE] comment ISSUE [-m COMMENT] - jira [-v ...] [-u USER] [-e URI] take ISSUE - jira [-v ...] [-u USER] [-e URI] (assign|give) ISSUE ASSIGNEE + 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] [-b] [-t FILE] view ISSUE + jira [-v ...] [-u USER] [-e URI] [-b] [-t FILE] edit ISSUE [-m COMMENT] [-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] [-b] DUPLICATE dups ISSUE + jira [-v ...] [-u USER] [-e URI] [-b] BLOCKER blocks ISSUE + jira [-v ...] [-u USER] [-e URI] [-b] watch ISSUE [-w WATCHER] + jira [-v ...] [-u USER] [-e URI] [-b] (trans|transition) TRANSITION ISSUE [-m COMMENT] + jira [-v ...] [-u USER] [-e URI] [-b] ack ISSUE [-m COMMENT] + jira [-v ...] [-u USER] [-e URI] [-b] close ISSUE [-m COMMENT] + jira [-v ...] [-u USER] [-e URI] [-b] resolve ISSUE [-m COMMENT] + jira [-v ...] [-u USER] [-e URI] [-b] reopen ISSUE [-m COMMENT] + jira [-v ...] [-u USER] [-e URI] [-b] start ISSUE [-m COMMENT] + jira [-v ...] [-u USER] [-e URI] [-b] stop ISSUE [-m COMMENT] + jira [-v ...] [-u USER] [-e URI] [-b] [-t FILE] comment ISSUE [-m COMMENT] + jira [-v ...] [-u USER] [-e URI] [-b] take ISSUE + 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] issuelinktypes - jira [-v ...] [-u USER] [-e URI] [-t FILE] transmeta ISSUE - jira [-v ...] [-u USER] [-e URI] [-t FILE] editmeta ISSUE - 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] transitions ISSUE + jira [-v ...] [-u USER] [-e URI] [-b][-t FILE] transmeta 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] createmeta [-p PROJECT] [-i ISSUETYPE] + jira [-v ...] [-u USER] [-e URI] [-b] [-t FILE] transitions ISSUE jira [-v ...] export-templates [-d DIR] 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: -e --endpoint=URI URI to use for jira -h --help Show this usage -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 --version Show this version Command Options: -a --assignee=USER Username assigned the issue + -b --browse Open your browser to the Jira issue -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) -m --comment=COMMENT Comment message for transition -o --override=KEY:VAL Set custom key/value pairs -p --project=PROJECT Project to Search for -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) ``` diff --git a/jira/cli/cli.go b/jira/cli/cli.go index 4b59c52..b85ee37 100644 --- a/jira/cli/cli.go +++ b/jira/cli/cli.go @@ -297,3 +297,13 @@ func (c *Cli) editTemplate(template string, tmpFilePrefix string, templateData m } 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() + } + } +} diff --git a/jira/cli/commands.go b/jira/cli/commands.go index b0bc13e..3f86f26 100644 --- a/jira/cli/commands.go +++ b/jira/cli/commands.go @@ -105,6 +105,7 @@ func (c *Cli) CmdList() error { func (c *Cli) CmdView(issue string) error { log.Debug("view called") + c.Browse(issue) uri := fmt.Sprintf("%s/rest/api/2/issue/%s", c.endpoint, issue) data, err := responseToJson(c.get(uri)) if err != nil { @@ -145,6 +146,7 @@ func (c *Cli) CmdEdit(issue string) error { } if resp.StatusCode == 204 { + c.Browse(issueData["key"].(string)) fmt.Printf("OK %s %s/browse/%s\n", issueData["key"], c.endpoint, issueData["key"]) return nil } else { @@ -160,6 +162,7 @@ func (c *Cli) CmdEdit(issue string) error { func (c *Cli) CmdEditMeta(issue string) error { log.Debug("editMeta called") + c.Browse(issue) uri := fmt.Sprintf("%s/rest/api/2/issue/%s/editmeta", c.endpoint, issue) data, err := responseToJson(c.get(uri)) if err != nil { @@ -171,6 +174,7 @@ func (c *Cli) CmdEditMeta(issue string) error { func (c *Cli) CmdTransitionMeta(issue string) error { log.Debug("tranisionMeta called") + c.Browse(issue) uri := fmt.Sprintf("%s/rest/api/2/issue/%s/transitions?expand=transitions.fields", c.endpoint, issue) data, err := responseToJson(c.get(uri)) if err != nil { @@ -210,6 +214,7 @@ func (c *Cli) CmdCreateMeta(project string, issuetype string) error { func (c *Cli) CmdTransitions(issue string) error { log.Debug("Transitions called") + c.Browse(issue) uri := fmt.Sprintf("%s/rest/api/2/issue/%s/transitions", c.endpoint, issue) data, err := responseToJson(c.get(uri)) if err != nil { @@ -255,7 +260,9 @@ func (c *Cli) CmdCreate(project string, issuetype string) error { return err } else { key := json.(map[string]interface{})["key"] + c.Browse(key.(string)) fmt.Printf("OK %s %s/browse/%s\n", key, c.endpoint, key) + } return nil } else { @@ -304,6 +311,7 @@ func (c *Cli) CmdBlocks(blocker string, issue string) error { return err } if resp.StatusCode == 201 { + c.Browse(issue) fmt.Printf("OK %s %s/browse/%s\n", issue, c.endpoint, issue) } else { logBuffer := bytes.NewBuffer(make([]byte, 0)) @@ -339,6 +347,7 @@ func (c *Cli) CmdDups(duplicate string, issue string) error { return err } if resp.StatusCode == 201 { + c.Browse(issue) fmt.Printf("OK %s %s/browse/%s\n", issue, c.endpoint, issue) } else { logBuffer := bytes.NewBuffer(make([]byte, 0)) @@ -364,6 +373,7 @@ func (c *Cli) CmdWatch(issue string, watcher string) error { return err } if resp.StatusCode == 204 { + c.Browse(issue) fmt.Printf("OK %s %s/browse/%s\n", issue, c.endpoint, issue) } else { logBuffer := bytes.NewBuffer(make([]byte, 0)) @@ -429,6 +439,7 @@ func (c *Cli) CmdTransition(issue string, trans string) error { return err } if resp.StatusCode == 204 { + c.Browse(issue) fmt.Printf("OK %s %s/browse/%s\n", issue, c.endpoint, issue) } else { logBuffer := bytes.NewBuffer(make([]byte, 0)) @@ -452,6 +463,7 @@ func (c *Cli) CmdComment(issue string) error { } if resp.StatusCode == 201 { + c.Browse(issue) fmt.Printf("OK %s %s/browse/%s\n", issue, c.endpoint, issue) return nil } else { @@ -498,6 +510,7 @@ func (c *Cli) CmdAssign(issue string, user string) error { return err } if resp.StatusCode == 204 { + c.Browse(issue) fmt.Printf("OK %s %s/browse/%s\n", issue, c.endpoint, issue) } else { logBuffer := bytes.NewBuffer(make([]byte, 0)) diff --git a/jira/main.go b/jira/main.go index fbd16cb..06a2507 100644 --- a/jira/main.go +++ b/jira/main.go @@ -20,32 +20,32 @@ func main() { usage := fmt.Sprintf(` 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] view ISSUE - jira [-v ...] [-u USER] [-e URI] [-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] DUPLICATE dups ISSUE - jira [-v ...] [-u USER] [-e URI] BLOCKER blocks ISSUE - jira [-v ...] [-u USER] [-e URI] watch ISSUE [-w WATCHER] - jira [-v ...] [-u USER] [-e URI] (trans|transition) TRANSITION ISSUE [-m COMMENT] - jira [-v ...] [-u USER] [-e URI] ack ISSUE [-m COMMENT] - jira [-v ...] [-u USER] [-e URI] close ISSUE [-m COMMENT] - jira [-v ...] [-u USER] [-e URI] resolve ISSUE [-m COMMENT] - jira [-v ...] [-u USER] [-e URI] reopen ISSUE [-m COMMENT] - jira [-v ...] [-u USER] [-e URI] start ISSUE [-m COMMENT] - jira [-v ...] [-u USER] [-e URI] stop ISSUE [-m COMMENT] - jira [-v ...] [-u USER] [-e URI] [-t FILE] comment ISSUE [-m COMMENT] - jira [-v ...] [-u USER] [-e URI] take ISSUE - jira [-v ...] [-u USER] [-e URI] (assign|give) ISSUE ASSIGNEE + jira [-v ...] [-u USER] [-e URI] [-b] [-t FILE] view ISSUE + jira [-v ...] [-u USER] [-e URI] [-b] [-t FILE] edit ISSUE [-m COMMENT] [-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] [-b] DUPLICATE dups ISSUE + jira [-v ...] [-u USER] [-e URI] [-b] BLOCKER blocks ISSUE + jira [-v ...] [-u USER] [-e URI] [-b] watch ISSUE [-w WATCHER] + jira [-v ...] [-u USER] [-e URI] [-b] (trans|transition) TRANSITION ISSUE [-m COMMENT] + jira [-v ...] [-u USER] [-e URI] [-b] ack ISSUE [-m COMMENT] + jira [-v ...] [-u USER] [-e URI] [-b] close ISSUE [-m COMMENT] + jira [-v ...] [-u USER] [-e URI] [-b] resolve ISSUE [-m COMMENT] + jira [-v ...] [-u USER] [-e URI] [-b] reopen ISSUE [-m COMMENT] + jira [-v ...] [-u USER] [-e URI] [-b] start ISSUE [-m COMMENT] + jira [-v ...] [-u USER] [-e URI] [-b] stop ISSUE [-m COMMENT] + jira [-v ...] [-u USER] [-e URI] [-b] [-t FILE] comment ISSUE [-m COMMENT] + jira [-v ...] [-u USER] [-e URI] [-b] take ISSUE + 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] issuelinktypes - jira [-v ...] [-u USER] [-e URI] [-t FILE] transmeta ISSUE - jira [-v ...] [-u USER] [-e URI] [-t FILE] editmeta ISSUE + jira [-v ...] [-u USER] [-e URI] [-b][-t FILE] transmeta 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] 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 ...] [-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: -e --endpoint=URI URI to use for jira @@ -57,6 +57,7 @@ General Options: Command Options: -a --assignee=USER Username assigned the issue + -b --browse Open your browser to the Jira issue -c --component=COMPONENT Component to Search for -d --directory=DIR Directory to export templates to (default: %s) -i --issuetype=ISSUETYPE Jira Issue Type (default: Bug) @@ -114,6 +115,8 @@ Command Options: opts[opt] = v case int: opts[opt] = fmt.Sprintf("%d", v) + case bool: + opts[opt] = fmt.Sprintf("%t", v) } } }