From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2201) id 38AFF3858C32; Sun, 7 Apr 2024 17:54:40 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 38AFF3858C32 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1712512480; bh=lEfUtkC+Z/Njl+pWXzh1RULqb9Lfb+Vic57SXm2cYVE=; h=To:Subject:Date:From:From; b=LHf/jqPi2o8kQXtuXYezDNoLYcAcrGXdmO4kB+0AMgR0MnbQHQZOgvtJIGUni9V+z 20Xq0wr1K9clI2UJcy6O8541tsb6oNpv3AOXYI49zTCNZaLku5wDqvzHeLZbKRzlO3 JClqE8D4a8GMa3s9tNvlQpL+AZzhVu6ThieKsQt4= To: cygwin-apps-cvs@sourceware.org Subject: [calm - Cygwin server-side packaging maintenance script] branch master, updated. 20230209-85-g13248b3 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 06cbd1c6d571b38511b5fdb02fd1174662ddec4e X-Git-Newrev: 13248b3a30eee83bc91bd0d27e03593a77859e2b Message-Id: <20240407175440.38AFF3858C32@sourceware.org> Date: Sun, 7 Apr 2024 17:54:39 +0000 (GMT) From: Jon Turney List-Id: https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/calm.git;h=13248b3a30eee83bc91bd0d27e03593a77859e2b commit 13248b3a30eee83bc91bd0d27e03593a77859e2b Author: Jon Turney 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 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 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('

Packages needing a rebuild for a later version solib than %s.

' % depp.pn, file=body) + + print('', file=body) + print('', 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('' % + (linkify(r, po), linkify(spn, spo), bv, pkg2html.tsformat(po.tar(bv).mtime)), file=body) + + print('
packagesrcpackageversiontimestamp
%s%s%s%s
', 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('''\

Packages for old soversions. (The corresponding source package produces a @@ -187,9 +225,13 @@ def deprecated(args, packages, reportlist): print('', file=body) print('', 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 = '%s' % (depp.pn, len_link) + print('' % - (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('
packageversiontimestamprdepends
%s%s%s%s
', 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'