Commit Diff


commit - e526b14b660a73efce02a2edc9e63bea215208ed
commit + 4bcb477f41800862d0a7c265b40dfccf97180dcc
blob - defa8f4ac66fc7ab6e793dffdccdf927198e404d
blob + 3ee0fe29e984c743a573219152d6c86e8d380abf
--- cmd/Jira/Jira.go
+++ cmd/Jira/Jira.go
@@ -1,4 +1,4 @@
-package jira
+package main
 
 import (
 	"bytes"
@@ -8,7 +8,6 @@ import (
 	"io"
 	"io/fs"
 	"log"
-	"net/url"
 	"os"
 	"path"
 	"regexp"
@@ -151,11 +150,11 @@ func (w *awin) Get(f fs.File) error {
 			return err
 		}
 	}
+
 	stat, err := f.Stat()
 	if err != nil {
 		return err
 	}
-
 	defer f.Close()
 	if stat.IsDir() {
 		dirs, err := f.(fs.ReadDirFile).ReadDir(-1)
@@ -174,6 +173,7 @@ func (w *awin) Get(f fs.File) error {
 		w.PrintTabbed(buf.String())
 		return nil
 	}
+
 	b, err := io.ReadAll(f)
 	if err != nil {
 		return fmt.Errorf("read %s: %w", stat.Name(), err)
@@ -246,10 +246,7 @@ func readCreds(name string) (username, password string
 	return u, p, nil
 }
 
-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)
@@ -261,24 +258,20 @@ func main() {
 		fmt.Fprintln(os.Stderr, usage)
 		os.Exit(2)
 	}
-	user, pass, err := readCreds(credPath)
+	config, err := readConfig(credPath)
 	if err != nil {
-		log.Fatalf("read credentials: %v", err)
+		log.Fatalf("read configuration: %v", err)
 	}
 
 	// srv := newFakeServer("testdata")
 	// defer srv.Close()
 
-	u, err := url.Parse("https://" + *hostFlag + "/rest/api/3")
-	if err != nil {
-		log.Fatalf("parse api root url: %v", err)
-	}
 	fsys := &jira.FS{
 		Client: &jira.Client{
 			Debug:    false,
-			APIRoot:  u,
-			Username: user,
-			Password: pass,
+			APIRoot:  config.BaseURL,
+			Username: config.Username,
+			Password: config.Password,
 		},
 	}
 
blob - /dev/null
blob + 8446f85284e03a77313b0d7f5fde033016c1fbfb (mode 644)
--- /dev/null
+++ cmd/Jira/config.go
@@ -0,0 +1,54 @@
+package main
+
+import (
+	"bufio"
+	"fmt"
+	"net/url"
+	"os"
+	"strings"
+)
+
+type Config struct {
+	BaseURL  *url.URL
+	Username string
+	Password string
+}
+
+func readConfig(name string) (*Config, error) {
+	f, err := os.Open(name)
+	if err != nil {
+		return nil, err
+	}
+	defer f.Close()
+	var conf Config
+	sc := bufio.NewScanner(f)
+	for sc.Scan() {
+		line := strings.TrimSpace(sc.Text())
+		if strings.HasPrefix(line, "#") {
+			continue
+		} else if line == "" {
+			continue
+		}
+		k, v, ok := strings.Cut(line, " ")
+		if !ok {
+			return nil, fmt.Errorf("key %s: expected whitespace after configuration key", k)
+		} else if v == "" {
+			return nil, fmt.Errorf("key %s: missing parameter", k)
+		}
+		switch k {
+		case "url":
+			u, err := url.Parse(v)
+			if err != nil {
+				return nil, fmt.Errorf("parse base url: %w", err)
+			}
+			conf.BaseURL = u
+		case "username":
+			conf.Username = v
+		case "password":
+			conf.Password = v
+		default:
+			return nil, fmt.Errorf("unknown configuration key %q", k)
+		}
+	}
+	return &conf, sc.Err()
+}