From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2201) id D725A3858D35; Thu, 12 Jan 2023 11:37:27 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D725A3858D35 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1673523447; bh=QuNXwQmzshDBz4JX2JjHe4F0TG36ZcFXSaKmCrrISlk=; h=To:Subject:Date:From:From; b=BDD0acG9CqCat5XA5F+1wLBbFKDkIX78NNhzeipp+7fOwDDHD+lbha8N2lukvlENF cTpHQAx/mKh2Gy/ZxTzWGa9Mm9/jlzTbwmEZRTPHuAzsOSwIu4KGYv2X3BMO1C3iOf hUyAZjVl6Oe1oKZ6qTrZS1EhK+I8N2cCMJNfHYp8= To: cygwin-apps-cvs@sourceware.org Subject: [calm - Cygwin server-side packaging maintenance script] branch master, updated. 20221205-18-g7b11bae X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: d8c6dd106db65c039295e2ec76ffbda50f6d0bd2 X-Git-Newrev: 7b11bae1275bc54f19ea6bfe9aeebdb8049a2cfd Message-Id: <20230112113727.D725A3858D35@sourceware.org> Date: Thu, 12 Jan 2023 11:37:27 +0000 (GMT) From: Jon Turney List-Id: https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/calm.git;h=7b11bae1275bc54f19ea6bfe9aeebdb8049a2cfd commit 7b11bae1275bc54f19ea6bfe9aeebdb8049a2cfd Author: Jon Turney Date: Wed Jan 11 15:35:06 2023 +0000 Add 'python26' to non-existent provide list (since we're going to annotate python26 dependent packages which are missing that, to facilitate their removal) https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/calm.git;h=f05c6de0aa72603732cfab724e74874b46e805b0 commit f05c6de0aa72603732cfab724e74874b46e805b0 Author: Jon Turney Date: Wed Jan 11 13:09:34 2023 +0000 Add a more generic 'add requires based on paths in package' tool Diff: --- calm/fix-requires-by-path.py | 124 +++++++++++++++++++++++++++++++++++++++++++ calm/past_mistakes.py | 1 + 2 files changed, 125 insertions(+) diff --git a/calm/fix-requires-by-path.py b/calm/fix-requires-by-path.py new file mode 100644 index 0000000..19b2f71 --- /dev/null +++ b/calm/fix-requires-by-path.py @@ -0,0 +1,124 @@ +#!/usr/bin/env python3 +# +# Copyright (c) 2023 Jon Turney +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# + +import argparse +import logging +import os +import re +import shutil +import sys +import tarfile + +import xtarfile + +from . import common_constants +from . import hint + +# +# +# + + +def fix_one_hint(args, dirpath, hintfile, tf): + pn = os.path.join(dirpath, hintfile) + + hints = hint.hint_file_parse(pn, hint.pvr) + + hints.pop('parse-warnings', None) + if 'parse-errors' in hints: + logging.error('invalid hints %s' % hintfile) + return + + modified = False + + requires = hints.get('requires', '').split() + if requires: + # requires is already present? + if args.requires in requires: + return + + # check if this package installs anything with the specified path, and if + # so, add to the requires, if not already present + ivp = False + + try: + with xtarfile.open(os.path.join(dirpath, tf), mode='r') as a: + ivp = any(m.startswith(args.path) for m in a.getnames()) + except tarfile.ReadError: + pass + + if ivp: + requires = hints.get('requires', '').split() + if args.requires not in requires: + requires.append(args.requires) + requires = sorted(requires) + modified = True + logging.warning("adding %s to requires in %s" % (args.requires, hintfile)) + hints['requires'] = ' '.join(requires) + + if not modified: + return + + # write updated hints + shutil.copy2(pn, pn + '.bak') + hint.hint_file_write(pn, hints) + # os.system('/usr/bin/diff -uBZ %s %s' % (pn + '.bak', pn)) + + +def fix_hints(args): + for (dirpath, _subdirs, files) in os.walk(args.relarea): + for f in files: + match = re.match(r'^([^-].*?)\.tar' + common_constants.PACKAGE_COMPRESSIONS_RE + r'$', f) + if match: + root = match.group(1) + if root.endswith('-src'): + continue + + fix_one_hint(args, dirpath, root + '.hint', f) + +# +# +# + + +if __name__ == "__main__": + relarea_default = common_constants.FTP + + parser = argparse.ArgumentParser(description='Add DEPATOM to requires: of packages which contain a file starting with PATH') + parser.add_argument('path', metavar='PATH', help='path to match') + parser.add_argument('requires', metavar='DEPATOM', help='require to add') + parser.add_argument('-v', '--verbose', action='count', dest='verbose', help='verbose output', default=0) + parser.add_argument('--releasearea', action='store', metavar='DIR', help="release directory (default: " + relarea_default + ")", default=relarea_default, dest='relarea') + (args) = parser.parse_args() + + if not args.path.startswith('/'): + sys.exit('must use an absolute path') + else: + args.path = args.path[1:] + + if args.verbose: + logging.getLogger().setLevel(logging.INFO) + + logging.basicConfig(format=os.path.basename(sys.argv[0]) + ': %(message)s') + + fix_hints(args) diff --git a/calm/past_mistakes.py b/calm/past_mistakes.py index 08885ec..0a56340 100644 --- a/calm/past_mistakes.py +++ b/calm/past_mistakes.py @@ -156,6 +156,7 @@ missing_obsolete = { nonexistent_provides = [ '_windows', 'perl5_026', + 'python26', 'rdiff-debuginfo', 'rxvt-unicode-X-debuginfo', 'xfce4-mixer-debuginfo',