[calm - Cygwin server-side packaging maintenance script] branch master, updated. 20210626-36-g417126b

Jon TURNEY via Cygwin-apps-cvs <[email protected]>
Newsgroups gmane.os.cygwin.cvs.apps
Message-ID <[email protected]>


https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/calm.git;h=417126bee6afcf6f5f3110d7fa8f7d5c5316c8fa

commit 417126bee6afcf6f5f3110d7fa8f7d5c5316c8fa
Author: Jon Turney <[email protected]>
Date:   Sat Mar 5 16:33:05 2022 +0000

    Factor out navigating from pkg to srcpkg

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/calm.git;h=8a55677b7ddc5f268ffd8a0759ae970a0c099ca3

commit 8a55677b7ddc5f268ffd8a0759ae970a0c099ca3
Author: Jon Turney <[email protected]>
Date:   Mon Feb 28 16:34:29 2022 +0000

    Give unmaintained packages the 'unmaintained' pseudo-category
    
    Give unmaintained packages the 'unmaintained' pseudo-category in
    setup.ini

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/calm.git;h=2842bf596c73a76dab7dc26d4d85b8009a6016c1

commit 2842bf596c73a76dab7dc26d4d85b8009a6016c1
Author: Jon Turney <[email protected]>
Date:   Thu Mar 3 16:34:17 2022 +0000

    Drop MoveList.copy()
    
    Unneeded since 46bebfc1

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/calm.git;h=c4c43f1c5813ba64cefd98354ec0d321a319f883

commit c4c43f1c5813ba64cefd98354ec0d321a319f883
Author: Jon Turney <[email protected]>
Date:   Fri Mar 4 17:00:17 2022 +0000

    Drop mailhost & mailport from BufferingSMTPHandler
    
    Drop mailhost & mailport from BufferingSMTPHandler, unused since
    356b1abe changed from using SMTP to sendmail.


Diff:
---
 calm/buffering_smtp_handler.py                |  3 --
 calm/common_constants.py                      |  4 ---
 calm/movelist.py                              | 16 ---------
 calm/package.py                               | 49 +++++++++++++++++++--------
 calm/pkg2html.py                              |  2 +-
 test/testdata/inifile/setup.ini.expected      |  6 ++--
 test/testdata/process_arch/setup.ini.expected |  6 ++--
 7 files changed, 41 insertions(+), 45 deletions(-)

diff --git a/calm/buffering_smtp_handler.py b/calm/buffering_smtp_handler.py
index c826d34..10b1e7b 100644
--- a/calm/buffering_smtp_handler.py
+++ b/calm/buffering_smtp_handler.py
@@ -34,12 +34,9 @@ class BufferingSMTPHandler(logging.handlers.BufferingHandler):
     def __init__(self,
                  toaddrs,
                  subject,
-                 mailhost=common_constants.MAILHOST,
                  fromaddr='[email protected]',
                  logging_format='%(levelname)s: %(message)s'):
         logging.handlers.BufferingHandler.__init__(self, capacity=0)
-        self.mailhost = mailhost
-        self.mailport = None
         self.fromaddr = fromaddr
         self.toaddrs = toaddrs
         self.subject = subject
diff --git a/calm/common_constants.py b/calm/common_constants.py
index ebbe834..203685d 100644
--- a/calm/common_constants.py
+++ b/calm/common_constants.py
@@ -66,9 +66,6 @@ PKGMAINT = '/www/sourceware/htdocs/cygwin/cygwin-pkg-maint'
 # removed files archive directory
 VAULT = '/sourceware/snapshot-tmp/cygwin'
 
-# SMTP smarthost
-MAILHOST = 'localhost'
-
 # defaults for package freshness
 DEFAULT_KEEP_COUNT = 3
 DEFAULT_KEEP_COUNT_TEST = 2
@@ -79,7 +76,6 @@ DEFAULT_KEEP_DAYS = 0
 if os.uname()[1] == 'tambora':
     EMAILS = '[email protected]'
     ALWAYS_BCC = ''
-    MAILHOST = 'allegra'
 
 # package compressions
 PACKAGE_COMPRESSIONS = ['bz2', 'gz', 'lzma', 'xz', 'zst']
diff --git a/calm/movelist.py b/calm/movelist.py
index c7bdde8..7bf445f 100644
--- a/calm/movelist.py
+++ b/calm/movelist.py
@@ -23,7 +23,6 @@
 
 import logging
 import os
-import shutil
 
 from collections import defaultdict
 from . import utils
@@ -91,18 +90,3 @@ class MoveList(object):
             if pi:
                 i.movelist[p] = pi
         return i
-
-    # copy the files in a movelist
-    def copy(self, args, fromdir, todir):
-        for p in sorted(self.movelist):
-            logging.debug("mkdir %s" % os.path.join(todir, p))
-            if not args.dryrun:
-                utils.makedirs(os.path.join(todir, p))
-            logging.debug("copy from '%s' to '%s':" % (os.path.join(fromdir, p), os.path.join(todir, p)))
-            for f in sorted(self.movelist[p]):
-                if os.path.exists(os.path.join(fromdir, p, f)):
-                    logging.debug("%s" % (f))
-                    if not args.dryrun:
-                        shutil.copy2(os.path.join(fromdir, p, f), os.path.join(todir, p, f))
-                else:
-                    logging.error("%s can't be copied as it doesn't exist" % (f))
diff --git a/calm/package.py b/calm/package.py
index 8c6a3f1..522689e 100755
--- a/calm/package.py
+++ b/calm/package.py
@@ -79,6 +79,22 @@ class Package(object):
     def versions(self):
         return self.tarfiles.keys()
 
+    def srcpackage(self, vr, suffix=True):
+        if self.kind == Kind.source:
+            spn = self.name
+        else:
+            # source tarfile is in the external-source package, if specified,
+            # otherwise it's in the sibling source package
+            hints = self.version_hints.get(vr, {})
+            spn = hints.get('external-source', self.name + '-src')
+
+        # strip '-src' suffix?
+        if not suffix:
+            if spn.endswith('-src'):
+                spn = spn[:-4]
+
+        return spn
+
 
 # information we keep about a tar file
 class Tar(object):
@@ -419,6 +435,7 @@ def read_one_package(packages, p, relpath, dirpath, files, remove, kind, strict)
             actual_tars[ovr] = tars[vr]
 
     packages[pn] = Package()
+    packages[pn].name = pn
     packages[pn].version_hints = version_hints
     packages[pn].override_hints = override_hints
     packages[pn].tarfiles = actual_tars
@@ -503,6 +520,7 @@ def validate_packages(args, packages, valid_requires_extra=None):
             packages[p].obsolete = False
             packages[p].rdepends = set()
             packages[p].build_rdepends = set()
+            packages[p].orphaned = False
 
     # perform various package validations
     for p in sorted(packages.keys()):
@@ -754,12 +772,7 @@ def validate_packages(args, packages, valid_requires_extra=None):
             sourceless = False
             missing_source = True
 
-            # source tarfile is in the external-source package, if specified,
-            # otherwise it's in the sibling source package
-            if 'external-source' in packages[p].version_hints[v]:
-                es_p = packages[p].version_hints[v]['external-source']
-            else:
-                es_p = p + '-src'
+            es_p = packages[p].srcpackage(v)
 
             # mark the source tarfile as being used by an install tarfile
             if es_p in packages:
@@ -836,7 +849,7 @@ def validate_packages(args, packages, valid_requires_extra=None):
 
             # ignore packages which have a different external-source:
             # (e.g. where a different source package supersedes this one)
-            es = packages[install_p].version_hints[packages[install_p].best_version].get('external-source', source_p)
+            es = packages[install_p].srcpackage(packages[install_p].best_version)
             if es != source_p:
                 continue
 
@@ -878,6 +891,7 @@ def validate_package_maintainers(args, packages):
     # read maintainer list
     mlist = {}
     mlist = maintainers.add_packages(mlist, args.pkglist)
+    pkg_maintainers = maintainers.invert(mlist)
 
     # make the list of all packages
     all_packages = maintainers.all_packages(mlist)
@@ -900,7 +914,7 @@ def validate_package_maintainers(args, packages):
         # validate that the source package has a maintainer
         bv = packages[p].best_version
         if bv:
-            es = packages[p].version_hints[bv].get('external-source', p)
+            es = packages[p].srcpackage(bv)
             if es in packages:
                 es_pn = packages[es].orig_name
                 if es_pn not in all_packages and p not in all_packages:
@@ -908,6 +922,10 @@ def validate_package_maintainers(args, packages):
                         logging.error("package '%s' is not obsolete, but has no maintainer" % (p))
                         error = True
 
+        if 'ORPHANED' in pkg_maintainers[packages[p].orig_name]:
+            # note orphaned packages
+            packages[p].orphaned = True
+
     return error
 
 
@@ -969,9 +987,13 @@ def write_setup_ini(args, packages, arch):
             if 'ldesc' in po.version_hints[bv]:
                 print("ldesc: %s" % po.version_hints[bv]['ldesc'], file=f)
 
+            # mark orphaned packages with the 'unmaintained' pseudo-category
+            category = po.version_hints[bv]['category']
+            if po.orphaned:
+                category += ' unmaintained'
             # for historical reasons, category names must start with a capital
             # letter
-            category = ' '.join(map(upper_first_character, po.version_hints[bv]['category'].split()))
+            category = ' '.join(map(upper_first_character, category.split()))
             print("category: %s" % category, file=f)
 
             # compute the union of requires for all versions
@@ -1074,12 +1096,9 @@ def write_setup_ini(args, packages, arch):
                 hints = po.version_hints.get(version, {})
 
                 # follow external-source
-                if 'external-source' in hints:
-                    s = hints['external-source']
-                else:
-                    s = sibling_src
-                    if s not in packages:
-                        s = None
+                s = po.srcpackage(version)
+                if s not in packages:
+                    s = None
 
                 # external-source points to a source file in another package
                 if s:
diff --git a/calm/pkg2html.py b/calm/pkg2html.py
index b2080dc..ae6a6a7 100755
--- a/calm/pkg2html.py
+++ b/calm/pkg2html.py
@@ -243,7 +243,7 @@ def update_package_listings(args, packages):
                         if homepage:
                             print('<span class="detail">homepage</span>: <a href="%s">%s</a><br><br>' % (homepage, homepage), file=f)
                     else:
-                        es = po.version_hints[bv].get('external-source', p + '-src')
+                        es = po.srcpackage(bv)
                         print('<span class="detail">source package</span>: %s<br><br>' % linkify_package(es), file=f)
 
                     es_po = arch_package(packages, es)
diff --git a/test/testdata/inifile/setup.ini.expected b/test/testdata/inifile/setup.ini.expected
index 3f583d7..b96b8a9 100644
--- a/test/testdata/inifile/setup.ini.expected
+++ b/test/testdata/inifile/setup.ini.expected
@@ -339,7 +339,7 @@
  '\n'
  '@ test-c\n'
  'sdesc: "test package C"\n'
- 'category: Devel\n'
+ 'category: Devel Unmaintained\n'
  'requires: test-d test-e\n'
  'version: 1.0-1\n'
  'install: noarch/release/test-c/test-c-1.0-1.tar.xz 256 '
@@ -351,7 +351,7 @@
  '\n'
  '@ test-d\n'
  'sdesc: "test package D"\n'
- 'category: Devel\n'
+ 'category: Devel Unmaintained\n'
  'version: 1.0.42590-1\n'
  'install: noarch/release/test-d/test-d-1.0-1.tar.xz 236 '
  '2e47817b620a7dbfe6810d47aee0adbcdf4663dc57932bcc51fc4b9bcfafa00dbbc2bfbefb1692dd5f6cc5333f23aea324d7c4d9b2ca091b917811fcdb70ca1f\n'
@@ -360,7 +360,7 @@
  '\n'
  '@ test-e\n'
  'sdesc: "test package E"\n'
- 'category: Devel\n'
+ 'category: Devel Unmaintained\n'
  'version: 1.0-1\n'
  'install: noarch/release/test-e/test-e-1.0-1.tar.xz 236 '
  '2e47817b620a7dbfe6810d47aee0adbcdf4663dc57932bcc51fc4b9bcfafa00dbbc2bfbefb1692dd5f6cc5333f23aea324d7c4d9b2ca091b917811fcdb70ca1f\n'
diff --git a/test/testdata/process_arch/setup.ini.expected b/test/testdata/process_arch/setup.ini.expected
index d97f1a3..9e9fb93 100644
--- a/test/testdata/process_arch/setup.ini.expected
+++ b/test/testdata/process_arch/setup.ini.expected
@@ -328,7 +328,7 @@
  '\n'
  '@ test-c\n'
  'sdesc: "test package C"\n'
- 'category: Devel\n'
+ 'category: Devel Unmaintained\n'
  'requires: test-d test-e\n'
  'version: 1.0-1\n'
  'install: noarch/release/test-c/test-c-1.0-1.tar.xz 256 '
@@ -340,7 +340,7 @@
  '\n'
  '@ test-d\n'
  'sdesc: "test package D"\n'
- 'category: Devel\n'
+ 'category: Devel Unmaintained\n'
  'version: 1.0.42590-1\n'
  'install: noarch/release/test-d/test-d-1.0-1.tar.xz 236 '
  '2e47817b620a7dbfe6810d47aee0adbcdf4663dc57932bcc51fc4b9bcfafa00dbbc2bfbefb1692dd5f6cc5333f23aea324d7c4d9b2ca091b917811fcdb70ca1f\n'
@@ -349,7 +349,7 @@
  '\n'
  '@ test-e\n'
  'sdesc: "test package E"\n'
- 'category: Devel\n'
+ 'category: Devel Unmaintained\n'
  'version: 1.0-1\n'
  'install: noarch/release/test-e/test-e-1.0-1.tar.xz 236 '
  '2e47817b620a7dbfe6810d47aee0adbcdf4663dc57932bcc51fc4b9bcfafa00dbbc2bfbefb1692dd5f6cc5333f23aea324d7c4d9b2ca091b917811fcdb70ca1f\n'
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.