X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/550e20e00518ce51054e9c52549e77f74d033eba..df4897f1390e58825dd8afcc053955c6d3894169:/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 94bfd1e8e8..74e5831235 100644 --- a/apps/workbench/app/controllers/actions_controller.rb +++ b/apps/workbench/app/controllers/actions_controller.rb @@ -1,25 +1,97 @@ class ActionsController < ApplicationController + + skip_before_filter :find_object_by_uuid, only: :post + def combine_selected_files_into_collection lst = [] + files = [] params["selection"].each do |s| m = CollectionsHelper.match(s) - if m + if m and m[1] and m[2] lst.append(m[1] + m[2]) + files.append(m) end end collections = Collection.where(uuid: lst) - - collections.each do |c| - puts c.manifest_text + + 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] + IO.popen(['arv-normalize', '--extract', m[4][1..-1]], 'w+b') do |io| + io.write mt + io.close_write + while buf = io.read(2**20) + combined += buf + end + end + else + combined += chash[m[1]+m[2]].manifest_text + end + end + + normalized = '' + IO.popen(['arv-normalize'], 'w+b') do |io| + io.write combined + io.close_write + while buf = io.read(2**20) + normalized += buf + end + end + + require 'digest/md5' + + d = Digest::MD5.new() + d << normalized + newuuid = "#{d.hexdigest}+#{normalized.length}" + + env = Hash[ENV]. + merge({ + 'ARVADOS_API_HOST' => + $arvados_api_client.arvados_v1_base. + sub(/\/arvados\/v1/, ''). + sub(/^https?:\/\//, ''), + 'ARVADOS_API_TOKEN' => Thread.current[:arvados_api_token], + 'ARVADOS_API_HOST_INSECURE' => + Rails.configuration.arvados_insecure_https ? 'true' : 'false' + }) + + IO.popen([env, 'arv-put', '--raw'], 'w+b') do |io| + io.write normalized + io.close_write + while buf = io.read(2**20) + + end + end + + newc = Collection.new({:uuid => newuuid, :manifest_text => normalized}) + newc.save! + + chash.each do |k,v| + l = Link.new({ + tail_kind: "arvados#collection", + tail_uuid: k, + head_kind: "arvados#collection", + head_uuid: newuuid, + link_class: "provenance", + name: "provided" + }) + l.save! end - '/' + redirect_to controller: 'collections', action: :show, id: newc.uuid end def post if params["combine_selected_files_into_collection"] - redirect_to combine_selected_files_into_collection + combine_selected_files_into_collection else redirect_to :back end