]> Savannah Git Hosting - gnulib.git/commitdiff
gnulib-tool.py: Inline 'sed' invocations used on library files.
authorCollin Funk <collin.funk1@gmail.com>
Thu, 28 Mar 2024 00:39:58 +0000 (17:39 -0700)
committerBruno Haible <bruno@clisp.org>
Thu, 28 Mar 2024 01:19:27 +0000 (02:19 +0100)
* pygnulib/GLFileSystem.py (GLFileAssistant.__init__): Update type hints
and docstrings to reflect changes necessary for using re.sub() instead
of 'sed'.
(GLFileAssistant.add_or_update): Use re.sub() instead of invoking 'sed'.
* pygnulib/GLImport.py (GLImport.prepare): Update transformation
variables to reflect changes to GLFileAssistant.

ChangeLog
gnulib-tool.py.TODO
pygnulib/GLFileSystem.py
pygnulib/GLImport.py

index bc31b14bd2890fd2e970c300ec64a266c9eef497..aa7df631205c2e610ea34a7431cdd46e304c0875 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2024-03-27  Collin Funk  <collin.funk1@gmail.com>
+
+       gnulib-tool.py: Inline 'sed' invocations used on library files.
+       * pygnulib/GLFileSystem.py (GLFileAssistant.__init__): Update type hints
+       and docstrings to reflect changes necessary for using re.sub() instead
+       of 'sed'.
+       (GLFileAssistant.add_or_update): Use re.sub() instead of invoking 'sed'.
+       * pygnulib/GLImport.py (GLImport.prepare): Update transformation
+       variables to reflect changes to GLFileAssistant.
+
 2024-03-27  Bruno Haible  <bruno@clisp.org>
 
        obstack: Work around ICE with Oracle cc 12.6 (regr. 2023-12-01).
index d7da337f2061abb166c351e06cbeef0355828c5f..48c9e39fa8c90b2cfb99ad8208345e8dd2248f40 100644 (file)
@@ -9,7 +9,6 @@ Optimize:
   - os.chdir around subprocess creation -> cwd=... argument instead.
   - Inline all 'sed' invocations:
     main.py:1387:                args = ['sed', '-e', sed_table, tempname]
-    GLFileSystem.py:382:                args = ['sed', '-e', transformer]
 
 Various other refactorings, as deemed useful.
 
index 0397af4df392fdc1603e26d3d25e3957d09a8ac7..fe5e0507611dcf563cb86cc86cb4e76c224e5038 100644 (file)
@@ -19,6 +19,7 @@ from __future__ import annotations
 # Define global imports
 #===============================================================================
 import os
+import re
 import codecs
 import filecmp
 import subprocess as sp
@@ -163,8 +164,13 @@ class GLFileSystem(object):
 class GLFileAssistant(object):
     '''GLFileAssistant is used to help with file processing.'''
 
-    def __init__(self, config: GLConfig, transformers: dict = dict()):
-        '''Create GLFileAssistant instance.'''
+    def __init__(self, config: GLConfig, transformers: dict[str, tuple[re.Pattern, str] | None] = {}) -> None:
+        '''Create GLFileAssistant instance.
+
+        config stores information shared between classes.
+        transformers is a dictionary which uses a file category as the key. The
+          value accessed is a tuple containing arguments for re.sub() or None if
+          no transformations are needed.'''
         if type(config) is not GLConfig:
             raise TypeError('config must be a GLConfig, not %s'
                             % type(config).__name__)
@@ -173,11 +179,11 @@ class GLFileAssistant(object):
                             % type(transformers).__name__)
         for key in ['lib', 'aux', 'main', 'tests']:
             if key not in transformers:
-                transformers[key] = 's,x,x,'
+                transformers[key] = None
             else:  # if key in transformers
                 value = transformers[key]
-                if type(value) is not str:
-                    raise TypeError('transformers[%s] must be a string, not %s'
+                if type(value) is not tuple and value != None:
+                    raise TypeError('transformers[%s] must be a tuple or None, not %s'
                                     % (key, type(value).__name__))
         self.original = None
         self.rewritten = None
@@ -341,10 +347,10 @@ class GLFileAssistant(object):
             xoriginal = substart('tests=lib/', 'lib/', original)
         lookedup, tmpflag = self.filesystem.lookup(xoriginal)
         tmpfile = self.tmpfilename(rewritten)
-        sed_transform_lib_file = self.transformers.get('lib', '')
-        sed_transform_build_aux_file = self.transformers.get('aux', '')
-        sed_transform_main_lib_file = self.transformers.get('main', '')
-        sed_transform_testsrelated_lib_file = self.transformers.get('tests', '')
+        sed_transform_lib_file = self.transformers.get('lib')
+        sed_transform_build_aux_file = self.transformers.get('aux')
+        sed_transform_main_lib_file = self.transformers.get('main')
+        sed_transform_testsrelated_lib_file = self.transformers.get('tests')
         try:  # Try to copy lookedup file to tmpfile
             copyfile(lookedup, tmpfile)
             ensure_writable(tmpfile)
@@ -352,7 +358,7 @@ class GLFileAssistant(object):
             raise GLError(15, lookedup)
         # Don't process binary files with sed.
         if not (original.endswith(".class") or original.endswith(".mo")):
-            transformer = ''
+            transformer = None
             if original.startswith('lib/'):
                 if sed_transform_main_lib_file:
                     transformer = sed_transform_main_lib_file
@@ -362,16 +368,13 @@ class GLFileAssistant(object):
             elif original.startswith('tests=lib/'):
                 if sed_transform_testsrelated_lib_file:
                     transformer = sed_transform_testsrelated_lib_file
-            if transformer:
-                args = ['sed', '-e', transformer]
-                stdin = codecs.open(lookedup, 'rb', 'UTF-8')
-                try:  # Try to transform file
-                    data = sp.check_output(args, stdin=stdin, shell=False)
-                    data = data.decode("UTF-8")
-                except Exception as error:
-                    raise GLError(16, lookedup)
-                with codecs.open(tmpfile, 'wb', 'UTF-8') as file:
-                    file.write(data)
+            if transformer != None:
+                # Read the file that we looked up.
+                with open(lookedup, 'rb', encoding='utf-8') as file:
+                    src_data = file.read()
+                # Write the transformed data to the temporary file.
+                with open(tmpfile, 'wb', encoding='utf-8') as file:
+                    file.write(re.sub(transformer[0], transformer[1], src_data))
         path = joinpath(self.config['destdir'], rewritten)
         if isfile(path):
             # The file already exists.
index fcaffea6505728328b4898d7c6ed23728c5f09c6..07be6742a1b9d2a92e3e39a717bfcab3c6ac931c 100644 (file)
@@ -941,16 +941,15 @@ AC_DEFUN([%s_FILE_LIST], [\n''' % macro_prefix
                     print(notice)
 
         # Determine script to apply to imported library files.
-        sed_transform_lib_file = ''
+        sed_transform_lib_file = None
         if 'config-h' in [ str(module)
                            for module in main_modules ]:
-            sed_transform_lib_file += '''
-        s/^#ifdef[\t ]*HAVE_CONFIG_H[\t ]*$/#if 1/
-      '''
+            sed_transform_lib_file = (re.compile(r'^#ifdef[\t ]*HAVE_CONFIG_H[\t ]*$', re.MULTILINE), r'#if 1')
+
         sed_transform_main_lib_file = sed_transform_lib_file
 
         # Determine script to apply to auxiliary files that go into $auxdir/.
-        sed_transform_build_aux_file = ''
+        sed_transform_build_aux_file = None
 
         # Determine script to apply to library files that go into $testsbase/.
         sed_transform_testsrelated_lib_file = sed_transform_lib_file