Patchwork D10310: tests: restore the ability to run `black` on Windows

login
register
mail settings
Submitter phabricator
Date April 5, 2021, 5:15 p.m.
Message ID <differential-rev-PHID-DREV-kfu26yuo5lhozn2zbhnd-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/48628/
State Superseded
Headers show

Comments

phabricator - April 5, 2021, 5:15 p.m.
mharbison72 created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  The hghave test for black silently stopped working with the change in
  08fd76a553c9 <https://phab.mercurial-scm.org/rHG08fd76a553c966e78b5785b640d405c154081210>.  This was the output of what it was hitting when run in the test
  environment:
  
    Traceback (most recent call last):\r (esc)
       File "c:\\users\\matt\\appdata\\local\\programs\\python\\python39\\lib\\runpy.py", line 197, in _run_module_as_main\r (esc)
         return _run_code(code, main_globals, None,\r (esc)
       File "c:\\users\\matt\\appdata\\local\\programs\\python\\python39\\lib\\runpy.py", line 87, in _run_code\r (esc)
         exec(code, run_globals)\r (esc)
       File "c:\\Users\\Matt\\AppData\\Roaming\\Python\\Python39\\Scripts\\black.exe\\__main__.py", line 4, in <module>\r (esc)
       File "C:\\Users\\Matt\\AppData\\Roaming\\Python\\Python39\\site-packages\\black\\__init__.py", line 70, in <module>\r (esc)
         CACHE_DIR = Path(user_cache_dir("black", version=__version__))\r (esc)
       File "C:\\Users\\Matt\\AppData\\Roaming\\Python\\Python39\\site-packages\\appdirs.py", line 293, in user_cache_dir\r (esc)
         path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA"))\r (esc)
       File "C:\\Users\\Matt\\AppData\\Roaming\\Python\\Python39\\site-packages\\appdirs.py", line 481, in _get_win_folder_with_pywin32\r (esc)
         dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0)\r (esc)
     pywintypes.com_error: (-2147024893, '$ENOTDIR$.', None, None)\r (esc)
     [1]

REPOSITORY
  rHG Mercurial

BRANCH
  default

REVISION DETAIL
  https://phab.mercurial-scm.org/D10310

AFFECTED FILES
  tests/hghave.py
  tests/run-tests.py
  tests/test-check-format.t

CHANGE DETAILS




To: mharbison72, #hg-reviewers
Cc: mercurial-patches, mercurial-devel

Patch

diff --git a/tests/test-check-format.t b/tests/test-check-format.t
--- a/tests/test-check-format.t
+++ b/tests/test-check-format.t
@@ -1,5 +1,11 @@ 
 #require black test-repo
 
+Black needs the real USERPROFILE in order to run on Windows
+#if msys
+  $ USERPROFILE="$REALUSERPROFILE"
+  $ export USERPROFILE
+#endif
+
   $ cd $RUNTESTDIR/..
   $ black --check --diff `hg files 'set:(**.py + grep("^#!.*python")) - mercurial/thirdparty/**'`
 
diff --git a/tests/run-tests.py b/tests/run-tests.py
--- a/tests/run-tests.py
+++ b/tests/run-tests.py
@@ -1371,6 +1371,7 @@ 
         env['TESTNAME'] = self.name
         env['HOME'] = _bytes2sys(self._testtmp)
         if os.name == 'nt':
+            env['REALUSERPROFILE'] = env['USERPROFILE']
             # py3.8+ ignores HOME: https://bugs.python.org/issue36264
             env['USERPROFILE'] = env['HOME']
         formated_timeout = _bytes2sys(b"%d" % default_defaults['timeout'][1])
diff --git a/tests/hghave.py b/tests/hghave.py
--- a/tests/hghave.py
+++ b/tests/hghave.py
@@ -140,9 +140,22 @@ 
     """Return the match object if cmd executes successfully and its output
     is matched by the supplied regular expression.
     """
+
+    # Tests on Windows have to fake USERPROFILE to point to the test area so
+    # that `~` is properly expanded on py3.8+.  However, some tools like black
+    # make calls that need the real USERPROFILE in order to run `foo --version`.
+    env = os.environ
+    if os.name == 'nt':
+        env = os.environ.copy()
+        env['USERPROFILE'] = env['REALUSERPROFILE']
+
     r = re.compile(regexp)
     p = subprocess.Popen(
-        cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT
+        cmd,
+        shell=True,
+        stdout=subprocess.PIPE,
+        stderr=subprocess.STDOUT,
+        env=env,
     )
     s = p.communicate()[0]
     ret = p.returncode