master
Bel LaPointe 2023-11-06 13:23:28 -07:00
parent b2a51e65b0
commit 97f2cb197f
3 changed files with 54 additions and 52 deletions

View File

@ -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
}

View File

@ -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
}