Mercurial > hgsubversion
comparison tests/test_util.py @ 91:7d10165cf3d9
tests: Mock the mercurial.ui.ui class like we really should to capture output.
Has the nice side effect that we can use nose 0.11's multiprocess plugin.
| author | Augie Fackler <durin42@gmail.com> |
|---|---|
| date | Fri, 14 Nov 2008 16:52:30 -0600 |
| parents | 01e747937d35 |
| children | 9b5e528f67f8 |
comparison
equal
deleted
inserted
replaced
| 90:4c419603d41b | 91:7d10165cf3d9 |
|---|---|
| 1 import errno | 1 import errno |
| 2 import os | 2 import os |
| 3 import subprocess | 3 import subprocess |
| 4 import shutil | 4 import shutil |
| 5 import StringIO | |
| 5 import stat | 6 import stat |
| 6 import tempfile | 7 import tempfile |
| 7 import unittest | 8 import unittest |
| 8 import urllib | 9 import urllib |
| 9 | 10 |
| 16 import push_cmd | 17 import push_cmd |
| 17 | 18 |
| 18 FIXTURES = os.path.join(os.path.abspath(os.path.dirname(__file__)), | 19 FIXTURES = os.path.join(os.path.abspath(os.path.dirname(__file__)), |
| 19 'fixtures') | 20 'fixtures') |
| 20 | 21 |
| 21 def fileurl(path): | 22 def fileurl(path): |
| 22 path = os.path.abspath(path) | 23 path = os.path.abspath(path) |
| 23 drive, path = os.path.splitdrive(path) | 24 drive, path = os.path.splitdrive(path) |
| 24 path = urllib.pathname2url(path) | 25 path = urllib.pathname2url(path) |
| 25 if drive: | 26 if drive: |
| 26 drive = '/' + drive | 27 drive = '/' + drive |
| 61 raise | 62 raise |
| 62 if (s.st_mode & stat.S_IWRITE) == 0: | 63 if (s.st_mode & stat.S_IWRITE) == 0: |
| 63 os.chmod(f, s.st_mode | stat.S_IWRITE) | 64 os.chmod(f, s.st_mode | stat.S_IWRITE) |
| 64 shutil.rmtree(path) | 65 shutil.rmtree(path) |
| 65 | 66 |
| 67 | |
| 68 class MockUI(object): | |
| 69 real_ui = ui.ui | |
| 70 _isatty = False | |
| 71 def __init__(self, parentui=None): | |
| 72 self.stream = StringIO.StringIO() | |
| 73 self.inner_ui = self.real_ui(parentui=parentui) | |
| 74 | |
| 75 def status(self, *args): | |
| 76 self.stream.write(*args) | |
| 77 | |
| 78 def warn(self, *args): | |
| 79 self.stream.write(*args) | |
| 80 | |
| 81 def __getattr__(self, attr): | |
| 82 return getattr(self.inner_ui, attr) | |
| 83 | |
| 84 | |
| 66 class TestBase(unittest.TestCase): | 85 class TestBase(unittest.TestCase): |
| 67 def setUp(self): | 86 def setUp(self): |
| 68 self.oldwd = os.getcwd() | 87 self.oldwd = os.getcwd() |
| 69 self.tmpdir = tempfile.mkdtemp('svnwrap_test') | 88 self.tmpdir = tempfile.mkdtemp('svnwrap_test') |
| 70 self.repo_path = '%s/testrepo' % self.tmpdir | 89 self.repo_path = '%s/testrepo' % self.tmpdir |
| 71 self.wc_path = '%s/testrepo_wc' % self.tmpdir | 90 self.wc_path = '%s/testrepo_wc' % self.tmpdir |
| 91 self._real_ui = ui.ui | |
| 92 ui.ui = MockUI | |
| 72 | 93 |
| 73 def tearDown(self): | 94 def tearDown(self): |
| 74 rmtree(self.tmpdir) | 95 rmtree(self.tmpdir) |
| 75 os.chdir(self.oldwd) | 96 os.chdir(self.oldwd) |
| 76 | 97 ui.ui = self._real_ui |
| 98 | |
| 77 # define this as a property so that it reloads anytime we need it | 99 # define this as a property so that it reloads anytime we need it |
| 78 @property | 100 @property |
| 79 def repo(self): | 101 def repo(self): |
| 80 return hg.repository(ui.ui(), self.wc_path) | 102 return hg.repository(ui.ui(), self.wc_path) |
| 81 | 103 |
| 86 | 108 |
| 87 def svnls(self, path, rev='HEAD'): | 109 def svnls(self, path, rev='HEAD'): |
| 88 path = self.repo_path + '/' + path | 110 path = self.repo_path + '/' + path |
| 89 path = fileurl(path) | 111 path = fileurl(path) |
| 90 args = ['svn', 'ls', '-r', rev, '-R', path] | 112 args = ['svn', 'ls', '-r', rev, '-R', path] |
| 91 p = subprocess.Popen(args, | 113 p = subprocess.Popen(args, |
| 92 stdout=subprocess.PIPE, | 114 stdout=subprocess.PIPE, |
| 93 stderr=subprocess.PIPE) | 115 stderr=subprocess.PIPE) |
| 94 stdout, stderr = p.communicate() | 116 stdout, stderr = p.communicate() |
| 95 if p.returncode: | 117 if p.returncode: |
| 96 raise Exception('svn ls failed on %s: %r' % (path, stderr)) | 118 raise Exception('svn ls failed on %s: %r' % (path, stderr)) |
| 97 entries = [e.strip('/') for e in stdout.splitlines()] | 119 entries = [e.strip('/') for e in stdout.splitlines()] |
| 102 """Commit changes to mercurial directory | 124 """Commit changes to mercurial directory |
| 103 | 125 |
| 104 'changes' is a sequence of tuples (source, dest, data). It can look | 126 'changes' is a sequence of tuples (source, dest, data). It can look |
| 105 like: | 127 like: |
| 106 - (source, source, data) to set source content to data | 128 - (source, source, data) to set source content to data |
| 107 - (source, dest, None) to set dest content to source one, and mark it as | 129 - (source, dest, None) to set dest content to source one, and mark it as |
| 108 copied from source. | 130 copied from source. |
| 109 - (source, dest, data) to set dest content to data, and mark it as copied | 131 - (source, dest, data) to set dest content to data, and mark it as copied |
| 110 from source. | 132 from source. |
| 111 - (source, None, None) to remove source. | 133 - (source, None, None) to remove source. |
| 112 """ | 134 """ |
| 133 return context.memfilectx(path=dest, | 155 return context.memfilectx(path=dest, |
| 134 data=newdata, | 156 data=newdata, |
| 135 islink=False, | 157 islink=False, |
| 136 isexec=False, | 158 isexec=False, |
| 137 copied=copied) | 159 copied=copied) |
| 138 | 160 |
| 139 ctx = context.memctx(repo, | 161 ctx = context.memctx(repo, |
| 140 (parentctx.node(), node.nullid), | 162 (parentctx.node(), node.nullid), |
| 141 'automated test', | 163 'automated test', |
| 142 changed + removed, | 164 changed + removed, |
| 143 filectxfn, | 165 filectxfn, |
