Today's changes:

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

        gnulib-tool.py: Don't initialize local variables too early.
        * gnulib-tool.py (main): Initialize each local variable in one place.
        I prefer to have pylint tell me about uninitialized variables than to
        get the value None at runtime.

        gnulib-tool.py: Finish implementing option --po-domain.
        * gnulib-tool.py (main): Accept option --po-domain.
        * pygnulib/GLEmiter.py (GLEmiter.po_POTFILES_in): Fix variable
        reference.
        * pygnulib/GLImport.py (GLImport.execute): Don't delete Makefile.in.in
        from the gnulib directory. Don't require a shell when invoking wget.
        After invoking wget, restore the current directory.

        gnulib-tool.py: Finish implementing option --macro-prefix.
        * gnulib-tool.py (main): Accept option --macro-prefix.

        gnulib-tool.py: Refactor --makefile-name option.
        * gnulib-tool.py (main): Handle option --makefile-name like all other
        string-valued options.

        gnulib-tool.py: Implement option --no-libtool.
        * gnulib-tool.py (main): Accept option --no-libtool.

        gnulib-tool.py: Remove redundant type checks.
        * pygnulib/GLConfig.py (GLConfig.__init__): Remove redundant type
        checks, left over from 2022-08-04.
        (GLConfig.getIncludeGuardPrefix): Improve comment.
        (GLConfig.resetMacroPrefix): Optimize.

        gnulib-tool.py: Refactor --makefile-name option.
        * gnulib-tool.py (main): Rename variable 'makefile' to 'makefile_name'.
        * pygnulib/GLConfig.py: Rename attribute 'makefile' to 'makefile_name'.
        * pygnulib/GLMakefileTable.py: Update.
        * pygnulib/GLEmiter.py: Likewise.
        * pygnulib/GLImport.py: Likewise.
        * pygnulib/GLFileSystem.py (GLFileAssistant): Remove unused assignment.

        gnulib-tool.py: Fix link_if_changed function.
        * pygnulib/constants.py (joinpath): Fix comment.
        (as_link_value_at_dest): New function, extracted from link_relative.
        (link_relative): Use it.
        (link_if_changed): Really don't replace the symbolic link if it does not
        need to change.

        gnulib-tool.py: Fix 'Unused import' warnings.
        * gnulib-tool.py: Remove unused imports.
        * pygnulib/*.py: Likewise.

        gnulib-tool.py: Fix 'Undefined variable' errors.
        * pygnulib/constants.py: Import codecs.
        * pygnulib/GLConfig.py (GLConfig.setLibName): Fix local variable
        reference.
        * pygnulib/GLFileSystem.py (GLFileSystem.lookup,
        GLFileAssistant.update): Fix local variable references.
        * pygnulib/GLEmiter.py (GLEmiter.po_POTFILES_in): Fix reference.
        * pygnulib/GLTestDir.py (GLMegaTestDir.execute): Define missing local
        variables.

        gnulib-tool.py: Make option --version work.
        * pygnulib/constants.py (__copyright__): Bump copyright year.
        * pygnulib/GLInfo.py (GLInfo.authors): Add a comma after the
        second-to-last author.
        (GLInfo.copyright): Show only the last modification year.
        (GLInfo.date): Check whether git and GNU date are available. Use
        'git log ChangeLog', not 'git log'. Run 'git log' in the gnulib
        directory, not in the current directory. Search for 'Date:' only at the
        beginning of a line. As a fallback, look at the first ChangeLog entry.
        (GLInfo.version): Check whether git is available. Run git-version-gen in
        the gnulib directory, not in the current directory. Replace '-dirty'
        with '-modified'. As a fallback, return the empty string.
        * gnulib-tool.py (main) [--version]: Add a space before the version.

        gnulib-tool.py: Simplify.
        * pygnulib/constants.py (compiler): Remove function.
        * gnulib-tool.py: Use re.compile directly instead.
        * pygnulib/*.py: Likewise.

>From 276725c4e2c8e06e3cec36472adb0be7d99b709d Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Fri, 5 Aug 2022 04:05:04 +0200
Subject: [PATCH 01/12] gnulib-tool.py: Simplify.

* pygnulib/constants.py (compiler): Remove function.
* gnulib-tool.py: Use re.compile directly instead.
* pygnulib/*.py: Likewise.
---
 ChangeLog                  |  7 +++++++
 gnulib-tool.py             |  3 +--
 pygnulib/GLEmiter.py       | 25 ++++++++++++------------
 pygnulib/GLImport.py       | 17 ++++++++---------
 pygnulib/GLModuleSystem.py | 39 +++++++++++++++++++-------------------
 pygnulib/GLTestDir.py      | 25 ++++++++++++------------
 pygnulib/constants.py      | 10 ++--------
 7 files changed, 61 insertions(+), 65 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 1abeb15271..e504d85215 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2022-08-05  Bruno Haible  <br...@clisp.org>
+
+	gnulib-tool.py: Simplify.
+	* pygnulib/constants.py (compiler): Remove function.
+	* gnulib-tool.py: Use re.compile directly instead.
+	* pygnulib/*.py: Likewise.
+
 2022-08-04  Bruno Haible  <br...@clisp.org>
 
 	gnulib-tool.py: Fix typo.
diff --git a/gnulib-tool.py b/gnulib-tool.py
index 21c6789ba9..1a6bd9e948 100755
--- a/gnulib-tool.py
+++ b/gnulib-tool.py
@@ -55,7 +55,6 @@ ENCS = constants.ENCS
 UTILS = constants.UTILS
 MODES = constants.MODES
 TESTS = constants.TESTS
-compiler = constants.compiler
 joinpath = constants.joinpath
 copyfile = constants.copyfile
 isabs = os.path.isabs
@@ -745,7 +744,7 @@ def main():
                 else:  # if not isfile(filepath)
                     filepath = joinpath(destdir, 'aclocal.m4')
                     if isfile(filepath):
-                        pattern = constants.compiler(r'm4_include\(\[(.*?)\]\)')
+                        pattern = re.compile(r'm4_include\(\[(.*?)\]\)')
                         with codecs.open(filepath, 'rb', 'UTF-8') as file:
                             m4dirs = pattern.findall(file.read())
                         m4dirs = [ os.path.dirname(m4dir)
diff --git a/pygnulib/GLEmiter.py b/pygnulib/GLEmiter.py
index c95d109423..b56e551f1d 100644
--- a/pygnulib/GLEmiter.py
+++ b/pygnulib/GLEmiter.py
@@ -45,7 +45,6 @@ __copyright__ = constants.__copyright__
 # Define global constants
 #===============================================================================
 TESTS = constants.TESTS
-compiler = constants.compiler
 joinpath = constants.joinpath
 isfile = os.path.isfile
 normpath = os.path.normpath
@@ -158,7 +157,7 @@ class GLEmiter(object):
                       if line.strip() ]
             snippet = '%s\n' % '\n'.join(lines)
             transformer = fileassistant.transformers.get('aux', '')
-            pattern = compiler('(^.*?$)', re.S | re.M)
+            pattern = re.compile('(^.*?$)', re.S | re.M)
             snippet = pattern.sub('%s\\1' % indentation, snippet)
             if transformer:
                 args = ['sed', '-e', transformer]
@@ -179,7 +178,7 @@ class GLEmiter(object):
             else:
                 # Don't indent AM_GNU_GETTEXT_VERSION line, as that confuses
                 # autopoint through at least GNU gettext version 0.18.2.
-                snippet = compiler('^ *AM_GNU_GETTEXT_VERSION').sub('AM_GNU_GETTEXT_VERSION', snippet)
+                snippet = re.compile('^ *AM_GNU_GETTEXT_VERSION').sub('AM_GNU_GETTEXT_VERSION', snippet)
             emit += snippet
             if str(module) == 'alloca' and libtool and not disable_libtool:
                 emit += 'changequote(,)dnl\n'
@@ -189,7 +188,7 @@ class GLEmiter(object):
         if replace_auxdir:
             regex = 'AC_CONFIG_FILES\\(\\[(.*?)\\:build-aux/(.*?)\\]\\)'
             repl = 'AC_CONFIG_FILES([\\1:%s/\\2])' % auxdir
-            pattern = compiler(regex, re.S | re.M)
+            pattern = re.compile(regex, re.S | re.M)
             emit = pattern.sub(repl, emit)
         lines = [ line
                   for line in emit.split('\n')
@@ -694,9 +693,9 @@ AC_DEFUN([%V1%_LIBSOURCES], [
                 amsnippet1 = amsnippet1.replace('lib_LIBRARIES', 'lib%_LIBRARIES')
                 amsnippet1 = amsnippet1.replace('lib_LTLIBRARIES', 'lib%_LTLIBRARIES')
                 if LD_flags:
-                    pattern = compiler('lib_LDFLAGS[\t ]*\\+=(.*?)$', re.S | re.M)
+                    pattern = re.compile('lib_LDFLAGS[\t ]*\\+=(.*?)$', re.S | re.M)
                     amsnippet1 = pattern.sub('', amsnippet1)
-                pattern = compiler('lib_([A-Z][A-Z](?:.*?))', re.S | re.M)
+                pattern = re.compile('lib_([A-Z][A-Z](?:.*?))', re.S | re.M)
                 amsnippet1 = pattern.sub('%s_%s_\\1' % (libname, libext),
                                          amsnippet1)
                 amsnippet1 = amsnippet1.replace('$(GNULIB_', '$(' + module_indicator_prefix + '_GNULIB_')
@@ -709,12 +708,12 @@ AC_DEFUN([%V1%_LIBSOURCES], [
                 if str(module) == 'alloca':
                     amsnippet1 += '%s_%s_LIBADD += @%sALLOCA@\n' % (libname, libext, perhapsLT)
                     amsnippet1 += '%s_%s_DEPENDENCIES += @%sALLOCA@\n' % (libname, libext, perhapsLT)
-                amsnippet1 = constants.combine_lines_matching(compiler('%s_%s_SOURCES' % (libname, libext)),
+                amsnippet1 = constants.combine_lines_matching(re.compile('%s_%s_SOURCES' % (libname, libext)),
                                                               amsnippet1)
 
                 # Get unconditional snippet, edit it and save to amsnippet2.
                 amsnippet2 = module.getAutomakeSnippet_Unconditional()
-                pattern = compiler('lib_([A-Z][A-Z](?:.*?))', re.S | re.M)
+                pattern = re.compile('lib_([A-Z][A-Z](?:.*?))', re.S | re.M)
                 amsnippet2 = pattern.sub('%s_%s_\\1' % (libname, libext),
                                          amsnippet2)
                 amsnippet2 = amsnippet2.replace('$(GNULIB_',
@@ -756,7 +755,7 @@ AC_DEFUN([%V1%_LIBSOURCES], [
             #  * https://debbugs.gnu.org/10997
             #  * https://debbugs.gnu.org/11030
             # So we need this workaround.
-            pattern = compiler('^pkgdata_DATA *\\+=', re.S | re.M)
+            pattern = re.compile('^pkgdata_DATA *\\+=', re.S | re.M)
             if pattern.findall(allsnippets):
                 emit += 'pkgdata_DATA =\n'
             emit += 'EXTRA_DIST =\n'
@@ -808,7 +807,7 @@ AC_DEFUN([%V1%_LIBSOURCES], [
         insnippets = False
         inmakefile = False
         regex = '^[a-zA-Z0-9_]*_%sLIBRARIES *\\+{0,1}= *%s.%s' % (perhapsLT, libname, libext)
-        pattern = compiler(regex, re.S | re.M)
+        pattern = re.compile(regex, re.S | re.M)
         insnippets = bool(pattern.findall(allsnippets))
         # Then test if $sourcebase/Makefile.am (if it exists) specifies it.
         path = joinpath(sourcebase, 'Makefile.am')
@@ -961,9 +960,9 @@ AC_DEFUN([%V1%_LIBSOURCES], [
                 snippet = snippet.replace('lib_LIBRARIES', 'lib%_LIBRARIES')
                 snippet = snippet.replace('lib_LTLIBRARIES', 'lib%_LTLIBRARIES')
                 if LD_flags:
-                    pattern = compiler('lib_LDFLAGS[\t ]*\\+=(.*?)$', re.S | re.M)
+                    pattern = re.compile('lib_LDFLAGS[\t ]*\\+=(.*?)$', re.S | re.M)
                     snippet = pattern.sub('', snippet)
-                pattern = compiler('lib_([A-Z][A-Z](?:.*?))', re.S | re.M)
+                pattern = re.compile('lib_([A-Z][A-Z](?:.*?))', re.S | re.M)
                 snippet = pattern.sub('libtests_a_\\1', snippet)
                 snippet = snippet.replace('$(GNULIB_', '$(' + module_indicator_prefix + '_GNULIB_')
                 snippet = snippet.replace('lib%_LIBRARIES', 'lib_LIBRARIES')
@@ -1038,7 +1037,7 @@ AC_DEFUN([%V1%_LIBSOURCES], [
         #  * https://debbugs.gnu.org/10997
         #  * https://debbugs.gnu.org/11030
         # So we need this workaround.
-        pattern = compiler('^pkgdata_DATA *\\+=', re.S | re.M)
+        pattern = re.compile('^pkgdata_DATA *\\+=', re.S | re.M)
         if bool(pattern.findall(main_snippets)) or bool(pattern.findall(longrun_snippets)):
             emit += 'pkgdata_DATA =\n'
 
diff --git a/pygnulib/GLImport.py b/pygnulib/GLImport.py
index 9dff29a6b3..3b2b14eb4b 100644
--- a/pygnulib/GLImport.py
+++ b/pygnulib/GLImport.py
@@ -49,7 +49,6 @@ __copyright__ = constants.__copyright__
 #===============================================================================
 MODES = constants.MODES
 TESTS = constants.TESTS
-compiler = constants.compiler
 joinpath = constants.joinpath
 cleaner = constants.cleaner
 copyfile2 = constants.copyfile2
@@ -99,18 +98,18 @@ class GLImport(object):
         self.config.setAutoconfFile(path)
         with codecs.open(path, 'rb', 'UTF-8') as file:
             data = file.read()
-        pattern = compiler(r'^AC_CONFIG_AUX_DIR\((.*?)\)$', re.S | re.M)
+        pattern = re.compile(r'^AC_CONFIG_AUX_DIR\((.*?)\)$', re.S | re.M)
         match = pattern.findall(data)
         if match:
             result = cleaner(match)[0]
             self.cache.setAuxDir(joinpath(self.config['destdir'], result))
-        pattern = compiler(r'A[CM]_PROG_LIBTOOL', re.S | re.M)
+        pattern = re.compile(r'A[CM]_PROG_LIBTOOL', re.S | re.M)
         guessed_libtool = bool(pattern.findall(data))
         if self.config['auxdir'] == None:
             self.config.setAuxDir(self.cache['auxdir'])
 
         # Guess autoconf version.
-        pattern = compiler(r'.*AC_PREREQ\((.*?)\)', re.S | re.M)
+        pattern = re.compile(r'.*AC_PREREQ\((.*?)\)', re.S | re.M)
         versions = cleaner(pattern.findall(data))
         if versions:
             version = sorted(set([ float(version)
@@ -126,7 +125,7 @@ class GLImport(object):
                 data = file.read()
 
             # Create regex object and keys.
-            pattern = compiler('^(gl_.*?)\\((.*?)\\)$', re.S | re.M)
+            pattern = re.compile('^(gl_.*?)\\((.*?)\\)$', re.S | re.M)
             keys = \
                 [
                     'gl_LOCAL_DIR', 'gl_MODULES', 'gl_AVOID', 'gl_SOURCE_BASE',
@@ -214,7 +213,7 @@ class GLImport(object):
                 with codecs.open(path, 'rb', 'UTF-8') as file:
                     data = file.read()
                 regex = 'AC_DEFUN\\(\\[%s_FILE_LIST\\], \\[(.*?)\\]\\)' % self.cache['macro_prefix']
-                pattern = compiler(regex, re.S | re.M)
+                pattern = re.compile(regex, re.S | re.M)
                 self.cache.setFiles(pattern.findall(data)[-1].strip().split())
 
         # The self.config['localpath'] defaults to the cached one. Recall that
@@ -870,7 +869,7 @@ AC_DEFUN([%s_FILE_LIST], [\n''' % macro_prefix
             notice = notice.strip()
             if notice:
                 print('Notice from module %s:' % str(module))
-                pattern = compiler('^(.*?)$', re.S | re.M)
+                pattern = re.compile('^(.*?)$', re.S | re.M)
                 notice = pattern.sub('  \\1', notice)
                 print(notice)
 
@@ -1442,9 +1441,9 @@ in <library>_a_LDFLAGS or <library>_la_LDFLAGS when linking a library.''')
         with codecs.open(configure_ac, 'rb', 'UTF-8') as file:
             data = file.read()
         match_result1 = \
-            bool(compiler('^ *AC_PROG_CC_STDC', re.S | re.M).findall(data))
+            bool(re.compile('^ *AC_PROG_CC_STDC', re.S | re.M).findall(data))
         match_result2 = \
-            bool(compiler('^ *AC_PROG_CC_C99', re.S | re.M).findall(data))
+            bool(re.compile('^ *AC_PROG_CC_C99', re.S | re.M).findall(data))
         if match_result1:
             position_early_after = 'AC_PROG_CC_STDC'
         elif match_result2:
diff --git a/pygnulib/GLModuleSystem.py b/pygnulib/GLModuleSystem.py
index eb5b544594..6b8f20e54f 100644
--- a/pygnulib/GLModuleSystem.py
+++ b/pygnulib/GLModuleSystem.py
@@ -42,7 +42,6 @@ __copyright__ = constants.__copyright__
 DIRS = constants.DIRS
 ENCS = constants.ENCS
 TESTS = constants.TESTS
-compiler = constants.compiler
 joinpath = constants.joinpath
 isdir = os.path.isdir
 isfile = os.path.isfile
@@ -281,7 +280,7 @@ Include:|Link:|License:|Maintainer:)'
         '''GLModule.getName() -> str
 
         Return the name of the module.'''
-        pattern = compiler(joinpath('modules', '(.*?)$'))
+        pattern = re.compile(joinpath('modules', '(.*?)$'))
         result = pattern.findall(self.module)[0]
         return result
 
@@ -386,7 +385,7 @@ Include:|Link:|License:|Maintainer:)'
                 result = ''
             else:  # if section in self.content
                 pattern = '^%s[\t ]*(.*?)%s' % (section, self.regex)
-                pattern = compiler(pattern, re.S | re.M)
+                pattern = re.compile(pattern, re.S | re.M)
                 result = pattern.findall(self.content)
                 if type(result) is list:
                     if not result:
@@ -407,7 +406,7 @@ Include:|Link:|License:|Maintainer:)'
                 result = ''
             else:  # if section in self.content
                 pattern = '^%s[\t ]*(.*?)%s' % (section, self.regex)
-                pattern = compiler(pattern, re.S | re.M)
+                pattern = re.compile(pattern, re.S | re.M)
                 result = pattern.findall(self.content)
                 if type(result) is list:
                     if not result:
@@ -436,7 +435,7 @@ Include:|Link:|License:|Maintainer:)'
                     regex = '^(Description|Comment|Status|Notice|Applicability|'
                     regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|'
                     regex += 'Makefile\\.am|Include|Link|License|Maintainer):$'
-                    pattern = compiler(regex)
+                    pattern = re.compile(regex)
                     findflag = pattern.findall(line)
                     if findflag:
                         break
@@ -465,7 +464,7 @@ Include:|Link:|License:|Maintainer:)'
                     regex = '^(Description|Comment|Status|Notice|Applicability|'
                     regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|'
                     regex += 'Makefile\\.am|Include|Link|License|Maintainer):$'
-                    pattern = compiler(regex)
+                    pattern = re.compile(regex)
                     findflag = pattern.findall(line)
                     if findflag:
                         break
@@ -492,7 +491,7 @@ Include:|Link:|License:|Maintainer:)'
                     regex = '^(Description|Comment|Status|Notice|Applicability|'
                     regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|'
                     regex += 'Makefile\\.am|Include|Link|License|Maintainer):$'
-                    pattern = compiler(regex)
+                    pattern = re.compile(regex)
                     findflag = pattern.findall(line)
                     if findflag:
                         break
@@ -530,7 +529,7 @@ Include:|Link:|License:|Maintainer:)'
                     regex = '^(Description|Comment|Status|Notice|Applicability|'
                     regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|'
                     regex += 'Makefile\\.am|Include|Link|License|Maintainer):$'
-                    pattern = compiler(regex)
+                    pattern = re.compile(regex)
                     findflag = pattern.findall(line)
                     if findflag:
                         break
@@ -564,7 +563,7 @@ Include:|Link:|License:|Maintainer:)'
                     regex = '^(Description|Comment|Status|Notice|Applicability|'
                     regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|'
                     regex += 'Makefile\\.am|Include|Link|License|Maintainer):$'
-                    pattern = compiler(regex)
+                    pattern = re.compile(regex)
                     findflag = pattern.findall(line)
                     if findflag:
                         break
@@ -608,7 +607,7 @@ Include:|Link:|License:|Maintainer:)'
                     regex = '^(Description|Comment|Status|Notice|Applicability|'
                     regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|'
                     regex += 'Makefile\\.am|Include|Link|License|Maintainer):$'
-                    pattern = compiler(regex)
+                    pattern = re.compile(regex)
                     findflag = pattern.findall(line)
                     if findflag:
                         break
@@ -635,7 +634,7 @@ Include:|Link:|License:|Maintainer:)'
                     regex = '^(Description|Comment|Status|Notice|Applicability|'
                     regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|'
                     regex += 'Makefile\\.am|Include|Link|License|Maintainer):$'
-                    pattern = compiler(regex)
+                    pattern = re.compile(regex)
                     findflag = pattern.findall(line)
                     if findflag:
                         break
@@ -676,7 +675,7 @@ Include:|Link:|License:|Maintainer:)'
                     regex = '^(Description|Comment|Status|Notice|Applicability|'
                     regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|'
                     regex += 'Makefile\\.am|Include|Link|License|Maintainer):$'
-                    pattern = compiler(regex)
+                    pattern = re.compile(regex)
                     findflag = pattern.findall(line)
                     if findflag:
                         break
@@ -706,7 +705,7 @@ Include:|Link:|License:|Maintainer:)'
                 # TODO: unconditional automake snippet for nontests modules
                 snippet = self.getAutomakeSnippet_Conditional()
                 snippet = constants.combine_lines(snippet)
-                pattern = compiler('^lib_SOURCES[\t ]*\\+=[\t ]*(.*?)$', re.S | re.M)
+                pattern = re.compile('^lib_SOURCES[\t ]*\\+=[\t ]*(.*?)$', re.S | re.M)
                 mentioned_files = pattern.findall(snippet)
                 if mentioned_files != list():
                     mentioned_files = mentioned_files[-1].split(' ')
@@ -774,14 +773,14 @@ Include:|Link:|License:|Maintainer:)'
                     regex = '^(Description|Comment|Status|Notice|Applicability|'
                     regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|'
                     regex += 'Makefile\\.am|Include|Link|License|Maintainer):$'
-                    pattern = compiler(regex)
+                    pattern = re.compile(regex)
                     findflag = pattern.findall(line)
                     if findflag:
                         break
                     parts += [line]
                 result = ''.join(parts)
             result = result.strip()
-            pattern = compiler('^(["<].*?[>"])', re.S | re.M)
+            pattern = re.compile('^(["<].*?[>"])', re.S | re.M)
             result = pattern.sub('#include \\1', result)
             self.cache['include'] = result
         return self.cache['include']
@@ -802,7 +801,7 @@ Include:|Link:|License:|Maintainer:)'
                     regex = '^(Description|Comment|Status|Notice|Applicability|'
                     regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|'
                     regex += 'Makefile\\.am|Include|Link|License|Maintainer):$'
-                    pattern = compiler(regex)
+                    pattern = re.compile(regex)
                     findflag = pattern.findall(line)
                     if findflag:
                         break
@@ -845,7 +844,7 @@ Include:|Link:|License:|Maintainer:)'
                 result = ''
             else:  # if section in self.content
                 pattern = '^%s[\t ]*(.*?)%s' % (section, self.regex)
-                pattern = compiler(pattern, re.S | re.M)
+                pattern = re.compile(pattern, re.S | re.M)
                 result = pattern.findall(self.content)
                 if type(result) is list:
                     if not result:
@@ -874,7 +873,7 @@ Include:|Link:|License:|Maintainer:)'
                     regex = '^(Description|Comment|Status|Notice|Applicability|'
                     regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|'
                     regex += 'Makefile\\.am|Include|Link|License|Maintainer):$'
-                    pattern = compiler(regex)
+                    pattern = re.compile(regex)
                     findflag = pattern.findall(line)
                     if findflag:
                         break
@@ -1042,7 +1041,7 @@ class GLModuleTable(object):
                     if self.config['conddeps']:
                         automake_snippet = \
                             module.getAutomakeSnippet_Conditional()
-                        pattern = compiler('^if')
+                        pattern = re.compile('^if')
                         if not pattern.findall(automake_snippet):
                             self.addUnconditional(module)
                         conditional = self.isConditional(module)
@@ -1165,7 +1164,7 @@ class GLModuleTable(object):
                 raise TypeError('each module must be a GLModule instance')
             snippet = module.getAutomakeSnippet()
             snippet = constants.remove_backslash_newline(snippet)
-            pattern = compiler('^lib_SOURCES[\t ]*\\+=[\t ]*(.*?)$', re.S | re.M)
+            pattern = re.compile('^lib_SOURCES[\t ]*\\+=[\t ]*(.*?)$', re.S | re.M)
             files = pattern.findall(snippet)
             if files:  # if source files were found
                 files = files[-1].split(' ')
diff --git a/pygnulib/GLTestDir.py b/pygnulib/GLTestDir.py
index 732a0590df..624a38317e 100644
--- a/pygnulib/GLTestDir.py
+++ b/pygnulib/GLTestDir.py
@@ -51,7 +51,6 @@ __copyright__ = constants.__copyright__
 DIRS = constants.DIRS
 UTILS = constants.UTILS
 TESTS = constants.TESTS
-compiler = constants.compiler
 joinpath = constants.joinpath
 copyfile = constants.copyfile
 movefile = constants.movefile
@@ -304,7 +303,7 @@ class GLTestDir(object):
                 notice = module.getNotice()
                 if notice:
                     print('Notice from module %s:' % str(module))
-                    pattern = compiler('^(.*?)$', re.S | re.M)
+                    pattern = re.compile('^(.*?)$', re.S | re.M)
                     notice = pattern.sub('  \\1', notice)
                     print(notice)
         else:  # if not single_configure
@@ -312,7 +311,7 @@ class GLTestDir(object):
                 notice = module.getNotice()
                 if notice:
                     print('Notice from module %s:' % str(module))
-                    pattern = compiler('^(.*?)$', re.S | re.M)
+                    pattern = re.compile('^(.*?)$', re.S | re.M)
                     notice = pattern.sub('  \\1', notice)
                     print(notice)
 
@@ -466,7 +465,7 @@ class GLTestDir(object):
                                   for line in snippet.split('\n')
                                   if line.strip() ]
                         snippet = '\n'.join(lines)
-                        pattern = compiler('AC_REQUIRE\\(\\[([^()].*?)\\]\\)', re.S | re.M)
+                        pattern = re.compile('AC_REQUIRE\\(\\[([^()].*?)\\]\\)', re.S | re.M)
                         snippet = pattern.sub('\\1', snippet)
                         snippet = snippet.strip()
                         snippets += [snippet]
@@ -583,7 +582,7 @@ class GLTestDir(object):
                           for line in snippet.split('\n')
                           if line.strip() ]
                 snippet = '\n'.join(lines)
-                pattern = compiler('AC_REQUIRE\\(\\[([^()].*?)\\]\\)', re.S | re.M)
+                pattern = re.compile('AC_REQUIRE\\(\\[([^()].*?)\\]\\)', re.S | re.M)
                 snippet = pattern.sub('\\1', snippet)
                 snippet = snippet.strip()
                 snippets += [snippet]
@@ -754,9 +753,9 @@ class GLTestDir(object):
 
         # Extract the value of "CLEANFILES += ..." and "MOSTLYCLEANFILES += ...".
         regex_find = list()
-        pattern = compiler('^CLEANFILES[\t ]*\\+=(.*?)$', re.S | re.M)
+        pattern = re.compile('^CLEANFILES[\t ]*\\+=(.*?)$', re.S | re.M)
         regex_find += pattern.findall(snippet)
-        pattern = compiler('^MOSTLYCLEANFILES[\t ]*\\+=(.*?)$', re.S | re.M)
+        pattern = re.compile('^MOSTLYCLEANFILES[\t ]*\\+=(.*?)$', re.S | re.M)
         regex_find += pattern.findall(snippet)
         regex_find = [ line.strip()
                        for line in regex_find
@@ -770,7 +769,7 @@ class GLTestDir(object):
         # Extract the value of "BUILT_SOURCES += ...". Remove variable references
         # such $(FOO_H) because they don't refer to distributed files.
         regex_find = list()
-        pattern = compiler('^BUILT_SOURCES[\t ]*\\+=(.*?)$', re.S | re.M)
+        pattern = re.compile('^BUILT_SOURCES[\t ]*\\+=(.*?)$', re.S | re.M)
         regex_find += pattern.findall(snippet)
         regex_find = [ line.strip()
                        for line in regex_find
@@ -782,7 +781,7 @@ class GLTestDir(object):
                   if line.strip()]
         built_sources = [ line
                           for line in built_sources
-                          if not bool(compiler('[$]\\([A-Za-z0-9_]*\\)$').findall(line)) ]
+                          if not bool(re.compile('[$]\\([A-Za-z0-9_]*\\)$').findall(line)) ]
         distributed_built_sources = [ file
                                       for file in built_sources
                                       if file not in cleaned_files ]
@@ -796,9 +795,9 @@ class GLTestDir(object):
 
             # Extract the value of "CLEANFILES += ..." and "MOSTLYCLEANFILES += ...".
             regex_find = list()
-            pattern = compiler('^CLEANFILES[\t ]*\\+=(.*?)$', re.S | re.M)
+            pattern = re.compile('^CLEANFILES[\t ]*\\+=(.*?)$', re.S | re.M)
             regex_find += pattern.findall(snippet)
-            pattern = compiler('^MOSTLYCLEANFILES[\t ]*\\+=(.*?)$', re.S | re.M)
+            pattern = re.compile('^MOSTLYCLEANFILES[\t ]*\\+=(.*?)$', re.S | re.M)
             regex_find += pattern.findall(snippet)
             regex_find = [ line.strip()
                            for line in regex_find
@@ -813,7 +812,7 @@ class GLTestDir(object):
             # such $(FOO_H) because they don't refer to distributed files.
             regex_find = list()
             tests_built_sources = list()
-            pattern = compiler('^BUILT_SOURCES[\t ]*\\+=(.*?)$', re.S | re.M)
+            pattern = re.compile('^BUILT_SOURCES[\t ]*\\+=(.*?)$', re.S | re.M)
             regex_find += pattern.findall(snippet)
             regex_find = [ line.strip()
                            for line in regex_find
@@ -825,7 +824,7 @@ class GLTestDir(object):
                       if line.strip() ]
             tests_built_sources = [ line
                                     for line in tests_built_sources
-                                    if not bool(compiler('[$]\\([A-Za-z0-9_]*\\)$').findall(line)) ]
+                                    if not bool(re.compile('[$]\\([A-Za-z0-9_]*\\)$').findall(line)) ]
             tests_distributed_built_sources = [ file
                                                 for file in tests_built_sources
                                                 if file not in cleaned_files]
diff --git a/pygnulib/constants.py b/pygnulib/constants.py
index 7d59235007..4eff6da8bc 100644
--- a/pygnulib/constants.py
+++ b/pygnulib/constants.py
@@ -237,12 +237,6 @@ def execute(args, verbose):
             sys.exit(retcode)
 
 
-def compiler(pattern, flags=0):
-    '''Compile regex pattern depending on version of Python.'''
-    pattern = re.compile(pattern, flags)
-    return pattern
-
-
 def cleaner(sequence):
     '''Clean string or list of strings after using regex.'''
     if type(sequence) is str:
@@ -405,8 +399,8 @@ def filter_filelist(separator, filelist,
     listing = list()
     for filename in filelist:
         if filename.startswith(prefix) and filename.endswith(suffix):
-            pattern = compiler('^%s(.*?)%s$'
-                               % (removed_prefix, removed_suffix))
+            pattern = re.compile('^%s(.*?)%s$'
+                                 % (removed_prefix, removed_suffix))
             result = pattern.sub('%s\\1%s'
                                  % (added_prefix, added_suffix), filename)
             listing += [result]
-- 
2.34.1

>From 1f0e03e5a3e83d271c4aef05dbbb4850f66cee42 Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Fri, 5 Aug 2022 14:17:35 +0200
Subject: [PATCH 02/12] gnulib-tool.py: Make option --version work.

* pygnulib/constants.py (__copyright__): Bump copyright year.
* pygnulib/GLInfo.py (GLInfo.authors): Add a comma after the
second-to-last author.
(GLInfo.copyright): Show only the last modification year.
(GLInfo.date): Check whether git and GNU date are available. Use
'git log ChangeLog', not 'git log'. Run 'git log' in the gnulib
directory, not in the current directory. Search for 'Date:' only at the
beginning of a line. As a fallback, look at the first ChangeLog entry.
(GLInfo.version): Check whether git is available. Run git-version-gen in
the gnulib directory, not in the current directory. Replace '-dirty'
with '-modified'. As a fallback, return the empty string.
* gnulib-tool.py (main) [--version]: Add a space before the version.
---
 ChangeLog             | 14 +++++++
 gnulib-tool.py        |  5 ++-
 gnulib-tool.py.TODO   |  1 -
 pygnulib/GLInfo.py    | 90 ++++++++++++++++++++++++++++---------------
 pygnulib/constants.py |  2 +-
 5 files changed, 78 insertions(+), 34 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index e504d85215..81871735d2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,19 @@
 2022-08-05  Bruno Haible  <br...@clisp.org>
 
+	gnulib-tool.py: Make option --version work.
+	* pygnulib/constants.py (__copyright__): Bump copyright year.
+	* pygnulib/GLInfo.py (GLInfo.authors): Add a comma after the
+	second-to-last author.
+	(GLInfo.copyright): Show only the last modification year.
+	(GLInfo.date): Check whether git and GNU date are available. Use
+	'git log ChangeLog', not 'git log'. Run 'git log' in the gnulib
+	directory, not in the current directory. Search for 'Date:' only at the
+	beginning of a line. As a fallback, look at the first ChangeLog entry.
+	(GLInfo.version): Check whether git is available. Run git-version-gen in
+	the gnulib directory, not in the current directory. Replace '-dirty'
+	with '-modified'. As a fallback, return the empty string.
+	* gnulib-tool.py (main) [--version]: Add a space before the version.
+
 	gnulib-tool.py: Simplify.
 	* pygnulib/constants.py (compiler): Remove function.
 	* gnulib-tool.py: Use re.compile directly instead.
diff --git a/gnulib-tool.py b/gnulib-tool.py
index 1a6bd9e948..c4386133a6 100755
--- a/gnulib-tool.py
+++ b/gnulib-tool.py
@@ -397,8 +397,11 @@ def main():
         print(info.usage())
         sys.exit(0)
     if cmdargs.version != None:
+        version = info.version()
+        if version != '':
+            version = ' ' + version
         message = '''gnulib-tool (%s %s)%s\n%s\n%s\n\nWritten by %s.''' \
-            % (info.package(), info.date(), info.version(), info.copyright(),
+            % (info.package(), info.date(), version, info.copyright(),
                info.license(), info.authors())
         print(message)
         sys.exit(0)
diff --git a/gnulib-tool.py.TODO b/gnulib-tool.py.TODO
index 7170268b0e..de3a90dc37 100644
--- a/gnulib-tool.py.TODO
+++ b/gnulib-tool.py.TODO
@@ -40,7 +40,6 @@ Implement the options:
   -S | --more-symlinks
   -H | --more-hardlinks
   --help (same output)
-  --version
 
 --------------------------------------------------------------------------------
 
diff --git a/pygnulib/GLInfo.py b/pygnulib/GLInfo.py
index 34b38db7eb..5e386e7c34 100644
--- a/pygnulib/GLInfo.py
+++ b/pygnulib/GLInfo.py
@@ -65,9 +65,7 @@ class GLInfo(object):
         The special __author__ variable is used (type is list).'''
         result = ''
         for item in __author__:
-            if item == __author__[-2]:
-                result += '%s ' % item
-            elif item == __author__[-1]:
+            if item == __author__[-1]:
                 result += 'and %s' % item
             else:
                 result += '%s, ' % item
@@ -75,38 +73,58 @@ class GLInfo(object):
 
     def license(self):
         '''Return formatted string which contains license and its description.'''
-        result = 'License GPLv3+: GNU GPL version 3 or later'
-        result += ' <https://gnu.org/licenses/gpl.html>\n'
-        result += 'This is free software: you are free'
-        result += ' to change and redistribute it.\n'
+        result = 'License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>\n'
+        result += 'This is free software: you are free to change and redistribute it.\n'
         result += 'There is NO WARRANTY, to the extent permitted by law.'
         return result
 
     def copyright(self):
         '''Return formatted string which contains copyright.
         The special __copyright__ variable is used (type is str).'''
-        result = 'Copyright (C) %s' % __copyright__
+        copyright = __copyright__
+        # Per the GNU Coding Standards, show only the last year.
+        copyright = re.compile('^[0-9]*-').sub('', copyright)
+        result = 'Copyright (C) %s' % copyright
         return result
 
     def date(self):
         '''Return formatted string which contains date and time in GMT format.'''
         if isdir(DIRS['git']):
-            counter = int()  # Create counter
-            result = ''  # Create string
-            args = ['git', 'log']
-            result = sp.check_output(args).decode("UTF-8")
-            # Get date as "Fri Mar 21 07:16:51 2008 -0600" from string
-            pattern = re.compile('Date:[\t ]*(.*?)$', re.S | re.M)
-            result = pattern.findall(result)[0]
-            # Turn "Fri Mar 21 07:16:51 2008 -0600" into "Mar 21 2008 07:16:51 -0600"
-            pattern = re.compile('^[^ ]* ([^ ]*) ([0-9]*) ([0-9:]*) ([0-9]*) ')
-            result = pattern.sub('\\1 \\2 \\4 \\3 ', result)
-            # Use GNU date to compute the time in GMT
-            args = ['date', '-d', result, '-u', '+%Y-%m-%d %H:%M:%S']
-            proc = sp.check_output(args)
-            result = str(proc, "UTF-8")
-            result = result.rstrip(os.linesep)
-            return result
+            have_git = None
+            try:
+                sp.check_call(['git', '--version'], stdout=sp.DEVNULL)
+                have_git = True
+            except:
+                have_git = False
+            if have_git:
+                have_GNU_date = None
+                try:
+                    sp.check_call(['date', '--version'], stdout=sp.DEVNULL)
+                    have_GNU_date = True
+                except:
+                    have_GNU_date = False
+                if have_GNU_date:
+                    args = ['git', 'log', '-n', '1', 'ChangeLog']
+                    result = sp.check_output(args, cwd=DIRS['root']).decode("UTF-8")
+                    # Get date as "Fri Mar 21 07:16:51 2008 -0600" from string
+                    pattern = re.compile('^Date:[\t ]*(.*?)$', re.M)
+                    result = pattern.findall(result)[0]
+                    # Turn "Fri Mar 21 07:16:51 2008 -0600" into "Mar 21 2008 07:16:51 -0600"
+                    pattern = re.compile('^[^ ]* ([^ ]*) ([0-9]*) ([0-9:]*) ([0-9]*) ')
+                    result = pattern.sub('\\1 \\2 \\4 \\3 ', result)
+                    # Use GNU date to compute the time in GMT
+                    args = ['date', '-d', result, '-u', '+%Y-%m-%d %H:%M:%S']
+                    proc = sp.check_output(args)
+                    result = str(proc, "UTF-8")
+                    result = result.rstrip(os.linesep)
+                    return result
+        # gnulib copy without versioning information.
+        first_changelog_line = None
+        with codecs.open(os.path.join(DIRS['root'], 'ChangeLog'), 'rb', 'UTF-8') as file:
+            line = file.readline()
+            first_changelog_line = line.rstrip()
+        result = re.compile(' .*').sub('', first_changelog_line)
+        return result
 
     def usage(self):
         '''Show help message.'''
@@ -289,10 +307,20 @@ Report bugs to <bug-gnulib@gnu.org>.'''
     def version(self):
         '''Return formatted string which contains git version.'''
         if isdir(DIRS['git']):
-            version_gen = joinpath(DIRS['build-aux'], 'git-version-gen')
-            args = [version_gen, DIRS['root']]
-            result = sp.check_output(args).decode("UTF-8")
-            result = result.strip()
-            if result == 'UNKNOWN':
-                result = ''
-            return result
+            have_git = None
+            try:
+                sp.check_call(['git', '--version'], stdout=sp.DEVNULL)
+                have_git = True
+            except:
+                have_git = False
+            if have_git:
+                version_gen = joinpath(DIRS['build-aux'], 'git-version-gen')
+                args = [version_gen, '/dev/null']
+                result = sp.check_output(args, cwd=DIRS['root']).decode("UTF-8")
+                result = result.strip()
+                result = result.replace('-dirty', '-modified')
+                if result == 'UNKNOWN':
+                    result = ''
+                return result
+        # gnulib copy without versioning information.
+        return ''
diff --git a/pygnulib/constants.py b/pygnulib/constants.py
index 4eff6da8bc..ffee05846e 100644
--- a/pygnulib/constants.py
+++ b/pygnulib/constants.py
@@ -41,7 +41,7 @@ __author__ = \
         'Dmitriy Selyutin',
     ]
 __license__ = 'GNU GPLv3+'
-__copyright__ = '2002-2017 Free Software Foundation, Inc.'
+__copyright__ = '2002-2022 Free Software Foundation, Inc.'
 
 
 #===============================================================================
-- 
2.34.1

>From eb194fa7a5c8abc2e79ca608466b04dc89a7c67d Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Fri, 5 Aug 2022 15:15:16 +0200
Subject: [PATCH 03/12] gnulib-tool.py: Fix 'Undefined variable' errors.

* pygnulib/constants.py: Import codecs.
* pygnulib/GLConfig.py (GLConfig.setLibName): Fix local variable
reference.
* pygnulib/GLFileSystem.py (GLFileSystem.lookup,
GLFileAssistant.update): Fix local variable references.
* pygnulib/GLEmiter.py (GLEmiter.po_POTFILES_in): Fix reference.
* pygnulib/GLTestDir.py (GLMegaTestDir.execute): Define missing local
variables.
---
 ChangeLog                | 10 ++++++++++
 pygnulib/GLConfig.py     |  2 +-
 pygnulib/GLEmiter.py     |  2 +-
 pygnulib/GLFileSystem.py |  6 +++---
 pygnulib/GLTestDir.py    |  3 +++
 pygnulib/constants.py    |  1 +
 6 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 81871735d2..1d3630beea 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2022-08-05  Bruno Haible  <br...@clisp.org>
 
+	gnulib-tool.py: Fix 'Undefined variable' errors.
+	* pygnulib/constants.py: Import codecs.
+	* pygnulib/GLConfig.py (GLConfig.setLibName): Fix local variable
+	reference.
+	* pygnulib/GLFileSystem.py (GLFileSystem.lookup,
+	GLFileAssistant.update): Fix local variable references.
+	* pygnulib/GLEmiter.py (GLEmiter.po_POTFILES_in): Fix reference.
+	* pygnulib/GLTestDir.py (GLMegaTestDir.execute): Define missing local
+	variables.
+
 	gnulib-tool.py: Make option --version work.
 	* pygnulib/constants.py (__copyright__): Bump copyright year.
 	* pygnulib/GLInfo.py (GLInfo.authors): Add a comma after the
diff --git a/pygnulib/GLConfig.py b/pygnulib/GLConfig.py
index 039b4f012d..cda218e423 100644
--- a/pygnulib/GLConfig.py
+++ b/pygnulib/GLConfig.py
@@ -764,7 +764,7 @@ class GLConfig(object):
                 self.table['libname'] = libname
         else:  # if type of libname is not str
             raise TypeError('libname must be a string, not %s'
-                            % type(module).__name__)
+                            % type(libname).__name__)
 
     def resetLibName(self):
         '''Reset the library name to 'libgnu'.'''
diff --git a/pygnulib/GLEmiter.py b/pygnulib/GLEmiter.py
index b56e551f1d..b547fde7e7 100644
--- a/pygnulib/GLEmiter.py
+++ b/pygnulib/GLEmiter.py
@@ -450,7 +450,7 @@ USE_MSGCTXT = no\n"""
         emit = ''
         sourcebase = self.config['sourcebase']
         sourcebase = '%s%s' % (self.sourcebase, os.path.sep)
-        files = [ substart('lib/', sourcebase, file)
+        files = [ constants.substart('lib/', sourcebase, file)
                   for file in files ]
         files = [ file
                   for file in files
diff --git a/pygnulib/GLFileSystem.py b/pygnulib/GLFileSystem.py
index 7bec0f9e6e..9e6161a24d 100644
--- a/pygnulib/GLFileSystem.py
+++ b/pygnulib/GLFileSystem.py
@@ -88,7 +88,7 @@ class GLFileSystem(object):
         GLConfig: localpath.'''
         if type(name) is not str:
             raise TypeError('name must be a string, not %s'
-                            % type(module).__name__)
+                            % type(name).__name__)
         localpath = self.config['localpath']
         # Each element in localpath is a directory whose contents overrides
         # or amends the result of the lookup in the rest of localpath and
@@ -322,9 +322,9 @@ class GLFileAssistant(object):
                         raise GLError(17, original)
             else:  # if self.config['dryrun']
                 if already_present:
-                    print('Update file %s (backup in %s)' % (rewritten, backup))
+                    print('Update file %s (backup in %s)' % (rewritten, backupname))
                 else:  # if not already_present
-                    print('Replace file %s (backup in %s)' % (rewritten, backup))
+                    print('Replace file %s (backup in %s)' % (rewritten, backupname))
 
     def add_or_update(self, already_present):
         '''GLFileAssistant.add_or_update(already_present)
diff --git a/pygnulib/GLTestDir.py b/pygnulib/GLTestDir.py
index 624a38317e..db74b9b4e3 100644
--- a/pygnulib/GLTestDir.py
+++ b/pygnulib/GLTestDir.py
@@ -906,6 +906,9 @@ class GLMegaTestDir(object):
 
         Create a mega scratch package with the given modules one by one and all
         together.'''
+        auxdir = self.config['auxdir']
+        verbose = self.config['verbosity']
+
         megasubdirs = list()
         modules = [ self.modulesystem.find(m)
                     for m in self.config['modules'] ]
diff --git a/pygnulib/constants.py b/pygnulib/constants.py
index ffee05846e..313aac94a1 100644
--- a/pygnulib/constants.py
+++ b/pygnulib/constants.py
@@ -25,6 +25,7 @@ import sys
 import platform
 import shutil
 import tempfile
+import codecs
 import subprocess as sp
 import __main__ as interpreter
 
-- 
2.34.1

>From 45b3978734eb20b5d7642dba5560c660782916c4 Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Fri, 5 Aug 2022 17:13:20 +0200
Subject: [PATCH 04/12] gnulib-tool.py: Fix 'Unused import' warnings.

* gnulib-tool.py: Remove unused imports.
* pygnulib/*.py: Likewise.
---
 ChangeLog                   | 4 ++++
 gnulib-tool.py              | 5 +++--
 pygnulib/GLConfig.py        | 4 ----
 pygnulib/GLEmiter.py        | 4 ----
 pygnulib/GLError.py         | 4 ----
 pygnulib/GLFileSystem.py    | 3 ---
 pygnulib/GLImport.py        | 5 -----
 pygnulib/GLInfo.py          | 2 --
 pygnulib/GLMakefileTable.py | 7 -------
 pygnulib/GLTestDir.py       | 4 ----
 10 files changed, 7 insertions(+), 35 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 1d3630beea..e838c4610c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2022-08-05  Bruno Haible  <br...@clisp.org>
 
+	gnulib-tool.py: Fix 'Unused import' warnings.
+	* gnulib-tool.py: Remove unused imports.
+	* pygnulib/*.py: Likewise.
+
 	gnulib-tool.py: Fix 'Undefined variable' errors.
 	* pygnulib/constants.py: Import codecs.
 	* pygnulib/GLConfig.py (GLConfig.setLibName): Fix local variable
diff --git a/gnulib-tool.py b/gnulib-tool.py
index c4386133a6..4e5a87d4f2 100755
--- a/gnulib-tool.py
+++ b/gnulib-tool.py
@@ -29,6 +29,9 @@
 # You can use this command to check the style:
 #   $ pycodestyle --max-line-length=136 --ignore=E265,W503,E241,E711,E712,E201,E202,E221 gnulib-tool.py pygnulib/*.py
 
+# You can use this command to check for mistakes:
+#   $ pylint --disable=C0103,C0114,C0121,C0209,C0301,C0302,R0902,R0912,R0913,R0914,R0915,R1705,R1702,R1720 gnulib-tool.py pygnulib/*.py
+
 
 #===============================================================================
 # Define global imports
@@ -38,11 +41,9 @@ import re
 import sys
 import codecs
 import random
-import shutil
 import argparse
 import subprocess as sp
 from tempfile import mktemp
-from pprint import pprint
 from pygnulib import constants
 from pygnulib import classes
 
diff --git a/pygnulib/GLConfig.py b/pygnulib/GLConfig.py
index cda218e423..baf61029c9 100644
--- a/pygnulib/GLConfig.py
+++ b/pygnulib/GLConfig.py
@@ -17,12 +17,8 @@
 # Define global imports
 #===============================================================================
 import os
-import re
-import sys
 import copy
-import codecs
 import tempfile
-import subprocess as sp
 from . import constants
 from .GLError import GLError
 
diff --git a/pygnulib/GLEmiter.py b/pygnulib/GLEmiter.py
index b547fde7e7..97bb585e3f 100644
--- a/pygnulib/GLEmiter.py
+++ b/pygnulib/GLEmiter.py
@@ -18,19 +18,15 @@
 #===============================================================================
 import os
 import re
-import sys
 import codecs
-import shutil
 import subprocess as sp
 from . import constants
 from .GLInfo import GLInfo
-from .GLError import GLError
 from .GLConfig import GLConfig
 from .GLModuleSystem import GLModule
 from .GLModuleSystem import GLModuleTable
 from .GLMakefileTable import GLMakefileTable
 from .GLFileSystem import GLFileAssistant
-from pprint import pprint
 
 
 #===============================================================================
diff --git a/pygnulib/GLError.py b/pygnulib/GLError.py
index a366da5b1a..c736e423af 100644
--- a/pygnulib/GLError.py
+++ b/pygnulib/GLError.py
@@ -17,10 +17,6 @@
 # Define global imports
 #===============================================================================
 import os
-import re
-import sys
-import locale
-import codecs
 from . import constants
 
 
diff --git a/pygnulib/GLFileSystem.py b/pygnulib/GLFileSystem.py
index 9e6161a24d..bee38223d5 100644
--- a/pygnulib/GLFileSystem.py
+++ b/pygnulib/GLFileSystem.py
@@ -17,10 +17,7 @@
 # Define global imports
 #===============================================================================
 import os
-import re
-import sys
 import codecs
-import shutil
 import filecmp
 import subprocess as sp
 from enum import Enum
diff --git a/pygnulib/GLImport.py b/pygnulib/GLImport.py
index 3b2b14eb4b..bf8171ea6b 100644
--- a/pygnulib/GLImport.py
+++ b/pygnulib/GLImport.py
@@ -18,16 +18,11 @@
 #===============================================================================
 import os
 import re
-import sys
-import locale
 import codecs
-import shutil
-import filecmp
 import subprocess as sp
 from . import constants
 from .GLError import GLError
 from .GLConfig import GLConfig
-from .GLModuleSystem import GLModule
 from .GLModuleSystem import GLModuleTable
 from .GLModuleSystem import GLModuleSystem
 from .GLFileSystem import GLFileSystem
diff --git a/pygnulib/GLInfo.py b/pygnulib/GLInfo.py
index 5e386e7c34..b2d4457a5f 100644
--- a/pygnulib/GLInfo.py
+++ b/pygnulib/GLInfo.py
@@ -18,8 +18,6 @@
 #===============================================================================
 import os
 import re
-import sys
-import locale
 import codecs
 import subprocess as sp
 from . import constants
diff --git a/pygnulib/GLMakefileTable.py b/pygnulib/GLMakefileTable.py
index c4fb6d195a..abaeaf9d2e 100644
--- a/pygnulib/GLMakefileTable.py
+++ b/pygnulib/GLMakefileTable.py
@@ -17,15 +17,8 @@
 # Define global imports
 #===============================================================================
 import os
-import re
-import sys
-import codecs
-import hashlib
-import subprocess as sp
 from . import constants
-from .GLError import GLError
 from .GLConfig import GLConfig
-from .GLFileSystem import GLFileSystem
 
 
 #===============================================================================
diff --git a/pygnulib/GLTestDir.py b/pygnulib/GLTestDir.py
index db74b9b4e3..757c494011 100644
--- a/pygnulib/GLTestDir.py
+++ b/pygnulib/GLTestDir.py
@@ -19,15 +19,11 @@
 import os
 import re
 import sys
-import locale
 import codecs
-import shutil
-import filecmp
 import subprocess as sp
 from . import constants
 from .GLError import GLError
 from .GLConfig import GLConfig
-from .GLModuleSystem import GLModule
 from .GLModuleSystem import GLModuleTable
 from .GLModuleSystem import GLModuleSystem
 from .GLFileSystem import CopyAction
-- 
2.34.1

>From 7a106efa3268cad77c6b21b798296284923b4a2f Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Fri, 5 Aug 2022 19:24:14 +0200
Subject: [PATCH 05/12] gnulib-tool.py: Fix link_if_changed function.

* pygnulib/constants.py (joinpath): Fix comment.
(as_link_value_at_dest): New function, extracted from link_relative.
(link_relative): Use it.
(link_if_changed): Really don't replace the symbolic link if it does not
need to change.
---
 ChangeLog             |  7 +++++++
 pygnulib/constants.py | 42 +++++++++++++++++++++++++++---------------
 2 files changed, 34 insertions(+), 15 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index e838c4610c..c48eabe254 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2022-08-05  Bruno Haible  <br...@clisp.org>
 
+	gnulib-tool.py: Fix link_if_changed function.
+	* pygnulib/constants.py (joinpath): Fix comment.
+	(as_link_value_at_dest): New function, extracted from link_relative.
+	(link_relative): Use it.
+	(link_if_changed): Really don't replace the symbolic link if it does not
+	need to change.
+
 	gnulib-tool.py: Fix 'Unused import' warnings.
 	* gnulib-tool.py: Remove unused imports.
 	* pygnulib/*.py: Likewise.
diff --git a/pygnulib/constants.py b/pygnulib/constants.py
index 313aac94a1..46c0cbc152 100644
--- a/pygnulib/constants.py
+++ b/pygnulib/constants.py
@@ -244,10 +244,10 @@ def cleaner(sequence):
         sequence = sequence.replace('[', '')
         sequence = sequence.replace(']', '')
     elif type(sequence) is list:
-        sequence = [value.replace('[', '').replace(']', '')
-                    for value in sequence]
-        sequence = [value.replace('(', '').replace(')', '')
-                    for value in sequence]
+        sequence = [ value.replace('[', '').replace(']', '')
+                     for value in sequence]
+        sequence = [ value.replace('(', '').replace(')', '')
+                     for value in sequence]
         sequence = [ False if value == 'false' else value
                      for value in sequence ]
         sequence = [ True if value == 'true' else value
@@ -262,7 +262,7 @@ def joinpath(head, *tail):
 
     Join two or more pathname components, inserting '/' as needed. If any
     component is an absolute path, all previous path components will be
-    discarded. The second argument may be string or list of strings.'''
+    discarded.'''
     newtail = list()
     for item in tail:
         newtail += [item]
@@ -356,36 +356,48 @@ def symlink_relative(src, dest):
         copyfile2(cp_src, dest)
 
 
-def link_relative(src, dest):
-    '''Like ln -s, except that src is given relative to the current directory
-    (or absolute), not given relative to the directory of dest.'''
+def as_link_value_at_dest(src, dest):
+    '''Compute the symbolic link value to place at dest, such that the
+    resulting symbolic link points to src. src is given relative to the
+    current directory (or absolute).'''
     if type(src) is not str:
         raise TypeError('src must be a string, not %s' % (type(src).__name__))
     if type(dest) is not str:
         raise TypeError('dest must be a string, not %s' % (type(dest).__name__))
     if src.startswith('/') or (len(src) >= 2 and src[1] == ':'):
-        symlink_relative(src, dest)
+        return src
     else:  # if src is not absolute
         if dest.startswith('/') or (len(dest) >= 2 and dest[1] == ':'):
             cwd = os.getcwd()
-            symlink_relative(joinpath(cwd, src), dest)
+            return joinpath(cwd, src)
         else:  # if dest is not absolute
             destdir = os.path.dirname(dest)
             if not destdir:
                 destdir = '.'
-            src = relativize(destdir, src)
-            symlink_relative(src, dest)
+            return relativize(destdir, src)
+
+
+def link_relative(src, dest):
+    '''Like ln -s, except that src is given relative to the current directory
+    (or absolute), not given relative to the directory of dest.'''
+    if type(src) is not str:
+        raise TypeError('src must be a string, not %s' % (type(src).__name__))
+    if type(dest) is not str:
+        raise TypeError('dest must be a string, not %s' % (type(dest).__name__))
+    link_value = as_link_value_at_dest(src, dest)
+    symlink_relative(link_value, dest)
 
 
 def link_if_changed(src, dest):
     '''Create a symlink, but avoids munging timestamps if the link is correct.'''
-    ln_target = os.path.realpath(src)
-    if not (os.path.islink(dest) and src == ln_target):
+    link_value = as_link_value_at_dest(src, dest)
+    if not (os.path.islink(dest) and os.readlink(dest) == link_value):
         try:
             os.remove(dest)
         except FileNotFoundError:
             pass
-        link_relative(src, dest)
+        # Equivalent to link_relative(src, dest):
+        symlink_relative(link_value, dest)
 
 
 def filter_filelist(separator, filelist,
-- 
2.34.1

>From ad534101bdf0b188babd525c4d54c9bf250763f7 Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Fri, 5 Aug 2022 23:15:39 +0200
Subject: [PATCH 06/12] gnulib-tool.py: Refactor --makefile-name option.

* gnulib-tool.py (main): Rename variable 'makefile' to 'makefile_name'.
* pygnulib/GLConfig.py: Rename attribute 'makefile' to 'makefile_name'.
* pygnulib/GLMakefileTable.py: Update.
* pygnulib/GLEmiter.py: Likewise.
* pygnulib/GLImport.py: Likewise.
* pygnulib/GLFileSystem.py (GLFileAssistant): Remove unused assignment.
---
 ChangeLog                   |  8 ++++++++
 gnulib-tool.py              | 12 ++++++------
 pygnulib/GLConfig.py        | 38 ++++++++++++++++++-------------------
 pygnulib/GLEmiter.py        | 24 +++++++++++------------
 pygnulib/GLFileSystem.py    |  1 -
 pygnulib/GLImport.py        | 28 +++++++++++++--------------
 pygnulib/GLMakefileTable.py | 10 +++++-----
 7 files changed, 64 insertions(+), 57 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index c48eabe254..85938bb76f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2022-08-05  Bruno Haible  <br...@clisp.org>
 
+	gnulib-tool.py: Refactor --makefile-name option.
+	* gnulib-tool.py (main): Rename variable 'makefile' to 'makefile_name'.
+	* pygnulib/GLConfig.py: Rename attribute 'makefile' to 'makefile_name'.
+	* pygnulib/GLMakefileTable.py: Update.
+	* pygnulib/GLEmiter.py: Likewise.
+	* pygnulib/GLImport.py: Likewise.
+	* pygnulib/GLFileSystem.py (GLFileAssistant): Remove unused assignment.
+
 	gnulib-tool.py: Fix link_if_changed function.
 	* pygnulib/constants.py (joinpath): Fix comment.
 	(as_link_value_at_dest): New function, extracted from link_relative.
diff --git a/gnulib-tool.py b/gnulib-tool.py
index 4e5a87d4f2..9c63f6147f 100755
--- a/gnulib-tool.py
+++ b/gnulib-tool.py
@@ -83,7 +83,7 @@ def main():
     tests = None
     libname = None
     lgpl = None
-    makefile = None
+    makefile_name = None
     libtool = None
     conddeps = None
     macro_prefix = None
@@ -365,9 +365,9 @@ def main():
                         action='append',
                         choices=['2', '3orGPLv2', '3'],
                         nargs='?')
-    # makefile
+    # makefile-name
     parser.add_argument("--makefile-name",
-                        dest="makefile",
+                        dest="makefile_name",
                         default=None,
                         type=str)
     # single-configure
@@ -555,7 +555,7 @@ def main():
                  or cmdargs.excl_privileged_tests != None
                  or cmdargs.excl_unportable_tests != None
                  or cmdargs.avoids != None or cmdargs.lgpl != None
-                 or cmdargs.makefile != None))):
+                 or cmdargs.makefile_name != None))):
         message = '%s: *** ' % constants.APP['name']
         message += 'invalid options for --%s mode\n' % mode
         message += 'Try \'gnulib-tool --help\' for more information.\n'
@@ -629,7 +629,7 @@ def main():
         if lgpl == None:
             lgpl = True
     libtool = cmdargs.libtool
-    makefile = cmdargs.makefile
+    makefile_name = cmdargs.makefile_name
     avoids = cmdargs.avoids
     if avoids != None:
         avoids = [ module
@@ -655,7 +655,7 @@ def main():
         excl_test_categories=excl_test_categories,
         libname=libname,
         lgpl=lgpl,
-        makefile=makefile,
+        makefile_name=makefile_name,
         libtool=libtool,
         conddeps=conddeps,
         macro_prefix=macro_prefix,
diff --git a/pygnulib/GLConfig.py b/pygnulib/GLConfig.py
index baf61029c9..34788f0f74 100644
--- a/pygnulib/GLConfig.py
+++ b/pygnulib/GLConfig.py
@@ -56,7 +56,7 @@ class GLConfig(object):
                  sourcebase=None, m4base=None, pobase=None, docbase=None, testsbase=None,
                  modules=None, avoids=None, files=None,
                  incl_test_categories=None, excl_test_categories=None, libname=None,
-                 lgpl=None, makefile=None, libtool=None, conddeps=None, macro_prefix=None,
+                 lgpl=None, makefile_name=None, libtool=None, conddeps=None, macro_prefix=None,
                  podomain=None, witness_c_macro=None, vc_files=None, symbolic=None,
                  lsymbolic=None, configure_ac=None, ac_version=None,
                  libtests=None, single_configure=None, verbose=None, dryrun=None,
@@ -130,10 +130,10 @@ class GLConfig(object):
         self.resetLGPL()
         if lgpl != None:
             self.setLGPL(lgpl)
-        # makefile
-        self.resetMakefile()
-        if makefile != None:
-            self.setMakefile(makefile)
+        # makefile_name
+        self.resetMakefileName()
+        if makefile_name != None:
+            self.setMakefileName(makefile_name)
         # libtool
         self.resetLibtool()
         if libtool != None:
@@ -671,7 +671,7 @@ class GLConfig(object):
 
     def setInclTestCategory(self, category, enable):
         '''Enable or disable the given test category.'''
-        if (enable):
+        if enable:
             self.enableInclTestCategory(category)
         else:
             self.disableInclTestCategory(category)
@@ -855,26 +855,26 @@ class GLConfig(object):
         include_guard_prefix = 'GL'
         self.table['include_guard_prefix'] = include_guard_prefix
 
-    # Define makefile methods.
-    def getMakefile(self):
+    # Define makefile_name methods.
+    def getMakefileName(self):
         '''Return the name of makefile in automake syntax in the source-base and
         tests-base directories. Default is 'Makefile.am'.'''
-        return self.table['makefile']
+        return self.table['makefile_name']
 
-    def setMakefile(self, makefile):
+    def setMakefileName(self, makefile_name):
         '''Specify the name of makefile in automake syntax in the source-base and
         tests-base directories. Default is 'Makefile.am'.'''
-        if type(makefile) is str:
-            if makefile:
-                self.table['makefile'] = makefile
-        else:  # if type of makefile is not str
-            raise TypeError('makefile must be a string, not %s'
-                            % type(makefile).__name__)
-
-    def resetMakefile(self):
+        if type(makefile_name) is str:
+            if makefile_name:
+                self.table['makefile_name'] = makefile_name
+        else:  # if type of makefile_name is not str
+            raise TypeError('makefile_name must be a string, not %s'
+                            % type(makefile_name).__name__)
+
+    def resetMakefileName(self):
         '''Reset the name of makefile in automake syntax in the source-base and
         tests-base directories. Default is 'Makefile.am'.'''
-        self.table['makefile'] = ''
+        self.table['makefile_name'] = ''
 
     # Define podomain methods.
     def getPoDomain(self):
diff --git a/pygnulib/GLEmiter.py b/pygnulib/GLEmiter.py
index 97bb585e3f..9d9ca458ee 100644
--- a/pygnulib/GLEmiter.py
+++ b/pygnulib/GLEmiter.py
@@ -604,7 +604,7 @@ AC_DEFUN([%V1%_LIBSOURCES], [
 
         Emit the contents of the library Makefile. Returns str and a bool
         variable which shows if subdirectories are used.
-        GLConfig: localpath, sourcebase, libname, pobase, auxdir, makefile, libtool,
+        GLConfig: localpath, sourcebase, libname, pobase, auxdir, makefile_name, libtool,
         macro_prefix, podomain, conddeps, witness_c_macro.
 
         destfile is a filename relative to destdir of Makefile being generated.
@@ -638,7 +638,7 @@ AC_DEFUN([%V1%_LIBSOURCES], [
         libname = self.config['libname']
         pobase = self.config['pobase']
         auxdir = self.config['auxdir']
-        makefile = self.config['makefile']
+        makefile_name = self.config['makefile_name']
         libtool = self.config['libtool']
         macro_prefix = self.config['macro_prefix']
         podomain = self.config['podomain']
@@ -651,9 +651,9 @@ AC_DEFUN([%V1%_LIBSOURCES], [
 
         # When creating an includable Makefile.am snippet, augment variables with
         # += instead of assigning them.
-        if makefile:
+        if makefile_name:
             assign = '+='
-        else:  # if not makefile
+        else:  # if not makefile_name
             assign = '='
         if libtool:
             libext = 'la'
@@ -732,7 +732,7 @@ AC_DEFUN([%V1%_LIBSOURCES], [
                                 and file.count('/') > 1):
                             uses_subdirs = True
                             break
-        if not makefile:
+        if not makefile_name:
             subdir_options = ''
             # If there are source files in subdirectories, prevent collision of the
             # object files (example: hash.c and libxml/hash.c).
@@ -740,7 +740,7 @@ AC_DEFUN([%V1%_LIBSOURCES], [
                 subdir_options = ' subdir-objects'
             emit += 'AUTOMAKE_OPTIONS = 1.9.6 gnits%s\n' % subdir_options
         emit += '\n'
-        if not makefile:
+        if not makefile_name:
             emit += 'SUBDIRS =\n'
             emit += 'noinst_HEADERS =\n'
             emit += 'noinst_LIBRARIES =\n'
@@ -758,7 +758,7 @@ AC_DEFUN([%V1%_LIBSOURCES], [
             emit += 'BUILT_SOURCES =\n'
             emit += 'SUFFIXES =\n'
         emit += 'MOSTLYCLEANFILES %s core *.stackdump\n' % assign
-        if not makefile:
+        if not makefile_name:
             emit += 'MOSTLYCLEANDIRS =\n'
             emit += 'CLEANFILES =\n'
             emit += 'DISTCLEANFILES =\n'
@@ -788,10 +788,10 @@ AC_DEFUN([%V1%_LIBSOURCES], [
         if for_test:
             cppflags_part2 = ' -DGNULIB_STRICT_CHECKING=1'
         cppflags = '%s%s' % (cppflags_part1, cppflags_part2)
-        if not makefile:
+        if not makefile_name:
             emit += 'AM_CPPFLAGS =%s\n' % cppflags
             emit += 'AM_CFLAGS =\n'
-        else:  # if makefile
+        else:  # if makefile_name
             if cppflags:
                 emit += 'AM_CPPFLAGS +=%s\n' % cppflags
         emit += '\n'
@@ -807,7 +807,7 @@ AC_DEFUN([%V1%_LIBSOURCES], [
         insnippets = bool(pattern.findall(allsnippets))
         # Then test if $sourcebase/Makefile.am (if it exists) specifies it.
         path = joinpath(sourcebase, 'Makefile.am')
-        if makefile and isfile(path):
+        if makefile_name and isfile(path):
             with codecs.open(path, 'rb', 'UTF-8') as file:
                 data = file.read()
             inmakefile = bool(pattern.findall(data))
@@ -866,7 +866,7 @@ AC_DEFUN([%V1%_LIBSOURCES], [
 
         Emit the contents of the tests Makefile. Returns str and a bool variable
         which shows if subdirectories are used.
-        GLConfig: localpath, modules, libname, auxdir, makefile, libtool,
+        GLConfig: localpath, modules, libname, auxdir, makefile_name, libtool,
         sourcebase, m4base, testsbase, macro_prefix, witness_c_macro,
         single_configure, libtests.
 
@@ -901,7 +901,7 @@ AC_DEFUN([%V1%_LIBSOURCES], [
         m4base = self.config['m4base']
         pobase = self.config['pobase']
         testsbase = self.config['testsbase']
-        makefile = self.config['makefile']
+        makefile_name = self.config['makefile_name']
         libtool = self.config['libtool']
         macro_prefix = self.config['macro_prefix']
         podomain = self.config['podomain']
diff --git a/pygnulib/GLFileSystem.py b/pygnulib/GLFileSystem.py
index bee38223d5..82f5f085b9 100644
--- a/pygnulib/GLFileSystem.py
+++ b/pygnulib/GLFileSystem.py
@@ -173,7 +173,6 @@ class GLFileAssistant(object):
         self.original = None
         self.rewritten = None
         self.added = list()
-        self.makefile = list()
         self.config = config
         self.transformers = transformers
         self.filesystem = GLFileSystem(self.config)
diff --git a/pygnulib/GLImport.py b/pygnulib/GLImport.py
index bf8171ea6b..dda10c1b76 100644
--- a/pygnulib/GLImport.py
+++ b/pygnulib/GLImport.py
@@ -193,7 +193,7 @@ class GLImport(object):
             if tempdict['gl_TESTS_BASE']:
                 self.cache.setTestsBase(cleaner(tempdict['gl_TESTS_BASE']))
             if tempdict['gl_MAKEFILE_NAME']:
-                self.cache.setMakefile(cleaner(tempdict['gl_MAKEFILE_NAME']))
+                self.cache.setMakefileName(cleaner(tempdict['gl_MAKEFILE_NAME']))
             if tempdict['gl_MACRO_PREFIX']:
                 self.cache.setMacroPrefix(cleaner(tempdict['gl_MACRO_PREFIX']))
             if tempdict['gl_PO_DOMAIN']:
@@ -364,7 +364,7 @@ class GLImport(object):
         conddeps = self.config.checkCondDeps()
         libname = self.config.getLibName()
         lgpl = self.config.getLGPL()
-        makefile = self.config.getMakefile()
+        makefile_name = self.config.getMakefileName()
         libtool = self.config.checkLibtool()
         macro_prefix = self.config.getMacroPrefix()
         witness_c_macro = self.config.getWitnessCMacro()
@@ -406,8 +406,8 @@ class GLImport(object):
                 actioncmd += ' --lgpl'
             else:  # if lgpl != True
                 actioncmd += ' --lgpl=%s' % lgpl
-        if makefile:
-            actioncmd += ' --makefile-name=%s' % makefile
+        if makefile_name:
+            actioncmd += ' --makefile-name=%s' % makefile_name
         if conddeps:
             actioncmd += ' --conditional-dependencies'
         else:  # if not conddeps
@@ -479,7 +479,7 @@ class GLImport(object):
         testsbase = self.config['testsbase']
         lgpl = self.config['lgpl']
         libname = self.config['libname']
-        makefile = self.config['makefile']
+        makefile_name = self.config['makefile_name']
         conddeps = self.config['conddeps']
         libtool = self.config['libtool']
         macro_prefix = self.config['macro_prefix']
@@ -532,7 +532,7 @@ class GLImport(object):
                 emit += 'gl_LGPL\n'
             else:  # if lgpl != True
                 emit += 'gl_LGPL([%s])\n' % lgpl
-        emit += 'gl_MAKEFILE_NAME([%s])\n' % makefile
+        emit += 'gl_MAKEFILE_NAME([%s])\n' % makefile_name
         if conddeps:
             emit += 'gl_CONDITIONAL_DEPENDENCIES\n'
         if libtool:
@@ -562,7 +562,7 @@ class GLImport(object):
         testsbase = self.config['testsbase']
         lgpl = self.config['lgpl']
         libname = self.config['libname']
-        makefile = self.config['makefile']
+        makefile_name = self.config['makefile_name']
         conddeps = self.config['conddeps']
         libtool = self.config['libtool']
         macro_prefix = self.config['macro_prefix']
@@ -768,7 +768,7 @@ AC_DEFUN([%s_FILE_LIST], [\n''' % macro_prefix
         lgpl = self.config['lgpl']
         copyrights = self.config['copyrights']
         libname = self.config['libname']
-        makefile = self.config['makefile']
+        makefile_name = self.config['makefile_name']
         conddeps = self.config['conddeps']
         libtool = self.config['libtool']
         macro_prefix = self.config['macro_prefix']
@@ -1004,7 +1004,7 @@ AC_DEFUN([%s_FILE_LIST], [\n''' % macro_prefix
         lgpl = self.config['lgpl']
         copyrights = self.config['copyrights']
         libname = self.config['libname']
-        makefile = self.config['makefile']
+        makefile_name = self.config['makefile_name']
         conddeps = self.config['conddeps']
         libtool = self.config['libtool']
         macro_prefix = self.config['macro_prefix']
@@ -1102,10 +1102,10 @@ AC_DEFUN([%s_FILE_LIST], [\n''' % macro_prefix
         include_guard_prefix = self.config['include_guard_prefix']
 
         # Determine makefile name.
-        if not makefile:
+        if not makefile_name:
             makefile_am = 'Makefile.am'
-        else:  # if makefile
-            makefile_am = makefile
+        else:  # if makefile_name
+            makefile_am = makefile_name
 
         # Create normal Makefile.ams.
         for_test = False
@@ -1414,14 +1414,14 @@ in <library>_a_LDFLAGS or <library>_la_LDFLAGS when linking a library.''')
         if makefile_am == 'Makefile.am':
             print('  - add "%s/Makefile" to AC_CONFIG_FILES in %s,' % (sourcebase, configure_ac))
         else:  # if makefile_am != 'Makefile.am'
-            print('  - "include %s" from within "%s/Makefile.am",' % (makefile, sourcebase))
+            print('  - "include %s" from within "%s/Makefile.am",' % (makefile_name, sourcebase))
         if pobase:
             print('  - add "%s/Makefile.in to AC_CONFIG_FILES in %s,' % (pobase, configure_ac))
         if inctests:
             if makefile_am == 'Makefile.am':
                 print('  - add "%s/Makefile" to AC_CONFIG_FILES in %s,' % (testsbase, configure_ac))
             else:  # if makefile_am != 'Makefile.am'
-                print('  - "include %s" from within "%s/Makefile.am",' % (makefile, testsbase))
+                print('  - "include %s" from within "%s/Makefile.am",' % (makefile_name, testsbase))
         # Print makefile edits.
         current_edit = int()
         makefile_am_edits = self.makefiletable.count()
diff --git a/pygnulib/GLMakefileTable.py b/pygnulib/GLMakefileTable.py
index abaeaf9d2e..d23f5710cb 100644
--- a/pygnulib/GLMakefileTable.py
+++ b/pygnulib/GLMakefileTable.py
@@ -81,18 +81,18 @@ class GLMakefileTable(object):
         Add a special row to Makefile.am table with the first parent directory
         which contains or will contain Makefile.am file.
         GLConfig: sourcebase, m4base, testsbase, incl_test_categories,
-        excl_test_categories, makefile.'''
+        excl_test_categories, makefile_name.'''
         m4base = self.config['m4base']
         sourcebase = self.config['sourcebase']
         testsbase = self.config['testsbase']
-        makefile = self.config['makefile']
+        makefile_name = self.config['makefile_name']
         inctests = self.config.checkInclTestCategory(TESTS['tests'])
         dir1 = '%s%s' % (m4base, os.path.sep)
         mfd = 'Makefile.am'
-        if not makefile:
+        if not makefile_name:
             mfx = 'Makefile.am'
-        else:  # if makefile
-            mfx = makefile
+        else:  # if makefile_name
+            mfx = makefile_name
         dir2 = ''
         while (dir1
                and (joinpath(self.config['destdir'], dir1, mfd)
-- 
2.34.1

>From fcf959cfe1f3ee1c84bf47af33023c440894b734 Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Fri, 5 Aug 2022 23:34:20 +0200
Subject: [PATCH 07/12] gnulib-tool.py: Remove redundant type checks.

* pygnulib/GLConfig.py (GLConfig.__init__): Remove redundant type
checks, left over from 2022-08-04.
(GLConfig.getIncludeGuardPrefix): Improve comment.
(GLConfig.resetMacroPrefix): Optimize.
---
 ChangeLog            |  6 ++++
 pygnulib/GLConfig.py | 71 +++++++++++---------------------------------
 2 files changed, 24 insertions(+), 53 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 85938bb76f..4301d9c847 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2022-08-05  Bruno Haible  <br...@clisp.org>
 
+	gnulib-tool.py: Remove redundant type checks.
+	* pygnulib/GLConfig.py (GLConfig.__init__): Remove redundant type
+	checks, left over from 2022-08-04.
+	(GLConfig.getIncludeGuardPrefix): Improve comment.
+	(GLConfig.resetMacroPrefix): Optimize.
+
 	gnulib-tool.py: Refactor --makefile-name option.
 	* gnulib-tool.py (main): Rename variable 'makefile' to 'makefile_name'.
 	* pygnulib/GLConfig.py: Rename attribute 'makefile' to 'makefile_name'.
diff --git a/pygnulib/GLConfig.py b/pygnulib/GLConfig.py
index 34788f0f74..e571dff2b3 100644
--- a/pygnulib/GLConfig.py
+++ b/pygnulib/GLConfig.py
@@ -137,19 +137,11 @@ class GLConfig(object):
         # libtool
         self.resetLibtool()
         if libtool != None:
-            if type(libtool) is bool:
-                self.setLibtool(libtool)
-            else:  # if type(libtool) is not bool
-                raise TypeError('libtool must be a bool, not %s'
-                                % type(libtool).__name__)
+            self.setLibtool(libtool)
         # conddeps
         self.resetCondDeps()
         if conddeps != None:
-            if type(conddeps) is bool:
-                self.setCondDeps(conddeps)
-            else:  # if type(conddeps) is not bool
-                raise TypeError('conddeps must be a bool, not %s'
-                                % type(conddeps).__name__)
+            self.setCondDeps(conddeps)
         # macro_prefix
         self.resetMacroPrefix()
         if macro_prefix != None:
@@ -172,27 +164,15 @@ class GLConfig(object):
         # vc_files
         self.resetVCFiles()
         if vc_files != None:
-            if type(vc_files) is bool:
-                self.setVCFiles(vc_files)
-            else:  # if type(vc_files) is not bool
-                raise TypeError('vc_files must be a bool, not %s'
-                                % type(vc_files).__name__)
+            self.setVCFiles(vc_files)
         # symbolic
         self.resetSymbolic()
         if symbolic != None:
-            if type(symbolic) is bool:
-                self.setSymbolic(symbolic)
-            else:  # if type(symbolic) is not bool
-                raise TypeError('symbolic must be a bool, not %s'
-                                % type(symbolic).__name__)
+            self.setSymbolic(symbolic)
         # lsymbolic
         self.resetLSymbolic()
         if lsymbolic != None:
-            if type(lsymbolic) is bool:
-                self.setLSymbolic(lsymbolic)
-            else:  # if type(lsymbolic) is not bool
-                raise TypeError('lsymbolic must be a bool, not %s'
-                                % type(lsymbolic).__name__)
+            self.setLSymbolic(lsymbolic)
         # configure_ac
         self.resetAutoconfFile()
         if configure_ac != None:
@@ -204,19 +184,11 @@ class GLConfig(object):
         # libtests
         self.resetLibtests()
         if libtests != None:
-            if type(libtests) is bool:
-                self.setLibtests(libtests)
-            else:  # if type(libtests) is not bool
-                raise TypeError('libtests must be a bool, not %s'
-                                % type(libtests).__name__)
+            self.setLibtests(libtests)
         # single_configure
         self.resetSingleConfigure()
         if single_configure != None:
-            if type(single_configure) is bool:
-                self.setSingleConfigure(single_configure)
-            else:  # if type(single_configure) is not bool
-                raise TypeError('single_configure must be a bool, not %s'
-                                % type(single_configure).__name__)
+            self.setSingleConfigure(single_configure)
         # verbose
         self.resetVerbosity()
         if verbose != None:
@@ -224,19 +196,11 @@ class GLConfig(object):
         # dryrun
         self.resetDryRun()
         if dryrun != None:
-            if type(dryrun) is bool:
-                self.setDryRun(dryrun)
-            else:  # if type(dryrun) is not bool
-                raise TypeError('dryrun must be a bool, not %s'
-                                % type(dryrun).__name__)
+            self.setDryRun(dryrun)
         # errors
         self.resetErrors()
         if errors != None:
-            if type(errors) is bool:
-                self.setErrors(errors)
-            else:  # if type(errors) is not bool
-                raise TypeError('errors must be a bool, not %s'
-                                % type(errors).__name__)
+            self.setErrors(errors)
 
     # Define special methods.
     def __repr__(self):
@@ -819,20 +783,22 @@ class GLConfig(object):
         Default value is None, which means that lgpl is disabled.'''
         self.table['lgpl'] = None
 
-    def getIncludeGuardPrefix(self):
-        '''Return include_guard_prefix to use inside GLEmiter class.'''
-        return self.table['include_guard_prefix']
-
     def getModuleIndicatorPrefix(self):
         '''Return module_indicator_prefix to use inside GLEmiter class.'''
         return self.getIncludeGuardPrefix()
 
-    # Define macro_prefix methods.
+    # Define macro_prefix and include_guard_prefix methods.
+    # The include_guard_prefix is a replacement for ${gl_include_guard_prefix}.
+    # It is determined from the macro_prefix.
     def getMacroPrefix(self):
         '''Return the prefix of the macros 'gl_EARLY' and 'gl_INIT'.
         Default macro_prefix is 'gl'.'''
         return self.table['macro_prefix']
 
+    def getIncludeGuardPrefix(self):
+        '''Return the replacement for ${gl_include_guard_prefix}.'''
+        return self.table['include_guard_prefix']
+
     def setMacroPrefix(self, macro_prefix):
         '''Specify the prefix of the macros 'gl_EARLY' and 'gl_INIT'.
         Default macro_prefix is 'gl'.'''
@@ -852,8 +818,7 @@ class GLConfig(object):
         '''Reset the prefix of the macros 'gl_EARLY' and 'gl_INIT'.
         Default macro_prefix is 'gl'.'''
         self.table['macro_prefix'] = 'gl'
-        include_guard_prefix = 'GL'
-        self.table['include_guard_prefix'] = include_guard_prefix
+        self.table['include_guard_prefix'] = 'GL'
 
     # Define makefile_name methods.
     def getMakefileName(self):
@@ -976,11 +941,11 @@ class GLConfig(object):
         '''Specify preferred autoconf version. Default value is 2.59.'''
         self.table['ac_version'] = 2.59
 
-    # Define symbolic methods.
     def checkCopyrights(self):
         '''Check if copyright notices in files should be replaced.'''
         return self.table['copyrights']
 
+    # Define symbolic methods.
     def checkSymbolic(self):
         '''Check if pygnulib will make symbolic links instead of copying files.'''
         return self.table['symbolic']
-- 
2.34.1

>From 13af1a0d8a0bb1028bd4a1276c8da2d68db78367 Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Sat, 6 Aug 2022 00:14:02 +0200
Subject: [PATCH 08/12] gnulib-tool.py: Implement option --no-libtool.

* gnulib-tool.py (main): Accept option --no-libtool.
---
 ChangeLog           |  3 +++
 gnulib-tool.py      | 10 +++++++---
 gnulib-tool.py.TODO |  1 -
 3 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 4301d9c847..652600a45a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2022-08-05  Bruno Haible  <br...@clisp.org>
 
+	gnulib-tool.py: Implement option --no-libtool.
+	* gnulib-tool.py (main): Accept option --no-libtool.
+
 	gnulib-tool.py: Remove redundant type checks.
 	* pygnulib/GLConfig.py (GLConfig.__init__): Remove redundant type
 	checks, left over from 2022-08-04.
diff --git a/gnulib-tool.py b/gnulib-tool.py
index 9c63f6147f..f11c7bd5cb 100755
--- a/gnulib-tool.py
+++ b/gnulib-tool.py
@@ -319,10 +319,14 @@ def main():
                         default=None,
                         nargs=1)
     # libtool
-    parser.add_argument("--libtool",
-                        dest=libtool,
-                        default=False,
+    parser.add_argument('--libtool',
+                        dest='libtool',
+                        default=None,
                         action="store_true")
+    parser.add_argument('--no-libtool',
+                        dest='libtool',
+                        default=None,
+                        action="store_false")
     # libname
     parser.add_argument('--lib',
                         dest='libname',
diff --git a/gnulib-tool.py.TODO b/gnulib-tool.py.TODO
index de3a90dc37..6787e88df2 100644
--- a/gnulib-tool.py.TODO
+++ b/gnulib-tool.py.TODO
@@ -29,7 +29,6 @@ Implement the options:
   --gnu-make
   --tests-makefile-name
   --automake-subdir
-  --no-libtool
   --macro-prefix
   --po-domain
   --witness-c-macro
-- 
2.34.1

>From 0108a901f10bf6ed6198e565c35b091c3fe6e218 Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Sat, 6 Aug 2022 01:47:34 +0200
Subject: [PATCH 09/12] gnulib-tool.py: Refactor --makefile-name option.

* gnulib-tool.py (main): Handle option --makefile-name like all other
string-valued options.
---
 ChangeLog      |  4 ++++
 gnulib-tool.py | 10 ++++++----
 2 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 652600a45a..d98a5bd692 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2022-08-05  Bruno Haible  <br...@clisp.org>
 
+	gnulib-tool.py: Refactor --makefile-name option.
+	* gnulib-tool.py (main): Handle option --makefile-name like all other
+	string-valued options.
+
 	gnulib-tool.py: Implement option --no-libtool.
 	* gnulib-tool.py (main): Accept option --no-libtool.
 
diff --git a/gnulib-tool.py b/gnulib-tool.py
index f11c7bd5cb..ba15ba7154 100755
--- a/gnulib-tool.py
+++ b/gnulib-tool.py
@@ -314,9 +314,9 @@ def main():
                         action='store_true')
     # avoids
     parser.add_argument('--avoid',
-                        action='append',
                         dest='avoids',
                         default=None,
+                        action='append',
                         nargs=1)
     # libtool
     parser.add_argument('--libtool',
@@ -370,10 +370,10 @@ def main():
                         choices=['2', '3orGPLv2', '3'],
                         nargs='?')
     # makefile-name
-    parser.add_argument("--makefile-name",
-                        dest="makefile_name",
+    parser.add_argument('--makefile-name',
+                        dest='makefile_name',
                         default=None,
-                        type=str)
+                        nargs=1)
     # single-configure
     parser.add_argument('--single-configure',
                         dest='single_configure',
@@ -634,6 +634,8 @@ def main():
             lgpl = True
     libtool = cmdargs.libtool
     makefile_name = cmdargs.makefile_name
+    if makefile_name != None:
+        makefile_name = makefile_name[0]
     avoids = cmdargs.avoids
     if avoids != None:
         avoids = [ module
-- 
2.34.1

>From bfc5329c890031833022bc78b5f0e793a53f5be6 Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Sat, 6 Aug 2022 02:10:32 +0200
Subject: [PATCH 10/12] gnulib-tool.py: Finish implementing option
 --macro-prefix.

* gnulib-tool.py (main): Accept option --macro-prefix.
---
 ChangeLog           |  3 +++
 gnulib-tool.py      | 11 ++++++++++-
 gnulib-tool.py.TODO |  1 -
 3 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index d98a5bd692..16d17a6232 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2022-08-05  Bruno Haible  <br...@clisp.org>
 
+	gnulib-tool.py: Finish implementing option --macro-prefix.
+	* gnulib-tool.py (main): Accept option --macro-prefix.
+
 	gnulib-tool.py: Refactor --makefile-name option.
 	* gnulib-tool.py (main): Handle option --makefile-name like all other
 	string-valued options.
diff --git a/gnulib-tool.py b/gnulib-tool.py
index ba15ba7154..030e3caf73 100755
--- a/gnulib-tool.py
+++ b/gnulib-tool.py
@@ -374,6 +374,11 @@ def main():
                         dest='makefile_name',
                         default=None,
                         nargs=1)
+    # macro-prefix
+    parser.add_argument('--macro-prefix',
+                        dest='macro_prefix',
+                        default=None,
+                        nargs=1)
     # single-configure
     parser.add_argument('--single-configure',
                         dest='single_configure',
@@ -559,7 +564,8 @@ def main():
                  or cmdargs.excl_privileged_tests != None
                  or cmdargs.excl_unportable_tests != None
                  or cmdargs.avoids != None or cmdargs.lgpl != None
-                 or cmdargs.makefile_name != None))):
+                 or cmdargs.makefile_name != None
+                 or cmdargs.macro_prefix != None))):
         message = '%s: *** ' % constants.APP['name']
         message += 'invalid options for --%s mode\n' % mode
         message += 'Try \'gnulib-tool --help\' for more information.\n'
@@ -636,6 +642,9 @@ def main():
     makefile_name = cmdargs.makefile_name
     if makefile_name != None:
         makefile_name = makefile_name[0]
+    macro_prefix = cmdargs.macro_prefix
+    if macro_prefix != None:
+        macro_prefix = macro_prefix[0]
     avoids = cmdargs.avoids
     if avoids != None:
         avoids = [ module
diff --git a/gnulib-tool.py.TODO b/gnulib-tool.py.TODO
index 6787e88df2..87438c5a16 100644
--- a/gnulib-tool.py.TODO
+++ b/gnulib-tool.py.TODO
@@ -29,7 +29,6 @@ Implement the options:
   --gnu-make
   --tests-makefile-name
   --automake-subdir
-  --macro-prefix
   --po-domain
   --witness-c-macro
   --vc-files
-- 
2.34.1

>From b5850cf209fc597150fb196067674c8c41857316 Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Sat, 6 Aug 2022 03:06:51 +0200
Subject: [PATCH 11/12] gnulib-tool.py: Finish implementing option --po-domain.

* gnulib-tool.py (main): Accept option --po-domain.
* pygnulib/GLEmiter.py (GLEmiter.po_POTFILES_in): Fix variable
reference.
* pygnulib/GLImport.py (GLImport.execute): Don't delete Makefile.in.in
from the gnulib directory. Don't require a shell when invoking wget.
After invoking wget, restore the current directory.
---
 ChangeLog            |  8 ++++++++
 gnulib-tool.py       | 20 +++++++++++++++++++-
 gnulib-tool.py.TODO  |  1 -
 pygnulib/GLEmiter.py |  3 +--
 pygnulib/GLImport.py | 11 +++++++----
 5 files changed, 35 insertions(+), 8 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 16d17a6232..fde81debea 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2022-08-05  Bruno Haible  <br...@clisp.org>
 
+	gnulib-tool.py: Finish implementing option --po-domain.
+	* gnulib-tool.py (main): Accept option --po-domain.
+	* pygnulib/GLEmiter.py (GLEmiter.po_POTFILES_in): Fix variable
+	reference.
+	* pygnulib/GLImport.py (GLImport.execute): Don't delete Makefile.in.in
+	from the gnulib directory. Don't require a shell when invoking wget.
+	After invoking wget, restore the current directory.
+
 	gnulib-tool.py: Finish implementing option --macro-prefix.
 	* gnulib-tool.py (main): Accept option --macro-prefix.
 
diff --git a/gnulib-tool.py b/gnulib-tool.py
index 030e3caf73..8dbf2d06a8 100755
--- a/gnulib-tool.py
+++ b/gnulib-tool.py
@@ -379,6 +379,11 @@ def main():
                         dest='macro_prefix',
                         default=None,
                         nargs=1)
+    # po-domain
+    parser.add_argument('--po-domain',
+                        dest='podomain',
+                        default=None,
+                        nargs=1)
     # single-configure
     parser.add_argument('--single-configure',
                         dest='single_configure',
@@ -565,13 +570,23 @@ def main():
                  or cmdargs.excl_unportable_tests != None
                  or cmdargs.avoids != None or cmdargs.lgpl != None
                  or cmdargs.makefile_name != None
-                 or cmdargs.macro_prefix != None))):
+                 or cmdargs.macro_prefix != None or cmdargs.podomain != None))):
         message = '%s: *** ' % constants.APP['name']
         message += 'invalid options for --%s mode\n' % mode
         message += 'Try \'gnulib-tool --help\' for more information.\n'
         message += '%s: *** Stop.\n' % constants.APP['name']
         sys.stderr.write(message)
         sys.exit(1)
+    if cmdargs.pobase != None and cmdargs.podomain == None:
+        message = '%s: *** ' % constants.APP['name']
+        message += 'together with --po-base, you need to specify --po-domain\n'
+        message += 'Try \'gnulib-tool --help\' for more information.\n'
+        message += '%s: *** Stop.\n' % constants.APP['name']
+        sys.stderr.write(message)
+        sys.exit(1)
+    if cmdargs.pobase == None and cmdargs.podomain != None:
+        message = '%s: warning: --po-domain has no effect without a --po-base option\n' % constants.APP['name']
+        sys.stderr.write(message)
 
     # Determine specific settings.
     destdir = cmdargs.destdir
@@ -645,6 +660,9 @@ def main():
     macro_prefix = cmdargs.macro_prefix
     if macro_prefix != None:
         macro_prefix = macro_prefix[0]
+    podomain = cmdargs.podomain
+    if podomain != None:
+        podomain = podomain[0]
     avoids = cmdargs.avoids
     if avoids != None:
         avoids = [ module
diff --git a/gnulib-tool.py.TODO b/gnulib-tool.py.TODO
index 87438c5a16..b59e89cc59 100644
--- a/gnulib-tool.py.TODO
+++ b/gnulib-tool.py.TODO
@@ -29,7 +29,6 @@ Implement the options:
   --gnu-make
   --tests-makefile-name
   --automake-subdir
-  --po-domain
   --witness-c-macro
   --vc-files
   --no-vc-files
diff --git a/pygnulib/GLEmiter.py b/pygnulib/GLEmiter.py
index 9d9ca458ee..b6c31fa603 100644
--- a/pygnulib/GLEmiter.py
+++ b/pygnulib/GLEmiter.py
@@ -444,8 +444,7 @@ USE_MSGCTXT = no\n"""
         Emit the file list to be passed to xgettext.
         GLConfig: sourcebase.'''
         emit = ''
-        sourcebase = self.config['sourcebase']
-        sourcebase = '%s%s' % (self.sourcebase, os.path.sep)
+        sourcebase = self.config['sourcebase'] + os.path.sep
         files = [ constants.substart('lib/', sourcebase, file)
                   for file in files ]
         files = [ file
diff --git a/pygnulib/GLImport.py b/pygnulib/GLImport.py
index dda10c1b76..9de4b3b93c 100644
--- a/pygnulib/GLImport.py
+++ b/pygnulib/GLImport.py
@@ -42,10 +42,12 @@ __copyright__ = constants.__copyright__
 #===============================================================================
 # Define global constants
 #===============================================================================
+DIRS = constants.DIRS
 MODES = constants.MODES
 TESTS = constants.TESTS
 joinpath = constants.joinpath
 cleaner = constants.cleaner
+copyfile = constants.copyfile
 copyfile2 = constants.copyfile2
 movefile = constants.movefile
 isabs = os.path.isabs
@@ -1161,7 +1163,7 @@ AC_DEFUN([%s_FILE_LIST], [\n''' % macro_prefix
                 tmpfile = self.assistant.tmpfilename(joinpath(pobase, file))
                 path = joinpath('build-aux', 'po', file)
                 lookedup, flag = filesystem.lookup(path)
-                movefile(lookedup, tmpfile)
+                copyfile(lookedup, tmpfile)
                 basename = joinpath(pobase, file)
                 filename, backup, flag = self.assistant.super_update(basename, tmpfile)
                 if flag == 1:
@@ -1227,7 +1229,8 @@ AC_DEFUN([%s_FILE_LIST], [\n''' % macro_prefix
                 os.chdir(joinpath(destdir, pobase))
                 args = ['wget', '--no-verbose', '--mirror', '--level=1', '-nd', '-A.po', '-P', '.',
                         '%sgnulib/' % TP_URL]
-                sp.call(args, shell=True)
+                sp.call(args)
+                os.chdir(DIRS['cwd'])
             else:  # if self.config['dryrun']
                 print('Fetch gnulib PO files from %s' % TP_URL)
 
@@ -1236,8 +1239,8 @@ AC_DEFUN([%s_FILE_LIST], [\n''' % macro_prefix
             if not self.config['dryrun']:
                 tmpfile = self.assistant.tmpfilename(basename)
                 data = '# Set of available languages.\n'
-                files = [constants.subend('.po', '', file)
-                         for file in os.listdir(joinpath(destdir, pobase))]
+                files = [ constants.subend('.po', '', file)
+                          for file in os.listdir(joinpath(destdir, pobase)) ]
                 data += '\n'.join(files)
                 with codecs.open(tmpfile, 'wb', 'UTF-8') as file:
                     file.write(data)
-- 
2.34.1

>From 6ef9c33342e6cdb898e157997ea33ed2ab8e00cb Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Sat, 6 Aug 2022 03:18:32 +0200
Subject: [PATCH 12/12] gnulib-tool.py: Don't initialize local variables too
 early.

* gnulib-tool.py (main): Initialize each local variable in one place.
I prefer to have pylint tell me about uninitialized variables than to
get the value None at runtime.
---
 ChangeLog      |  5 +++++
 gnulib-tool.py | 33 +++++++--------------------------
 2 files changed, 12 insertions(+), 26 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index fde81debea..dc968b8982 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2022-08-05  Bruno Haible  <br...@clisp.org>
 
+	gnulib-tool.py: Don't initialize local variables too early.
+	* gnulib-tool.py (main): Initialize each local variable in one place.
+	I prefer to have pylint tell me about uninitialized variables than to
+	get the value None at runtime.
+
 	gnulib-tool.py: Finish implementing option --po-domain.
 	* gnulib-tool.py (main): Accept option --po-domain.
 	* pygnulib/GLEmiter.py (GLEmiter.po_POTFILES_in): Fix variable
diff --git a/gnulib-tool.py b/gnulib-tool.py
index 8dbf2d06a8..78bb326a69 100755
--- a/gnulib-tool.py
+++ b/gnulib-tool.py
@@ -67,32 +67,6 @@ isfile = os.path.isfile
 # Define main part
 #===============================================================================
 def main():
-    # Reset arguments
-    mode = None
-    destdir = None
-    localpath = None
-    verbose = None
-    auxdir = None
-    modules = None
-    avoids = None
-    sourcebase = None
-    m4base = None
-    pobase = None
-    docbase = None
-    testsbase = None
-    tests = None
-    libname = None
-    lgpl = None
-    makefile_name = None
-    libtool = None
-    conddeps = None
-    macro_prefix = None
-    podomain = None
-    witness_c_macro = None
-    vc_files = None
-    dryrun = None
-    errors = None
-
     info = classes.GLInfo()
     parser = argparse.ArgumentParser(
         prog=constants.APP['name'],
@@ -467,6 +441,9 @@ def main():
         sys.exit(1)
 
     # Determine selected mode.
+    mode = None
+    modules = None
+    files = None
     if cmdargs.mode_list != None:
         mode = 'list'
     if cmdargs.mode_import != None:
@@ -671,6 +648,10 @@ def main():
     symlink = cmdargs.symlink == True
     lsymlink = cmdargs.lsymlink == True
     single_configure = cmdargs.single_configure
+    docbase = None
+    conddeps = None
+    witness_c_macro = None
+    vc_files = None
 
     # Create pygnulib configuration.
     config = classes.GLConfig(
-- 
2.34.1

Reply via email to