wip
parent
b2a51e65b0
commit
97f2cb197f
79
cmd/edit.go
79
cmd/edit.go
|
|
@ -7,6 +7,8 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path"
|
"path"
|
||||||
|
"sort"
|
||||||
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
|
@ -23,38 +25,19 @@ func edit(config *config) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func _edit(filepaths []string) error {
|
func _edit(filepaths []string) error {
|
||||||
tempDir, err := ioutil.TempDir(os.TempDir(), "edit-pttodo-*")
|
editableDir, err := inEditableDir(filepaths)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
originals := map[string]pttodo.Root{}
|
if err := vimd(editableDir); err != nil {
|
||||||
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 {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, target := range filepaths {
|
for _, target := range filepaths {
|
||||||
for {
|
for {
|
||||||
err := func() error {
|
err := func() error {
|
||||||
var todos []pttodo.Todo
|
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
|
return err
|
||||||
} else if err := yaml.NewDecoder(r).Decode(&todos); err != nil {
|
} else if err := yaml.NewDecoder(r).Decode(&todos); err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -69,13 +52,13 @@ func _edit(filepaths []string) error {
|
||||||
if _, err := os.Stdin.Read(b); err != nil {
|
if _, err := os.Stdin.Read(b); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := vimd(tempDir); err != nil {
|
if err := vimd(editableDir); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, target := range filepaths {
|
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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -118,6 +101,28 @@ func _edit(filepaths []string) error {
|
||||||
return nil
|
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 {
|
func vimd(d string) error {
|
||||||
bin := "vim"
|
bin := "vim"
|
||||||
editorbin, err := exec.LookPath(bin)
|
editorbin, err := exec.LookPath(bin)
|
||||||
|
|
@ -159,3 +164,27 @@ func vimd(d string) error {
|
||||||
}
|
}
|
||||||
return nil
|
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"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
|
||||||
"sort"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"gogs.inhome.blapointe.com/bel/pttodo/pttodo"
|
"gogs.inhome.blapointe.com/bel/pttodo/pttodo"
|
||||||
|
|
||||||
|
|
@ -103,27 +100,3 @@ func filePathReader(path string) (io.Reader, error) {
|
||||||
}
|
}
|
||||||
return bytes.NewReader(b), nil
|
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