add -dedupe to move dupe TODO and SCHEDULED to DONE

This commit is contained in:
bel
2024-12-31 10:21:36 -07:00
parent 1413d02764
commit 45b2060083
5 changed files with 72 additions and 4 deletions

View File

@@ -7,6 +7,8 @@ import (
"log"
"os"
"slices"
"gitea.inhome.blapointe.com/gogs/pttodo/pttodo"
"gopkg.in/yaml.v2"
@@ -32,6 +34,8 @@ func _main() error {
return merge(&config)
} else if config.archive != "" {
return archive(&config)
} else if config.dedupe {
return dedupe(&config)
} else {
if err := add(&config); err != nil {
return err
@@ -43,6 +47,54 @@ func _main() error {
}
}
func dedupe(config *config) error {
baseReader, err := filePathReader(config.target)
if err != nil {
return err
}
baseB, err := ioutil.ReadAll(baseReader)
if err != nil {
return err
}
var base pttodo.Root
if err := yaml.Unmarshal(baseB, &base); err != nil {
return err
}
do := func(todos []pttodo.Todo) []pttodo.Todo {
i := len(todos) - 1
for i >= 0 {
j := slices.IndexFunc(todos, func(todo pttodo.Todo) bool {
return todo.Equals(todos[i])
})
if j >= 0 && j != i {
todos[j] = todos[i]
base.Done = append(base.Done, todos[j])
todos = todos[:i]
}
i -= 1
}
return todos
}
base.Todo = do(base.Todo)
base.Scheduled = do(base.Scheduled)
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 archive(config *config) error {
if config.archive == "" {
return nil