From 5d6170a81ae315ef0328af858400e2aecdcb9c01 Mon Sep 17 00:00:00 2001 From: Cory Bennett Date: Thu, 24 Aug 2017 12:39:11 -0700 Subject: [PATCH] add --browse option to more commands --- jiracli/commands.go | 1 - jiracli/editmeta.go | 38 ++++++++++++++++++++++++------------ jiracli/labelsAdd.go | 7 +++++-- jiracli/labelsRemove.go | 4 ++++ jiracli/labelsSet.go | 7 +++++-- jiracli/list.go | 2 +- jiracli/login.go | 43 ----------------------------------------- jiracli/subtask.go | 2 +- jiracli/take.go | 1 + jiracli/transitions.go | 9 ++++++++- jiracli/unassign.go | 1 + jiracli/view.go | 23 ++++++++++++++-------- jiracli/worklogAdd.go | 10 +++++++++- jiracli/worklogList.go | 9 ++++++++- 14 files changed, 84 insertions(+), 73 deletions(-) delete mode 100644 jiracli/commands.go diff --git a/jiracli/commands.go b/jiracli/commands.go deleted file mode 100644 index f615f78..0000000 --- a/jiracli/commands.go +++ /dev/null @@ -1 +0,0 @@ -package jiracli diff --git a/jiracli/editmeta.go b/jiracli/editmeta.go index 78aa8d2..dbe11c2 100644 --- a/jiracli/editmeta.go +++ b/jiracli/editmeta.go @@ -2,37 +2,51 @@ package jiracli import kingpin "gopkg.in/alecthomas/kingpin.v2" +type EditMetaOptions struct { + GlobalOptions + Issue string +} + func (jc *JiraCli) CmdEditMetaRegistry() *CommandRegistryEntry { - issue := "" - opts := GlobalOptions{ - Template: "editmeta", + + opts := EditMetaOptions{ + GlobalOptions: GlobalOptions{ + Template: "editmeta", + }, } return &CommandRegistryEntry{ "View 'edit' metadata", func() error { - return jc.CmdEditMeta(issue, &opts) + return jc.CmdEditMeta(&opts) }, func(cmd *kingpin.CmdClause) error { - return jc.CmdEditMetaUsage(cmd, &issue, &opts) + return jc.CmdEditMetaUsage(cmd, &opts) }, } } -func (jc *JiraCli) CmdEditMetaUsage(cmd *kingpin.CmdClause, issue *string, opts *GlobalOptions) error { - if err := jc.GlobalUsage(cmd, opts); err != nil { +func (jc *JiraCli) CmdEditMetaUsage(cmd *kingpin.CmdClause, opts *EditMetaOptions) error { + if err := jc.GlobalUsage(cmd, &opts.GlobalOptions); err != nil { return err } - jc.TemplateUsage(cmd, opts) - cmd.Arg("ISSUE", "edit metadata for issue id").Required().StringVar(issue) + jc.BrowseUsage(cmd, &opts.GlobalOptions) + jc.TemplateUsage(cmd, &opts.GlobalOptions) + cmd.Arg("ISSUE", "edit metadata for issue id").Required().StringVar(&opts.Issue) return nil } // EditMeta will get issue edit metadata and send to "editmeta" template -func (jc *JiraCli) CmdEditMeta(issue string, opts *GlobalOptions) error { - editMeta, err := jc.GetIssueEditMeta(issue) +func (jc *JiraCli) CmdEditMeta(opts *EditMetaOptions) error { + editMeta, err := jc.GetIssueEditMeta(opts.Issue) if err != nil { return err } - return jc.runTemplate(opts.Template, editMeta, nil) + if err := jc.runTemplate(opts.Template, editMeta, nil); err != nil { + return err + } + if opts.Browse { + return jc.CmdBrowse(&BrowseOptions{opts.GlobalOptions, opts.Issue}) + } + return nil } diff --git a/jiracli/labelsAdd.go b/jiracli/labelsAdd.go index 4515e19..4734539 100644 --- a/jiracli/labelsAdd.go +++ b/jiracli/labelsAdd.go @@ -30,6 +30,7 @@ func (jc *JiraCli) CmdLabelsAddUsage(cmd *kingpin.CmdClause, opts *LabelsAddOpti if err := jc.GlobalUsage(cmd, &opts.GlobalOptions); err != nil { return err } + jc.BrowseUsage(cmd, &opts.GlobalOptions) cmd.Arg("ISSUE", "issue id to modify labels").Required().StringVar(&opts.Issue) cmd.Arg("LABEL", "label to add to issue").Required().StringsVar(&opts.Labels) return nil @@ -49,10 +50,12 @@ func (jc *JiraCli) CmdLabelsAdd(opts *LabelsAddOptions) error { }, } - err := jc.EditIssue(opts.Issue, &issueUpdate) - if err != nil { + if err := jc.EditIssue(opts.Issue, &issueUpdate); err != nil { return err } fmt.Printf("OK %s %s/browse/%s\n", opts.Issue, jc.Endpoint, opts.Issue) + if opts.Browse { + return jc.CmdBrowse(&BrowseOptions{opts.GlobalOptions, opts.Issue}) + } return nil } diff --git a/jiracli/labelsRemove.go b/jiracli/labelsRemove.go index 5aaebb4..718427a 100644 --- a/jiracli/labelsRemove.go +++ b/jiracli/labelsRemove.go @@ -30,6 +30,7 @@ func (jc *JiraCli) CmdLabelsRemoveUsage(cmd *kingpin.CmdClause, opts *LabelsRemo if err := jc.GlobalUsage(cmd, &opts.GlobalOptions); err != nil { return err } + jc.BrowseUsage(cmd, &opts.GlobalOptions) cmd.Arg("ISSUE", "issue id to modify labels").Required().StringVar(&opts.Issue) cmd.Arg("LABEL", "label to remove from issue").Required().StringsVar(&opts.Labels) return nil @@ -54,5 +55,8 @@ func (jc *JiraCli) CmdLabelsRemove(opts *LabelsRemoveOptions) error { return err } fmt.Printf("OK %s %s/browse/%s\n", opts.Issue, jc.Endpoint, opts.Issue) + if opts.Browse { + return jc.CmdBrowse(&BrowseOptions{opts.GlobalOptions, opts.Issue}) + } return nil } diff --git a/jiracli/labelsSet.go b/jiracli/labelsSet.go index d0a368b..ecd5794 100644 --- a/jiracli/labelsSet.go +++ b/jiracli/labelsSet.go @@ -30,6 +30,7 @@ func (jc *JiraCli) CmdLabelsSetUsage(cmd *kingpin.CmdClause, opts *LabelsSetOpti if err := jc.GlobalUsage(cmd, &opts.GlobalOptions); err != nil { return err } + jc.BrowseUsage(cmd, &opts.GlobalOptions) cmd.Arg("ISSUE", "issue id to modify labels").Required().StringVar(&opts.Issue) cmd.Arg("LABEL", "label to set on issue").Required().StringsVar(&opts.Labels) return nil @@ -47,10 +48,12 @@ func (jc *JiraCli) CmdLabelsSet(opts *LabelsSetOptions) error { }, } - err := jc.EditIssue(opts.Issue, &issueUpdate) - if err != nil { + if err := jc.EditIssue(opts.Issue, &issueUpdate); err != nil { return err } fmt.Printf("OK %s %s/browse/%s\n", opts.Issue, jc.Endpoint, opts.Issue) + if opts.Browse { + return jc.CmdBrowse(&BrowseOptions{opts.GlobalOptions, opts.Issue}) + } return nil } diff --git a/jiracli/list.go b/jiracli/list.go index 79de2b7..dbbd4fe 100644 --- a/jiracli/list.go +++ b/jiracli/list.go @@ -15,7 +15,7 @@ func (jc *JiraCli) CmdListRegistry() *CommandRegistryEntry { GlobalOptions: GlobalOptions{ Template: "list", }, - SearchOptions: SearchOptions{ + SearchOptions: jira.SearchOptions{ MaxResults: 500, QueryFields: "assignee,created,priority,reporter,status,summary,updated", Sort: "priority asc, key", diff --git a/jiracli/login.go b/jiracli/login.go index 4da6e2f..c6cb30e 100644 --- a/jiracli/login.go +++ b/jiracli/login.go @@ -61,46 +61,3 @@ func (jc *JiraCli) CmdLogin(opts *GlobalOptions) error { } return nil } - -// uri := fmt.Sprintf("%s/rest/auth/1/session", c.endpoint) -// for { -// req, _ := http.NewRequest("GET", uri, nil) -// user, _ := c.opts["user"].(string) - -// passwd := c.GetPass(user) -// req.SetBasicAuth(user, passwd) - -// resp, err := c.makeRequest(req) -// if err != nil { -// return err -// } -// if resp.StatusCode == 403 { -// // probably got this, need to redirect the user to login manually -// // X-Authentication-Denied-Reason: CAPTCHA_CHALLENGE; login-url=https://jira/login.jsp -// if reason := resp.Header.Get("X-Authentication-Denied-Reason"); reason != "" { -// err := fmt.Errorf("Authenticaion Failed: %s", reason) -// log.Errorf("%s", err) -// return err -// } -// err := fmt.Errorf("Authentication Failed: Unknown Reason") -// log.Errorf("%s", err) -// return err - -// } else if resp.StatusCode == 200 { -// // https://confluence.atlassian.com/display/JIRA043/JIRA+REST+API+%28Alpha%29+Tutorial#JIRARESTAPI%28Alpha%29Tutorial-CAPTCHAs -// // probably bad password, try again -// if reason := resp.Header.Get("X-Seraph-Loginreason"); reason == "AUTHENTICATION_DENIED" { -// log.Warning("Authentication Failed: %s", reason) -// continue -// } -// if _, ok := c.opts["password-source"]; ok { -// return c.SetPass(user, passwd) -// } -// break -// } else { -// log.Warning("Login failed") -// continue -// } -// } -// return nil -// } diff --git a/jiracli/subtask.go b/jiracli/subtask.go index 07fa561..17251e1 100644 --- a/jiracli/subtask.go +++ b/jiracli/subtask.go @@ -105,7 +105,7 @@ func (jc *JiraCli) CmdSubtask(opts *SubtaskOptions) error { fmt.Printf("OK %s %s/browse/%s\n", issueResp.Key, jc.Endpoint, issueResp.Key) if opts.Browse { - return jc.CmdBrowse(&BrowseOptions{opts.GlobalOptions, opts.Issue}) + return jc.CmdBrowse(&BrowseOptions{opts.GlobalOptions, issueResp.Key}) } return nil } diff --git a/jiracli/take.go b/jiracli/take.go index c630acb..fb2bb04 100644 --- a/jiracli/take.go +++ b/jiracli/take.go @@ -21,6 +21,7 @@ func (jc *JiraCli) CmdTakeUsage(cmd *kingpin.CmdClause, opts *AssignOptions) err if err := jc.GlobalUsage(cmd, &opts.GlobalOptions); err != nil { return err } + jc.BrowseUsage(cmd, &opts.GlobalOptions) cmd.Arg("ISSUE", "issue to assign").Required().StringVar(&opts.Issue) return nil } diff --git a/jiracli/transitions.go b/jiracli/transitions.go index 08e20d9..30257fe 100644 --- a/jiracli/transitions.go +++ b/jiracli/transitions.go @@ -29,6 +29,7 @@ func (jc *JiraCli) CmdTransitionsUsage(cmd *kingpin.CmdClause, opts *Transitions if err := jc.GlobalUsage(cmd, &opts.GlobalOptions); err != nil { return err } + jc.BrowseUsage(cmd, &opts.GlobalOptions) jc.TemplateUsage(cmd, &opts.GlobalOptions) cmd.Arg("ISSUE", "issue to list valid transitions").Required().StringVar(&opts.Issue) return nil @@ -40,5 +41,11 @@ func (jc *JiraCli) CmdTransitions(opts *TransitionsOptions) error { if err != nil { return err } - return jc.runTemplate(opts.Template, editMeta, nil) + if err := jc.runTemplate(opts.Template, editMeta, nil); err != nil { + return err + } + if opts.Browse { + return jc.CmdBrowse(&BrowseOptions{opts.GlobalOptions, opts.Issue}) + } + return nil } diff --git a/jiracli/unassign.go b/jiracli/unassign.go index f0aafce..093ac93 100644 --- a/jiracli/unassign.go +++ b/jiracli/unassign.go @@ -20,6 +20,7 @@ func (jc *JiraCli) CmdUnassignUsage(cmd *kingpin.CmdClause, opts *AssignOptions) if err := jc.GlobalUsage(cmd, &opts.GlobalOptions); err != nil { return err } + jc.BrowseUsage(cmd, &opts.GlobalOptions) cmd.Arg("ISSUE", "issue to unassign").Required().StringVar(&opts.Issue) return nil } diff --git a/jiracli/view.go b/jiracli/view.go index f3aee72..eeac15f 100644 --- a/jiracli/view.go +++ b/jiracli/view.go @@ -8,10 +8,10 @@ import ( type ViewOptions struct { GlobalOptions jira.IssueOptions + Issue string } func (jc *JiraCli) CmdViewRegistry() *CommandRegistryEntry { - issue := "" opts := ViewOptions{ GlobalOptions: GlobalOptions{ Template: "view", @@ -21,31 +21,38 @@ func (jc *JiraCli) CmdViewRegistry() *CommandRegistryEntry { return &CommandRegistryEntry{ "Prints issue details", func() error { - return jc.CmdView(issue, &opts) + return jc.CmdView(&opts) }, func(cmd *kingpin.CmdClause) error { - return jc.CmdViewUsage(cmd, &issue, &opts) + return jc.CmdViewUsage(cmd, &opts) }, } } -func (jc *JiraCli) CmdViewUsage(cmd *kingpin.CmdClause, issue *string, opts *ViewOptions) error { +func (jc *JiraCli) CmdViewUsage(cmd *kingpin.CmdClause, opts *ViewOptions) error { if err := jc.GlobalUsage(cmd, &opts.GlobalOptions); err != nil { return err } + jc.BrowseUsage(cmd, &opts.GlobalOptions) jc.TemplateUsage(cmd, &opts.GlobalOptions) cmd.Flag("expand", "field to expand for the issue").StringsVar(&opts.Expand) cmd.Flag("field", "field to return for the issue").StringsVar(&opts.Fields) cmd.Flag("property", "property to return for issue").StringsVar(&opts.Properties) - cmd.Arg("ISSUE", "issue id to view").Required().StringVar(issue) + cmd.Arg("ISSUE", "issue id to view").Required().StringVar(&opts.Issue) return nil } // View will get issue data and send to "view" template -func (jc *JiraCli) CmdView(issue string, opts *ViewOptions) error { - data, err := jc.GetIssue(issue, opts) +func (jc *JiraCli) CmdView(opts *ViewOptions) error { + data, err := jc.GetIssue(opts.Issue, opts) if err != nil { return err } - return jc.runTemplate(opts.Template, data, nil) + if err := jc.runTemplate(opts.Template, data, nil); err != nil { + return err + } + if opts.Browse { + return jc.CmdBrowse(&BrowseOptions{opts.GlobalOptions, opts.Issue}) + } + return nil } diff --git a/jiracli/worklogAdd.go b/jiracli/worklogAdd.go index 7925a86..003fd2c 100644 --- a/jiracli/worklogAdd.go +++ b/jiracli/worklogAdd.go @@ -32,6 +32,7 @@ func (jc *JiraCli) CmdWorklogAddUsage(cmd *kingpin.CmdClause, opts *WorklogAddOp if err := jc.GlobalUsage(cmd, &opts.GlobalOptions); err != nil { return err } + jc.BrowseUsage(cmd, &opts.GlobalOptions) jc.EditorUsage(cmd, &opts.GlobalOptions) jc.TemplateUsage(cmd, &opts.GlobalOptions) cmd.Flag("noedit", "Disable opening the editor").BoolVar(&opts.SkipEditing) @@ -45,8 +46,15 @@ func (jc *JiraCli) CmdWorklogAddUsage(cmd *kingpin.CmdClause, opts *WorklogAddOp // It will spawn the editor (unless --noedit isused) and post edited YAML // content as JSON to the worklog endpoint func (jc *JiraCli) CmdWorklogAdd(opts *WorklogAddOptions) error { - return jc.editLoop(&opts.GlobalOptions, &opts.Worklog, &opts.Worklog, func() error { + err := jc.editLoop(&opts.GlobalOptions, &opts.Worklog, &opts.Worklog, func() error { _, err := jc.AddIssueWorklog(opts.Issue, opts) return err }) + if err != nil { + return err + } + if opts.Browse { + return jc.CmdBrowse(&BrowseOptions{opts.GlobalOptions, opts.Issue}) + } + return nil } diff --git a/jiracli/worklogList.go b/jiracli/worklogList.go index 718f326..08713df 100644 --- a/jiracli/worklogList.go +++ b/jiracli/worklogList.go @@ -28,6 +28,7 @@ func (jc *JiraCli) CmdWorklogListUsage(cmd *kingpin.CmdClause, opts *WorklogList if err := jc.GlobalUsage(cmd, &opts.GlobalOptions); err != nil { return err } + jc.BrowseUsage(cmd, &opts.GlobalOptions) jc.TemplateUsage(cmd, &opts.GlobalOptions) cmd.Arg("ISSUE", "issue id to fetch worklogs").Required().StringVar(&opts.Issue) return nil @@ -39,5 +40,11 @@ func (jc *JiraCli) CmdWorklogList(opts *WorklogListOptions) error { if err != nil { return err } - return jc.runTemplate(opts.Template, data, nil) + if err := jc.runTemplate(opts.Template, data, nil); err != nil { + return err + } + if opts.Browse { + return jc.CmdBrowse(&BrowseOptions{opts.GlobalOptions, opts.Issue}) + } + return nil }