From 0ba821eb7ee58c7895c99b7c7a0900edc324b96e Mon Sep 17 00:00:00 2001 From: Bert Jacobs Date: Mon, 13 Sep 2021 18:23:39 +0200 Subject: [PATCH] Pass result of "clobber path" prompt to caller, stop task The end user would be prompted if a file is going to be overwritten, but homemaker would still attempt to do so no matter the answer. Move the retry-functionality of cleanPath inside this function so that the function itself can return a boolean to indicate if the calling task is free to continue. If the path is not clean then homemaker can just move on to the next file or next task. --- link.go | 30 ++++++++++++++++++++---------- template.go | 6 +++++- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/link.go b/link.go index 35f4979..aae10e6 100644 --- a/link.go +++ b/link.go @@ -30,28 +30,33 @@ import ( "strconv" ) -func cleanPath(loc string, flags int) error { +func cleanPath(loc string, flags int) (bool, error) { if info, _ := os.Lstat(loc); info != nil { if info.Mode()&os.ModeSymlink == 0 { - if flags&flagClobber != 0 || prompt("clobber path", loc) { + shouldContinue := false + if flags&flagClobber == 0 { + shouldContinue = prompt("clobber path", loc) + } + if flags&flagClobber != 0 || shouldContinue { if flags&flagVerbose != 0 { log.Printf("clobbering path: %s", loc) } - if err := os.RemoveAll(loc); err != nil { - return err + if err := try(func() error { return os.RemoveAll(loc) }) ; err != nil { + return false, err } + } else { + return false, nil } } else { if flags&flagVerbose != 0 { log.Printf("removing symlink: %s", loc) } - if err := os.Remove(loc); err != nil { - return err + if err := try(func() error { return os.Remove(loc) }); err != nil { + return false, err } } } - - return nil + return true, nil } func createPath(loc string, flags int, mode os.FileMode) error { @@ -124,9 +129,13 @@ func processLink(params []string, conf *config) error { return err } - if err := try(func() error { return cleanPath(dstPathAbs, conf.flags) }); err != nil { + pathCleaned, err := cleanPath(dstPathAbs, conf.flags) + if err != nil { return err } + if !pathCleaned { + return nil + } if conf.flags&flagVerbose != 0 { log.Printf("linking %s to %s", srcPathAbs, dstPathAbs) @@ -141,6 +150,7 @@ func processLink(params []string, conf *config) error { return nil } - return try(func() error { return cleanPath(dstPathAbs, conf.flags) }) + _, err = cleanPath(dstPathAbs, conf.flags) + return err } } diff --git a/template.go b/template.go index 002386f..a0d0b84 100644 --- a/template.go +++ b/template.go @@ -96,9 +96,13 @@ func processTemplate(params []string, conf *config) (err error) { return err } - if err = try(func() error { return cleanPath(dstPathAbs, conf.flags) }); err != nil { + pathCleaned, err := cleanPath(dstPathAbs, conf.flags) + if err != nil { return err } + if !pathCleaned { + return nil + } if conf.flags&flagVerbose != 0 { log.Printf("process template %s to %s", srcPathAbs, dstPathAbs)