From 0af16eaa3c70750c0faff2a72dc7ba90fd248d5b Mon Sep 17 00:00:00 2001 From: Soim Date: Wed, 22 Apr 2026 22:38:43 +0900 Subject: [PATCH] fix(download): keep get_downloadable_url version and parse Maven x.y.z.qualifier as x.y.z --- src/fosslight_util/download.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/fosslight_util/download.py b/src/fosslight_util/download.py index afcf326..f04651c 100755 --- a/src/fosslight_util/download.py +++ b/src/fosslight_util/download.py @@ -284,22 +284,30 @@ def get_remote_refs(git_url: str): _BASE_SEMVER_FOR_CHECKOUT = re.compile( - r'^(?:v\.? ?)?(\d+)\.(\d+)(?:\.(\d+))?(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$', + r'^(?:v\.? ?)?(\d+)\.(\d+)(?:\.(\d+))?' + r'(?:(?:-[0-9A-Za-z.-]+)|(?:\.[A-Za-z][0-9A-Za-z.-]*))?' + r'(?:\+[0-9A-Za-z.-]+)?$', re.IGNORECASE, ) _SEMVER_IN_REF = re.compile( r'(?:^v\.? ?|[-_])' r'(\d+)\.(\d+)\.(\d+)' - r'(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?' + r'(?:(?:-[0-9A-Za-z.-]+)|(?:\.[A-Za-z][0-9A-Za-z.-]*))?' + r'(?:\+[0-9A-Za-z.-]+)?' r'(?=[-_]|$)', re.IGNORECASE, ) _SEMVER_AT_REF_START = re.compile( r'^(\d+)\.(\d+)\.(\d+)' - r'(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?' + r'(?:(?:-[0-9A-Za-z.-]+)|(?:\.[A-Za-z][0-9A-Za-z.-]*))?' + r'(?:\+[0-9A-Za-z.-]+)?' r'(?=[-_]|$)', re.IGNORECASE, ) +_SEMVER_DOT_QUALIFIER_IN_STR = re.compile( + r'(\d+)\.(\d+)\.(\d+)\.[A-Za-z][0-9A-Za-z.-]*', + re.IGNORECASE, +) _CLARIFIED_MAJOR_ONLY_FULL = re.compile(r'^(?:v\.? ?)?(\d+)$', re.IGNORECASE) # Two-part x.y not followed by .digit (avoids taking "1.2" from "1.2.3") _CLARIFIED_TWO_IN_STR = re.compile(r'(\d+)\.(\d+)(?!\.\d)') @@ -341,6 +349,9 @@ def clarified_version_from_oss_version(oss_version: str) -> str: if m: return m.group(1) m = _SEMVER_IN_REF.search(s) or _SEMVER_AT_REF_START.match(s) + if m: + return f"{m.group(1)}.{m.group(2)}.{m.group(3)}" + m = _SEMVER_DOT_QUALIFIER_IN_STR.search(s) if m: return f"{m.group(1)}.{m.group(2)}.{m.group(3)}" m = _CLARIFIED_TWO_IN_STR.search(s)