Merge pull request #32 from albertdev/bugfix/rework-clobber-prompt

Continue to next file / task when pressing 'n' at clobber prompt
This commit is contained in:
Alex Yatskov 2021-12-14 14:17:39 -08:00 committed by GitHub
commit ddbd7c428a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 59 additions and 44 deletions

50
link.go
View File

@ -30,47 +30,6 @@ import (
"strconv" "strconv"
) )
func cleanPath(loc string, flags int) error {
if info, _ := os.Lstat(loc); info != nil {
if info.Mode()&os.ModeSymlink == 0 {
if flags&flagClobber != 0 || prompt("clobber path", loc) {
if flags&flagVerbose != 0 {
log.Printf("clobbering path: %s", loc)
}
if err := os.RemoveAll(loc); err != nil {
return err
}
}
} else {
if flags&flagVerbose != 0 {
log.Printf("removing symlink: %s", loc)
}
if err := os.Remove(loc); err != nil {
return err
}
}
}
return nil
}
func createPath(loc string, flags int, mode os.FileMode) error {
parentDir := path.Dir(loc)
if _, err := os.Stat(parentDir); os.IsNotExist(err) {
if flags&flagForce != 0 || prompt("force create path", parentDir) {
if flags&flagVerbose != 0 {
log.Printf("force creating path: %s", parentDir)
}
if err := os.MkdirAll(parentDir, mode); err != nil {
return err
}
}
}
return nil
}
func parseLink(params []string) (srcPath, dstPath string, mode os.FileMode, err error) { func parseLink(params []string) (srcPath, dstPath string, mode os.FileMode, err error) {
length := len(params) length := len(params)
if length < 1 || length > 3 { if length < 1 || length > 3 {
@ -124,9 +83,13 @@ func processLink(params []string, conf *config) error {
return err 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 return err
} }
if !pathCleaned {
return nil
}
if conf.flags&flagVerbose != 0 { if conf.flags&flagVerbose != 0 {
log.Printf("linking %s to %s", srcPathAbs, dstPathAbs) log.Printf("linking %s to %s", srcPathAbs, dstPathAbs)
@ -141,6 +104,7 @@ func processLink(params []string, conf *config) error {
return nil return nil
} }
return try(func() error { return cleanPath(dstPathAbs, conf.flags) }) _, err = cleanPath(dstPathAbs, conf.flags)
return err
} }
} }

View File

@ -96,9 +96,13 @@ func processTemplate(params []string, conf *config) (err error) {
return err 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 return err
} }
if !pathCleaned {
return nil
}
if conf.flags&flagVerbose != 0 { if conf.flags&flagVerbose != 0 {
log.Printf("process template %s to %s", srcPathAbs, dstPathAbs) log.Printf("process template %s to %s", srcPathAbs, dstPathAbs)

47
util.go
View File

@ -26,6 +26,7 @@ import (
"fmt" "fmt"
"log" "log"
"os" "os"
"path"
"path/filepath" "path/filepath"
"strings" "strings"
) )
@ -47,6 +48,52 @@ func makeAbsPath(path string) string {
return path return path
} }
func cleanPath(loc string, flags int) (bool, error) {
if info, _ := os.Lstat(loc); info != nil {
if info.Mode()&os.ModeSymlink == 0 {
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 := 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 := try(func() error { return os.Remove(loc) }); err != nil {
return false, err
}
}
}
return true, nil
}
func createPath(loc string, flags int, mode os.FileMode) error {
parentDir := path.Dir(loc)
if _, err := os.Stat(parentDir); os.IsNotExist(err) {
if flags&flagForce != 0 || prompt("force create path", parentDir) {
if flags&flagVerbose != 0 {
log.Printf("force creating path: %s", parentDir)
}
if err := os.MkdirAll(parentDir, mode); err != nil {
return err
}
}
}
return nil
}
func makeVariantNames(name, variant string) []string { func makeVariantNames(name, variant string) []string {
if nameParts := strings.Split(name, "__"); len(nameParts) > 1 { if nameParts := strings.Split(name, "__"); len(nameParts) > 1 {
variant = nameParts[len(nameParts)-1] variant = nameParts[len(nameParts)-1]