diff --git a/cmd/edit.go b/cmd/edit.go index 368484b..ed9f502 100644 --- a/cmd/edit.go +++ b/cmd/edit.go @@ -7,6 +7,8 @@ import ( "os" "os/exec" "path" + "sort" + "strings" "syscall" "time" @@ -23,38 +25,19 @@ func edit(config *config) error { } func _edit(filepaths []string) error { - tempDir, err := ioutil.TempDir(os.TempDir(), "edit-pttodo-*") + editableDir, err := inEditableDir(filepaths) if err != nil { return err } - originals := map[string]pttodo.Root{} - lastModified := map[string]time.Time{} - for _, target := range filepaths { - var original pttodo.Root - if r, err := filePathReader(target); err != nil { - return err - } else if err := yaml.NewDecoder(r).Decode(&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 info, _ := os.Stat(target); info != nil { - lastModified[target] = info.ModTime() - } else { - lastModified[target] = time.Time{} - } - } - if err := vimd(tempDir); err != nil { + if err := vimd(editableDir); err != nil { return err } + for _, target := range filepaths { for { err := func() error { var todos []pttodo.Todo - if r, err := filePathReader(path.Join(tempDir, path.Base(target))); err != nil { + if r, err := filePathReader(path.Join(editableDir, path.Base(target))); err != nil { return err } else if err := yaml.NewDecoder(r).Decode(&todos); err != nil { return err @@ -69,13 +52,13 @@ func _edit(filepaths []string) error { if _, err := os.Stdin.Read(b); err != nil { return err } - if err := vimd(tempDir); err != nil { + if err := vimd(editableDir); err != nil { return err } } } for _, target := range filepaths { - r, err := filePathReader(path.Join(tempDir, path.Base(target))) + r, err := filePathReader(path.Join(editableDir, path.Base(target))) if err != nil { return err } @@ -118,6 +101,28 @@ func _edit(filepaths []string) error { return nil } +func inEditableDir(filepaths []string) (string, error) { + tempDir, err := ioutil.TempDir(os.TempDir(), "edit-pttodo-*") + if err != nil { + return "", err + } + return tempDir, copyTodoToDir(tempDir, filepaths) +} + +func copyTodoToDir(d string, filepaths []string) error { + for _, target := range filepaths { + p := path.Join(d, path.Base(target)) + if root, err := pttodo.NewRootFromFile(target); err != nil { + return err + } else if b, err := yaml.Marshal(root.Todo); err != nil { + return err + } else if err := ioutil.WriteFile(p, b, os.ModePerm); err != nil { + return err + } + } + return nil +} + func vimd(d string) error { bin := "vim" editorbin, err := exec.LookPath(bin) @@ -159,3 +164,27 @@ func vimd(d string) error { } return nil } + +func listDir(dname string) ([]string, error) { + entries, err := os.ReadDir(dname) + if err != nil { + return nil, err + } + paths := make([]string, 0, len(entries)) + for i := range entries { + if entries[i].IsDir() { + continue + } + if strings.HasPrefix(path.Base(entries[i].Name()), ".") { + continue + } + paths = append(paths, path.Join(dname, entries[i].Name())) + } + sort.Slice(paths, func(i, j int) bool { + if path.Base(paths[i]) == "root.yaml" { + return true + } + return paths[i] < paths[j] + }) + return paths, nil +} diff --git a/cmd/main_test.go b/cmd/edit_test.go similarity index 100% rename from cmd/main_test.go rename to cmd/edit_test.go diff --git a/cmd/main.go b/cmd/main.go index b7dc725..b94964e 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -5,9 +5,6 @@ import ( "io" "io/ioutil" "os" - "path" - "sort" - "strings" "gogs.inhome.blapointe.com/bel/pttodo/pttodo" @@ -103,27 +100,3 @@ func filePathReader(path string) (io.Reader, error) { } return bytes.NewReader(b), nil } - -func listDir(dname string) ([]string, error) { - entries, err := os.ReadDir(dname) - if err != nil { - return nil, err - } - paths := make([]string, 0, len(entries)) - for i := range entries { - if entries[i].IsDir() { - continue - } - if strings.HasPrefix(path.Base(entries[i].Name()), ".") { - continue - } - paths = append(paths, path.Join(dname, entries[i].Name())) - } - sort.Slice(paths, func(i, j int) bool { - if path.Base(paths[i]) == "root.yaml" { - return true - } - return paths[i] < paths[j] - }) - return paths, nil -}