diff --git a/lib/galaxy/metadata/set_metadata.py b/lib/galaxy/metadata/set_metadata.py index f1c8906c39fd..237b106d3c7f 100644 --- a/lib/galaxy/metadata/set_metadata.py +++ b/lib/galaxy/metadata/set_metadata.py @@ -409,15 +409,26 @@ def set_meta(new_dataset_instance, file_dict): external_filename = unnamed_id_to_path.get(dataset_instance_id, dataset_filename_override) if not os.path.exists(external_filename): matches = glob.glob(external_filename) - assert len(matches) == 1, f"{len(matches)} file(s) matched by output glob '{external_filename}'" - external_filename = matches[0] - assert safe_contains( - tool_job_working_directory, external_filename - ), f"Cannot collect output '{external_filename}' from outside of working directory" - created_from_basename = os.path.relpath( - external_filename, os.path.join(tool_job_working_directory, "working") - ) - dataset.dataset.created_from_basename = created_from_basename + if matches: + assert len(matches) == 1, f"{len(matches)} file(s) matched by output glob '{external_filename}'" + external_filename = matches[0] + assert safe_contains( + tool_job_working_directory, external_filename + ), f"Cannot collect output '{external_filename}' from outside of working directory" + created_from_basename = os.path.relpath( + external_filename, os.path.join(tool_job_working_directory, "working") + ) + dataset.dataset.created_from_basename = created_from_basename + elif os.path.exists(dataset_path_to_extra_path(external_filename)): + # Only output is extra files dir, but no primary output file, that's fine, + # but make sure we create an empty primary output file. It's a little + # weird to do this, but it does indicate that there's nothing wrong with the file, + # as opposed to perhaps a storage issue. + with open(external_filename, "wb"): + pass + else: + raise Exception(f"Output file '{external_filename}' not found") + # override filename if we're dealing with outputs to working directory and dataset is not linked to link_data_only = metadata_params.get("link_data_only") if not link_data_only: diff --git a/test/functional/tools/composite_output.xml b/test/functional/tools/composite_output.xml index e634ea49315e..9e5f574809d5 100644 --- a/test/functional/tools/composite_output.xml +++ b/test/functional/tools/composite_output.xml @@ -1,6 +1,5 @@ mkdir '$output.files_path'; mkdir '$output.files_path/output'; - touch '$output'; cp '$input.extra_files_path'/* '$output.files_path'; echo "1 2 3" > '$output.files_path/md5out'; echo "1" > '$output.extra_files_path/output/1';