public inbox for cygwin-apps-cvs@sourceware.org help / color / mirror / Atom feed
From: Jon Turney <jturney@sourceware.org> To: cygwin-apps-cvs@sourceware.org Subject: [calm - Cygwin server-side packaging maintenance script] branch master, updated. 20230209-85-g13248b3 Date: Sun, 7 Apr 2024 17:54:39 +0000 (GMT) [thread overview] Message-ID: <20240407175440.38AFF3858C32@sourceware.org> (raw) https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/calm.git;h=13248b3a30eee83bc91bd0d27e03593a77859e2b commit 13248b3a30eee83bc91bd0d27e03593a77859e2b Author: Jon Turney <jon.turney@dronecode.org.uk> Date: Sun Apr 7 16:45:39 2024 +0100 Add dependencies etc. to JSON output https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/calm.git;h=7edaa9634d420e5cebf52f33656227d58f5cac32 commit 7edaa9634d420e5cebf52f33656227d58f5cac32 Author: Jon Turney <jon.turney@dronecode.org.uk> Date: Sat Apr 6 17:19:48 2024 +0100 Produce a subreport for each solib Initially I wanted to put this information directly into the solib report, but some sort of disclosure widget which spans the whole table width is hard to do in just HTML. https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/calm.git;h=62c983ea30540392c63bc7ea40ae383ac2ff5467 commit 62c983ea30540392c63bc7ea40ae383ac2ff5467 Author: Jon Turney <jon.turney@dronecode.org.uk> Date: Sat Apr 6 17:17:41 2024 +0100 Make fix-requires-by-linkage quieter Diff: --- calm/fix-requires-by-linkage.py | 2 +- calm/package.py | 19 ++++++--- calm/reports.py | 50 +++++++++++++++++++++-- calm/utils.py | 11 +++++ test/testdata/process_arch/packages.json.expected | 36 +++++++++++++++- 5 files changed, 106 insertions(+), 12 deletions(-) diff --git a/calm/fix-requires-by-linkage.py b/calm/fix-requires-by-linkage.py index 7de5f3f..0f1136f 100644 --- a/calm/fix-requires-by-linkage.py +++ b/calm/fix-requires-by-linkage.py @@ -73,7 +73,7 @@ def fix_one_hint(args, dirpath, hintfile, tf): logging.info('Found executable %s' % m.name) a.extract(m) - result = subprocess.run(['objdump', '-p', m.name], stdout=subprocess.PIPE, text=True) + result = subprocess.run(['objdump', '-p', m.name], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True) if ('DLL Name: %s' % args.dll) in result.stdout: exe = True diff --git a/calm/package.py b/calm/package.py index 860bc64..5414053 100755 --- a/calm/package.py +++ b/calm/package.py @@ -1448,15 +1448,22 @@ def write_repo_json(args, packages, f): 'name': po.orig_name, 'versions': versions, 'summary': po.version_hints[bv]['sdesc'].strip('"'), - 'subpackages': [{'name': sp, 'categories': package(sp).version_hints[package(sp).best_version].get('category', '').split()} for sp in sorted(po.is_used_by)], 'arches': arches, } - if 'homepage' in po.version_hints[bv]: - d['homepage'] = po.version_hints[bv]['homepage'] - - if 'license' in po.version_hints[bv]: - d['license'] = po.version_hints[bv]['license'] + spl = [] + for sp in sorted(po.is_used_by): + hints = package(sp).version_hints[package(sp).best_version] + sp = {'name': sp, 'categories': hints.get('category', '').split()} + for k in ['depends', 'provides', 'obsoletes']: + if hints.get(k, None): + sp[k] = [d.strip() for d in hints[k].split(',')] + spl.append(sp) + d['subpackages'] = spl + + for k in ['homepage', 'license', 'build-depends']: + if k in po.version_hints[bv]: + d[k] = po.version_hints[bv][k] build_recipe = _find_build_recipe_file(args, po.orig_name) if build_recipe: diff --git a/calm/reports.py b/calm/reports.py index 54a0d76..eb1078b 100644 --- a/calm/reports.py +++ b/calm/reports.py @@ -174,11 +174,49 @@ def deprecated(args, packages, reportlist): depp.po = po depp.v = bv depp.ts = po.tar(bv).mtime - # number of rdepends which have a different source package - depp.rdepends = len(list(p for p in po.rdepends if packages[arch][p].srcpackage(packages[arch][p].best_version) != es)) + + # filter rdepends + depp.rdepends = [] + for d in po.rdepends: + # have a different source package + bv = packages[arch][d].best_version + if packages[arch][d].srcpackage(bv) == es: + continue + + # current version has the dependency of interest + dpl = utils.deplist_without_verrel(packages[arch][d].version_hints[bv]['depends']) + if p not in dpl: + continue + + depp.rdepends.append(d) dep_list.append(depp) + # produce a rebuild report for each solib + for depp in dep_list: + if len(depp.rdepends) == 0: + continue + + body = io.StringIO() + print('<p>Packages needing a rebuild for a later version solib than %s.</p>' % depp.pn, file=body) + + print('<table class="grid sortable">', file=body) + print('<tr><th>package</th><th>srcpackage</th><th>version</th><th>timestamp</th></tr>', file=body) + + for r in sorted(depp.rdepends): + po = packages[arch][r] + bv = po.best_version + spn = po.srcpackage(bv) + spo = packages[arch][spn] + + print('<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>' % + (linkify(r, po), linkify(spn, spo), bv, pkg2html.tsformat(po.tar(bv).mtime)), file=body) + + print('</table>', file=body) + + write_report(args, 'Package needing rebuilds (%s)' % depp.pn, body, 'so_rebuild_%s.html' % depp.pn, reportlist, not_empty=False) + + # then produce an overall report body = io.StringIO() print(textwrap.dedent('''\ <p>Packages for old soversions. (The corresponding source package produces a @@ -187,9 +225,13 @@ def deprecated(args, packages, reportlist): print('<table class="grid sortable">', file=body) print('<tr><th>package</th><th>version</th><th>timestamp</th><th>rdepends</th></tr>', file=body) - for depp in sorted(dep_list, key=lambda i: (i.rdepends, i.ts), reverse=True): + for depp in sorted(dep_list, key=lambda i: (len(i.rdepends), i.ts), reverse=True): + len_link = len(depp.rdepends) + if len_link: + len_link = '<a href="so_rebuild_%s.html">%s</a>' % (depp.pn, len_link) + print('<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>' % - (linkify(depp.pn, depp.po), depp.v, pkg2html.tsformat(depp.ts), depp.rdepends), file=body) + (linkify(depp.pn, depp.po), depp.v, pkg2html.tsformat(depp.ts), len_link), file=body) print('</table>', file=body) diff --git a/calm/utils.py b/calm/utils.py index 26e3655..f6679fb 100644 --- a/calm/utils.py +++ b/calm/utils.py @@ -30,6 +30,7 @@ import email.utils import filecmp import logging import os +import re import subprocess from contextlib import contextmanager @@ -198,3 +199,13 @@ def sendmail(hdr, msg): logging.debug('sendmail: msgid %s, exit status %d' % (m['Message-Id'], p.returncode)) return m['Message-Id'] + + +# +# remove version-constrains from a list of dependencies +# +def deplist_without_verrel(dl): + dpl = dl.split(',') + dpl = [dp.strip() for dp in dpl] + dpl = [re.sub(r'(.*)\s+\(.*\)', r'\1', dp) for dp in dpl] + return dpl diff --git a/test/testdata/process_arch/packages.json.expected b/test/testdata/process_arch/packages.json.expected index a915f4d..2c41b14 100644 --- a/test/testdata/process_arch/packages.json.expected +++ b/test/testdata/process_arch/packages.json.expected @@ -63,12 +63,18 @@ ' "categories": [\n' ' "Base"\n' ' ],\n' + ' "depends": [\n' + ' "base-cygwin"\n' + ' ],\n' ' "name": "cygwin"\n' ' },\n' ' {\n' ' "categories": [\n' ' "Debug"\n' ' ],\n' + ' "depends": [\n' + ' "cygwin-debuginfo"\n' + ' ],\n' ' "name": "cygwin-debuginfo"\n' ' },\n' ' {\n' @@ -102,6 +108,9 @@ ' "categories": [\n' ' "Utils"\n' ' ],\n' + ' "depends": [\n' + ' "openssh"\n' + ' ],\n' ' "name": "keychain"\n' ' }\n' ' ],\n' @@ -126,6 +135,9 @@ ' "categories": [\n' ' "Net"\n' ' ],\n' + ' "depends": [\n' + ' "libdns_sd1"\n' + ' ],\n' ' "name": "libdns_sd-devel"\n' ' },\n' ' {\n' @@ -138,6 +150,9 @@ ' "categories": [\n' ' "Net"\n' ' ],\n' + ' "depends": [\n' + ' "libdns_sd1"\n' + ' ],\n' ' "name": "mDNSResponder"\n' ' }\n' ' ],\n' @@ -224,6 +239,10 @@ ' "categories": [\n' ' "Base"\n' ' ],\n' + ' "depends": [\n' + ' "base-cygwin",\n' + ' "per-version"\n' + ' ],\n' ' "name": "per-version-replacement-hint-only"\n' ' }\n' ' ],\n' @@ -247,6 +266,9 @@ ' "categories": [\n' ' "Base"\n' ' ],\n' + ' "depends": [\n' + ' "base-cygwin"\n' + ' ],\n' ' "name": "per-version"\n' ' }\n' ' ],\n' @@ -347,7 +369,15 @@ ' "categories": [\n' ' "Devel"\n' ' ],\n' - ' "name": "test-c"\n' + ' "depends": [\n' + ' "test-d (>= 1.0)",\n' + ' "test-e"\n' + ' ],\n' + ' "name": "test-c",\n' + ' "obsoletes": [\n' + ' "obs-a",\n' + ' "obs-b"\n' + ' ]\n' ' }\n' ' ],\n' ' "summary": "test package C",\n' @@ -381,6 +411,7 @@ ' "arches": [\n' ' "x86_64"\n' ' ],\n' + ' "build-depends": "cygwin-devel",\n' ' "name": "test-e",\n' ' "subpackages": [\n' ' {\n' @@ -411,6 +442,9 @@ ' "categories": [\n' ' "Devel"\n' ' ],\n' + ' "depends": [\n' + ' "cygwin"\n' + ' ],\n' ' "name": "testpackage"\n' ' },\n' ' {\n'
reply other threads:[~2024-04-07 17:54 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20240407175440.38AFF3858C32@sourceware.org \ --to=jturney@sourceware.org \ --cc=cygwin-apps-cvs@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).