diff --git a/mmv.go b/mmv.go index d5fc829..42dfbae 100644 --- a/mmv.go +++ b/mmv.go @@ -13,8 +13,16 @@ func Rename(files map[string]string) error { if err != nil { return err } - for _, r := range rs { + for i, r := range rs { if err := doRename(r.src, r.dst); err != nil { + // undo on error not to leave the temporary files + // this does not undo directory creation + for i--; i >= 0; i-- { + if r = rs[i]; os.Rename(r.dst, r.src) != nil { + // something wrong happens so give up not to overwrite files + break + } + } return err } } diff --git a/mmv_test.go b/mmv_test.go index 862e659..b41e300 100644 --- a/mmv_test.go +++ b/mmv_test.go @@ -254,6 +254,30 @@ func TestRename(t *testing.T) { }, err: "duplicate destination: foo", }, + { + name: "undo on error", + files: map[string]string{ + "foo": "bar", + "bar": "foo", + "baz": "qux", + "qux": "quux", + "quux": "baz", + }, + count: 7, + contents: map[string]string{ + "foo": "0", + "bar": "1", + "baz": "2", + "qux": "3", + }, + expected: map[string]string{ + "foo": "0", + "bar": "1", + "baz": "2", + "qux": "3", + }, + err: "quux: ", // no such file or directory + }, { name: "create destination directory", files: map[string]string{