From ad4f8299c56566e060e580eb8421214dda833c57 Mon Sep 17 00:00:00 2001 From: Pavel Raiskup Date: Jun 02 2023 14:21:16 +0000 Subject: [PATCH 1/4] The 'repoquery --queryformat' doesn't accept %location Per `sudo dnf-3 repoquery --querytags` output. --- diff --git a/prunerepo/helpers.py b/prunerepo/helpers.py index 7c34bcf..33aebe9 100644 --- a/prunerepo/helpers.py +++ b/prunerepo/helpers.py @@ -64,14 +64,30 @@ def get_package_build_time(package_path, log): return int(stdout[0]) -def get_rpms(repoquery_cmd, path, log): +def get_rpms(repoquery_cmd, log): """ Get paths to rpm packages in the repository according to given repoquery_cmd """ stdout = run_cmd(repoquery_cmd, log) # returns srpms as well - rel_rpms_paths = [relpath for relpath in stdout if not is_srpm(relpath)] - abs_rpms_paths = [os.path.abspath(os.path.join(path, relpath)) for relpath in rel_rpms_paths] - return abs_rpms_paths + + # List in a format: + # file:///some/path/python3-motionpaint-1.4-1.fc23.noarch.rpm + rpm_paths = [path for path in stdout if not is_srpm(path)] + abs_rpm_paths = [] + for path in rpm_paths: + prefix = "file://" + if not path.startswith(prefix): + raise PrunerepoException( + f"Repoquery output doesn't start with file:// - {path}" + ) + abs_path = path[len(prefix):] + if not abs_path.startswith("/"): + raise PrunerepoException( + f"Repoquery output doesn't provide absolute path: {path}" + ) + abs_rpm_paths.append(abs_path) + + return abs_rpm_paths def prune_packages(path, days, dry_run, log): @@ -166,7 +182,7 @@ def get_rpms_to_remove(directory, days=0, log=None): "--repofrompath=prunerepo_query," + os.path.abspath(directory), "--repo=prunerepo_query", "--refresh", - "--queryformat=%{location}", + "--location", "--quiet", "--setopt=skip_if_unavailable=False", ] @@ -178,11 +194,11 @@ def get_rpms_to_remove(directory, days=0, log=None): os.path.abspath(directory), days) get_latest_packages_cmd = get_all_packages_cmd + ['--latest-limit=1'] - latest_rpms = get_rpms(get_latest_packages_cmd, directory, log) + latest_rpms = get_rpms(get_latest_packages_cmd, log) if not latest_rpms: return [] - all_rpms = get_rpms(get_all_packages_cmd, directory, log) + all_rpms = get_rpms(get_all_packages_cmd, log) repodir = os.path.abspath(directory) pair_lookup = RPMToSRPMPairs(repodir, log) diff --git a/tests/testlib.sh b/tests/testlib.sh index 4b7e9e5..cd6e0ba 100644 --- a/tests/testlib.sh +++ b/tests/testlib.sh @@ -10,11 +10,11 @@ function runcmd { } function listpkgsbyrepo { - dnf repoquery --repofrompath=test_prunerepo,$testrepo --repo=test_prunerepo --refresh --quiet --queryformat '%{location}' --setopt='skip_if_unavailable=False' | sort + dnf repoquery --repofrompath=test_prunerepo,$testrepo --repo=test_prunerepo --refresh --quiet --location --setopt='skip_if_unavailable=False' | sed 's|file://||' | sort } function listpkgsbyfs { - find . -name '*.rpm' | cut -c 3- | sort + find . -name '*.rpm' -exec realpath {} \; | sort } function run { From 5778509338a4cf8da521ac3f1a8e954285e90bbe Mon Sep 17 00:00:00 2001 From: Pavel Raiskup Date: Jun 02 2023 14:22:22 +0000 Subject: [PATCH 2/4] Ignore signature issues while querying rpm %BUILDTIME --- diff --git a/prunerepo/helpers.py b/prunerepo/helpers.py index 33aebe9..6e7976e 100644 --- a/prunerepo/helpers.py +++ b/prunerepo/helpers.py @@ -59,7 +59,7 @@ def get_package_build_time(package_path, log): """ Get build time by reading package metadata """ - query_cmd = ["/usr/bin/rpm", "-qp", "--queryformat", "%{BUILDTIME}"] + [package_path] + query_cmd = ["/usr/bin/rpm", "-qp", "--nosignature", "--queryformat", "%{BUILDTIME}"] + [package_path] stdout = run_cmd(query_cmd, log) return int(stdout[0]) From b213784b3ed705af41f02c68c32ec48632b8a652 Mon Sep 17 00:00:00 2001 From: Pavel Raiskup Date: Jun 02 2023 14:22:56 +0000 Subject: [PATCH 3/4] tests: make tests work on systems with non-default locale --- diff --git a/tests/base/test.sh b/tests/base/test.sh index d2e5e2e..0e8a554 100755 --- a/tests/base/test.sh +++ b/tests/base/test.sh @@ -48,7 +48,7 @@ echo "============================ test --days ============================"; setup -oldestbuilddate=`rpm -qp --queryformat '%{BUILDTIME:date}' $testrepo/0-oldestbuild/example-1.0.1-1.fc23.x86_64.rpm 2> /dev/null` +oldestbuilddate=`LC_ALL=en_US.utf8 rpm -qp --queryformat '%{BUILDTIME:date}' $testrepo/0-oldestbuild/example-1.0.1-1.fc23.x86_64.rpm 2> /dev/null` oldestbuilddayback=$(( (`date +'%s'` - `date -d "$oldestbuilddate" +'%s'`)/60/60/24 )) runcmd --days $oldestbuilddayback . From 3938abc677b81a3c39ac156037e7aec3906df335 Mon Sep 17 00:00:00 2001 From: Pavel Raiskup Date: Jun 02 2023 14:23:35 +0000 Subject: [PATCH 4/4] Ajust to the current/future DNF packaging The "dnf" is going to be provided by "dnf5" package, and the /bin/dnf file as well. The /bin/dnf-3 though stays in python3-dnf (which continues to be compatible with the dnf-plugins-core package). --- diff --git a/prunerepo.spec b/prunerepo.spec index bd25560..b3fe9d0 100644 --- a/prunerepo.spec +++ b/prunerepo.spec @@ -18,7 +18,7 @@ BuildRequires: python3-rpm BuildRequires: createrepo_c BuildRequires: asciidoc BuildRequires: findutils -BuildRequires: dnf +BuildRequires: python3-dnf BuildRequires: dnf-plugins-core BuildRequires: coreutils Requires: createrepo_c diff --git a/prunerepo/helpers.py b/prunerepo/helpers.py index 6e7976e..561c56a 100644 --- a/prunerepo/helpers.py +++ b/prunerepo/helpers.py @@ -177,7 +177,7 @@ def get_rpms_to_remove(directory, days=0, log=None): causing unwanted RPM removals. """ get_all_packages_cmd = [ - "dnf", + "dnf-3", "repoquery", "--repofrompath=prunerepo_query," + os.path.abspath(directory), "--repo=prunerepo_query", diff --git a/tests/testlib.sh b/tests/testlib.sh index cd6e0ba..33c755a 100644 --- a/tests/testlib.sh +++ b/tests/testlib.sh @@ -10,7 +10,7 @@ function runcmd { } function listpkgsbyrepo { - dnf repoquery --repofrompath=test_prunerepo,$testrepo --repo=test_prunerepo --refresh --quiet --location --setopt='skip_if_unavailable=False' | sed 's|file://||' | sort + dnf-3 repoquery --repofrompath=test_prunerepo,$testrepo --repo=test_prunerepo --refresh --quiet --location --setopt='skip_if_unavailable=False' | sed 's|file://||' | sort } function listpkgsbyfs {