wipper on edit.go

master
bel 2023-11-06 20:49:08 -07:00
parent caa9f9d6fd
commit 3549010ab4
1 changed files with 36 additions and 26 deletions

View File

@ -25,39 +25,32 @@ func edit(config *config) error {
}
func _edit(filepaths func() []string) error {
editableDir, err := inEditableDir(filepaths())
editableDir, err := inEditableDirAsTodos(filepaths())
if err != nil {
return err
}
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(editableDir, path.Base(target))); err != nil {
return err
} else if err := yaml.NewDecoder(r).Decode(&todos); err != nil {
return err
}
return nil
}()
if err == nil {
break
}
log.Printf("%s, press <Enter> to resume editing", err)
b := make([]byte, 1)
if _, err := os.Stdin.Read(b); err != nil {
return err
}
if err := vimd(editableDir); err != nil {
if err := modifyEditableDir(editableDir, func() error {
files, err := listDir(editableDir)
if err != nil {
return err
}
for _, p := range files {
if _, err := pttodo.NewTodosFromFile(p); err != nil {
return err
}
}
return nil
}); err != nil {
return err
}
for _, target := range filepaths() {
editedFiles, err := listDir(editableDir)
if err != nil {
return err
}
for _, target := range editedFiles {
r, err := filePathReader(path.Join(editableDir, path.Base(target)))
if err != nil {
return err
@ -101,7 +94,7 @@ func _edit(filepaths func() []string) error {
return nil
}
func inEditableDir(filepaths []string) (string, error) {
func inEditableDirAsTodos(filepaths []string) (string, error) {
tempDir, err := ioutil.TempDir(os.TempDir(), "edit-pttodo-*")
if err != nil {
return "", err
@ -148,6 +141,23 @@ func copyTodoToDir(d string, filepaths []string) error {
return nil
}
func modifyEditableDir(d string, check func() error) error {
for {
if err := vimd(d); err != nil {
return err
}
err := check()
if err == nil {
return nil
}
log.Printf("%s, press <Enter> to resume editing", err)
b := make([]byte, 1)
if _, err := os.Stdin.Read(b); err != nil {
return err
}
}
}
func vimd(d string) error {
bin := "vim"
editorbin, err := exec.LookPath(bin)