commit 8a4b7c017983246797ee7a4cd56c6a6175126ca7
parent fac10d65517b52cbfcfb48d395832524025afbeb
Author: Oliver Lowe <o@olowe.co>
Date: Sat, 9 Nov 2024 08:03:29 +1100
Jira: decode, print issue links
Diffstat:
4 files changed, 36 insertions(+), 14 deletions(-)
diff --git a/Jira/acme.go b/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, err error) {
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)
}
diff --git a/Jira/jira.go b/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
}
diff --git a/Jira/jira_test.go b/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)
}
+*/
diff --git a/Jira/print.go b/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 {