public inbox for cygwin-apps-cvs@sourceware.org
help / color / mirror / Atom feed
* [calm - Cygwin server-side packaging maintenance script] branch master, updated. 20210110-2-ged5a8f8
@ 2021-02-10 15:14 Jon TURNEY
  0 siblings, 0 replies; only message in thread
From: Jon TURNEY @ 2021-02-10 15:14 UTC (permalink / raw)
  To: cygwin-apps-cvs




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

commit ed5a8f814447f0b2e7c12f9582d67546e871ffc0
Author: Jon Turney <jon.turney@dronecode.org.uk>
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 <jon.turney@dronecode.org.uk>
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)
 
 #
 #



^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-02-10 15:14 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-02-10 15:14 [calm - Cygwin server-side packaging maintenance script] branch master, updated. 20210110-2-ged5a8f8 Jon TURNEY

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).