diff --git a/lib/galaxy/tool_util/fetcher.py b/lib/galaxy/tool_util/fetcher.py
index 3c9bedaaaf9..9e5ed42aeba 100644
--- a/lib/galaxy/tool_util/fetcher.py
+++ b/lib/galaxy/tool_util/fetcher.py
@@ -1,3 +1,4 @@
+import os
from typing import (
Dict,
Type,
@@ -8,6 +9,7 @@ from galaxy.util import plugin_config
if TYPE_CHECKING:
from galaxy.tool_util.locations import ToolLocationResolver
+ from galaxy.util.path import StrPath
class ToolLocationFetcher:
@@ -19,8 +21,8 @@ class ToolLocationFetcher:
return plugin_config.plugins_dict(galaxy.tool_util.locations, "scheme")
- def to_tool_path(self, path_or_uri_like: str, **kwds) -> str:
- if "://" not in path_or_uri_like:
+ def to_tool_path(self, path_or_uri_like: "StrPath", **kwds) -> "StrPath":
+ if isinstance(path_or_uri_like, os.PathLike) or "://" not in path_or_uri_like:
path = path_or_uri_like
else:
uri_like = path_or_uri_like
diff --git a/lib/galaxy/tool_util/parser/factory.py b/lib/galaxy/tool_util/parser/factory.py
index ce403638f7f..5c9e46a3100 100644
--- a/lib/galaxy/tool_util/parser/factory.py
+++ b/lib/galaxy/tool_util/parser/factory.py
@@ -86,9 +86,8 @@ def get_tool_source(
tool_location_fetcher = ToolLocationFetcher()
assert config_file
- config_file = str(config_file)
- config_file = tool_location_fetcher.to_tool_path(config_file)
+ config_file = str(tool_location_fetcher.to_tool_path(config_file))
if not enable_beta_formats:
tree, macro_paths = load_tool_with_refereces(config_file)
return XmlToolSource(tree, source_path=config_file, macro_paths=macro_paths)
diff --git a/lib/galaxy/tool_util/parser/xml.py b/lib/galaxy/tool_util/parser/xml.py
index aba5a687424..2d18724f1bd 100644
--- a/lib/galaxy/tool_util/parser/xml.py
+++ b/lib/galaxy/tool_util/parser/xml.py
@@ -708,7 +708,13 @@ class XmlToolSource(ToolSource):
return citations
for citation_elem in citations_elem:
- citation = parse_citation_elem(citation_elem)
+ try:
+ citation = parse_citation_elem(citation_elem)
+ except Exception:
+ if Version(self.parse_profile()) < Version("24.2"):
+ continue
+ else:
+ raise
if citation:
citations.append(citation)
diff --git a/test/unit/tool_util/invalid_citation.xml b/test/unit/tool_util/invalid_citation.xml
new file mode 100644
index 00000000000..684209fb3b8
--- /dev/null
+++ b/test/unit/tool_util/invalid_citation.xml
@@ -0,0 +1,17 @@
+
+
+ cat $input1 > $out_file1
+
+
+
+
+
+
+
+
+
+ Ronald A. Fisher in the 1930s
+
+
+
+
diff --git a/test/unit/tool_util/invalid_citation_24.2.xml b/test/unit/tool_util/invalid_citation_24.2.xml
new file mode 100644
index 00000000000..9971329a90b
--- /dev/null
+++ b/test/unit/tool_util/invalid_citation_24.2.xml
@@ -0,0 +1,17 @@
+
+
+ cat $input1 > $out_file1
+
+
+
+
+
+
+
+
+
+ Ronald A. Fisher in the 1930s
+
+
+
+
diff --git a/test/unit/tool_util/test_parsing.py b/test/unit/tool_util/test_parsing.py
index 21ec9238769..8aa46cbb356 100644
--- a/test/unit/tool_util/test_parsing.py
+++ b/test/unit/tool_util/test_parsing.py
@@ -20,6 +20,10 @@ from galaxy.tool_util.parser.output_models import (
)
from galaxy.tool_util.unittest_utils import functional_test_tool_path
from galaxy.util import galaxy_directory
+from galaxy.util.resources import (
+ as_file,
+ resource_path,
+)
from galaxy.util.unittest import TestCase
TOOL_XML_1 = """
@@ -948,6 +952,23 @@ class TestCollectionCatGroupTag(FunctionalTestToolTestCase):
assert output_dataset_model.metadata_source == "input1"
+def test_old_invalid_citation_dont_cause_failure_to_load():
+ with as_file(resource_path(__name__, "invalid_citation.xml")) as tool_path:
+ tool_source = get_tool_source(tool_path)
+ assert tool_source.parse_citations() == []
+
+
+def test_invalid_citation_not_allowed_in_modern_tools():
+ with as_file(resource_path(__name__, "invalid_citation_24.2.xml")) as tool_path:
+ tool_source = get_tool_source(tool_path)
+ exc = None
+ try:
+ tool_source.parse_citations()
+ except Exception as e:
+ exc = e
+ assert exc is not None
+
+
class TestToolProvidedMetadata2(FunctionalTestToolTestCase):
test_path = "tool_provided_metadata_2.xml"