From 122769921162f005c829e998bf9007794a91d165 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Thu, 3 Jul 2025 17:26:00 +0200 Subject: [PATCH] support multiple capture groups in version-regex This support multiple capture groups in the `--version-regex` option. The groups will be concatenated to a single version delimited by `.`. This allows extracting versions from versioning schemes such as PostgreSQL's, which use `REL_17_0` tags etc., i.e. they use a different separator. --- nix_update/version/__init__.py | 10 ++++++---- tests/test_version_regex_no_rev.py | 19 +++++++++++++++++++ tests/testpkgs/default.nix | 1 + tests/testpkgs/postgresql.nix | 13 +++++++++++++ 4 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 tests/testpkgs/postgresql.nix diff --git a/nix_update/version/__init__.py b/nix_update/version/__init__.py index 54345f86..01896462 100644 --- a/nix_update/version/__init__.py +++ b/nix_update/version/__init__.py @@ -77,13 +77,15 @@ def extract_version(version: Version, version_regex: str) -> Version | None: pattern = re.compile(version_regex) match = re.match(pattern, version.number) if match is not None: - group = match.group(1) - if group is not None: + # Filter non-matched groups which come back as None. + groups = [g for g in match.groups() if g] + if len(groups) > 0: + number = ".".join(groups) return Version( - group, + number, prerelease=version.prerelease, rev=version.rev - or (None if version.number == group else version.number), + or (None if version.number == number else version.number), ) return None diff --git a/tests/test_version_regex_no_rev.py b/tests/test_version_regex_no_rev.py index db7289d6..a7b60e9d 100644 --- a/tests/test_version_regex_no_rev.py +++ b/tests/test_version_regex_no_rev.py @@ -32,6 +32,25 @@ def test_main(helpers: conftest.Helpers) -> None: assert "net-news-wire: 6.1.5 ->" in commit +def test_groups(helpers: conftest.Helpers) -> None: + with helpers.testpkgs(init_git=True) as path: + main( + [ + "--file", + str(path), + "postgresql", + "--version-regex", + "^REL_(\\d+)_(\\d+)(?:_(\\d+))?$", + ], + ) + version = get_nix_value(path, "postgresql.version") + print(version) + assert version != "17.0" + assert version != "17." + assert version != "17" + assert "17." in version + + def get_nix_value(path: Path, key: str) -> str: return subprocess.run( [ diff --git a/tests/testpkgs/default.nix b/tests/testpkgs/default.nix index d1dbb999..45327b3f 100644 --- a/tests/testpkgs/default.nix +++ b/tests/testpkgs/default.nix @@ -41,4 +41,5 @@ set = pkgs.callPackage ./set.nix { }; let-bound-version = pkgs.callPackage ./let-bound-version.nix { }; subpackage = pkgs.callPackage ./subpackage.nix { }; + postgresql = pkgs.callPackage ./postgresql.nix { }; } diff --git a/tests/testpkgs/postgresql.nix b/tests/testpkgs/postgresql.nix new file mode 100644 index 00000000..848767a3 --- /dev/null +++ b/tests/testpkgs/postgresql.nix @@ -0,0 +1,13 @@ +{ fetchFromGitHub, stdenv }: + +stdenv.mkDerivation rec { + pname = "postgresql"; + version = "17.0"; + + src = fetchFromGitHub { + owner = "postgres"; + repo = "postgres"; + tag = "REL_${builtins.replaceStrings [ "." ] [ "_" ] version}"; + sha256 = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; + }; +}