[calm - Cygwin server-side packaging maintenance script] branch master, updated. 20210110-2-ged5a8f8

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=ed5a8f814447f0b2e7c12f9582d67546e871ffc0

commit ed5a8f814447f0b2e7c12f9582d67546e871ffc0
Author: Jon Turney <[email protected]>
Date:   Sun Feb 7 16:24:30 2021 +0000

    Update perl annotation tool
    
    Update perl annotation tool to update requires: with the appropriate
    provide name stored in an annotation, where it looks like it should be
    needed, now we actually have them.

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

commit c7759627578cc49d007f47982646b7e24a37ce95
Author: Jon Turney <[email protected]>
Date:   Sun Jan 10 19:38:25 2021 +0000

    Ignore B902 flake
    
    Ignore 'B902 blind except Exception: statement' flake.
    
    This isn't ideal. Three of these places are where we would otherwise
    have to enumerate all possible exceptions which could be raised during
    reading a compressed archive.
    
    The final place is were we are catching any possible exception to log
    before terminating, so really needs to be blind.


Diff:
---
 .flake8                        |  2 +-
 calm/fix-annotate-perl-hint.py | 82 ++++++++++++++++++++++++++++++++++--------
 2 files changed, 68 insertions(+), 16 deletions(-)

diff --git a/.flake8 b/.flake8
index 81548f7..0baa6cd 100644
--- a/.flake8
+++ b/.flake8
@@ -1,3 +1,3 @@
 [flake8]
-ignore=E741,E129,W504,A003
+ignore=E741,E129,W504,A003,B902
 max-line-length=240
diff --git a/calm/fix-annotate-perl-hint.py b/calm/fix-annotate-perl-hint.py
index 0f2679a..41ab770 100644
--- a/calm/fix-annotate-perl-hint.py
+++ b/calm/fix-annotate-perl-hint.py
@@ -24,31 +24,36 @@
 import argparse
 import logging
 import os
+import re
 import shutil
 import sys
+import tarfile
+import xtarfile
 
 from . import common_constants
 from . import hint
 
+# packages which are known to embed a perl interpreter or contain perl extension
+# dlls (i.e. link with libperl)
+known_packages = [
+    'perl-gdal',
+    'hexchat-perl',
+    'irssi',
+    'postgresql-contrib',
+    'postgresql-plperl',
+    'rxvt-unicode',
+    'weechat-perl',
+    'znc-perl',
+]
+
 #
 #
 #
 
 
-def fix_one_hint(dirpath, hintfile):
+def fix_one_hint(dirpath, hintfile, tf):
     pn = os.path.join(dirpath, hintfile)
 
-    annotation = False
-    with open(pn, 'r') as f:
-        for l in f:
-            if '# perl5_26' in l:
-                logging.info("%s has annotation comment" % (hintfile))
-                annotation = True
-                break
-
-    if not annotation:
-        return
-
     hints = hint.hint_file_parse(pn, hint.pvr)
 
     hints.pop('parse-warnings', None)
@@ -56,18 +61,65 @@ def fix_one_hint(dirpath, hintfile):
         logging.error('invalid hints %s' % hintfile)
         return
 
-    hints['notes'] = 'perl5_26'
+    modified = False
+
+    # if no annotation yet, add a perl annotation
+    if 'notes' not in hints:
+        requires = hints.get('requires', '').split()
+        if requires:
+            if ('perl_base' in requires) or ('perl' in requires):
+                logging.info("%s has perl in requires and no annotations" % (hintfile))
+                hints['notes'] = 'perl5_030'
+                modified = True
+
+    # if annotated, check if this package installs into vendor_perl, and if so,
+    # add the annotate perl version to requires, if not already present
+    if hints.get('notes', '').startswith('perl5_0'):
+        ivp = False
+        exe = False
+
+        try:
+            with xtarfile.open(os.path.join(dirpath, tf), mode='r') as a:
+                ivp = any(re.match(r'usr/(lib|share)/perl5/vendor_perl/', m) for m in a.getnames())
+                exe = any(re.search(r'\.(exe|dll)$', m) for m in a.getnames())
+        except tarfile.ReadError:
+            pass
+
+        knwn = any(hintfile.startswith(k) for k in known_packages)
+
+        if ivp or knwn:
+            requires = hints.get('requires', '').split()
+            if hints['notes'] not in requires:
+                requires.append(hints['notes'])
+                requires = sorted(requires)
+                modified = True
+                logging.warning("adding perl provide to requires in %s" % (hintfile))
+            hints['requires'] = ' '.join(requires)
+        else:
+            if exe:
+                logging.info("%s has perl in requires, and might have content linked to libperl" % (hintfile))
+            else:
+                logging.info("%s has perl in requires, assuming that's for a perl script" % (hintfile))
+
+    if not modified:
+        return
 
     # write updated hints
     shutil.copy2(pn, pn + '.bak')
     hint.hint_file_write(pn, hints)
+    # os.system('/usr/bin/diff -uBZ %s %s' % (pn + '.bak', pn))
 
 
 def fix_hints(relarea):
     for (dirpath, _subdirs, files) in os.walk(relarea):
         for f in files:
-            if f.endswith('.hint'):
-                fix_one_hint(dirpath, f)
+            match = re.match(r'^([^-].*?)\.tar' + common_constants.PACKAGE_COMPRESSIONS_RE + r'$', f)
+            if match:
+                root = match.group(1)
+                if root.endswith('-src'):
+                    continue
+
+                fix_one_hint(dirpath, root + '.hint', f)
 
 #
 #
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.