cp: error on target-filename collisions, rather than overwrite

Closes ticket:2447
This commit is contained in:
Brian Warner 2015-07-28 17:19:42 -07:00
parent f0fd34d16c
commit 98ab848cda
2 changed files with 22 additions and 4 deletions

View File

@ -496,8 +496,9 @@ class Copier:
def try_copy(self):
"""
All usage errors are caught here, not in a subroutine. This bottoms
out in copy_file_to_file() or copy_things_to_directory().
All usage errors (except for target filename collisions) are caught
here, not in a subroutine. This bottoms out in copy_file_to_file() or
copy_things_to_directory().
"""
source_specs = self.options.sources
destination_spec = self.options.destination
@ -735,6 +736,23 @@ class Copier:
# sourceobject) dicts for all the files that need to wind up there.
targetmap = self.build_targetmap(sources, target)
# target name collisions are an error
collisions = []
for target, sources in targetmap.items():
target_names = {}
for source in sources:
name = source.basename()
if name in target_names:
collisions.append((target, source, target_names[name]))
else:
target_names[name] = source
if collisions:
self.to_stderr("cannot copy multiple files with the same name into the same target directory")
# I'm not sure how to show where the collisions are coming from
#for (target, source1, source2) in collisions:
# self.to_stderr(source1.basename())
return 1
# step four: walk through the list of targets. For each one, copy all
# the files. If the target is a TahoeDirectory, upload and create
# read-caps, then do a set_children to the target directory.

View File

@ -787,7 +787,7 @@ cp -r $PARENTCAP/dir3/file3 $DIRCAP $PARENTCAP/dir2 $FILECAP to/missing/ : E2-DE
cp -r $PARENTCAP/dir4 to : to/dir4/emptydir/
cp -r $PARENTCAP/dir4 to/ : to/dir4/emptydir/
# name collisions: ensure files are copied in order
# name collisions should cause errors, not overwrites
cp -r $PARENTCAP/dir6/dir $PARENTCAP/dir5/dir to : E9-COLLIDING-TARGETS
cp -r $PARENTCAP/dir5/dir $PARENTCAP/dir6/dir to : E9-COLLIDING-TARGETS
cp -r $DIRCAP6 $DIRCAP5 to : E9-COLLIDING-TARGETS
@ -949,7 +949,7 @@ class CopyOut(GridTestMixin, CLITestMixin, unittest.TestCase):
return set(["E6-MANYONE"])
if err == "target is not a directory, but ends with a slash":
return set(["E7-BADSLASH"])
if err == "cannot copy multiple files with the same name from different source directories into the same target directory":
if err == "cannot copy multiple files with the same name into the same target directory":
return set(["E9-COLLIDING-TARGETS"])
if (err.startswith("source ") and
"is not a directory, but ends with a slash" in err):