[PATCH 2 of 2] tests: make run-tests.py invokes tests with needed variables only (issue5069)

liscju piotr.listkiewicz at gmail.com
Sat Mar 26 07:45:31 EDT 2016


# HG changeset patch
# User liscju <piotr.listkiewicz at gmail.com>
# Date 1458986707 -3600
#      Sat Mar 26 11:05:07 2016 +0100
# Node ID 19a08baae8794c77f4876161ea4bbe3f5cb6b6ff
# Parent  ffe9bc7aea5a63bc82e7322da9ff3448f13abaec
tests: make run-tests.py invokes tests with needed variables only (issue5069)

Before this patch tests were invoked with all environment variables
except fixed set of known problematic environment variables. This
commit makes run-tests.py pass to tests only that variables that
are actually used in run-tests.py

This commit is only proposal of solution. Class rememberusedkeyenv
is not implementing all dictionary methods, only ones that are
actually used in run-tests.py when accessing environment variables.

Other possible solution would be to make a fixed list of used
environment variables in run-tests.py.

I am looking forward for suggestions how this should be implemented.

diff -r ffe9bc7aea5a -r 19a08baae879 tests/run-tests.py
--- a/tests/run-tests.py	Sat Mar 26 08:48:17 2016 +0100
+++ b/tests/run-tests.py	Sat Mar 26 11:05:07 2016 +0100
@@ -69,8 +69,37 @@ except ImportError:
 from xml.dom import minidom
 import unittest
 
-osenviron = os.environ
-osenvironb = getattr(os, 'environb', os.environ)
+class rememberusedkeyenv(object):
+    def __init__(self, env):
+        self.usedkeys = set()
+        self.env = env
+
+    def __setitem__(self, key, value):
+        self.usedkeys.add(key)
+        self.env[key] = value
+
+    def __getitem__(self, key):
+        self.usedkeys.add(key)
+        return self.env[key]
+
+    def __delitem__(self, key):
+        self.usedkeys.remove(key)
+        del self.env[key]
+
+    def __contains__(self, key):
+        exists = key in self.env
+        if exists:
+            self.usedkeys.add(key)
+        return exists
+
+    def get(self, key, default=None):
+        if key in self:
+            return self[key]
+        else:
+            return default
+
+osenviron = rememberusedkeyenv(os.environ)
+osenvironb = rememberusedkeyenv(getattr(os, 'environb', os.environ))
 processlock = threading.Lock()
 
 if sys.version_info > (3, 5, 0):
@@ -785,12 +814,19 @@ class Test(unittest.TestCase):
         else:
             return re.escape(p)
 
+    def _addusedenv(self, env):
+        usedkeys = osenviron.usedkeys
+        usedkeys |= osenvironb.usedkeys
+        for key in usedkeys:
+            env[key] = osenviron[key]
+
     def _getenv(self):
         """Obtain environment variables to use during test execution."""
         def defineport(i):
             offset = '' if i == 0 else '%s' % i
             env["HGPORT%s" % offset] = '%s' % (self._startport + i)
-        env = osenviron.copy()
+        env = {}
+        self._addusedenv(env)
         env['TESTTMP'] = self._testtmp
         env['HOME'] = self._testtmp
         # This number should match portneeded in _getport
@@ -814,16 +850,6 @@ class Test(unittest.TestCase):
         env['COLUMNS'] = '80'
         env['TERM'] = 'xterm'
 
-        for k in ('HG HGPROF CDPATH GREP_OPTIONS http_proxy no_proxy ' +
-                  'NO_PROXY').split():
-            if k in env:
-                del env[k]
-
-        # unset env related to hooks
-        for k in env.keys():
-            if k.startswith('HG_'):
-                del env[k]
-
         return env
 
     def _createhgrc(self, path):


More information about the Mercurial-devel mailing list