diff --git a/main.go b/main.go index e48a23b..e27c115 100644 --- a/main.go +++ b/main.go @@ -22,14 +22,28 @@ var bTmpl string //go:embed index.html.tmpl var iTmpl string +// https://stackoverflow.com/questions/28322997/how-to-get-a-list-of-values-into-a-flag-in-golang/ +type bflag []string + +// TODO: Make sure these are unique. +func (b *bflag) Set(value string) error { + *b = append(*b, value) + + return nil +} + +func (b *bflag) String() string { + return strings.Join(*b, ", ") +} + type options struct { + Branches bflag `json:"branches"` + Force bool `json:"force"` name string Project string `json:"project"` + Quiet bool `json:"quiet"` Repo string `json:"repo"` URL string `json:"url"` - Branches string `json:"branches"` - Quiet bool `json:"quiet"` - Force bool `json:"force"` } // Helps store options into a JSON config file. @@ -66,8 +80,7 @@ func main() { flag.StringVar(&opt.Project, "p", "Jimbo", "Project title") flag.StringVar(&opt.Repo, "r", "", "Target repo") flag.StringVar(&opt.URL, "u", "https://host.net/project.git", "Repo public URL") - // TODO: Allow for passing multiple values. - flag.StringVar(&opt.Branches, "b", "all", "Target branches") + flag.Var(&opt.Branches, "b", "Target branches") flag.BoolVar(&opt.Quiet, "q", false, "Be quiet") flag.BoolVar(&opt.Force, "f", false, "Force rebuilding of all pages") flag.Parse() @@ -90,19 +103,21 @@ func main() { out = filepath.Join(cwd, out) } + // Create a separate options instance for reading config file values into. + store := *opt + + // Need deep copy the underlying slice types. + store.Branches = append(store.Branches, opt.Branches...) + // Attempt to read saved settings. - obs, err := os.ReadFile(filepath.Join(out, opt.name)) + bs, err := os.ReadFile(filepath.Join(out, opt.name)) if err != nil { log.Printf("unable to read config file: %v", err) } - // Create a separate options instance for reading config file values into. - // NOTE: Need dereference to safely copy. - cnf := *opt - // If a config file exists and an option has not been set, override default to match. - if err := json.Unmarshal(obs, &cnf); err != nil { + if err := json.Unmarshal(bs, &store); err != nil { log.Printf("unable to parse config file: %v", err) } @@ -114,21 +129,28 @@ func main() { flagset[f.Name] = true }) - ref := reflect.ValueOf(cnf) + ref := reflect.ValueOf(store) - // Log current settings. flag.VisitAll(func(f *flag.Flag) { + // Attempt to source settings from config file, then override flag defaults. if !flagset[f.Name] { - // Attempt to override default settings where necessary. v := ref.FieldByNameFunc(func(n string) bool { return strings.HasPrefix(strings.ToLower(n), f.Name) }) - // This has the nice side effect of magically overriding `opt` fields. - flag.Set(f.Name, v.String()) + // Don't ask. + if s, ok := v.Interface().(bflag); ok { + for _, b := range s { + flag.Set(f.Name, b) + } + } else { + // This has the welcome side effect of magically overriding `opt` fields. + flag.Set(f.Name, v.String()) + } } - log.Printf("%v/%v: %v\n", f.Name, f.Usage, f.Value) + // Log current settings. + log.Printf("%s/%s: %v\n", f.Name, f.Usage, f.Value) }) // The repo flag is required at this point. @@ -217,7 +239,7 @@ func setUpRepo(target string, opt *options) { } // TODO: implement! -func cleanUpBranches(branches string) []string { +func cleanUpBranches(branches bflag) []string { /* if test x"$BRANCHES" = x then
home › develop › de76620 › be6415b