diff --git a/cmd/config.go b/cmd/config.go index d636d4a..4385a50 100644 --- a/cmd/config.go +++ b/cmd/config.go @@ -21,6 +21,7 @@ type config struct { addSchedule string addTags string dryRun bool + archive string } func getConfig() config { @@ -32,6 +33,7 @@ func getConfig() config { 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") diff --git a/cmd/main.go b/cmd/main.go index 9d79be2..3008245 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -30,6 +30,8 @@ func _main() error { if config.target2 != "" { return merge(&config) + } else if config.archive != "" { + return archive(&config) } else { if err := add(&config); err != nil { return err @@ -41,6 +43,60 @@ func _main() error { } } +func archive(config *config) error { + if config.archive == "" { + return nil + } + + baseReader, err := filePathReader(config.target) + if err != nil { + return err + } + baseB, err := ioutil.ReadAll(baseReader) + if err != nil { + return err + } + + archiveReader, err := filePathReader(config.archive) + if err != nil { + return err + } + archiveB, err := ioutil.ReadAll(archiveReader) + if err != nil { + return err + } + + var base, archive pttodo.Root + if err := yaml.Unmarshal(baseB, &base); err != nil { + return err + } + if err := yaml.Unmarshal(archiveB, &archive); err != nil { + return err + } + + archive.Done = append(archive.Done, base.Done...) + if tmppath2, err := marshalRootToTempFile(archive); err != nil { + return err + } else if config.dryRun { + } else if err := rename(tmppath2, config.archive); err != nil { + return err + } + + base.Done = base.Done[:0] + if tmppath, err := marshalRootToTempFile(base); err != nil { + return err + } else if config.dryRun { + log.Println("===before===") + _dump(os.Stdout, []string{config.target}, config.tags, config.search, config.root) + log.Println("===after===") + _dump(os.Stdout, []string{tmppath}, config.tags, config.search, config.root) + } else if err := rename(tmppath, config.target); err != nil { + return err + } + + return nil +} + func merge(config *config) error { if config.target2 == "" { return nil