commit 4bcb477f41800862d0a7c265b40dfccf97180dcc from: Oliver Lowe via: Oliver Lowe date: Wed Mar 12 05:36:03 2025 UTC cmd/Jira: more options in config file 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() +}