Today's patches:

2022-08-13  Bruno Haible  <br...@clisp.org>

        gnulib-tool.py: Fix some code generation details.
        * pygnulib/GLEmiter.py: Don't produce Windows CR-LFs on Windows.
        (GLEmiter.po_Makevars): Emit a definition of top_builddir, not
        top_subdir.
        (GLEmiter.po_POTFILES_in): Fix result when sourcebase is 'tests' or
        something like that.
        (GLEmiter.initmacro_start): Add two more newlines (mistake from
        2021-04-11).

        gnulib-tool.py: Reduce code duplication.
        * pygnulib/constants.py (relinverse): New function.
        * pygnulib/GLEmiter.py (GLEmiter.po_Makevars,
        GLEmiter.tests_Makefile_am): Use it.
        * pygnulib/GLTestDir.py (GLTestDir.execute): Likewise.

From 01cd78f9d682ff75cc5ab1c2d21b911bdd9215b8 Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Sat, 13 Aug 2022 13:18:06 +0200
Subject: [PATCH 1/2] gnulib-tool.py: Reduce code duplication.

* pygnulib/constants.py (relinverse): New function.
* pygnulib/GLEmiter.py (GLEmiter.po_Makevars,
GLEmiter.tests_Makefile_am): Use it.
* pygnulib/GLTestDir.py (GLTestDir.execute): Likewise.
---
 ChangeLog             |  8 ++++++++
 pygnulib/GLEmiter.py  | 18 ++++--------------
 pygnulib/GLTestDir.py | 12 ++----------
 pygnulib/constants.py | 15 +++++++++++++++
 4 files changed, 29 insertions(+), 24 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 0d04cb70e7..1687348abe 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2022-08-13  Bruno Haible  <br...@clisp.org>
+
+	gnulib-tool.py: Reduce code duplication.
+	* pygnulib/constants.py (relinverse): New function.
+	* pygnulib/GLEmiter.py (GLEmiter.po_Makevars,
+	GLEmiter.tests_Makefile_am): Use it.
+	* pygnulib/GLTestDir.py (GLTestDir.execute): Likewise.
+
 2022-08-12  Marc Nieper-Wißkirchen  <m...@nieper-wisskirchen.de>
 
 	hamt: fix technically undefined behavior
diff --git a/pygnulib/GLEmiter.py b/pygnulib/GLEmiter.py
index c0fd053077..4c8f0d90f2 100644
--- a/pygnulib/GLEmiter.py
+++ b/pygnulib/GLEmiter.py
@@ -42,6 +42,7 @@ __copyright__ = constants.__copyright__
 #===============================================================================
 TESTS = constants.TESTS
 joinpath = constants.joinpath
+relinverse = constants.relinverse
 isfile = os.path.isfile
 normpath = os.path.normpath
 
@@ -390,13 +391,7 @@ class GLEmiter(object):
         emit = ''
         pobase = self.config['pobase']
         podomain = self.config['podomain']
-        top_subdir = ''
-        source = '%s/' % os.path.normpath(pobase)
-        if os.path.sep in source:
-            for directory in source.split(os.path.sep):
-                if directory != '':
-                    top_subdir += '../'
-        top_subdir = os.path.normpath(top_subdir)
+        top_subdir = relinverse(pobase)
         emit += "## DO NOT EDIT! GENERATED AUTOMATICALLY!\n"
         emit += "%s\n" % self.copyright_notice()
         emit += "# Usually the message domain is the same as the package name.\n"
@@ -941,13 +936,8 @@ AC_DEFUN([%V1%_LIBSOURCES], [
         else:  # if not for_test
             edit_check_PROGRAMS = False
 
-        # Calculate testsbase_inverse
-        counter = int()
-        testsbase_inverse = ''
-        while counter < len(testsbase.split('/')):
-            testsbase_inverse += '../'
-            counter += 1
-        testsbase_inverse = os.path.normpath(testsbase_inverse)
+        # Compute testsbase_inverse
+        testsbase_inverse = relinverse(testsbase)
 
         # Begin the generation.
         emit += "## DO NOT EDIT! GENERATED AUTOMATICALLY!\n"
diff --git a/pygnulib/GLTestDir.py b/pygnulib/GLTestDir.py
index bf00099283..68cc5ce411 100644
--- a/pygnulib/GLTestDir.py
+++ b/pygnulib/GLTestDir.py
@@ -48,6 +48,7 @@ DIRS = constants.DIRS
 UTILS = constants.UTILS
 TESTS = constants.TESTS
 joinpath = constants.joinpath
+relinverse = constants.relinverse
 copyfile = constants.copyfile
 movefile = constants.movefile
 isdir = os.path.isdir
@@ -405,16 +406,7 @@ class GLTestDir(object):
                     file.write(emit)
                 # Viewed from the $testsbase subdirectory, $auxdir is different.
                 emit = ''
-                saved_auxdir = self.config['auxdir']
-                testsbase = '%s/' % os.path.normpath(testsbase)
-                counter = int()
-                auxdir = ''
-                finish = (len(testsbase.split('/')) - 1)
-                while counter < finish:
-                    auxdir += '../'
-                    counter += 1
-                auxdir = os.path.normpath(joinpath(auxdir, saved_auxdir))
-                testsbase = os.path.normpath(testsbase)
+                auxdir = os.path.normpath(joinpath(relinverse(testsbase), auxdir))
                 self.config.setAuxDir(auxdir)
                 # Create $testsbase/configure.ac.
                 emit += '# Process this file with autoconf '
diff --git a/pygnulib/constants.py b/pygnulib/constants.py
index ae27d8d41a..10e11623b4 100644
--- a/pygnulib/constants.py
+++ b/pygnulib/constants.py
@@ -299,6 +299,21 @@ def relconcat(dir1, dir2):
     return os.path.normpath(os.path.join(dir1, dir2))
 
 
+def relinverse(dir):
+    '''Compute the inverse of dir. Namely, a relative pathname consisting only
+    of '..' components, such that dir/relinverse = '.'.
+    dir must be a relative pathname.'''
+    if False:
+        # This should work too.
+        return relativize(dir, '.')
+    else:
+        inverse = ''
+        for component in dir.split('/'):
+            if component != '':
+                inverse += '../'
+        return os.path.normpath(inverse)
+
+
 def copyfile(src, dest):
     '''Copy file src to file dest. Like shutil.copy, but ignore errors e.g. on
     VFAT file systems.'''
-- 
2.34.1

>From aa46eb2a5344ea32a973cdc2bb7b9d81d146543f Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Sat, 13 Aug 2022 15:02:55 +0200
Subject: [PATCH 2/2] gnulib-tool.py: Fix some code generation details.

* pygnulib/GLEmiter.py: Don't produce Windows CR-LFs on Windows.
(GLEmiter.po_Makevars): Emit a definition of top_builddir, not
top_subdir.
(GLEmiter.po_POTFILES_in): Fix result when sourcebase is 'tests' or
something like that.
(GLEmiter.initmacro_start): Add two more newlines (mistake from
2021-04-11).
---
 ChangeLog            |  9 +++++++
 pygnulib/GLEmiter.py | 64 ++++++++++++++++++--------------------------
 2 files changed, 35 insertions(+), 38 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 1687348abe..e0bf24fc90 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
 2022-08-13  Bruno Haible  <br...@clisp.org>
 
+	gnulib-tool.py: Fix some code generation details.
+	* pygnulib/GLEmiter.py: Don't produce Windows CR-LFs on Windows.
+	(GLEmiter.po_Makevars): Emit a definition of top_builddir, not
+	top_subdir.
+	(GLEmiter.po_POTFILES_in): Fix result when sourcebase is 'tests' or
+	something like that.
+	(GLEmiter.initmacro_start): Add two more newlines (mistake from
+	2021-04-11).
+
 	gnulib-tool.py: Reduce code duplication.
 	* pygnulib/constants.py (relinverse): New function.
 	* pygnulib/GLEmiter.py (GLEmiter.po_Makevars,
diff --git a/pygnulib/GLEmiter.py b/pygnulib/GLEmiter.py
index 4c8f0d90f2..8c8b3ed8a7 100644
--- a/pygnulib/GLEmiter.py
+++ b/pygnulib/GLEmiter.py
@@ -94,7 +94,7 @@ class GLEmiter(object):
 # the same distribution terms as the rest of that program.
 #
 # Generated by gnulib-tool.\n"""
-        return constants.nlconvert(emit)
+        return emit
 
     def autoconfSnippet(self, module, toplevel,
                         disable_libtool, disable_gettext, replace_auxdir, indentation):
@@ -388,10 +388,9 @@ class GLEmiter(object):
 
         Emit the contents of po/ makefile parameterization.
         GLConfig: pobase, podomain.'''
-        emit = ''
         pobase = self.config['pobase']
         podomain = self.config['podomain']
-        top_subdir = relinverse(pobase)
+        emit = ''
         emit += "## DO NOT EDIT! GENERATED AUTOMATICALLY!\n"
         emit += "%s\n" % self.copyright_notice()
         emit += "# Usually the message domain is the same as the package name.\n"
@@ -399,7 +398,7 @@ class GLEmiter(object):
         emit += "DOMAIN = %s-gnulib\n\n" % podomain
         emit += "# These two variables depend on the location of this directory.\n"
         emit += "subdir = %s\n" % pobase
-        emit += "top_subdir = %s\n" % top_subdir
+        emit += "top_builddir = %s\n" % relinverse(pobase)
         emit += """
 # These options get passed to xgettext.
 XGETTEXT_OPTIONS = \\
@@ -438,36 +437,32 @@ EXTRA_LOCALE_CATEGORIES =
 # package uses functions taking also a message context, like pgettext(), or
 # if in $(XGETTEXT_OPTIONS) you define keywords with a context argument.
 USE_MSGCTXT = no\n"""
-        return constants.nlconvert(emit)
+        return emit
 
     def po_POTFILES_in(self, files):
         '''GLEmiter.po_POTFILES_in(files) -> str
 
         Emit the file list to be passed to xgettext.
         GLConfig: sourcebase.'''
-        emit = ''
         sourcebase = self.config['sourcebase'] + os.path.sep
-        files = [ constants.substart('lib/', sourcebase, file)
-                  for file in files ]
-        files = [ file
-                  for file in files
-                  if file.startswith(sourcebase) ]
+        emit = ''
         emit += "## DO NOT EDIT! GENERATED AUTOMATICALLY!\n"
         emit += "%s\n" % self.copyright_notice()
         emit += "# List of files which contain translatable strings.\n"
-        emit += '\n'.join(files)
-        emit += '\n'
-        return constants.nlconvert(emit)
+        for file in files:
+            if file.startswith('lib/'):
+                emit += '%s\n' % constants.substart('lib/', sourcebase, file)
+        return emit
 
     def initmacro_start(self, macro_prefix_arg):
         '''GLEmiter.initmacro_start(macro_prefix_arg) -> str
 
         Emit the first few statements of the gl_INIT macro.'''
-        emit = ''
         if type(macro_prefix_arg) is not str:
             raise TypeError('macro_prefix_arg must be a string, not %s'
                             % type(macro_prefix_arg).__name__)
         module_indicator_prefix = self.config.getModuleIndicatorPrefix()
+        emit = ''
         # Overriding AC_LIBOBJ and AC_REPLACE_FUNCS has the effect of storing
         # platform-dependent object files in ${macro_prefix_arg}_LIBOBJS instead
         # of LIBOBJS. The purpose is to allow several gnulib instantiations under
@@ -475,45 +470,38 @@ USE_MSGCTXT = no\n"""
         # flexibility).
         # Furthermore it avoids an automake error like this when a Makefile.am
         # that uses pieces of gnulib also uses $(LIBOBJ):
-        #   automatically discovered file `error.c' should not be explicitly
-        #   mentioned.
-        emit += "  m4_pushdef([AC_LIBOBJ],"
-        emit += " m4_defn([%V1%_LIBOBJ]))\n"
-        emit += "  m4_pushdef([AC_REPLACE_FUNCS],"
-        emit += " m4_defn([%V1%_REPLACE_FUNCS]))\n"
+        #   automatically discovered file `error.c' should not be explicitly mentioned.
+        emit += "  m4_pushdef([AC_LIBOBJ], m4_defn([%s_LIBOBJ]))\n" % macro_prefix_arg
+        emit += "  m4_pushdef([AC_REPLACE_FUNCS], m4_defn([%s_REPLACE_FUNCS]))\n" % macro_prefix_arg
         # Overriding AC_LIBSOURCES has the same purpose of avoiding the automake
         # error when a Makefile.am that uses pieces of gnulib also uses $(LIBOBJ):
-        #   automatically discovered file `error.c' should not be explicitly
-        #   mentioned
+        #   automatically discovered file `error.c' should not be explicitly mentioned
         # We let automake know about the files to be distributed through the
         # EXTRA_lib_SOURCES variable.
-        emit += "  m4_pushdef([AC_LIBSOURCES],"
-        emit += " m4_defn([%V1%_LIBSOURCES]))\n"
+        emit += "  m4_pushdef([AC_LIBSOURCES], m4_defn([%s_LIBSOURCES]))\n" % macro_prefix_arg
         # Create data variables for checking the presence of files that are
         # mentioned as AC_LIBSOURCES arguments. These are m4 variables, not shell
         # variables, because we want the check to happen when the configure file is
         # created, not when it is run. ${macro_prefix_arg}_LIBSOURCES_LIST is the
         # list of files to check for. ${macro_prefix_arg}_LIBSOURCES_DIR is the
         # subdirectory in which to expect them.
-        emit += "  m4_pushdef([%V1%_LIBSOURCES_LIST], [])\n"
-        emit += "  m4_pushdef([%V1%_LIBSOURCES_DIR], [])\n"
+        emit += "  m4_pushdef([%s_LIBSOURCES_LIST], [])\n" % macro_prefix_arg
+        emit += "  m4_pushdef([%s_LIBSOURCES_DIR], [])\n" % macro_prefix_arg
         # Scope for m4 macros.
-        emit += "  m4_pushdef([GL_MACRO_PREFIX], [%V1%])"
+        emit += "  m4_pushdef([GL_MACRO_PREFIX], [%s])\n" % macro_prefix_arg
         # Scope the GNULIB_<modulename> variables.
-        emit += "  m4_pushdef([GL_MODULE_INDICATOR_PREFIX],"
-        emit += " [" + module_indicator_prefix + "])"
+        emit += "  m4_pushdef([GL_MODULE_INDICATOR_PREFIX], [%s])\n" % module_indicator_prefix
         emit += "  gl_COMMON\n"
-        emit = emit.replace('%V1%', macro_prefix_arg)
-        return constants.nlconvert(emit)
+        return emit
 
     def initmacro_end(self, macro_prefix_arg):
         '''GLEmiter.initmacro_end(macro_prefix_arg) -> str
 
         Emit the last few statements of the gl_INIT macro.'''
-        emit = ''
         if type(macro_prefix_arg) is not str:
             raise TypeError('macro_prefix_arg must be a string, not %s'
                             % type(macro_prefix_arg).__name__)
+        emit = ''
         # Check the presence of files that are mentioned as AC_LIBSOURCES
         # arguments. The check is performed only when autoconf is run from the
         # directory where the configure.ac resides; if it is run from a different
@@ -552,20 +540,20 @@ USE_MSGCTXT = no\n"""
     AC_SUBST([%V1%_LTLIBOBJS], [$%V1%_ltlibobjs])
   ])\n"""
         emit = emit.replace('%V1%', macro_prefix_arg)
-        return constants.nlconvert(emit)
+        return emit
 
     def initmacro_done(self, macro_prefix_arg, sourcebase_arg):
         '''GLEmiter.initmacro_done(macro_prefix_arg, sourcebase_arg) -> str
 
         Emit a few statements after the gl_INIT macro.
         GLConfig: sourcebase.'''
-        emit = ''
         if type(macro_prefix_arg) is not str:
             raise TypeError('macro_prefix_arg must be a string, not %s'
                             % type(macro_prefix_arg).__name__)
         if type(sourcebase_arg) is not str:
             raise TypeError('sourcebase_arg must be a string, not %s'
                             % type(sourcebase_arg).__name__)
+        emit = ''
         emit += """\
 
 # Like AC_LIBOBJ, except that the module name goes
@@ -596,7 +584,7 @@ AC_DEFUN([%V1%_LIBSOURCES], [
 ])\n"""
         emit = emit.replace('%V1%', macro_prefix_arg)
         emit = emit.replace('%V2%', sourcebase_arg)
-        return constants.nlconvert(emit)
+        return emit
 
     def lib_Makefile_am(self, destfile, modules,
                         moduletable, makefiletable, actioncmd, for_test):
@@ -634,7 +622,6 @@ AC_DEFUN([%V1%_LIBSOURCES], [
         if type(for_test) is not bool:
             raise TypeError('for_test must be a bool, not %s'
                             % type(for_test).__name__)
-        emit = ''
         sourcebase = self.config['sourcebase']
         libname = self.config['libname']
         pobase = self.config['pobase']
@@ -649,6 +636,7 @@ AC_DEFUN([%V1%_LIBSOURCES], [
         module_indicator_prefix = self.config.getModuleIndicatorPrefix()
         ac_version = self.config['ac_version']
         destfile = os.path.normpath(destfile)
+        emit = ''
 
         # When creating an includable Makefile.am snippet, augment variables with
         # += instead of assigning them.
@@ -900,7 +888,6 @@ AC_DEFUN([%V1%_LIBSOURCES], [
         if type(for_test) is not bool:
             raise TypeError('for_test must be a bool, not %s'
                             % type(for_test).__name__)
-        emit = ''
         auxdir = self.config['auxdir']
         sourcebase = self.config['sourcebase']
         libname = self.config['libname']
@@ -918,6 +905,7 @@ AC_DEFUN([%V1%_LIBSOURCES], [
         ac_version = self.config['ac_version']
         libtests = self.config['libtests']
         single_configure = self.config['single_configure']
+        emit = ''
 
         if libtool:
             libext = 'la'
-- 
2.34.1

Reply via email to