From 026d7b564c46587bedf2a910284c06798158d47c Mon Sep 17 00:00:00 2001 From: Yuxiang Zhu Date: Fri, 30 Sep 2022 16:35:22 +0800 Subject: [PATCH] rpms:rebase: Allow to use `~` in rpm version --- doozerlib/cli/__init__.py | 31 +++++++++++++++++++++++++++++++ doozerlib/cli/rpms_build.py | 6 +++--- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/doozerlib/cli/__init__.py b/doozerlib/cli/__init__.py index dcee86e33..dba8ab278 100644 --- a/doozerlib/cli/__init__.py +++ b/doozerlib/cli/__init__.py @@ -194,3 +194,34 @@ def validate_semver_major_minor_patch(ctx, param, version): raise click.BadParameter('Expected X, X.Y, or X.Y.Z (with optional "v" prefix)') return f'{vsplit[0]}.{minor_version}.{patch_version}' + + +def validate_rpm_version(ctx, param, version: str): + """ + For non-None, non-auto values, ensures that the incoming parameter meets the criteria vX.Y.Z[~prerelease] or X.Y.Z[~prerelease]. + If minor or patch is not supplied, the value is modified to possess + minor.major to meet semver requirements. + :param ctx: Click context + :param param: The parameter specified on the command line + :param version: The version specified on the command line + :return: + """ + if version == 'auto' or version is None: + return version + + xyz, prerelease = version.rsplit("~", 1) + vsplit = xyz.split(".") + try: + int(vsplit[0].lstrip('v')) + minor_version = int('0' if len(vsplit) < 2 else vsplit[1]) + patch_version = int('0' if len(vsplit) < 3 else vsplit[2]) + except ValueError: + raise click.BadParameter(f'Invalid version string: {version}') + + if len(vsplit) > 3: + raise click.BadParameter('Expected X, X.Y, or X.Y.Z (with optional "v" prefix)') + + result = f'{vsplit[0]}.{minor_version}.{patch_version}' + if prerelease: + result += f"~{prerelease}" + return result diff --git a/doozerlib/cli/rpms_build.py b/doozerlib/cli/rpms_build.py index cf830f88d..7affda7d7 100644 --- a/doozerlib/cli/rpms_build.py +++ b/doozerlib/cli/rpms_build.py @@ -6,7 +6,7 @@ from doozerlib import exectools from doozerlib.cli import (cli, click_coroutine, pass_runtime, - validate_semver_major_minor_patch) + validate_rpm_version) from doozerlib.exceptions import DoozerFatalError from doozerlib.rpm_builder import RPMBuilder from doozerlib.rpmcfg import RPMMetadata @@ -14,7 +14,7 @@ @cli.command("rpms:rebase-and-build", help="Rebase and build rpms in the group or given by --rpms.") -@click.option("--version", metavar='VERSION', default=None, callback=validate_semver_major_minor_patch, +@click.option("--version", metavar='VERSION', default=None, callback=validate_rpm_version, help="Version string to populate in specfile.", required=True) @click.option("--release", metavar='RELEASE', default=None, help="Release label to populate in specfile.", required=True) @@ -75,7 +75,7 @@ async def _rebase_and_build(rpm: RPMMetadata): @cli.command("rpms:rebase", help="Rebase rpms in the group or given by --rpms.") -@click.option("--version", metavar='VERSION', default=None, callback=validate_semver_major_minor_patch, +@click.option("--version", metavar='VERSION', default=None, callback=validate_rpm_version, help="Version string to populate in specfile.", required=True) @click.option("--release", metavar='RELEASE', default=None, help="Release label to populate in specfile.", required=True)