From 12f3fd73653116c5b8601e0dd0e44bb5ef36cdd7 Mon Sep 17 00:00:00 2001 From: Jon Turney Date: Mon, 16 Jan 2023 17:24:27 +0000 Subject: Only allow requires: of packages which currently exist In f3a2daab817a, we accidentally allowed packages to depend on a package which has been removed, instead of just applying that to obsoletes. Fix that so we check that requires: contains packages which actually exist! Also clean up no longer required 'splitchar' Fixes: f3a2daab817a ("Persistently record all package names") --- calm/package.py | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/calm/package.py b/calm/package.py index 43a403e..641030c 100755 --- a/calm/package.py +++ b/calm/package.py @@ -665,7 +665,7 @@ def upgrade_oldstyle_obsoletes(packages): # # validate the package database # -def validate_packages(args, packages, valid_requires_extra=None, missing_obsolete_extra=None): +def validate_packages(args, packages, valid_provides_extra=None, missing_obsolete_extra=None): error = False if packages is None: @@ -674,12 +674,9 @@ def validate_packages(args, packages, valid_requires_extra=None, missing_obsolet if missing_obsolete_extra is None: missing_obsolete_extra = {} - # build the set of valid things to requires: etc. + # build the set of valid things to depends: on valid_requires = set() - if valid_requires_extra: - valid_requires.update(valid_requires_extra) - for p in packages: valid_requires.add(p) for hints in packages[p].version_hints.values(): @@ -693,23 +690,27 @@ def validate_packages(args, packages, valid_requires_extra=None, missing_obsolet packages[p].obsoleted_by = set() packages[p].orphaned = False + # it's also valid to obsoletes: packages which have been removed + valid_obsoletes = set(valid_requires) + if valid_provides_extra: + valid_obsoletes.update(valid_provides_extra) + # perform various package validations for p in sorted(packages.keys()): for (v, hints) in packages[p].version_hints.items(): - for (c, okmissing, splitchar) in [ - ('depends', 'missing-depended-package', ','), - ('obsoletes', 'missing-obsoleted-package', ',') + for (c, okmissing, valid) in [ + ('depends', 'missing-depended-package', valid_requires), + ('obsoletes', 'missing-obsoleted-package', valid_obsoletes) ]: # if c is in hints, and not the empty string if hints.get(c, ''): - for r in hints[c].split(splitchar): + for r in hints[c].split(','): # remove any extraneous whitespace r = r.strip() # strip off any version relation enclosed in '()' # following the package name - if splitchar: - r = re.sub(r'(.*) +\(.*\)', r'\1', r) + r = re.sub(r'(.*) +\(.*\)', r'\1', r) if c == 'depends': # don't count cygwin-debuginfo for the purpose of @@ -726,7 +727,7 @@ def validate_packages(args, packages, valid_requires_extra=None, missing_obsolet # all packages listed in a hint must exist (unless the # disable-check option says that's ok) - if (r not in valid_requires) and (r not in past_mistakes.nonexistent_provides + past_mistakes.expired_provides): + if (r not in valid) and (r not in past_mistakes.nonexistent_provides + past_mistakes.expired_provides): if okmissing not in getattr(args, 'disable_check', []): logging.error("package '%s' version '%s' %s: '%s', but nothing satisfies that" % (p, v, c, r)) error = True -- cgit v1.2.3