X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/676dfa352dbf55a23e0123b47d1affe33c028908..498f3130928f58e830be3abe74b20d06904af3cd:/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 0cb6eed2d8..7c68ce9f7b 100644 --- a/apps/workbench/app/controllers/actions_controller.rb +++ b/apps/workbench/app/controllers/actions_controller.rb @@ -1,5 +1,8 @@ class ActionsController < ApplicationController + skip_filter :require_thread_api_token, only: [:report_issue_popup, :report_issue] + skip_filter :check_user_agreements, only: [:report_issue_popup, :report_issue] + @@exposed_actions = {} def self.expose_action method, &block @@exposed_actions[method] = true @@ -10,6 +13,19 @@ class ActionsController < ApplicationController ArvadosBase::resource_class_for_uuid(params[:uuid]) end + def show + @object = model_class.andand.find(params[:uuid]) + if @object.is_a? Link and + @object.link_class == 'name' and + ArvadosBase::resource_class_for_uuid(@object.head_uuid) == Collection + redirect_to collection_path(id: @object.uuid) + elsif @object + redirect_to @object + else + raise ActiveRecord::RecordNotFound + end + end + def post params.keys.collect(&:to_sym).each do |param| if @@exposed_actions[param] @@ -29,12 +45,13 @@ 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. collect { |x| ArvadosBase::resource_class_for_uuid(x) }. uniq. each do |resource_class| resource_class.filter([['uuid','in',uuids_to_add]]).each do |src| - if resource_class == Collection + if resource_class == Collection and not Collection.attribute_info.include?(:name) dst = Link.new(owner_uuid: @object.uuid, tail_uuid: @object.uuid, head_uuid: src.uuid, @@ -51,6 +68,9 @@ class ActionsController < ApplicationController dst.name = "Copy of unnamed #{dst.class_for_display.downcase}" end end + if resource_class == Collection + dst.manifest_text = Collection.select([:manifest_text]).where(uuid: src.uuid).first.manifest_text + end when :move dst = src else @@ -70,11 +90,42 @@ class ActionsController < ApplicationController redirect_to @object end + def arv_normalize mt, *opts + r = "" + env = Hash[ENV]. + merge({'ARVADOS_API_HOST' => + arvados_api_client.arvados_v1_base. + sub(/\/arvados\/v1/, ''). + sub(/^https?:\/\//, ''), + 'ARVADOS_API_TOKEN' => 'x', + 'ARVADOS_API_HOST_INSECURE' => + Rails.configuration.arvados_insecure_https ? 'true' : 'false' + }) + IO.popen([env, 'arv-normalize'] + opts, 'w+b') do |io| + io.write mt + io.close_write + while buf = io.read(2**16) + r += buf + end + end + r + end + expose_action :combine_selected_files_into_collection do lst = [] files = [] params["selection"].each do |s| - m = CollectionsHelper.match(s) + a = ArvadosBase::resource_class_for_uuid s + m = nil + if a == Link + begin + m = CollectionsHelper.match(Link.find(s).head_uuid) + rescue + end + else + m = CollectionsHelper.match(s) + end + if m and m[1] and m[2] lst.append(m[1] + m[2]) files.append(m) @@ -93,75 +144,49 @@ class ActionsController < ApplicationController 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 + combined += arv_normalize mt, '--extract', m[4][1..-1] 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**16) - normalized += buf - end - end - - normalized_stripped = '' - IO.popen(['arv-normalize', '--strip'], 'w+b') do |io| - io.write combined - io.close_write - while buf = io.read(2**16) - normalized_stripped += buf - end - end - - require 'digest/md5' - - d = Digest::MD5.new() - d << normalized_stripped - 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}) + normalized = arv_normalize combined + newc = Collection.new({:manifest_text => normalized}) newc.save! chash.each do |k,v| l = Link.new({ tail_uuid: k, - head_uuid: newuuid, + head_uuid: newc.uuid, link_class: "provenance", name: "provided" }) l.save! end - redirect_to controller: 'collections', action: :show, id: newc.uuid + if params["show_project"] + respond_to do |format| + format.js {render inline: "location.reload();" } + end + else + redirect_to controller: 'collections', action: :show, id: newc.uuid + end + end + + def report_issue_popup + respond_to do |format| + format.js + format.html + end + end + + def report_issue + logger.warn "report_issue: #{params.inspect}" + + respond_to do |format| + IssueReporter.send_report(current_user, params).deliver + format.js {render nothing: true} + end end end