From 8d896b17210f8b0aa9baed6446d180c0dbf39a81 Mon Sep 17 00:00:00 2001
From: mvdbeek <m.vandenbeek@gmail.com>
Date: Mon, 20 May 2024 16:51:30 +0200
Subject: [PATCH 1/4] Don't fail metadata if we only have an extra output files
 dir

---
 lib/galaxy/metadata/set_metadata.py | 25 ++++++++++++++++---------
 1 file changed, 16 insertions(+), 9 deletions(-)

diff --git a/lib/galaxy/metadata/set_metadata.py b/lib/galaxy/metadata/set_metadata.py
index f1c8906c39fd..58b8a2f5a15f 100644
--- a/lib/galaxy/metadata/set_metadata.py
+++ b/lib/galaxy/metadata/set_metadata.py
@@ -409,15 +409,22 @@ 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 extra files dir, but no primary output file, that's fine
+                        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:

From fa5e852c67a23e946544980994c4db9925d5b126 Mon Sep 17 00:00:00 2001
From: mvdbeek <m.vandenbeek@gmail.com>
Date: Mon, 20 May 2024 16:55:36 +0200
Subject: [PATCH 2/4] Revert "Always create output"

This reverts commit 90d04a017e3dacd7c5638f8d2c17ad6d10c63995.
---
 test/functional/tools/composite_output.xml       | 1 -
 test/functional/tools/composite_output_tests.xml | 1 -
 2 files changed, 2 deletions(-)

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 @@
 <tool id="composite_output" name="composite_output" version="1.0.0">
     <command><![CDATA[
-touch '$output' &&
 mkdir '$output.extra_files_path' &&
 cp '$input.extra_files_path'/* '$output.extra_files_path' &&
 cp '$input.extra_files_path'/Log '$output.extra_files_path'/second_log &&
diff --git a/test/functional/tools/composite_output_tests.xml b/test/functional/tools/composite_output_tests.xml
index 1ea58bb18828..39a702c8417a 100644
--- a/test/functional/tools/composite_output_tests.xml
+++ b/test/functional/tools/composite_output_tests.xml
@@ -3,7 +3,6 @@
   <command>
     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';

From 2f83ef358603747798e11e174c379cc793fdb622 Mon Sep 17 00:00:00 2001
From: mvdbeek <m.vandenbeek@gmail.com>
Date: Tue, 21 May 2024 14:14:23 +0200
Subject: [PATCH 3/4] Create empty file if datatype is auto_primary_file

---
 lib/galaxy/metadata/set_metadata.py | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/lib/galaxy/metadata/set_metadata.py b/lib/galaxy/metadata/set_metadata.py
index 58b8a2f5a15f..221346b8b438 100644
--- a/lib/galaxy/metadata/set_metadata.py
+++ b/lib/galaxy/metadata/set_metadata.py
@@ -421,6 +421,9 @@ def set_meta(new_dataset_instance, file_dict):
                         dataset.dataset.created_from_basename = created_from_basename
                     elif os.path.exists(dataset_path_to_extra_path(external_filename)):
                         # Only output extra files dir, but no primary output file, that's fine
+                        if dataset.datatype.composite_type == "auto_primary_file":
+                            with open(external_filename, "wb"):
+                                pass
                         pass
                     else:
                         raise Exception(f"Output file '{external_filename}' not found")

From e80204e951a8a27b39b09ffb6c2a0119ed726f44 Mon Sep 17 00:00:00 2001
From: mvdbeek <m.vandenbeek@gmail.com>
Date: Tue, 21 May 2024 14:17:57 +0200
Subject: [PATCH 4/4] Create empty primary file if we only have extra files dir

---
 lib/galaxy/metadata/set_metadata.py | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/lib/galaxy/metadata/set_metadata.py b/lib/galaxy/metadata/set_metadata.py
index 221346b8b438..237b106d3c7f 100644
--- a/lib/galaxy/metadata/set_metadata.py
+++ b/lib/galaxy/metadata/set_metadata.py
@@ -420,11 +420,12 @@ def set_meta(new_dataset_instance, file_dict):
                         )
                         dataset.dataset.created_from_basename = created_from_basename
                     elif os.path.exists(dataset_path_to_extra_path(external_filename)):
-                        # Only output extra files dir, but no primary output file, that's fine
-                        if dataset.datatype.composite_type == "auto_primary_file":
-                            with open(external_filename, "wb"):
-                                pass
-                        pass
+                        # 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")