--- a/mercurial/commands.py Tue Nov 08 10:35:09 2005 -0800
+++ b/mercurial/commands.py Tue Nov 08 10:35:13 2005 -0800
@@ -790,6 +790,7 @@
cwd = repo.getcwd()
errors = 0
copied = []
+ targets = {}
def okaytocopy(abs, rel, exact):
reasons = {'?': _('is not managed'),
@@ -803,7 +804,12 @@
def copy(abssrc, relsrc, target, exact):
abstarget = util.canonpath(repo.root, cwd, target)
reltarget = util.pathto(cwd, abstarget)
- if os.path.exists(reltarget):
+ prevsrc = targets.get(abstarget)
+ if prevsrc is not None:
+ ui.warn(_('%s: not overwriting - %s collides with %s\n') %
+ (reltarget, abssrc, prevsrc))
+ return
+ elif os.path.exists(reltarget):
if opts['force']:
os.unlink(reltarget)
else:
@@ -829,6 +835,7 @@
(relsrc, inst.strerror))
errors += 1
return
+ targets[abstarget] = abssrc
repo.copy(abssrc, abstarget)
copied.append((abssrc, relsrc, exact))
--- a/tests/test-rename Tue Nov 08 10:35:09 2005 -0800
+++ b/tests/test-rename Tue Nov 08 10:35:13 2005 -0800
@@ -76,3 +76,9 @@
hg rename --force d1/ba d1/ca
hg status
hg update -C
+
+echo "# do not copy more than one source file to the same destination file"
+mkdir d3
+hg rename d1/* d2/* d3
+hg status
+hg update -C
--- a/tests/test-rename.out Tue Nov 08 10:35:09 2005 -0800
+++ b/tests/test-rename.out Tue Nov 08 10:35:13 2005 -0800
@@ -101,3 +101,15 @@
# replace a symlink with a file
A d1/ca
R d1/ba
+# do not copy more than one source file to the same destination file
+copying d1/d11/a1 to d3/d11/a1
+d3/b: not overwriting - d2/b collides with d1/b
+removing d1/d11/a1
+A d3/a
+A d3/b
+A d3/ba
+A d3/d11/a1
+R d1/a
+R d1/b
+R d1/ba
+R d1/d11/a1