From 5d1136abfe210bc6e5a75e6029a23d85525a13d9 Mon Sep 17 00:00:00 2001 From: Gokcehan Date: Wed, 17 Jun 2020 05:17:00 +0300 Subject: [PATCH] keep the destination file before rename Related #343 --- eval.go | 20 +++++++++++++++----- nav.go | 15 +++++---------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/eval.go b/eval.go index c496a2c..26ddc2d 100644 --- a/eval.go +++ b/eval.go @@ -1116,12 +1116,16 @@ func (e *callExpr) eval(app *app, args []string) { log.Printf("getting current directory: %s", err) return } - oldPathTo := filepath.Join(wd, curr.Name()) - newPathTo := filepath.Join(wd, s) - if oldPathTo == newPathTo { + + oldPath := filepath.Join(wd, curr.Name()) + newPath := filepath.Join(wd, s) + + if oldPath == newPath { return } - app.nav.renameCache = []string{oldPathTo, newPathTo} + + app.nav.renameOldPath = oldPath + app.nav.renameNewPath = newPath if dir, _ := filepath.Split(s); dir != "" { if _, err := os.Stat(filepath.Join(wd, dir)); err != nil { @@ -1130,7 +1134,13 @@ func (e *callExpr) eval(app *app, args []string) { } } - if _, err := os.Stat(newPathTo); err == nil { // file exists + oldStat, err := os.Stat(oldPath) + if err != nil { + app.ui.echoerrf("rename: %s", err) + return + } + + if newStat, err := os.Stat(newPath); !os.IsNotExist(err) && !os.SameFile(oldStat, newStat) { app.ui.cmdPrefix = "replace " + s + "?[y/N]" return } diff --git a/nav.go b/nav.go index 898d6a4..87f44c0 100644 --- a/nav.go +++ b/nav.go @@ -270,7 +270,8 @@ type nav struct { regCache map[string]*reg saves map[string]bool marks map[string]string - renameCache []string + renameOldPath string + renameNewPath string selections map[string]int selectionInd int height int @@ -359,7 +360,6 @@ func newNav(height int) *nav { regCache: make(map[string]*reg), saves: make(map[string]bool), marks: make(map[string]string), - renameCache: make([]string, 2), selections: make(map[string]int), selectionInd: 0, height: height, @@ -824,17 +824,12 @@ func (nav *nav) del(ui *ui) error { } func (nav *nav) rename() error { - oldPath := nav.renameCache[0] - newPath := nav.renameCache[1] + oldPath := nav.renameOldPath + newPath := nav.renameNewPath + dir, _ := filepath.Split(newPath) os.MkdirAll(dir, os.ModePerm) - if _, err := os.Stat(newPath); err == nil { // file exists - if err := os.Remove(newPath); err != nil { - return err - } - } - if err := os.Rename(oldPath, newPath); err != nil { return err }