add cli -g to merge in a file
parent
cd5ce0f0df
commit
bf10c00708
|
|
@ -36,12 +36,18 @@ func _main() error {
|
||||||
defaultFilepath = "-"
|
defaultFilepath = "-"
|
||||||
}
|
}
|
||||||
filepath := flag.String("f", defaultFilepath, "($PTTODO_FILE) path to yaml file")
|
filepath := flag.String("f", defaultFilepath, "($PTTODO_FILE) path to yaml file")
|
||||||
|
filepathToMergeIn := flag.String("g", "", "path to yaml file to merge into -f")
|
||||||
root := flag.String("root", DUMP_TODO, "path to pretty print ("+fmt.Sprint([]string{DUMP_ALL, DUMP_TODO, DUMP_SCHEDULED, DUMP_DONE})+")")
|
root := flag.String("root", DUMP_TODO, "path to pretty print ("+fmt.Sprint([]string{DUMP_ALL, DUMP_TODO, DUMP_SCHEDULED, DUMP_DONE})+")")
|
||||||
tags := flag.String("tags", "", "csv of all tags to find")
|
tags := flag.String("tags", "", "csv of all tags to find")
|
||||||
search := flag.String("search", "", "fts case insensitive")
|
search := flag.String("search", "", "fts case insensitive")
|
||||||
e := flag.Bool("e", false, "edit file")
|
e := flag.Bool("e", false, "edit file")
|
||||||
dry := flag.Bool("dry", false, "dry run")
|
dry := flag.Bool("dry", false, "dry run")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
if *filepathToMergeIn != "" {
|
||||||
|
if err := merge(*dry, *filepath, *filepathToMergeIn); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
if *e {
|
if *e {
|
||||||
if err := edit(*dry, *filepath); err != nil {
|
if err := edit(*dry, *filepath); err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -54,6 +60,28 @@ func _main() error {
|
||||||
return dump(*dry, os.Stdout, *filepath, tagslist, *search, *root)
|
return dump(*dry, os.Stdout, *filepath, tagslist, *search, *root)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func verifyRoot(root pttodo.Root) error {
|
||||||
|
f, err := ioutil.TempFile(os.TempDir(), "tmp")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
f.Close()
|
||||||
|
tempFile := f.Name()
|
||||||
|
b, err := yaml.Marshal(root)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := ioutil.WriteFile(tempFile, b, os.ModePerm); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer os.Remove(tempFile)
|
||||||
|
return verifyFile(tempFile)
|
||||||
|
}
|
||||||
|
|
||||||
|
func verifyFile(path string) error {
|
||||||
|
return dump(true, io.Discard, path, nil, "", DUMP_ALL)
|
||||||
|
}
|
||||||
|
|
||||||
func edit(dry bool, filepath string) error {
|
func edit(dry bool, filepath string) error {
|
||||||
var tempFile string
|
var tempFile string
|
||||||
cp := func() error {
|
cp := func() error {
|
||||||
|
|
@ -115,10 +143,7 @@ func edit(dry bool, filepath string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
verify := func() error {
|
verify := func() error {
|
||||||
if err := dump(true, io.Discard, tempFile, nil, "", DUMP_ALL); err != nil {
|
return verifyFile(tempFile)
|
||||||
return fmt.Errorf("failed to verify %s: %v", tempFile, err)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
save := func() error {
|
save := func() error {
|
||||||
if dry {
|
if dry {
|
||||||
|
|
@ -140,16 +165,69 @@ func edit(dry bool, filepath string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func merge(dry bool, filepath string, mergeTargetFilePath string) error {
|
||||||
|
baseReader, err := filePathReader(filepath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
baseB, err := ioutil.ReadAll(baseReader)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
mergingReader, err := filePathReader(mergeTargetFilePath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
mergingB, err := ioutil.ReadAll(mergingReader)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var base, merging pttodo.Root
|
||||||
|
if err := yaml.Unmarshal(baseB, &base); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := yaml.Unmarshal(mergingB, &merging); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
base.MergeIn(merging)
|
||||||
|
|
||||||
|
if err := verifyRoot(base); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
tmppath, err := marshalRootToTempFile(base)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if dry {
|
||||||
|
log.Printf("would've moved %s to %s when adding %s", tmppath, filepath, mergeTargetFilePath)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return os.Rename(tmppath, filepath)
|
||||||
|
}
|
||||||
|
|
||||||
|
func marshalRootToTempFile(root pttodo.Root) (string, error) {
|
||||||
|
f, err := ioutil.TempFile(os.TempDir(), "tmp")
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
f.Close()
|
||||||
|
os.Remove(f.Name())
|
||||||
|
b, err := yaml.Marshal(root)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
filepath := f.Name() + ".yaml"
|
||||||
|
err = ioutil.WriteFile(filepath, b, os.ModePerm)
|
||||||
|
return filepath, err
|
||||||
|
}
|
||||||
|
|
||||||
func dump(dry bool, writer io.Writer, filepath string, tags []string, search, rootDisplay string) error {
|
func dump(dry bool, writer io.Writer, filepath string, tags []string, search, rootDisplay string) error {
|
||||||
var reader io.Reader
|
reader, err := filePathReader(filepath)
|
||||||
if filepath == "-" {
|
if err != nil {
|
||||||
reader = os.Stdin
|
return err
|
||||||
} else {
|
|
||||||
b, err := ioutil.ReadFile(filepath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
reader = bytes.NewReader(b)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
b, err := ioutil.ReadAll(reader)
|
b, err := ioutil.ReadAll(reader)
|
||||||
|
|
@ -214,3 +292,17 @@ func dump(dry bool, writer io.Writer, filepath string, tags []string, search, ro
|
||||||
}
|
}
|
||||||
return os.WriteFile(filepath, b3, os.ModePerm)
|
return os.WriteFile(filepath, b3, os.ModePerm)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func filePathReader(path string) (io.Reader, error) {
|
||||||
|
var reader io.Reader
|
||||||
|
if path == "-" {
|
||||||
|
reader = os.Stdin
|
||||||
|
} else {
|
||||||
|
b, err := ioutil.ReadFile(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
reader = bytes.NewReader(b)
|
||||||
|
}
|
||||||
|
return reader, nil
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue