package main import ( "flag" "fmt" "os" "path" "path/filepath" "sort" "strings" ) type config struct { target string target2 string root string tags []string search string edit bool add string addSchedule string addTags string dryRun bool archive string dedupe bool } func getConfig() config { defaultFilepath := os.Getenv("PTTODO_FILE") if defaultFilepath == "" { defaultFilepath = "./todo.yaml" } var config config flag.StringVar(&config.target, "f", defaultFilepath, "($PTTODO_FILE) path to yaml file or dir (starting with root then alphabetical for dir)") flag.StringVar(&config.target2, "g", "", "path to yaml file to merge into root of -f") flag.StringVar(&config.archive, "archive", "", "path to yaml file to migrate done") flag.StringVar(&config.root, "root", DUMP_TODO, "path to pretty print ("+fmt.Sprint([]string{DUMP_ALL, DUMP_TODO, DUMP_SCHEDULED, DUMP_DONE})+")") var tagss string flag.StringVar(&tagss, "tags", "", "csv of all tags to find, -x to invert") flag.StringVar(&config.search, "search", "", "fts case insensitive") flag.BoolVar(&config.edit, "e", false, "edit file") flag.BoolVar(&config.dedupe, "dedupe", false, "dedupe file") flag.BoolVar(&config.dryRun, "dry-run", false, "dry run") flag.StringVar(&config.add, "add", "", "todo to add") flag.StringVar(&config.addSchedule, "add-schedule", "", "todo to add schedule") flag.StringVar(&config.addTags, "add-tags", "", "todo to add csv tags") flag.Parse() config.tags = strings.Split(tagss, ",") config.Targets() return config } func (config config) Targets() []string { result, err := config.targets() if err != nil { panic(err) } sort.Strings(result) for i := range result { if path.Base(result[i]) == "root.yaml" { newresult := append([]string{result[i]}, result[:i]...) newresult = append(newresult, result[i+1:]...) result = newresult break } } return result } func (config config) targets() ([]string, error) { patterns := []string{config.target, fmt.Sprintf("%s.*", config.target)} isDir := false if stat, err := os.Stat(config.target); err == nil { isDir = stat.IsDir() } if isDir { patterns = []string{fmt.Sprintf("%s/*", config.target)} } result := make([]string, 0, 1) for _, pattern := range patterns { results, err := filepath.Glob(pattern) if err != nil { return nil, err } for i := range results { if stat, err := os.Stat(results[i]); err != nil { return nil, err } else if stat.IsDir() { } else if strings.HasPrefix(path.Base(results[i]), ".") && isDir { } else { result = append(result, results[i]) } } } if len(result) == 0 { if isDir { return []string{path.Join(config.target, "root.yaml")}, nil } return []string{config.target}, nil } return result, nil }