diff --git a/cmd/pttodo-cli/cli.go b/cmd/pttodo-cli/cli.go index b240b6e..dae7d4b 100644 --- a/cmd/pttodo-cli/cli.go +++ b/cmd/pttodo-cli/cli.go @@ -113,26 +113,41 @@ func edit(dry bool, filepaths []string) error { if err != nil { return err } + originals := map[string]pttodo.Root{} for _, target := range filepaths { + var original pttodo.Root if b, err := ioutil.ReadFile(target); err != nil && !os.IsNotExist(err) { return err - } else if err := ioutil.WriteFile(path.Join(tempDir, path.Base(target)), b, os.ModePerm); err != nil { + } else if err := yaml.Unmarshal(b, &original); err != nil { + return err + } else if c, err := yaml.Marshal(original.Todo); err != nil { + return err + } else if err := ioutil.WriteFile(path.Join(tempDir, path.Base(target)), c, os.ModePerm); err != nil { return err } + originals[target] = original } if err := vimd(tempDir); err != nil { return err } for _, target := range filepaths { for { - err := verifyFile(path.Join(tempDir, path.Base(target))) + err := func() error { + var todos []pttodo.Todo + if b, err := ioutil.ReadFile(path.Join(tempDir, path.Base(target))); err != nil { + return err + } else if err := yaml.Unmarshal(b, &todos); err != nil { + return err + } + return nil + }() if err == nil { break } - log.Printf("%v, press to resume editing", err) + log.Printf("%s, press to resume editing", err) b := make([]byte, 1) if _, err := os.Stdin.Read(b); err != nil { - break + return err } if err := vimd(tempDir); err != nil { return err @@ -143,12 +158,13 @@ func edit(dry bool, filepaths []string) error { return nil } for _, target := range filepaths { - var todo pttodo.Root + original := originals[target] if b, err := ioutil.ReadFile(path.Join(tempDir, path.Base(target))); err != nil { return err - } else if err := yaml.Unmarshal(b, &todo); err != nil { + } else if err := yaml.Unmarshal(b, &original.Todo); err != nil { return err - } else if c, err := yaml.Marshal(todo); err != nil { + } else if original.AutoMove(); false { + } else if c, err := yaml.Marshal(original); err != nil { return err } else if err := ioutil.WriteFile(target, c, os.ModePerm); err != nil { return err diff --git a/cmd/pttodo-cli/testdata/test.yaml b/cmd/pttodo-cli/testdata/test.yaml index 783b309..f5aa0e0 100755 --- a/cmd/pttodo-cli/testdata/test.yaml +++ b/cmd/pttodo-cli/testdata/test.yaml @@ -1,5 +1,12 @@ todo: - a +- b - a -scheduled: [] +scheduled: +- todo: abc + schedule: "2022-05-01" + ts: Wed Mar 23 08:03:45 MDT 2022 +- todo: def + schedule: "2022-05-01" + ts: Wed Mar 23 08:04:05 MDT 2022 done: [] diff --git a/pttodo/root.go b/pttodo/root.go index a4b2723..0059958 100644 --- a/pttodo/root.go +++ b/pttodo/root.go @@ -20,6 +20,23 @@ func (root Root) Equals(other Root) bool { return true } +func (root *Root) AutoMove() { + root.MoveScheduledToTodo() + root.MoveTodoToScheduled() +} + +func (root *Root) MoveTodoToScheduled() { + for i := len(root.Todo) - 1; i >= 0; i-- { + if root.Todo[i].Schedule != "" && !root.Todo[i].Triggered() { + root.Scheduled = append(root.Scheduled, root.Todo[i]) + for j := i; j < len(root.Todo)-1; j++ { + root.Todo[j] = root.Todo[j+1] + } + root.Todo = root.Todo[:len(root.Todo)-1] + } + } +} + func (root *Root) MoveScheduledToTodo() { for i := len(root.Scheduled) - 1; i >= 0; i-- { if root.Scheduled[i].Triggered() {