From 31819b5ed1b2523cb272a1474cd00ce6bddca33c Mon Sep 17 00:00:00 2001 From: Jon Turney Date: Wed, 4 Jan 2023 19:25:56 +0000 Subject: Don't synthesize a new-style obsolete when current version isn't obsolete --- calm/package.py | 85 ++++++++++++++++++++++++++++++++------------------------- 1 file changed, 48 insertions(+), 37 deletions(-) diff --git a/calm/package.py b/calm/package.py index 5fc7c4e..d8e9432 100755 --- a/calm/package.py +++ b/calm/package.py @@ -581,7 +581,20 @@ def upgrade_oldstyle_obsoletes(packages): for p in sorted(packages): if packages[p].kind == Kind.binary: - for vr in packages[p].versions(): + for vr in sorted(packages[p].versions(), key=lambda v: SetupVersion(v), reverse=True): + # we only really want to consider packages where the current + # version is obsolete. + # + # (if older versions are obsolete and we were somehow + # un-obsoleted, we'd need to somehow infer version constraints + # on the obsoletions, or something) + # + # as a proxy for that, stop considering versions of this package + # when one isn't obsolete, don't consider older versions + if not (packages[p].tar(vr).is_empty and + '_obsolete' in packages[p].version_hints[vr]['category']): + break + # initially apply to a subset over a certain age, to gradually # introduce this change mtime = packages[p].tar(vr).mtime @@ -589,48 +602,46 @@ def upgrade_oldstyle_obsoletes(packages): continue logging.debug("_obsolete package '%s' version '%s' mtime '%s' is over cut-off age" % (p, vr, time.strftime("%F %T %Z", time.localtime(mtime)))) - if packages[p].tar(vr).is_empty: - if '_obsolete' in packages[p].version_hints[vr]['category']: - requires = packages[p].version_hints[vr].get('depends', '').split(', ') - requires = [re.sub(r'(.*) +\(.*\)', r'\1', r) for r in requires] + requires = packages[p].version_hints[vr].get('depends', '').split(', ') + requires = [re.sub(r'(.*) +\(.*\)', r'\1', r) for r in requires] - if p in past_mistakes.old_style_obsolete_by: - o = past_mistakes.old_style_obsolete_by[p] + if p in past_mistakes.old_style_obsolete_by: + o = past_mistakes.old_style_obsolete_by[p] - # empty replacement means "ignore" - if not o: - continue + # empty replacement means "ignore" + if not o: + continue - logging.debug('%s is hardcoded as obsoleted by %s ' % (p, o)) + logging.debug('%s is hardcoded as obsoleted by %s ' % (p, o)) - else: - # ignore self-destruct packages - provides = packages[p].version_hints[vr].get('provides', '') - if '_self-destruct' in provides: - continue - - if len(requires) == 0: - # obsolete but has no replacement - logging.warning('%s is obsolete, but has no replacement' % (p)) - continue - elif len(requires) == 1: - o = requires[0] - elif len(requires) >= 2: - # obsolete with multiple replacements (pick one?) - logging.warning('%s %s is obsoleted by %d packages (%s)' % (p, vr, len(requires), requires)) - continue - - # ignore if o it's blacklisted - if o in ['cygwin-debuginfo', 'calligra-libs']: - logging.debug("not adding 'obsoletes: %s' to '%s' as blacklisted" % (p, o)) - continue + else: + # ignore self-destruct packages + provides = packages[p].version_hints[vr].get('provides', '') + if '_self-destruct' in provides: + continue + + if len(requires) == 0: + # obsolete but has no replacement + logging.warning('%s is obsolete, but has no replacement' % (p)) + continue + elif len(requires) == 1: + o = requires[0] + elif len(requires) >= 2: + # obsolete with multiple replacements (pick one?) + logging.warning('%s %s is obsoleted by %d packages (%s)' % (p, vr, len(requires), requires)) + continue + + # ignore if o it's blacklisted + if o in ['cygwin-debuginfo', 'calligra-libs']: + logging.debug("not adding 'obsoletes: %s' to '%s' as blacklisted" % (p, o)) + continue - if o in packages: - if o not in missing_obsolete: - missing_obsolete[o] = set() + if o in packages: + if o not in missing_obsolete: + missing_obsolete[o] = set() - missing_obsolete[o].add(p) - logging.info("converting from empty, _obsolete category package '%s' to 'obsoletes: %s' in package '%s'" % (p, p, o)) + missing_obsolete[o].add(p) + logging.info("converting from empty, _obsolete category package '%s' to 'obsoletes: %s' in package '%s'" % (p, p, o)) return missing_obsolete -- cgit v1.2.3