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