diff tests/test_util.py @ 78:072010a271c6

Fix basic issues with tests on Windows - shutil.rmtree() fails if there are any read-only files (svn store) - Fix files:// URLs - os.spawnvp()/Popen4() do not exist under Windows, use subprocess
author Patrick Mezard <pmezard@gmail.com>
date Sun, 09 Nov 2008 18:08:35 -0600
parents 1f8854804795
children 71de43e9f614
line wrap: on
line diff
--- a/tests/test_util.py
+++ b/tests/test_util.py
@@ -1,5 +1,9 @@
+import errno
 import os
-import popen2
+import subprocess
+import shutil
+import stat
+import urllib
 
 from mercurial import ui
 from mercurial import hg
@@ -9,22 +13,47 @@ import fetch_command
 FIXTURES = os.path.join(os.path.abspath(os.path.dirname(__file__)),
                         'fixtures')
 
+def fileurl(path):    
+    path = os.path.abspath(path)
+    drive, path = os.path.splitdrive(path)
+    path = urllib.pathname2url(path)
+    if drive:
+        drive = '/' + drive
+    url = 'file://%s%s' % (drive, path)
+    return url
+
 def load_svndump_fixture(path, fixture_name):
     '''Loads an svnadmin dump into a fresh repo at path, which should not
     already exist.
     '''
-    os.spawnvp(os.P_WAIT, 'svnadmin', ['svnadmin', 'create', path,])
-    proc = popen2.Popen4(['svnadmin', 'load', path,])
+    subprocess.call(['svnadmin', 'create', path,])
+    proc = subprocess.Popen(['svnadmin', 'load', path,], stdin=subprocess.PIPE,
+                            stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
     inp = open(os.path.join(FIXTURES, fixture_name))
-    proc.tochild.write(inp.read())
-    proc.tochild.close()
-    proc.wait()
+    proc.stdin.write(inp.read())
+    proc.stdin.flush()
+    proc.communicate()
 
 def load_fixture_and_fetch(fixture_name, repo_path, wc_path, stupid=False):
     load_svndump_fixture(repo_path, fixture_name)
     fetch_command.fetch_revisions(ui.ui(),
-                                  svn_url='file://%s' % repo_path,
+                                  svn_url=fileurl(repo_path),
                                   hg_repo_path=wc_path,
                                   stupid=stupid)
     repo = hg.repository(ui.ui(), wc_path)
     return repo
+
+def rmtree(path):
+    # Read-only files cannot be removed under Windows
+    for root, dirs, files in os.walk(path):
+        for f in files:
+            f = os.path.join(root, f)
+            try:
+                s = os.stat(f)
+            except OSError, e:
+                if e.errno == errno.ENOENT:
+                    continue
+                raise
+            if (s.st_mode & stat.S_IWRITE) == 0:
+                os.chmod(f, s.st_mode | stat.S_IWRITE)
+    shutil.rmtree(path)