This is a gnulib-tool.py bug fix. While fighting with the non-standard 'bootstrap' script in GNU m4's repository, I came into a situation where that script printed a Python exception. I could reproduce it with this command line:
$ /GNULIB/gnulib/gnulib-tool --no-changelog --no-libtool --update
Traceback (most recent call last):
File "/GNULIB/gnulib/.gnulib-tool.py", line 30, in <module>
main.main_with_exception_handling()
File "/GNULIB/gnulib/pygnulib/main.py", line 1469, in
main_with_exception_handling
main(temporary_directory)
File "/GNULIB/gnulib/pygnulib/main.py", line 1095, in main
importer = GLImport(config, mode, guessed_m4dirs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/GNULIB/gnulib/pygnulib/GLImport.py", line 234, in __init__
self.cache.setFiles(pattern.findall(data)[-1].strip().split())
~~~~~~~~~~~~~~~~~~~~~^^^^
IndexError: list index out of range
It occurs because the m4/gnulib-cache.m4 file specifies
gl_MACRO_PREFIX([M4])
but the m4/gnulib-comp.m4 file has a definition of gl_FILE_LIST but no
definition of M4_FILE_LIST. (Input files are attached.)
gnulib-tool.sh is tolerant in this situation. This patch makes gnulib-tool.py
tolerant as well.
2025-04-15 Bruno Haible <[email protected]>
gnulib-tool.py: Fix exception during --update with changed macro-prefix.
* pygnulib/GLImport.py (GLImport.__init__): Support the case that the
expected ${macro_prefix}_FILE_LIST definition was not found.
diff --git a/pygnulib/GLImport.py b/pygnulib/GLImport.py
index 27d8b749ed..9344c8fa9d 100644
--- a/pygnulib/GLImport.py
+++ b/pygnulib/GLImport.py
@@ -231,7 +231,12 @@ def __init__(self, config: GLConfig, mode: int, m4dirs:
list[str]) -> None:
data = file.read()
regex = r'AC_DEFUN\(\[%s_FILE_LIST\], \[(.*?)\]\)' %
self.cache['macro_prefix']
pattern = re.compile(regex, re.S | re.M)
- self.cache.setFiles(pattern.findall(data)[-1].strip().split())
+ matches = pattern.findall(data)
+ if matches:
+ files = matches[-1].strip().split()
+ else:
+ files = []
+ self.cache.setFiles(files)
# The self.config['localpath'] defaults to the cached one. Recall that
# the cached one is relative to self.config['destdir'], whereas the one
inputs.tar.gz
Description: application/compressed-tar
