diff --git a/cmd/edit.go b/cmd/edit.go index 1963fa3..4ee1012 100644 --- a/cmd/edit.go +++ b/cmd/edit.go @@ -12,6 +12,7 @@ import ( "syscall" "time" + "github.com/google/uuid" "gogs.inhome.blapointe.com/bel/pttodo/pttodo" "gopkg.in/yaml.v2" ) @@ -50,28 +51,21 @@ func _edit(filepaths func() []string) error { } edits := map[string]string{} - originals := map[string]string{} for _, editedFile := range editedFiles { edits[path.Base(editedFile)] = editedFile - originalFile := func() string { - last := "" - for _, f := range filepaths() { - if path.Base(f) == path.Base(editedFile) { - return f - } - last = f - } - if last != "" { - return path.Join(path.Dir(last), path.Base(editedFile)) - } - panic("how?") - }() edited, err := pttodo.NewTodosFromFile(editedFile) if err != nil { return err } - original, err := pttodo.NewRootFromFile(originalFile) + original, err := pttodo.NewRootFromFile(func() string { + for _, f := range filepaths() { + if path.Base(f) == path.Base(editedFile) { + return f + } + } + return "/dev/null" + }()) if err != nil { return err } @@ -94,8 +88,6 @@ func _edit(filepaths func() []string) error { original.AutoMove() if err := func() error { - originals[path.Base(editedFile)] = originalFile - f, err := os.Create(editedFile) if err != nil { return err @@ -108,14 +100,27 @@ func _edit(filepaths func() []string) error { } } - for _, f := range originals { + dir := "" + for _, f := range filepaths() { if edited, ok := edits[path.Base(f)]; ok { if err := os.Rename(edited, f); err != nil { return err } + delete(edits, path.Base(f)) } else if err := os.Remove(f); err != nil { return err } + dir = path.Dir(f) + } + + for base, editedFile := range edits { + f := path.Join(dir, base) + if _, err := os.Stat(f); err == nil { + f = fmt.Sprintf("%s.todo.%s", f, uuid.New().String()) + } + if err := os.Rename(editedFile, f); err != nil { + return err + } } return nil