commit 8a4b7c017983246797ee7a4cd56c6a6175126ca7 from: Oliver Lowe date: Fri Nov 08 21:13:47 2024 UTC Jira: decode, print issue links commit - fac10d65517b52cbfcfb48d395832524025afbeb commit + 8a4b7c017983246797ee7a4cd56c6a6175126ca7 blob - ebe4369672e9aef95dc2e4b1ed23a552f83e7e53 blob + 19956a7dd143d738e70e4c28290741634b4abb00 --- Jira/acme.go +++ Jira/acme.go @@ -3,6 +3,7 @@ package main import ( "bytes" "errors" + "flag" "fmt" "io" "io/fs" @@ -207,7 +208,7 @@ func newSearch(fsys fs.FS, query string) { if !ok { win.Errf("cannot search with filesystem type %T", fsys) } - win.PrintTabbed("Search "+query+"\n\n") + win.PrintTabbed("Search " + query + "\n\n") issues, err := f.client.SearchIssues(query) if err != nil { win.Errf("search %q: %v", query, err) @@ -232,18 +233,18 @@ func readCreds(name string) (username, password string return u, p, nil } -// TODO(otl): don't hardcode lol -const host string = "audinate.atlassian.net" +var hostFlag = flag.String("h", "jira.atlassian.com", "") func main() { + flag.Parse() home, err := os.UserHomeDir() if err != nil { log.Fatalf("find user config dir: %v", err) } credPath := path.Join(home, ".config/atlassian/jira") - if len(os.Args) == 2 { - credPath = os.Args[1] - } else if len(os.Args) > 2 { + if len(flag.Args()) == 1 { + credPath = flag.Args()[0] + } else if len(flag.Args()) > 2 { fmt.Fprintln(os.Stderr, usage) os.Exit(2) } @@ -255,7 +256,7 @@ func main() { // srv := newFakeServer("testdata") // defer srv.Close() - u, err := url.Parse("https://" + host + "/rest/api/2") + u, err := url.Parse("https://" + *hostFlag + "/rest/api/2") if err != nil { log.Fatalf("parse api root url: %v", err) } blob - 7d5e3e863c132c13bf3adc9b01b52763e98c655c blob + 9f2ca6d5ec44a9f54ca4f17c2e40776f3e915c97 --- Jira/jira.go +++ Jira/jira.go @@ -23,7 +23,8 @@ type Issue struct { Created time.Time Updated time.Time Comments []Comment - Subtasks []Issue + Links []Issue + Subtasks []Issue } type Project struct { @@ -69,7 +70,7 @@ func (c *Comment) UnmarshalJSON(b []byte) error { type User struct { Name string `json:"name"` - Email string `json:"emailAddress"` + Email string `json:"emailAddress"` DisplayName string `json:"displayName"` } @@ -96,9 +97,13 @@ func (issue *Issue) UnmarshalJSON(b []byte) error { type alias Issue iaux := &struct { - Created string - Updated string - Comment map[string]json.RawMessage + Created string + Updated string + Comment map[string]json.RawMessage + IssueLinks []struct { + InwardIssue *Issue + OutwardIssue *Issue + } *alias }{ alias: (*alias)(issue), @@ -125,5 +130,13 @@ func (issue *Issue) UnmarshalJSON(b []byte) error { return fmt.Errorf("unmarshal comments: %w", err) } } + for _, l := range iaux.IssueLinks { + if l.InwardIssue != nil { + issue.Links = append(issue.Links, *l.InwardIssue) + } + if l.OutwardIssue != nil { + issue.Links = append(issue.Links, *l.OutwardIssue) + } + } return nil } blob - ca18c7050d18fc42f8b01338c381089a8dccba07 blob + 9d7a88427bd487c8a301a98162ef2b36961e2ee8 --- Jira/jira_test.go +++ Jira/jira_test.go @@ -2,7 +2,6 @@ package main import ( "encoding/json" - "fmt" "os" "testing" ) @@ -25,6 +24,7 @@ func TestDecode(t *testing.T) { } } +/* func TestSubtasks(t *testing.T) { f, err := os.Open("testdata/subtasks") if err != nil { @@ -37,3 +37,4 @@ func TestSubtasks(t *testing.T) { } fmt.Println(is.Subtasks) } +*/ blob - 516fb01ba5686ddaf74cba85cb90712b7da5aba6 blob + 2883317a3ad95736195ab1c971d64ba2af462f85 --- Jira/print.go +++ Jira/print.go @@ -20,6 +20,7 @@ func printIssues(issues []Issue) string { func printIssue(i *Issue) string { buf := &strings.Builder{} fmt.Fprintln(buf, "From:", i.Reporter) + fmt.Fprintln(buf, "Date:", i.Created.Format(time.RFC1123Z)) if i.Assignee.String() != "" { fmt.Fprintln(buf, "Assignee:", i.Assignee) } @@ -28,8 +29,14 @@ func printIssue(i *Issue) string { fmt.Fprintf(buf, "Archived-At: <%s>\n", u) } fmt.Fprintf(buf, "Archived-At: <%s>\n", i.URL) - fmt.Fprintln(buf, "Date:", i.Updated.Format(time.RFC1123Z)) fmt.Fprintln(buf, "Status:", i.Status.Name) + if len(i.Links) > 0 { + s := make([]string, len(i.Links)) + for j := range i.Links { + s[j] = i.Links[j].Key + } + fmt.Fprintln(buf, "References:", strings.Join(s, ", ")) + } if len(i.Subtasks) > 0 { s := make([]string, len(i.Subtasks)) for j := range i.Subtasks {