new edit ready for shuffles

Bel LaPointe 2022-03-23 07:49:54 -06:00
parent e8a83176aa
commit 8c050d1d89
3 changed files with 97 additions and 39 deletions

View File

@ -109,6 +109,55 @@ func verifyFile(path string) error {
} }
func edit(dry bool, filepaths []string) error { func edit(dry bool, filepaths []string) error {
tempDir, err := ioutil.TempDir(os.TempDir(), "edit-pttodo-*")
if err != nil {
return err
}
for _, target := range filepaths {
if b, err := ioutil.ReadFile(target); err != nil && !os.IsNotExist(err) {
return err
} else if err := ioutil.WriteFile(path.Join(tempDir, path.Base(target)), b, os.ModePerm); err != nil {
return err
}
}
if err := vimd(tempDir); err != nil {
return err
}
for _, target := range filepaths {
for {
err := verifyFile(path.Join(tempDir, path.Base(target)))
if err == nil {
break
}
log.Printf("%v, press <Enter> to resume editing", err)
b := make([]byte, 1)
if _, err := os.Stdin.Read(b); err != nil {
break
}
if err := vimd(tempDir); err != nil {
return err
}
}
}
if dry {
return nil
}
for _, target := range filepaths {
var todo pttodo.Root
if b, err := ioutil.ReadFile(path.Join(tempDir, path.Base(target))); err != nil {
return err
} else if err := yaml.Unmarshal(b, &todo); err != nil {
return err
} else if c, err := yaml.Marshal(todo); err != nil {
return err
} else if err := ioutil.WriteFile(target, c, os.ModePerm); err != nil {
return err
}
}
return nil
}
func _edit(dry bool, filepaths []string) error {
tempDir, err := ioutil.TempDir(os.TempDir(), "edit-pttodo") tempDir, err := ioutil.TempDir(os.TempDir(), "edit-pttodo")
if err != nil { if err != nil {
return err return err
@ -140,45 +189,7 @@ func edit(dry bool, filepaths []string) error {
return nil return nil
} }
vi := func() error { vi := func() error {
bin := "vim" return vimd(tempDir)
editorbin, err := exec.LookPath(bin)
if err != nil {
editorbin, err = exec.LookPath("vi")
}
if err != nil {
return err
}
args := []string{editorbin, "-p"}
tempfiles, err := listDir(tempDir)
if err != nil {
return err
}
args = append(args, tempfiles...)
cpid, err := syscall.ForkExec(
editorbin,
args,
&syscall.ProcAttr{
Dir: tempDir,
Env: os.Environ(),
Files: []uintptr{os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd()},
Sys: nil,
},
)
if err != nil {
return err
}
proc, err := os.FindProcess(cpid)
if err != nil {
return err
}
state, err := proc.Wait()
if err != nil {
return err
}
if exitCode := state.ExitCode(); exitCode != 0 {
return fmt.Errorf("bad exit code on vim: %d, state: %+v", exitCode, state)
}
return nil
} }
verifyOne := func(tempFile string) error { verifyOne := func(tempFile string) error {
for { for {
@ -248,6 +259,48 @@ func edit(dry bool, filepaths []string) error {
return nil return nil
} }
func vimd(d string) error {
bin := "vim"
editorbin, err := exec.LookPath(bin)
if err != nil {
editorbin, err = exec.LookPath("vi")
}
if err != nil {
return err
}
args := []string{editorbin, "-p"}
files, err := listDir(d)
if err != nil {
return err
}
args = append(args, files...)
cpid, err := syscall.ForkExec(
editorbin,
args,
&syscall.ProcAttr{
Dir: d,
Env: os.Environ(),
Files: []uintptr{os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd()},
Sys: nil,
},
)
if err != nil {
return err
}
proc, err := os.FindProcess(cpid)
if err != nil {
return err
}
state, err := proc.Wait()
if err != nil {
return err
}
if exitCode := state.ExitCode(); exitCode != 0 {
return fmt.Errorf("bad exit code on vim: %d, state: %+v", exitCode, state)
}
return nil
}
func merge(dry bool, filepath string, mergeTargetFilePath string) error { func merge(dry bool, filepath string, mergeTargetFilePath string) error {
baseReader, err := filePathReader(filepath) baseReader, err := filePathReader(filepath)
if err != nil { if err != nil {

Binary file not shown.

5
cmd/pttodo-cli/testdata/test.yaml vendored Executable file
View File

@ -0,0 +1,5 @@
todo:
- a
- a
scheduled: []
done: []