From 83fe701bf90750f0743e0e6677489431b18d60b2 Mon Sep 17 00:00:00 2001 From: Collin Funk Date: Wed, 27 Mar 2024 17:39:58 -0700 Subject: [PATCH] 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. --- ChangeLog | 10 ++++++++++ gnulib-tool.py.TODO | 1 - pygnulib/GLFileSystem.py | 43 +++++++++++++++++++++------------------- pygnulib/GLImport.py | 9 ++++----- 4 files changed, 37 insertions(+), 26 deletions(-) diff --git a/ChangeLog b/ChangeLog index bc31b14bd2..aa7df63120 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2024-03-27 Collin Funk + + 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 obstack: Work around ICE with Oracle cc 12.6 (regr. 2023-12-01). diff --git a/gnulib-tool.py.TODO b/gnulib-tool.py.TODO index d7da337f20..48c9e39fa8 100644 --- a/gnulib-tool.py.TODO +++ b/gnulib-tool.py.TODO @@ -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. diff --git a/pygnulib/GLFileSystem.py b/pygnulib/GLFileSystem.py index 0397af4df3..a155c7f0a0 100644 --- a/pygnulib/GLFileSystem.py +++ b/pygnulib/GLFileSystem.py @@ -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, 'r', encoding='utf-8') as file: + src_data = file.read() + # Write the transformed data to the temporary file. + with open(tmpfile, 'w', 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. diff --git a/pygnulib/GLImport.py b/pygnulib/GLImport.py index fcaffea650..07be6742a1 100644 --- a/pygnulib/GLImport.py +++ b/pygnulib/GLImport.py @@ -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 -- 2.44.0