The gnulib-tool test suite will need this option, in order to use the
newest gnulib-tool with a frozen-in-time set of gnulib modules.


2024-03-17  Bruno Haible  <[email protected]>

        gnulib-tool: Add undocumented option --gnulib-dir.
        * gnulib-tool.sh: Accept --gnulib-dir=... option.
        * pygnulib/constants.py (init_DIRS): New function.
        * pygnulib/main.py (main): Accept --gnulib-dir=... option. Invoke
        init_DIRS. Expect .git directory to be present in DIRS['root'], not
        APP['root'].
        * pygnulib/GLImport.py (GLImport.execute): Use DIRS['root'], not
        APP['root'].

diff --git a/gnulib-tool.sh b/gnulib-tool.sh
index 62039fb03b..96869f80d6 100755
--- a/gnulib-tool.sh
+++ b/gnulib-tool.sh
@@ -1526,6 +1526,10 @@ func_determine_path_separator
       --version | --versio | --versi | --vers )
         func_version
         func_exit $? ;;
+      # Undocumented option. Only used for the gnulib-tool test suite.
+      --gnulib-dir=* )
+        gnulib_dir=`echo "X$1" | sed -e 's/^X--gnulib-dir=//'`
+        shift ;;
       -- )
         # Stop option processing
         shift
diff --git a/pygnulib/GLImport.py b/pygnulib/GLImport.py
index c65ba7d3f7..c06f0f9f6b 100644
--- a/pygnulib/GLImport.py
+++ b/pygnulib/GLImport.py
@@ -1191,7 +1191,7 @@ AC_DEFUN([%s_FILE_LIST], [\n''' % macro_prefix
                                                           
self.moduletable['main'], self.moduletable, self.makefiletable,
                                                           actioncmd, for_test)
         if automake_subdir:
-            emit = sp.run([joinpath(APP['root'], 
'build-aux/prefix-gnulib-mk'), '--from-gnulib-tool',
+            emit = sp.run([joinpath(DIRS['root'], 
'build-aux/prefix-gnulib-mk'), '--from-gnulib-tool',
                            f'--lib-name={libname}', f'--prefix={sourcebase}/'],
                           input=emit, text=True, capture_output=True).stdout
         with codecs.open(tmpfile, 'wb', 'UTF-8') as file:
diff --git a/pygnulib/constants.py b/pygnulib/constants.py
index dc2e68069d..975b0e7da2 100644
--- a/pygnulib/constants.py
+++ b/pygnulib/constants.py
@@ -77,17 +77,18 @@ APP['root'] = os.path.dirname(os.path.dirname(APP['path'])) 
# file name of <gnul
 APP['name'] = os.path.join(APP['root'], 'gnulib-tool.py')
 
 # Set DIRS directory
-DIRS['root'] = APP['root']
 DIRS['cwd'] = os.getcwd()
-DIRS['build-aux'] = os.path.join(DIRS['root'], 'build-aux')
-DIRS['config'] = os.path.join(DIRS['root'], 'config')
-DIRS['doc'] = os.path.join(DIRS['root'], 'doc')
-DIRS['lib'] = os.path.join(DIRS['root'], 'lib')
-DIRS['m4'] = os.path.join(DIRS['root'], 'm4')
-DIRS['modules'] = os.path.join(DIRS['root'], 'modules')
-DIRS['tests'] = os.path.join(DIRS['root'], 'tests')
-DIRS['git'] = os.path.join(DIRS['root'], '.git')
-DIRS['cvs'] = os.path.join(DIRS['root'], 'CVS')
+def init_DIRS(gnulib_dir):
+    DIRS['root'] = gnulib_dir
+    DIRS['build-aux'] = os.path.join(gnulib_dir, 'build-aux')
+    DIRS['config'] = os.path.join(gnulib_dir, 'config')
+    DIRS['doc'] = os.path.join(gnulib_dir, 'doc')
+    DIRS['lib'] = os.path.join(gnulib_dir, 'lib')
+    DIRS['m4'] = os.path.join(gnulib_dir, 'm4')
+    DIRS['modules'] = os.path.join(gnulib_dir, 'modules')
+    DIRS['tests'] = os.path.join(gnulib_dir, 'tests')
+    DIRS['git'] = os.path.join(gnulib_dir, '.git')
+    DIRS['cvs'] = os.path.join(gnulib_dir, 'CVS')
 
 # Set MODES dictionary
 MODES = \
diff --git a/pygnulib/main.py b/pygnulib/main.py
index 5d88d0115a..7142414fb2 100644
--- a/pygnulib/main.py
+++ b/pygnulib/main.py
@@ -455,6 +455,11 @@ def main():
                         dest='lcopymode',
                         default=None,
                         action='store_const', 
const=classes.CopyAction.Hardlink)
+    # Undocumented option. Only used for the gnulib-tool test suite.
+    parser.add_argument('--gnulib-dir',
+                        dest='gnulib_dir',
+                        default=None,
+                        nargs=1)
     # All other arguments are collected.
     parser.add_argument("non_option_arguments",
                         nargs='*')
@@ -463,6 +468,14 @@ def main():
     # occur between or after options.
     cmdargs, unhandled = parser.parse_known_args()
 
+    # Handle --gnulib-dir and finalize DIRS.
+    gnulib_dir = cmdargs.gnulib_dir
+    if gnulib_dir != None:
+        gnulib_dir = gnulib_dir[0]
+    else:
+        gnulib_dir = APP['root']
+    constants.init_DIRS(gnulib_dir)
+
     # Handle --help and --version, ignoring all other options.
     if cmdargs.help != None:
         print(info.usage())
@@ -1284,10 +1297,10 @@ def main():
         # This disturbs the result of the next "gitk" invocation.
         # Workaround: Let git scan the files. This can be done through
         # "git update-index --refresh" or "git status" or "git diff".
-        if isdir(joinpath(APP['root'], '.git')):
+        if isdir(joinpath(DIRS['root'], '.git')):
             try:
                 sp.run(['git', 'update-index', '--refresh'],
-                       cwd=APP['root'], stdout=sp.DEVNULL)
+                       cwd=DIRS['root'], stdout=sp.DEVNULL)
             except FileNotFoundError:
                 # No 'git' program was found.
                 pass




Reply via email to