Diff:
---
calm/calm.py | 10 ++++---
calm/pkg2html.py | 9 +++++--
calm/repology.py | 81 +++++++++++++++++++++++++++++++++++--------------------
calm/reports.py | 13 +++++++--
calm/uploads.py | 2 ++
test/test_calm.py | 3 +--
6 files changed, 80 insertions(+), 38 deletions(-)
diff --git a/calm/calm.py b/calm/calm.py
index 5099ecc..21cb30f 100755
--- a/calm/calm.py
+++ b/calm/calm.py
@@ -188,7 +188,7 @@ def process_maintainer_uploads(args, state, all_packages,
m, basedir, desc, scru
uploads.auth_check(args, m, scan_result, state.packages)
if scan_result.error:
- logging.error("error while reading uploadedpackages from maintainer
%s" % (m.name))
+ logging.error("error while reading uploaded packages from maintainer
%s" % (m.name))
success = False
if success:
@@ -228,11 +228,15 @@ def _announce_upload(args, scan_result, maintainer, r):
ldesc = po.version_hints[version]['ldesc'].strip('"')
test = 'test' in po.version_hints[version]
- pkglist.add(po.orig_name)
+ # not totally clear how we should name source packages, so omit them
for
+ # the moment
+ if po.kind == package.Kind.binary:
+ pkglist.add(po.orig_name)
if not srcpkg:
logging.error("could not locate source package in upload")
return
+
logging.debug("source package is %s, version %s, test %s",
srcpkg.orig_name, version, test)
# find source tarfile for this particular package version
@@ -248,7 +252,7 @@ def _announce_upload(args, scan_result, maintainer, r):
cl = ''
with xtarfile.open(tf, mode='r') as a:
files = a.getnames()
- for readme in ['README', srcpkg.orig_name + '.README', 'ANNOUNCE']:
+ for readme in ['README', srcpkg.orig_name + '.README', 'ANNOUNCE',
'ChangeLog']:
fn = srcpkg.orig_name + '-' + version + '.src/' + readme
if fn in files:
logging.debug("extracting %s from archive for changelog" %
readme)
diff --git a/calm/pkg2html.py b/calm/pkg2html.py
index 1cca3e8..9df0375 100755
--- a/calm/pkg2html.py
+++ b/calm/pkg2html.py
@@ -311,8 +311,13 @@ def update_package_listings(args, packages):
repology_pn = getattr(po, 'repology_project_name',
None)
if repology_pn:
- upstream_version = getattr(po, 'upstream_version',
'')
- details_table['repology info'] = '<a
href="https://repology.org/project/%s/information">%s</a> (%s)' % (repology_pn,
repology_pn, upstream_version)
+ upstream_version = getattr(po, 'upstream_version',
None)
+ if isinstance(upstream_version, str):
+ upstream_version = '(%s)' % upstream_version
+ else:
+ upstream_version = ''
+
+ details_table['repology info'] = '<a
href="https://repology.org/project/%s/information">%s</a> %s' % (repology_pn,
repology_pn, upstream_version)
if po.kind == package.Kind.binary:
doc_path = os.path.join(args.htdocs, 'doc', pn)
diff --git a/calm/repology.py b/calm/repology.py
index cc374a8..8c715d9 100644
--- a/calm/repology.py
+++ b/calm/repology.py
@@ -28,10 +28,12 @@
import json
import logging
+import re
import time
import urllib.error
import urllib.request
from collections import namedtuple
+from enum import Enum, auto, unique
from .version import SetupVersion
@@ -39,22 +41,28 @@ REPOLOGY_API_URL = 'https://repology.org/api/v1/projects/'
last_check = 0
last_data = {}
-LegacyData = namedtuple('LegacyData', ['version', 'ignores'])
-use_legacy = {'qt': [LegacyData('5', []),
- LegacyData('4', []),
- LegacyData('3', [])],
- 'gtk': [LegacyData('3', ['3.9', '+']),
- LegacyData('2', [])],
- 'gtksourceview': [LegacyData('2', []),
- LegacyData('3', []),
- LegacyData('4', []),
- LegacyData('5', []),
- ]
- }
+LegacyData = namedtuple('LegacyData', ['version_re', 'ignores'])
+use_legacy = {
+ 'automake': LegacyData(r'\d.\d+', ['+']),
+ 'gtk': LegacyData(r'\d', ['3.9', '+', '-']),
+ 'gtksourceview': LegacyData(r'\d', []),
+ 'qt': LegacyData(r'\d', ['p']),
+}
RepologyData = namedtuple('RepologyData', ['upstream_version',
'repology_project_name'])
+@unique
+class UnknownVersion(Enum):
+ noscheme = auto()
+ unique = auto()
+ unclassified = auto()
+ unknown = auto()
+
+ def __str__(self):
+ return self.name
+
+
def repology_fetch_data():
repology_data = {}
last_pn = ''
@@ -93,17 +101,17 @@ def repology_fetch_data():
newest_version.append(v)
if (pn in use_legacy) and (i['status'] in ['legacy',
'outdated']):
- prefix = None
- for ld in use_legacy[pn]:
- if v.startswith(ld.version):
- prefix = ld.version
- break
+ ld = use_legacy[pn]
+ prefix_re = ld.version_re
- if not prefix:
+ m = re.match(r'^(' + prefix_re + r')', v)
+ if m:
+ prefix = m.group(1)
+ else:
continue
- # blacklist versions containing substrings (pre-release
- # versions etc.)
+ # blacklist versions containing certain substrings
+ # (pre-release versions etc.)
if any(ignore in v for ignore in ld.ignores):
continue
@@ -112,11 +120,22 @@ def repology_fetch_data():
if SetupVersion(v) >
SetupVersion(legacy_versions.get(prefix, '0')):
legacy_versions[prefix] = v
+ # if we couldn't find a newest_version...
if not newest_version:
- continue
-
- # XXX: if everything is noscheme, we can probably record that
- # information as well.
+ # if everything is noscheme, that's the reason
+ if all(i['status'] in ['noscheme', 'rolling'] for i in p):
+ newest_version.append(UnknownVersion.noscheme)
+ # if this package is unique to cygwin, that's the reason
+ elif all(i['status'] in ['unique'] for i in p):
+ newest_version.append(UnknownVersion.unique)
+ # if repology's not sure what upstream this package belongs to
+ elif pn.endswith('unclassified'):
+ newest_version.append(UnknownVersion.unclassified)
+ # if repology (probably correctly) thinks there's something
+ # weird about this package...
+ else:
+ newest_version.append(UnknownVersion.unknown)
+ logging.info("repology can't help with latest version for
project %s" % (pn))
# next, assign that version to all the corresponding cygwin source
# packages
@@ -130,12 +149,16 @@ def repology_fetch_data():
# if package name contains legacy version
if pn in use_legacy:
prefix = None
- for ld in use_legacy[pn]:
- if (pn + ld.version) in source_pn:
- prefix = ld.version
+ for p in legacy_versions:
+ if (pn + p) in source_pn:
+ prefix = p
+ break
+
+ if prefix:
+ upstream_version = [legacy_versions[prefix]]
+ else:
+ upstream_version = newest_version
- if prefix and prefix in legacy_versions:
- upstream_version = legacy_versions[prefix]
else:
# otherwise, just use the newest version(s)
upstream_version = newest_version
diff --git a/calm/reports.py b/calm/reports.py
index b8b4559..161921a 100644
--- a/calm/reports.py
+++ b/calm/reports.py
@@ -136,12 +136,21 @@ def maintainer_packages(args, packages, maintainer,
reportlist):
up.pn = p
up.po = po
up.v = SetupVersion(v).V
- up.upstream_v = getattr(po, 'upstream_version', 'unknown')
up.ts = po.tar(v).mtime
up.rdepends = len(rdepends)
up.build_rdepends = len(build_rdepends)
up.importance = po.importance
- up.status = SetupVersion._compare(SetupVersion(v)._V,
SetupVersion(up.upstream_v)._V)
+
+ up.upstream_v = getattr(po, 'upstream_version', None)
+ if isinstance(up.upstream_v, str):
+ up.status = SetupVersion._compare(SetupVersion(v)._V,
SetupVersion(up.upstream_v)._V)
+ else:
+ if up.upstream_v is None:
+ up.upstream_v = 'unknown'
+ else:
+ up.upstream_v = 'unknown (%s)' % up.upstream_v
+
+ up.status = 1 # uncertainty
um_list.append(up)
diff --git a/calm/uploads.py b/calm/uploads.py
index 1c2d922..412bfe6 100644
--- a/calm/uploads.py
+++ b/calm/uploads.py
@@ -156,11 +156,13 @@ def scan(scandir, m, all_packages, args):
# package doesn't appear in package list at all?
superpackage = splitpath[2]
if superpackage not in all_packages:
+ error = True
logging.error("package '%s' is not in the package list" %
superpackage)
continue
# only process packages for which we are listed as a maintainer, or we
are a trusted maintainer
if not ((superpackage in m.pkgs) or (m.name in
args.trustedmaint.split('/'))):
+ error = True
logging.warning("package '%s' is not in the package list for
maintainer '%s'" % (superpackage, m.name))
continue
diff --git a/test/test_calm.py b/test/test_calm.py
index c87ad6c..78effd1 100755
--- a/test/test_calm.py
+++ b/test/test_calm.py
@@ -314,7 +314,7 @@ class CalmTest(unittest.TestCase):
oldcwd = os.getcwd()
os.chdir(test_root)
- pkglist = ['after-ready', 'not-ready', 'testpackage', 'testpackage2',
'testpackage-zstd']
+ pkglist = ['after-ready', 'corrupt', 'not-ready', 'testpackage',
'testpackage2', 'testpackage-zstd']
mlist = {}
mlist = maintainers.add_directories(mlist, 'testdata/homes')
@@ -468,7 +468,6 @@ class CalmTest(unittest.TestCase):
# set appropriate !readys
m_homedir = os.path.join(args.homedir, 'Blooey McFooey')
ready_fns = [(os.path.join(m_homedir, 'x86_64', 'release',
'testpackage', '!ready'), ''),
- (os.path.join(m_homedir, 'x86_64', 'release',
'testpackage2', 'testpackage2-subpackage', '!ready'), ''),
(os.path.join(m_homedir, 'x86_64', 'release',
'after-ready', '!ready'), '-t 198709011700'),
(os.path.join(m_homedir, 'noarch', 'release',
'perl-Net-SMTP-SSL', '!ready'), ''),
(os.path.join(m_homedir, 'x86_64', 'release', 'corrupt',
'!ready'), ''),
[calm - Cygwin server-side packaging maintenance script] branch master, updated. 20250329-17-gb24400e
Jon Turney via Cygwin-apps-cvs Fri, 11 Jul 2025 06:21:05 -0700
