From bb6fb3fdf8a72ccfb01c85a31c19718e0f148b84 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sat, 15 Aug 2020 15:24:35 +0300 Subject: [PATCH] Fix bug with parsing detached packages --- platformio/package/meta.py | 7 ++++++- tests/package/test_meta.py | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/platformio/package/meta.py b/platformio/package/meta.py index f57f0495..fa93780e 100644 --- a/platformio/package/meta.py +++ b/platformio/package/meta.py @@ -229,6 +229,8 @@ class PackageSpec(object): # pylint: disable=too-many-instance-attributes def _parse_requirements(self, raw): if "@" not in raw: return raw + if raw.startswith("file://") and os.path.exists(raw[7:]): + return raw tokens = raw.rsplit("@", 1) if any(s in tokens[1] for s in (":", "/")): return raw @@ -296,7 +298,10 @@ class PackageSpec(object): # pylint: disable=too-many-instance-attributes def _parse_name_from_url(url): if url.endswith("/"): url = url[:-1] - for c in ("#", "?"): + stop_chars = ["#", "?"] + if url.startswith("file://"): + stop_chars.append("@") # detached path + for c in stop_chars: if c in url: url = url[: url.index(c)] diff --git a/tests/package/test_meta.py b/tests/package/test_meta.py index d7d4b820..0629f274 100644 --- a/tests/package/test_meta.py +++ b/tests/package/test_meta.py @@ -80,7 +80,7 @@ def test_spec_requirements(): assert spec == PackageSpec(id=20, requirements="!=1.2.3,<2.0") -def test_spec_local_urls(): +def test_spec_local_urls(tmpdir_factory): assert PackageSpec("file:///tmp/foo.tar.gz") == PackageSpec( url="file:///tmp/foo.tar.gz", name="foo" ) @@ -93,6 +93,11 @@ def test_spec_local_urls(): assert PackageSpec("file:///tmp/foo.tar.gz@~2.3.0-beta.1") == PackageSpec( url="file:///tmp/foo.tar.gz", name="foo", requirements="~2.3.0-beta.1" ) + # detached folder with "@" symbol + pkg_dir = tmpdir_factory.mktemp("storage").join("detached@1.2.3").mkdir() + assert PackageSpec("file://%s" % str(pkg_dir)) == PackageSpec( + name="detached", url="file://%s" % pkg_dir + ) def test_spec_external_urls():