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"
)
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) {
length := len(params)
if length < 1 || length > 3 {
@ -124,9 +83,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 +104,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
}
}

View File

@ -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)

47
util.go
View File

@ -26,6 +26,7 @@ import (
"fmt"
"log"
"os"
"path"
"path/filepath"
"strings"
)
@ -47,6 +48,52 @@ func makeAbsPath(path string) string {
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 {
if nameParts := strings.Split(name, "__"); len(nameParts) > 1 {
variant = nameParts[len(nameParts)-1]