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
# 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.
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
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):