-
- if m and m[1] and m[2]
- lst.append(m[1] + m[2])
- files.append(m)
- end
- end
-
- collections = Collection.where(uuid: lst)
-
- chash = {}
- collections.each do |c|
- c.reload()
- chash[c.uuid] = c
- end
-
- combined = ""
- files.each do |m|
- mt = chash[m[1]+m[2]].manifest_text
- if m[4]
- combined += arv_normalize mt, '--extract', m[4][1..-1]
- else
- combined += chash[m[1]+m[2]].manifest_text
+ src_pathlist.each do |src_path|
+ src_path = src_path.sub(/^(\.\/|\/|)/, "./")
+ src_stream, _, basename = src_path.rpartition("/")
+ dst_stream = destdir || src_stream
+ # Generate a unique name by adding (1), (2), etc. to it.
+ # If the filename has a dot that's not at the beginning, insert the
+ # number just before that. Otherwise, append the number to the name.
+ if match = basename.match(/[^\.]\./)
+ suffix_start = match.begin(0) + 1
+ else
+ suffix_start = basename.size
+ end
+ suffix_size = 0
+ dst_path = nil
+ loop.each_with_index do |_, try_count|
+ dst_path = "#{dst_stream}/#{basename}"
+ break unless new_coll.exist?(dst_path)
+ uniq_suffix = "(#{try_count + 1})"
+ basename[suffix_start, suffix_size] = uniq_suffix
+ suffix_size = uniq_suffix.size
+ end
+ new_coll.cp_r(src_path, dst_path, src_coll)