Commit Diff


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 {