- for locator in collection_blocks:
- parts = locator.split('+')
- logger.info("Copying block %s (%s bytes)", locator, parts[1])
- data = src_keep.get(locator)
- dst_keep.put(data)
+
+ dst_manifest = ""
+ dst_locators = {}
+ for line in manifest.splitlines():
+ words = line.split()
+ dst_manifest_line = words[0]
+ for word in words[1:]:
+ try:
+ loc = arvados.KeepLocator(word)
+ blockhash = loc.md5sum
+ # copy this block if we haven't seen it before
+ # (otherwise, just reuse the existing dst_locator)
+ if blockhash not in dst_locators:
+ logger.info("Copying block %s (%s bytes)", blockhash, loc.size)
+ data = src_keep.get(word)
+ dst_locator = dst_keep.put(data)
+ dst_locators[blockhash] = dst_locator
+ dst_manifest_line += ' ' + dst_locators[blockhash]
+ except ValueError:
+ # If 'word' can't be parsed as a locator,
+ # presume it's a filename.
+ dst_manifest_line += ' ' + word
+ dst_manifest += dst_manifest_line + "\n"