From ac672113f282dc7d11cc4153d4d8b8b4708a8f82 Mon Sep 17 00:00:00 2001 From: itchyny Date: Wed, 8 Jan 2020 11:10:27 +0900 Subject: [PATCH] check same source path after clean --- mmv.go | 11 +++++++++++ mmv_test.go | 12 ++++++++++++ 2 files changed, 23 insertions(+) diff --git a/mmv.go b/mmv.go index 4f12baf..58b58bd 100644 --- a/mmv.go +++ b/mmv.go @@ -31,6 +31,14 @@ func (err *emptyPathError) Error() string { return "empty path error" } +type sameSourceError struct { + path string +} + +func (err *sameSourceError) Error() string { + return fmt.Sprintf("duplicate source: %s", err.path) +} + type sameDestinationError struct { path string } @@ -57,6 +65,9 @@ func buildRenames(files map[string]string) ([]rename, error) { if d := filepath.Clean(src); d != src { delete(files, src) src = d + if _, ok := files[src]; ok { + return nil, &sameSourceError{src} + } files[src] = dst } if d := filepath.Clean(dst); d != dst { diff --git a/mmv_test.go b/mmv_test.go index dba53cb..aab201a 100644 --- a/mmv_test.go +++ b/mmv_test.go @@ -186,6 +186,18 @@ func TestRename(t *testing.T) { "foo": "1", }, }, + { + name: "cleaned path same source error", + files: map[string]string{ + "foo": "baz", + "bar/../foo": "bar", + }, + contents: map[string]string{ + "foo": "0", + "bar": "1", + }, + err: &sameSourceError{"foo"}, + }, { name: "cleaned path same destination error", files: map[string]string{