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'), ''),

Reply via email to