From c118adcac770f5ada7aa6688d8fe1fa68d8679fd Mon Sep 17 00:00:00 2001 From: jakub-nt <175944085+jakub-nt@users.noreply.github.com> Date: Mon, 2 Dec 2024 15:25:33 +0100 Subject: [PATCH 1/2] Add argument to specify minimal version in `cfbs generate-release-information` Signed-off-by: jakub-nt <175944085+jakub-nt@users.noreply.github.com> --- cfbs/args.py | 6 ++++ cfbs/cfbs.1 | 4 +++ cfbs/commands.py | 6 ++-- cfbs/main.py | 10 ++++++- cfbs/masterfiles/analyze.py | 6 ++++ cfbs/masterfiles/download_all_versions.py | 28 +++++++++++-------- .../generate_release_information.py | 12 ++++++-- 7 files changed, 56 insertions(+), 16 deletions(-) diff --git a/cfbs/args.py b/cfbs/args.py index ffdacb32..086e1ef5 100644 --- a/cfbs/args.py +++ b/cfbs/args.py @@ -110,6 +110,12 @@ def get_arg_parser(): help="Check whether masterfiles from cfengine.com and github.com match in 'cfbs generate-release-information'", action="store_true", ) + parser.add_argument( + "--from", + help="Specify minimal version in 'cfbs generate-release-information'", + dest="from_", + metavar="FROM", + ) parser.add_argument( "--masterfiles", help="Add masterfiles on cfbs init choose between" ) diff --git a/cfbs/cfbs.1 b/cfbs/cfbs.1 index c52295d2..23d89c71 100644 --- a/cfbs/cfbs.1 +++ b/cfbs/cfbs.1 @@ -80,6 +80,10 @@ Use existing masterfiles instead of downloading in 'cfbs generate-release-inform \fB\-\-check\-against\-git\fR Check whether masterfiles from cfengine.com and github.com match in 'cfbs generate-release-information' +.TP +\fB\-\-from\fR +Specify minimal version in 'cfbs generate-release-information' + .TP \fB\-\-masterfiles\fR \fI\,MASTERFILES\/\fR Add masterfiles on cfbs init choose between diff --git a/cfbs/commands.py b/cfbs/commands.py index d1788dd0..6a50e906 100644 --- a/cfbs/commands.py +++ b/cfbs/commands.py @@ -1208,5 +1208,7 @@ def get_input_command(name, outfile): @cfbs_command("generate-release-information") -def generate_release_information_command(omit_download=False, check=False): - generate_release_information(omit_download, check) +def generate_release_information_command( + omit_download=False, check=False, min_version=None +): + generate_release_information(omit_download, check, min_version) diff --git a/cfbs/main.py b/cfbs/main.py index ca1bc533..a967a790 100644 --- a/cfbs/main.py +++ b/cfbs/main.py @@ -70,6 +70,12 @@ def main() -> int: % args.command ) + if args.from_ and args.command != "generate-release-information": + user_error( + "The option --from is only for 'cfbs generate-release-information', not 'cfbs %s'" + % args.command + ) + if args.non_interactive and args.command not in ( "init", "add", @@ -105,7 +111,9 @@ def main() -> int: if args.command == "generate-release-information": return commands.generate_release_information_command( - omit_download=args.omit_download, check=args.check_against_git + omit_download=args.omit_download, + check=args.check_against_git, + min_version=args.from_, ) if not is_cfbs_repo(): diff --git a/cfbs/masterfiles/analyze.py b/cfbs/masterfiles/analyze.py index 81978eec..776bccf5 100644 --- a/cfbs/masterfiles/analyze.py +++ b/cfbs/masterfiles/analyze.py @@ -120,3 +120,9 @@ def version_as_comparable_list_negated(version): vcl[1] = [-x for x in vcl[1]] return vcl + + +def version_is_at_least(version, min_version): + return min_version is None or ( + version_as_comparable_list(version) >= version_as_comparable_list(min_version) + ) diff --git a/cfbs/masterfiles/download_all_versions.py b/cfbs/masterfiles/download_all_versions.py index fad92cff..166af30a 100644 --- a/cfbs/masterfiles/download_all_versions.py +++ b/cfbs/masterfiles/download_all_versions.py @@ -1,12 +1,13 @@ import os import shutil +from cfbs.masterfiles.analyze import version_is_at_least from cfbs.utils import FetchError, fetch_url, get_json, mkdir, user_error ENTERPRISE_RELEASES_URL = "https://cfengine.com/release-data/enterprise/releases.json" -def get_download_urls_enterprise(): +def get_download_urls_enterprise(min_version=None): download_urls = {} reported_checksums = {} @@ -17,6 +18,9 @@ def get_download_urls_enterprise(): for release_data in data["releases"]: version = release_data["version"] + if not version_is_at_least(version, min_version): + continue + if version == "3.10.0": # for 3.10.0, for some reason, the "Masterfiles ready-to-install tarball" is a .tar.gz tarball, rather than a .pkg.tar.gz tarball # download the .pkg.tar.gz tarball from an unlisted analoguous URL instead @@ -91,22 +95,24 @@ def download_versions_from_urls(download_path, download_urls, reported_checksums return downloaded_versions -def download_all_versions(download_path): - download_urls, reported_checksums = get_download_urls_enterprise() +def download_all_versions(download_path, min_version=None): + download_urls, reported_checksums = get_download_urls_enterprise(min_version) # add masterfiles versions which do not appear in Enterprise releases but appear in Community releases # 3.12.0b1 version = "3.12.0b1" - download_url = "https://cfengine-package-repos.s3.amazonaws.com/community_binaries/Community-3.12.0b1/misc/cfengine-masterfiles-3.12.0b1.pkg.tar.gz" - digest = "ede305dae7be3edfac04fc5b7f63b46adb3a5b1612f4755e855ee8e6b8d344d7" - download_urls[version] = download_url - reported_checksums[version] = digest + if version_is_at_least(version, min_version): + download_url = "https://cfengine-package-repos.s3.amazonaws.com/community_binaries/Community-3.12.0b1/misc/cfengine-masterfiles-3.12.0b1.pkg.tar.gz" + digest = "ede305dae7be3edfac04fc5b7f63b46adb3a5b1612f4755e855ee8e6b8d344d7" + download_urls[version] = download_url + reported_checksums[version] = digest # 3.10.0b1 version = "3.10.0b1" - download_url = "https://cfengine-package-repos.s3.amazonaws.com/tarballs/cfengine-masterfiles-3.10.0b1.pkg.tar.gz" - digest = "09291617254705d79dea2531b23dbd0754f09029e90ce0b43b275aa02c1223a3" - download_urls[version] = download_url - reported_checksums[version] = digest + if version_is_at_least(version, min_version): + download_url = "https://cfengine-package-repos.s3.amazonaws.com/tarballs/cfengine-masterfiles-3.10.0b1.pkg.tar.gz" + digest = "09291617254705d79dea2531b23dbd0754f09029e90ce0b43b275aa02c1223a3" + download_urls[version] = download_url + reported_checksums[version] = digest downloaded_versions = download_versions_from_urls( download_path, download_urls, reported_checksums diff --git a/cfbs/masterfiles/generate_release_information.py b/cfbs/masterfiles/generate_release_information.py index ac99271f..3437ff1c 100644 --- a/cfbs/masterfiles/generate_release_information.py +++ b/cfbs/masterfiles/generate_release_information.py @@ -1,3 +1,4 @@ +from cfbs.masterfiles.analyze import version_is_at_least from cfbs.masterfiles.download_all_versions import download_all_versions from cfbs.masterfiles.generate_vcf_download import generate_vcf_download from cfbs.masterfiles.generate_vcf_git_checkout import generate_vcf_git_checkout @@ -7,16 +8,23 @@ DOWNLOAD_PATH = "downloaded_masterfiles" -def generate_release_information(omit_download=False, check=False): +def generate_release_information(omit_download=False, check=False, min_version=None): if not omit_download: print("Downloading masterfiles...") - downloaded_versions = download_all_versions(DOWNLOAD_PATH) + downloaded_versions = download_all_versions(DOWNLOAD_PATH, min_version) print("Download finished. Every reported checksum matches.") else: downloaded_versions = immediate_subdirectories(DOWNLOAD_PATH) + downloaded_versions = list( + filter( + lambda v: version_is_at_least(v, min_version), + downloaded_versions, + ) + ) + print( "Downloading releases of masterfiles from cfengine.com and generating release information..." ) From 35f684f3553ce23a91afbd4ba31454ba3abfb3b6 Mon Sep 17 00:00:00 2001 From: jakub-nt <175944085+jakub-nt@users.noreply.github.com> Date: Wed, 4 Dec 2024 14:19:33 +0100 Subject: [PATCH 2/2] Improve wording in variable name and help Signed-off-by: jakub-nt <175944085+jakub-nt@users.noreply.github.com> --- cfbs/args.py | 5 ++--- cfbs/cfbs.1 | 2 +- cfbs/main.py | 4 ++-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/cfbs/args.py b/cfbs/args.py index 086e1ef5..4852a471 100644 --- a/cfbs/args.py +++ b/cfbs/args.py @@ -112,9 +112,8 @@ def get_arg_parser(): ) parser.add_argument( "--from", - help="Specify minimal version in 'cfbs generate-release-information'", - dest="from_", - metavar="FROM", + help="Specify minimum version in 'cfbs generate-release-information'", + dest="minimum_version", ) parser.add_argument( "--masterfiles", help="Add masterfiles on cfbs init choose between" diff --git a/cfbs/cfbs.1 b/cfbs/cfbs.1 index 23d89c71..f8b0beda 100644 --- a/cfbs/cfbs.1 +++ b/cfbs/cfbs.1 @@ -82,7 +82,7 @@ Check whether masterfiles from cfengine.com and github.com match in 'cfbs genera .TP \fB\-\-from\fR -Specify minimal version in 'cfbs generate-release-information' +Specify minimum version in 'cfbs generate-release-information' .TP \fB\-\-masterfiles\fR \fI\,MASTERFILES\/\fR diff --git a/cfbs/main.py b/cfbs/main.py index a967a790..2c207195 100644 --- a/cfbs/main.py +++ b/cfbs/main.py @@ -70,7 +70,7 @@ def main() -> int: % args.command ) - if args.from_ and args.command != "generate-release-information": + if args.minimum_version and args.command != "generate-release-information": user_error( "The option --from is only for 'cfbs generate-release-information', not 'cfbs %s'" % args.command @@ -113,7 +113,7 @@ def main() -> int: return commands.generate_release_information_command( omit_download=args.omit_download, check=args.check_against_git, - min_version=args.from_, + min_version=args.minimum_version, ) if not is_cfbs_repo():