X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/4b3e5e50e262fc51a158c1aed1942b1ef176e2eb..b0cf100405e0dd7e4913194cd88b71ff74cf1773:/apps/workbench/app/controllers/actions_controller.rb diff --git a/apps/workbench/app/controllers/actions_controller.rb b/apps/workbench/app/controllers/actions_controller.rb index 62533d81b4..7737a3cfe4 100644 --- a/apps/workbench/app/controllers/actions_controller.rb +++ b/apps/workbench/app/controllers/actions_controller.rb @@ -46,10 +46,10 @@ class ActionsController < ApplicationController def move_or_copy action uuids_to_add = params["selection"] uuids_to_add = [ uuids_to_add ] unless uuids_to_add.is_a? Array - uuids_to_add. + resource_classes = uuids_to_add. collect { |x| ArvadosBase::resource_class_for_uuid(x) }. - uniq. - each do |resource_class| + uniq + resource_classes.each do |resource_class| resource_class.filter([['uuid','in',uuids_to_add]]).each do |src| if resource_class == Collection and not Collection.attribute_info.include?(:name) dst = Link.new(owner_uuid: @object.uuid, @@ -87,7 +87,17 @@ class ActionsController < ApplicationController end end end - redirect_to @object + if (resource_classes == [Collection] and + @object.is_a? Group and + @object.group_class == 'project') + # In the common case where only collections are copied/moved + # into a project, it's polite to land on the collections tab on + # the destination project. + redirect_to project_url(@object.uuid, anchor: 'Data_collections') + else + # Otherwise just land on the default (Description) tab. + redirect_to @object + end end def arv_normalize mt, *opts @@ -147,12 +157,49 @@ class ActionsController < ApplicationController end combined = "" + files_in_dirs = {} files.each do |m| mt = chash[m[1]+m[2]].andand.manifest_text if not m[4].nil? and m[4].size > 1 - combined += arv_normalize mt, '--extract', m[4][1..-1] + manifest_files = files_in_dirs['.'] + if !manifest_files + manifest_files = [] + files_in_dirs['.'] = manifest_files + end + manifest_file = m[4].split('/')[-1] + uniq_file = derive_unique_filename(manifest_file, manifest_files) + normalized = arv_normalize mt, '--extract', ".#{m[4]}" + normalized = normalized.gsub(/(\d+:\d+:)(#{Regexp.quote manifest_file})/) {|s| "#{$1}#{uniq_file}" } + combined += normalized + manifest_files << uniq_file else - combined += mt + mt = arv_normalize mt + manifest_streams = mt.split "\n" + adjusted_streams = [] + manifest_streams.each do |stream| + manifest_parts = stream.split + adjusted_parts = [] + manifest_files = files_in_dirs[manifest_parts[0]] + if !manifest_files + manifest_files = [] + files_in_dirs[manifest_parts[0]] = manifest_files + end + + manifest_parts.each do |part| + part_match = /(\d+:\d+:)(\S+)/.match(part) + if part_match + uniq_file = derive_unique_filename(part_match[2], manifest_files) + adjusted_parts << "#{part_match[1]}#{uniq_file}" + manifest_files << uniq_file + else + adjusted_parts << part + end + end + adjusted_streams << adjusted_parts.join(' ') + end + adjusted_streams.each do |stream| + combined += (stream + "\n") + end end end @@ -206,4 +253,18 @@ class ActionsController < ApplicationController end end + protected + + def derive_unique_filename filename, manifest_files + filename_parts = filename.split('.') + filename_part = filename_parts[0] + counter = 1 + while true + return filename if !manifest_files.include? filename + filename_parts[0] = filename_part + "(" + counter.to_s + ")" + filename = filename_parts.join('.') + counter += 1 + end + end + end