Mercurial > hgsubversion
comparison 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 |
comparison
equal
deleted
inserted
replaced
| 77:ed3dd5bf45da | 78:072010a271c6 |
|---|---|
| 1 import errno | |
| 1 import os | 2 import os |
| 2 import popen2 | 3 import subprocess |
| 4 import shutil | |
| 5 import stat | |
| 6 import urllib | |
| 3 | 7 |
| 4 from mercurial import ui | 8 from mercurial import ui |
| 5 from mercurial import hg | 9 from mercurial import hg |
| 6 | 10 |
| 7 import fetch_command | 11 import fetch_command |
| 8 | 12 |
| 9 FIXTURES = os.path.join(os.path.abspath(os.path.dirname(__file__)), | 13 FIXTURES = os.path.join(os.path.abspath(os.path.dirname(__file__)), |
| 10 'fixtures') | 14 'fixtures') |
| 11 | 15 |
| 16 def fileurl(path): | |
| 17 path = os.path.abspath(path) | |
| 18 drive, path = os.path.splitdrive(path) | |
| 19 path = urllib.pathname2url(path) | |
| 20 if drive: | |
| 21 drive = '/' + drive | |
| 22 url = 'file://%s%s' % (drive, path) | |
| 23 return url | |
| 24 | |
| 12 def load_svndump_fixture(path, fixture_name): | 25 def load_svndump_fixture(path, fixture_name): |
| 13 '''Loads an svnadmin dump into a fresh repo at path, which should not | 26 '''Loads an svnadmin dump into a fresh repo at path, which should not |
| 14 already exist. | 27 already exist. |
| 15 ''' | 28 ''' |
| 16 os.spawnvp(os.P_WAIT, 'svnadmin', ['svnadmin', 'create', path,]) | 29 subprocess.call(['svnadmin', 'create', path,]) |
| 17 proc = popen2.Popen4(['svnadmin', 'load', path,]) | 30 proc = subprocess.Popen(['svnadmin', 'load', path,], stdin=subprocess.PIPE, |
| 31 stdout=subprocess.PIPE, stderr=subprocess.STDOUT) | |
| 18 inp = open(os.path.join(FIXTURES, fixture_name)) | 32 inp = open(os.path.join(FIXTURES, fixture_name)) |
| 19 proc.tochild.write(inp.read()) | 33 proc.stdin.write(inp.read()) |
| 20 proc.tochild.close() | 34 proc.stdin.flush() |
| 21 proc.wait() | 35 proc.communicate() |
| 22 | 36 |
| 23 def load_fixture_and_fetch(fixture_name, repo_path, wc_path, stupid=False): | 37 def load_fixture_and_fetch(fixture_name, repo_path, wc_path, stupid=False): |
| 24 load_svndump_fixture(repo_path, fixture_name) | 38 load_svndump_fixture(repo_path, fixture_name) |
| 25 fetch_command.fetch_revisions(ui.ui(), | 39 fetch_command.fetch_revisions(ui.ui(), |
| 26 svn_url='file://%s' % repo_path, | 40 svn_url=fileurl(repo_path), |
| 27 hg_repo_path=wc_path, | 41 hg_repo_path=wc_path, |
| 28 stupid=stupid) | 42 stupid=stupid) |
| 29 repo = hg.repository(ui.ui(), wc_path) | 43 repo = hg.repository(ui.ui(), wc_path) |
| 30 return repo | 44 return repo |
| 45 | |
| 46 def rmtree(path): | |
| 47 # Read-only files cannot be removed under Windows | |
| 48 for root, dirs, files in os.walk(path): | |
| 49 for f in files: | |
| 50 f = os.path.join(root, f) | |
| 51 try: | |
| 52 s = os.stat(f) | |
| 53 except OSError, e: | |
| 54 if e.errno == errno.ENOENT: | |
| 55 continue | |
| 56 raise | |
| 57 if (s.st_mode & stat.S_IWRITE) == 0: | |
| 58 os.chmod(f, s.st_mode | stat.S_IWRITE) | |
| 59 shutil.rmtree(path) |
