From bb585b1f8aca3640e4e9846f1b842ab3f4c44f59 Mon Sep 17 00:00:00 2001 From: MontrealSergiy Date: Fri, 24 Apr 2026 17:36:41 -0400 Subject: [PATCH 1/2] list support for Boutiques Input Subdir maker #1623 --- BrainPortal/lib/boutiques_input_subdir_maker.rb | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/BrainPortal/lib/boutiques_input_subdir_maker.rb b/BrainPortal/lib/boutiques_input_subdir_maker.rb index c0549c26b..c0af297fd 100644 --- a/BrainPortal/lib/boutiques_input_subdir_maker.rb +++ b/BrainPortal/lib/boutiques_input_subdir_maker.rb @@ -190,9 +190,20 @@ def finalize_bosh_invoke_struct(invoke_struct) #:nodoc: override_invoke_params.delete(inputid) else dirname = subdir_config["dirname"] - filename = subdir_config["filename"] || "#{override_invoke_params[inputid]}" + filename = subdir_config["filename"] append_userfile_name = subdir_config["append_filename"] - override_invoke_params[inputid] = append_userfile_name ? "#{dirname}/#{filename}" : dirname + new_value = if override_invoke_params[inputid].is_a?(String) + filename ||= "#{override_invoke_params[inputid]}" + append_userfile_name ? "#{dirname}/#{filename}" : dirname + elsif filename || ! append_userfile_name # handing input filelist + [append_userfile_name ? "#{dirname}/#{filename}" : dirname] + else + override_invoke_params[inputid].map do |filename| + "#{dirname}/#{filename}" + end + end + + override_invoke_params[inputid] = new_value end end From 1b5ba0bdee2a65eb3de53ad25cee2dbfb954e57c Mon Sep 17 00:00:00 2001 From: MontrealSergiy Date: Mon, 27 Apr 2026 18:35:35 -0400 Subject: [PATCH 2/2] list support for Boutiques Input - f Subdir maker, making files available #1623 --- .../lib/boutiques_input_subdir_maker.rb | 70 ++++++++++++------- 1 file changed, 43 insertions(+), 27 deletions(-) diff --git a/BrainPortal/lib/boutiques_input_subdir_maker.rb b/BrainPortal/lib/boutiques_input_subdir_maker.rb index c0af297fd..54dc2b9e6 100644 --- a/BrainPortal/lib/boutiques_input_subdir_maker.rb +++ b/BrainPortal/lib/boutiques_input_subdir_maker.rb @@ -145,30 +145,46 @@ def setup #:nodoc: # Special make_available who need to have a parent folder parent_dirname_by_inputid.each do |inputid,subdir_config| - userfile_id = original_userfile_ids[inputid] - - next if userfile_id.blank? - - userfile = Userfile.find(userfile_id) - dirname = subdir_config["dirname"] - filename = subdir_config["filename"] || userfile.name - - # Sync and create symlink; default mode when physical_copy not requested - if ! subdir_config["physical_copy"] - make_available(userfile, "#{dirname}/#{filename}") - next + original_userfile_id = original_userfile_ids[inputid] + next if original_userfile_id.blank? + + original_userfile = Userfile.find(original_userfile_id) + input = descriptor.input_by_id(inputid) + if ! input.list || ! original_userfile.is_a?(CbrainFileList) + #todo add .cbcsv support? + userfile_list = [original_userfile] + else + # In case the input is a list and is assigned a CbrainFileList + original_userfile.sync_to_cache + userfile_list = original_userfile.userfiles_accessible_by_user!(user, nil, nil, file_access_symbol) + if subdir_config["filename"].present? && userfile_list.size > 1 + self.addlog("The filename param in this module is not compatible with CBRAIN file list.") + self.addlog("Several input files for input #{inputid} are not renamed, other issues are possible.") + end end - # In the case of a physical copy, call make_available() in - # a local temp dir to do everything including syncing and - # creating the symlink, then make the physical copy using that symlink - install_tmp = ".subdirmaker/#{userfile.id}-#{filename}" - make_available(userfile, install_tmp) - Dir.mkdir(dirname) unless File.directory?(dirname) - add_slash = userfile.is_a?(FileCollection) ? '/' : '' - add_dashL = userfile.is_a?(SingleFile) ? '-L' : '' - rsyncout = ism_bash_this("rsync -a -l --no-g --chmod=u=rwX,g=rX,Dg+s,o=r --delete #{add_dashL} #{install_tmp.bash_escape}#{add_slash} #{dirname.bash_escape}/#{filename.bash_escape}") - cb_error "Failed to install '#{dirname}/#{filename}';\nrsync reported: #{rsyncout}" unless rsyncout.blank? + dirname = subdir_config["dirname"] + filename = subdir_config["filename"] + userfile_list.compact.each do |userfile| + # special make_available - inside dir, possibly renamed to filename if any + + # either copy or symlink files + if ! subdir_config["physical_copy"] # Sync and create symlink; default mode when physical_copy not requested + make_available(userfile, "#{dirname}/#{filename}") + else + # In the case of a physical copy, call make_available() in + # a local temp dir to do everything including syncing and + # creating the symlink, then make the physical copy using that symlink + install_tmp = ".subdirmaker/#{userfile.id}-#{filename}" + make_available(userfile, install_tmp) + Dir.mkdir(dirname) unless File.directory?(dirname) + add_slash = userfile.is_a?(FileCollection) ? '/' : '' + add_dashL = userfile.is_a?(SingleFile) ? '-L' : '' + rsyncout = ism_bash_this("rsync -a -l --no-g --chmod=u=rwX,g=rX,Dg+s,o=r --delete #{add_dashL} #{install_tmp.bash_escape}#{add_slash} #{dirname.bash_escape}/#{filename.bash_escape}") + cb_error "Failed to install '#{dirname}/#{filename}';\nrsync reported: #{rsyncout}" unless rsyncout.blank? + end + filename = nil # keep filenames as are + end end true @@ -195,14 +211,14 @@ def finalize_bosh_invoke_struct(invoke_struct) #:nodoc: new_value = if override_invoke_params[inputid].is_a?(String) filename ||= "#{override_invoke_params[inputid]}" append_userfile_name ? "#{dirname}/#{filename}" : dirname - elsif filename || ! append_userfile_name # handing input filelist - [append_userfile_name ? "#{dirname}/#{filename}" : dirname] + elsif ! append_userfile_name # handing input filelist + [ dirname.to_s ] else - override_invoke_params[inputid].map do |filename| - "#{dirname}/#{filename}" + override_invoke_params[inputid].map do |final_filename| + final_filename ||= filename + "#{dirname}/#{final_filename}" end end - override_invoke_params[inputid] = new_value end end