wip
parent
b2a51e65b0
commit
97f2cb197f
79
cmd/edit.go
79
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
|
||||
}
|
||||
|
|
|
|||
27
cmd/main.go
27
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
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue