svn commit: r1934497 - in subversion/trunk: . subversion/tests/cmdline subversion/tests/cmdline/svntest

[email protected]
Newsgroups gmane.comp.version-control.subversion.svn
Message-ID <177944341425.2003024.8243047079097890344@svn03-he-fi>
Author: brane
Date: Fri May 22 09:50:14 2026
New Revision: 1934497

Log:
Allow the tests to work with a non-standart Python 3 installation that
does not provide the 'venv' module.

* Makefile.in (check): Expose the --python-venv test runner flag through
   the PYTHON_VENV make variable.

* subversion/tests/cmdline/svntest/main.py:
   Do not require the 'venv' module to be present.
  (venv_create): The default value now depends on the presence of 'venv'.
  (SVN_TESTS_REQUIRE): Pin the dependency versions.
  (SVN_TESTS_DEPEND): New; dependency import module names. Use these
   wherever we're checking for module presence as opposed to installing them.
  (is_bad_xml_fatal): Fix a silly thinko in the predicaste.
  (create_python_venv): Require 'venv' presence.

* subversion/tests/cmdline/log_tests.py
  (log_with_merge_history_and_search,
   log_xml_with_merge_history): These tests pass the functional part and
    fail only when XML validation is enabled because they emit invalid XML.
    Update the predicates.

Modified:
   subversion/trunk/Makefile.in
   subversion/trunk/subversion/tests/cmdline/log_tests.py
   subversion/trunk/subversion/tests/cmdline/svntest/main.py

Modified: subversion/trunk/Makefile.in
==============================================================================
--- subversion/trunk/Makefile.in	Fri May 22 09:32:54 2026	(r1934496)
+++ subversion/trunk/Makefile.in	Fri May 22 09:50:14 2026	(r1934497)
@@ -634,6 +634,9 @@ check: bin @TRANSFORM_LIBTOOL_SCRIPTS@ $
 	  if test "$(SVN_BIN_DIR)" != ""; then                               \
 	    flags="--bin $(SVN_BIN_DIR) $$flags";                            \
 	  fi;                                                                \
+	  if test "$(PYTHON_VENV)" != ""; then                               \
+	    flags="--python-venv $(PYTHON_VENV) $$flags";                    \
+	  fi;                                                                \
 	  if test "$(STORE_PRISTINE)" != ""; then                            \
 	    flags="--store-pristine $(STORE_PRISTINE) $$flags";              \
 	  fi;                                                                \

Modified: subversion/trunk/subversion/tests/cmdline/log_tests.py
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/log_tests.py	Fri May 22 09:32:54 2026	(r1934496)
+++ subversion/trunk/subversion/tests/cmdline/log_tests.py	Fri May 22 09:50:14 2026	(r1934497)
@@ -2778,7 +2778,7 @@ def log_on_deleted_deep(sbox):
                                      '',
                                      '-q', '-c', '1-2')
 
-@XFail()
+@XFail(svntest.main.is_bad_xml_fatal)
 @Issue(4711)
 def log_with_merge_history_and_search(sbox):
   "log --use-merge-history --search"
@@ -2804,7 +2804,7 @@ def log_with_merge_history_and_search(sb
                                       sbox.ospath('A2'))
   svntest.verify.validate_xml_schema('log', output)
 
-@XFail(svntest.main.is_ra_type_file)
+@XFail(svntest.main.is_bad_xml_fatal)
 @Issue(4856)
 def log_xml_with_merge_history(sbox):
   "log --use-merge-history --xml"

Modified: subversion/trunk/subversion/tests/cmdline/svntest/main.py
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/svntest/main.py	Fri May 22 09:32:54 2026	(r1934496)
+++ subversion/trunk/subversion/tests/cmdline/svntest/main.py	Fri May 22 09:50:14 2026	(r1934497)
@@ -40,7 +40,13 @@ import importlib
 import zipfile
 import codecs
 import queue
-import venv
+
+# Even though 'venv' is part of the Python3 standard library,
+# some environment don't provide it. The tests do not require it.
+try:
+  import venv
+except ImportError:
+  venv = None
 
 from urllib.parse import quote as urllib_parse_quote
 from urllib.parse import unquote as urllib_parse_unquote
@@ -223,13 +229,15 @@ work_dir = "svn-test-work"
 
 # Directory for the Python virtual environment where we install
 # external dependencies of the test environment
+venv_create = venv is not None
 venv_base = work_dir
-venv_path = lambda: os.path.join(venv_base, "__venv__")
-venv_create = True
+def venv_path():
+  return os.path.join(venv_base, "__venv__")
 
 # List of dependencies
 found_dependencies = set()
-SVN_TESTS_REQUIRE = ["lxml", "rnc2rng"]
+SVN_TESTS_REQUIRE = ["lxml==6.1.0", "rnc2rng==2.7.0"]  # for pip
+SVN_TESTS_DEPEND = ["lxml", "rnc2rng"]  # for install_module
 
 # Constant for the merge info property.
 SVN_PROP_MERGEINFO = "svn:mergeinfo"
@@ -1760,7 +1768,8 @@ def is_remote_http_connection_allowed():
 def is_bad_xml_fatal():
   """Are we treating invalid XML output as a fatal error?"""
   # Only if we have all the necessary dependencies.
-  return {'lxml', 'rnc2rnd'} & found_dependencies
+  depends = {'lxml', 'rnc2rng'}
+  return depends == (depends & found_dependencies)
 
 
 def wc_format(ver=None):
@@ -2462,7 +2471,7 @@ def ensure_dependencies():
   saved_sys_path = sys.path[:]
   try:
     sys.path.insert(0, package_path)
-    for package in SVN_TESTS_REQUIRE:
+    for package in SVN_TESTS_DEPEND:
       importlib.import_module(package)
       found_dependencies.add(package)
     have_required = True
@@ -2482,11 +2491,14 @@ def ensure_dependencies():
       assert python_path == package_path
       if package_path not in sys.path:
         sys.path.append(package_path)
-      found_dependencies.update(set(SVN_TESTS_REQUIRE))
+      found_dependencies.update(set(SVN_TESTS_DEPEND))
       return package_path
   return None
 
 def create_python_venv(venv_dir, quiet=False):
+  # We should never get this far if the 'venv' module isn't available.
+  assert venv is not None
+
   try:
     # Create the virtual environment
     if not os.path.isdir(venv_dir):
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.