untested refacotor of edit.go
parent
fe8595cc68
commit
0329b9690c
76
cmd/edit.go
76
cmd/edit.go
|
|
@ -12,7 +12,6 @@ import (
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/google/uuid"
|
|
||||||
"gogs.inhome.blapointe.com/bel/pttodo/pttodo"
|
"gogs.inhome.blapointe.com/bel/pttodo/pttodo"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
)
|
)
|
||||||
|
|
@ -50,50 +49,67 @@ func _edit(filepaths func() []string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// remove original files
|
edits := map[string]string{}
|
||||||
// merge original files
|
for _, editedFile := range editedFiles {
|
||||||
// move new files in
|
edits[path.Base(editedFile)] = editedFile
|
||||||
for _, target := range editedFiles {
|
originalFile := func() string {
|
||||||
r, err := filePathReader(path.Join(editableDir, path.Base(target)))
|
for _, f := range filepaths() {
|
||||||
|
if path.Base(f) == path.Base(editedFile) {
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
}
|
||||||
|
panic("how?")
|
||||||
|
}()
|
||||||
|
|
||||||
|
edited, err := pttodo.NewTodosFromFile(editedFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
var newTodos []pttodo.Todo
|
original, err := pttodo.NewRootFromFile(originalFile)
|
||||||
if err := yaml.NewDecoder(r).Decode(&newTodos); err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
original := originals[target]
|
|
||||||
|
|
||||||
newTodoIDs := map[string]struct{}{}
|
editedIDs := map[string]int{}
|
||||||
for i := range newTodos {
|
for i := range edited {
|
||||||
newTodoIDs[newTodos[i].ID()] = struct{}{}
|
editedIDs[edited[i].ID()] = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := range original.Todo {
|
for i := range original.Todo {
|
||||||
if _, ok := newTodoIDs[original.Todo[i].ID()]; !ok {
|
if _, ok := editedIDs[original.Todo[i].ID()]; ok {
|
||||||
original.Todo[i].TS = pttodo.TS(time.Now().Unix())
|
continue
|
||||||
if string(original.Todo[i].Schedule) != "" && !original.Todo[i].Triggered() {
|
|
||||||
original.Scheduled = append(original.Scheduled, original.Todo[i])
|
|
||||||
}
|
|
||||||
original.Done = append(original.Done, original.Todo[i])
|
|
||||||
}
|
}
|
||||||
|
original.Todo[i].TS = pttodo.TS(time.Now().Unix())
|
||||||
|
if string(original.Todo[i].Schedule) != "" && !original.Todo[i].Triggered() {
|
||||||
|
original.Scheduled = append(original.Scheduled, original.Todo[i])
|
||||||
|
}
|
||||||
|
original.Done = append(original.Done, original.Todo[i])
|
||||||
}
|
}
|
||||||
original.Todo = newTodos
|
original.Todo = edited
|
||||||
|
|
||||||
original.AutoMove()
|
original.AutoMove()
|
||||||
|
|
||||||
c, err := yaml.Marshal(original)
|
if err := func() error {
|
||||||
if err != nil {
|
f, err := os.Create(editedFile)
|
||||||
return err
|
if err != nil {
|
||||||
}
|
return err
|
||||||
outputPath := target
|
}
|
||||||
if info, _ := os.Stat(target); info != nil && info.ModTime() != lastModified[target] {
|
defer f.Close()
|
||||||
outputPath = fmt.Sprintf("%s.%s.%s", outputPath, uuid.New().String(), path.Ext(outputPath))
|
|
||||||
}
|
return yaml.NewEncoder(f).Encode(original)
|
||||||
if err := ioutil.WriteFile(outputPath, c, os.ModePerm); err != nil {
|
}(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, f := range filepaths() {
|
||||||
|
if edited, ok := edits[path.Base(f)]; ok {
|
||||||
|
if err := os.Rename(edited, f); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else if err := os.Remove(f); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue