Commits

Dan Villiom Podlaski Christiansen committed 885ca11

Denete appnied patchez.

Comments (0)

Files changed (8)

configpath.diff

-# HG changeset patch
-# User Dan Villiom Podlaski Christiansen  <danchr@gmail.com>
-# Date 1323817677 -3600
-# Node ID 9ca11367f3d9db9ac0b1143d61e32736b6e1e795
-# Parent  2d9359a7e345b8233824c45fe7b8f1c2c27c9fa0
-expand configured paths
-
-diff --git a/hgsubversion/svnmeta.py b/hgsubversion/svnmeta.py
---- a/hgsubversion/svnmeta.py
-+++ b/hgsubversion/svnmeta.py
-@@ -48,13 +48,13 @@ class SVNMeta(object):
-         self.revmap = maps.RevMap(repo)
- 
-         author_host = self.ui.config('hgsubversion', 'defaulthost', uuid)
--        authors = self.ui.config('hgsubversion', 'authormap')
-+        authors = util.configpath(self.ui, 'authormap')
-         tag_locations = self.ui.configlist('hgsubversion', 'tagpaths', ['tags'])
-         self.usebranchnames = self.ui.configbool('hgsubversion',
-                                                  'usebranchnames', True)
--        branchmap = self.ui.config('hgsubversion', 'branchmap')
--        tagmap = self.ui.config('hgsubversion', 'tagmap')
--        filemap = self.ui.config('hgsubversion', 'filemap')
-+        branchmap = util.configpath(self.ui, 'branchmap')
-+        tagmap = util.configpath(self.ui, 'tagmap')
-+        filemap = util.configpath(self.ui, 'filemap')
- 
-         self.branches = {}
-         if os.path.exists(self.branch_info_file):
-diff --git a/hgsubversion/util.py b/hgsubversion/util.py
---- a/hgsubversion/util.py
-+++ b/hgsubversion/util.py
-@@ -28,6 +28,9 @@ def formatrev(rev):
-         return '\t(working copy)'
-     return '\t(revision %d)' % rev
- 
-+def configpath(ui, name):
-+    path = ui.config('hgsubversion', name)
-+    return path and hgutil.expandpath(path)
- 
- def filterdiff(diff, oldrev, newrev):
-     diff = newfile_devnull_re.sub(r'--- \1\t(revision 0)' '\n'

helpful.diff

-# HG changeset patch
-# Parent 158010a469a141f350822d811dbcabd7047ad1ff
-# User Dan Villiom Podlaski Christiansen  <danchr@gmail.com>
-make assertion failures slightly more helpful by including the failing verification
-
-diff --git a/tests/comprehensive/test_verify_and_startrev.py b/tests/comprehensive/test_verify_and_startrev.py
---- a/tests/comprehensive/test_verify_and_startrev.py
-+++ b/tests/comprehensive/test_verify_and_startrev.py
-@@ -57,11 +57,13 @@ def _do_case(self, name, stupid, layout)
-         fulltip = repo['tip']
-         shallowtip = shallowrepo['tip']
- 
-+        repo.ui.pushbuffer()
-         self.assertEqual(0, svncommands.verify(repo.ui, shallowrepo,
-                                                rev=shallowtip.node()))
- 
-         # viewing diff's of lists of files is easier on the eyes
--        self.assertMultiLineEqual('\n'.join(fulltip), '\n'.join(shallowtip))
-+        self.assertMultiLineEqual('\n'.join(fulltip), '\n'.join(shallowtip),
-+                                  repo.ui.popbuffer())
- 
-         for f in fulltip:
-             self.assertMultiLineEqual(fulltip[f].data(), shallowtip[f].data())

kill-prints.diff

-# HG changeset patch
-# Parent 3c134c3e9485e398df84d46f681892ac5c430256
-# User Dan Villiom Podlaski Christiansen  <danchr@gmail.com>
-kill all 'print' statements in the extension proper
-
-
-diff --git a/hgsubversion/editor.py b/hgsubversion/editor.py
---- a/hgsubversion/editor.py
-+++ b/hgsubversion/editor.py
-@@ -364,7 +364,6 @@ class HgEditor(svnwrap.Editor):
-                 else: # pragma: no cover
-                     raise hgutil.Abort(*e.args)
-             except: # pragma: no cover
--                print len(base), self.current.file
-                 self._exception_info = sys.exc_info()
-                 raise
-         return txdelt_window
-diff --git a/hgsubversion/maps.py b/hgsubversion/maps.py
---- a/hgsubversion/maps.py
-+++ b/hgsubversion/maps.py
-@@ -135,8 +135,7 @@ class Tags(dict):
-             svncommands.rebuildmeta(repo.ui, repo, ())
-             return
-         elif ver != self.VERSION:
--            print 'tagmap too new -- please upgrade'
--            raise NotImplementedError
-+            raise hgutil.Abort('tagmap too new -- please upgrade')
-         for l in f:
-             ha, revision, tag = l.split(' ', 2)
-             revision = int(revision)
-@@ -228,8 +227,7 @@ class RevMap(dict):
-             return iter([])
-         ver = int(f.readline())
-         if ver != cls.VERSION:
--            print 'revmap too new -- please upgrade'
--            raise NotImplementedError
-+            raise hgutil.Abort('revmap too new -- please upgrade')
-         return f
- 
-     def _load(self):
-@@ -361,8 +359,7 @@ class FileMap(object):
-         f = open(self.path)
-         ver = int(f.readline())
-         if ver != self.VERSION:
--            print 'filemap too new -- please upgrade'
--            raise NotImplementedError
-+            raise hgutil.Abort('filemap too new -- please upgrade')
-         self.load_fd(f, self.path)
-         f.close()
- 

maxdiff.diff

-# HG changeset patch
-# Parent 0756ab73b1dec2ba8c5a3a1eceefec192bb80a16
-# User Dan Villiom Podlaski Christiansen  <danchr@gmail.com>
-allow Python 2.7 to show large, multiline diffs when tests fail
-
-diff --git a/tests/test_util.py b/tests/test_util.py
---- a/tests/test_util.py
-+++ b/tests/test_util.py
-@@ -237,6 +237,9 @@ class TestBase(unittest.TestCase):
-     def setUp(self):
-         _verify_our_modules()
- 
-+        # prevent Python 2.7 from suppressing large changes
-+        self.maxDiff = None
-+
-         self.oldenv = dict([(k, os.environ.get(k, None),) for k in
-                            ('LANG', 'LC_ALL', 'HGRCPATH',)])
-         self.oldt = i18n.t
-kill-prints.diff
-maxdiff.diff
-verify-test.diff
-traceback.diff
-helpful.diff
-verify-editor.diff
-configpath.diff
 allow-multi-rebuildmeta.diff
 hgrcpath.diff
 empty.diff

traceback.diff

-# HG changeset patch
-# Parent ece6f4129e79a826e2b6d38b580f65408e203d58
-# User Dan Villiom Podlaski Christiansen  <danchr@gmail.com>
-don't suppress KeyboardInterrupt exception tracebacks
-
-diff --git a/hgsubversion/wrappers.py b/hgsubversion/wrappers.py
---- a/hgsubversion/wrappers.py
-+++ b/hgsubversion/wrappers.py
-@@ -380,7 +380,7 @@ def pull(repo, source, heads=[], force=F
-                             ui.traceback()
-                             raise hgutil.Abort(*e.args)
-         except KeyboardInterrupt:
--            pass
-+            ui.traceback()
-     finally:
-         util.progress(ui, 'pull', None, total=total)
-         util.swap_out_encoding(old_encoding)

verify-editor.diff

-# HG changeset patch
-# User Dan Villiom Podlaski Christiansen <danchr@gmail.com>
-# Date 1323817678 -3600
-# Node ID 2d9359a7e345b8233824c45fe7b8f1c2c27c9fa0
-# Parent a413ad1c77cba6a590ed84e9365fd09a1afd0d6f
-svn verify: use a custom editor and get_revision()
-
-Previously, we would fetch each file in the revision/changeset
-individually. With this change, we fetch the entire revision in one
-request, and use a custom editor to verify its contents. This is quite
-a lot faster than the previous means when verifying over the internet.
-By an order of magnitude or two, in fact. As data is transfered in a
-single operation, verifying a revision from PyPy took 30 seconds
-rather than 30 minutes, and saturated my 10Mbps connection.
-
-Please note that the output ordering isn't stable between the two;
-output will appear in reverse order when using the fast verifier.
-
-diff --git a/hgsubversion/editor.py b/hgsubversion/editor.py
---- a/hgsubversion/editor.py
-+++ b/hgsubversion/editor.py
-@@ -367,3 +367,101 @@ class HgEditor(svnwrap.Editor):
-                 self._exception_info = sys.exc_info()
-                 raise
-         return txdelt_window
-+
-+class Verifier(svnwrap.Editor):
-+    '''editor that verifies a repository against the given context
-+
-+    Defining the class within the function avoids importing Subversion
-+    needlessly.
-+    '''
-+    def __init__(self, ui, ctx):
-+        self.ui = ui
-+        self.ctx = ctx
-+        self.unexpected = set(ctx) - util.ignoredfiles
-+        self.missing = set()
-+        self.failed = False
-+
-+    def open_root(self, base_revnum, pool=None):
-+        pass
-+
-+    def add_directory(self, path, parent_baton, copyfrom_path,
-+                      copyfrom_revision, pool=None):
-+        self.file = None
-+        self.props = None
-+
-+    def open_directory(self, path, parent_baton, base_revision, pool=None):
-+        self.file = None
-+        self.props = None
-+
-+    def add_file(self, path, parent_baton=None, copyfrom_path=None,
-+                 copyfrom_revision=None, file_pool=None):
-+        if path in self.unexpected:
-+            self.unexpected.remove(path)
-+            self.file = path
-+            self.props = {}
-+        else:
-+            self.missing.add(path)
-+            self.failed = True
-+            self.file = None
-+            self.props = None
-+
-+    def open_file(self, path, base_revnum):
-+        raise NotImplementedError()
-+
-+    def apply_textdelta(self, file_baton, base_checksum, pool=None):
-+        stream = NeverClosingStringIO()
-+        handler = svnwrap.apply_txdelta('', stream)
-+        if not callable(handler):
-+            raise hgutil.Abort('Error in Subversion bindings: '
-+                               'cannot call handler!')
-+        def txdelt_window(window):
-+            handler(window)
-+            # window being None means we're done
-+            if window:
-+                return
-+
-+            fctx = self.ctx[self.file]
-+            hgdata = fctx.data()
-+            svndata = stream.getvalue()
-+
-+            if 'svn:executable' in self.props:
-+                if fctx.flags() != 'x':
-+                    self.ui.warn('wrong flags for: %s\n' % self.file)
-+                    self.failed = True
-+            elif 'svn:special' in self.props:
-+                hgdata = 'link ' + hgdata
-+                if fctx.flags() != 'l':
-+                    self.ui.warn('wrong flags for: %s\n' % self.file)
-+                    self.failed = True
-+            elif fctx.flags():
-+                self.ui.warn('wrong flags for: %s\n' % self.file)
-+                self.failed = True
-+
-+            if hgdata != svndata:
-+                self.ui.warn('difference in: %s\n' % self.file)
-+                self.failed = True
-+
-+        if self.file is not None:
-+            return txdelt_window
-+
-+    def change_dir_prop(self, dir_baton, name, value, pool=None):
-+        pass
-+
-+    def change_file_prop(self, file_baton, name, value, pool=None):
-+        if self.props is not None:
-+            self.props[name] = value
-+
-+    def close_directory(self, dir_baton, pool=None):
-+        pass
-+
-+    def delete_entry(self, path, revnum, pool=None):
-+        raise NotImplementedError()
-+
-+    def check(self):
-+        for f in self.unexpected:
-+            self.ui.warn('unexpected file: %s\n' % f)
-+            self.failed = True
-+        for f in self.missing:
-+            self.ui.warn('missing file: %s\n' % f)
-+            self.failed = True
-+        return not self.failed
-diff --git a/hgsubversion/svncommands.py b/hgsubversion/svncommands.py
---- a/hgsubversion/svncommands.py
-+++ b/hgsubversion/svncommands.py
-@@ -16,6 +16,7 @@ import svnwrap
- import svnrepo
- import util
- import svnexternals
-+import editor
- 
- 
- def verify(ui, repo, args=None, **opts):
-@@ -48,42 +49,52 @@ def verify(ui, repo, args=None, **opts):
- 
-     ui.write('verifying %s against %s@%i\n' % (ctx, branchurl, srev))
- 
--    svnfiles = set()
--    result = 0
-+    if opts.get('stupid', ui.configbool('hgsubversion', 'stupid')):
-+        svnfiles = set()
-+        result = 0
- 
--    svndata = svn.list_files(branchpath, srev)
--    for i, (fn, type) in enumerate(svndata):
--        util.progress(ui, 'verify', i)
--        if type != 'f':
--            continue
--        svnfiles.add(fn)
--        fp = fn
--        if branchpath:
--            fp = branchpath + '/' + fn
--        data, mode = svn.get_file(posixpath.normpath(fp), srev)
--        try:
--            fctx = ctx[fn]
--        except error.LookupError:
--            result = 1
--            continue
--        if not fctx.data() == data:
--            ui.write('difference in: %s\n' % fn)
--            result = 1
--        if not fctx.flags() == mode:
--            ui.write('wrong flags for: %s\n' % fn)
-+        svndata = svn.list_files(branchpath, srev)
-+        for i, (fn, type) in enumerate(svndata):
-+            util.progress(ui, 'verify', i)
-+            if type != 'f':
-+                continue
-+            svnfiles.add(fn)
-+            fp = fn
-+            if branchpath:
-+                fp = branchpath + '/' + fn
-+            data, mode = svn.get_file(posixpath.normpath(fp), srev)
-+            try:
-+                fctx = ctx[fn]
-+            except error.LookupError:
-+                result = 1
-+                continue
-+            if not fctx.data() == data:
-+                ui.write('difference in: %s\n' % fn)
-+                result = 1
-+            if not fctx.flags() == mode:
-+                ui.write('wrong flags for: %s\n' % fn)
-+                result = 1
-+
-+        hgfiles = set(ctx) - util.ignoredfiles
-+        if hgfiles != svnfiles:
-+            unexpected = hgfiles - svnfiles
-+            for f in sorted(unexpected):
-+                ui.write('unexpected file: %s\n' % f)
-+            missing = svnfiles - hgfiles
-+            for f in sorted(missing):
-+                ui.write('missing file: %s\n' % f)
-             result = 1
- 
--    hgfiles = set(ctx) - util.ignoredfiles
--    if hgfiles != svnfiles:
--        unexpected = hgfiles - svnfiles
--        for f in sorted(unexpected):
--            ui.write('unexpected file: %s\n' % f)
--        missing = svnfiles - hgfiles
--        for f in sorted(missing):
--            ui.write('missing file: %s\n' % f)
--        result = 1
-+        util.progress(ui, 'verify', None)
-+    else:
- 
--    util.progress(ui, 'verify', None)
-+
-+        v = editor.Verifier(ui, ctx)
-+        svnrepo.svnremoterepo(ui, branchurl).svn.get_revision(srev, v)
-+        if v.check():
-+            result = 0
-+        else:
-+            result = 1
- 
-     return result
- 
-diff --git a/tests/comprehensive/test_verify_and_startrev.py b/tests/comprehensive/test_verify_and_startrev.py
---- a/tests/comprehensive/test_verify_and_startrev.py
-+++ b/tests/comprehensive/test_verify_and_startrev.py
-@@ -42,7 +42,10 @@ def _do_case(self, name, stupid, layout)
-     assert len(self.repo) > 0
-     for i in repo:
-         ctx = repo[i]
--        self.assertEqual(svncommands.verify(repo.ui, repo, rev=ctx.node()), 0)
-+        self.assertEqual(svncommands.verify(repo.ui, repo, rev=ctx.node(),
-+                                            stupid=True), 0)
-+        self.assertEqual(svncommands.verify(repo.ui, repo, rev=ctx.node(),
-+                                            stupid=False), 0)
- 
-     # check a startrev clone
-     if layout == 'single' and name not in _skipshallow:
-@@ -59,7 +62,18 @@ def _do_case(self, name, stupid, layout)
- 
-         repo.ui.pushbuffer()
-         self.assertEqual(0, svncommands.verify(repo.ui, shallowrepo,
--                                               rev=shallowtip.node()))
-+                                               rev=shallowtip.node(),
-+                                               stupid=True))
-+        self.assertEqual(0, svncommands.verify(repo.ui, shallowrepo,
-+                                               rev=shallowtip.node(),
-+                                               stupid=False))
-+
-+        stupidui = ui.ui(repo.ui)
-+        stupidui.config('hgsubversion', 'stupid', True)
-+        self.assertEqual(svncommands.verify(stupidui, repo, rev=ctx.node(),
-+                                            stupid=True), 0)
-+        self.assertEqual(svncommands.verify(stupidui, repo, rev=ctx.node(),
-+                                            stupid=False), 0)
- 
-         # viewing diff's of lists of files is easier on the eyes
-         self.assertMultiLineEqual('\n'.join(fulltip), '\n'.join(shallowtip),
-diff --git a/tests/test_utility_commands.py b/tests/test_utility_commands.py
---- a/tests/test_utility_commands.py
-+++ b/tests/test_utility_commands.py
-@@ -245,16 +245,16 @@ class UtilityTests(test_util.TestBase):
-                                 authors=author_path)
-         self.assertMultiLineEqual(open(author_path).read(), 'Augie=\nevil=\n')
- 
--    def test_svnverify(self):
-+    def test_svnverify(self, stupid=False):
-         repo, repo_path = self.load_and_fetch('binaryfiles.svndump',
--                                              noupdate=False)
--        ret = svncommands.verify(self.ui(), repo, [], rev=1)
-+                                              noupdate=False, stupid=stupid)
-+        ret = svncommands.verify(self.ui(), repo, [], rev=1, stupid=stupid)
-         self.assertEqual(0, ret)
-         repo_path = self.load_svndump('binaryfiles-broken.svndump')
-         u = self.ui()
-         u.pushbuffer()
-         ret = svncommands.verify(u, repo, [test_util.fileurl(repo_path)],
--                                 rev=1)
-+                                 rev=1, stupid=stupid)
-         output = u.popbuffer()
-         self.assertEqual(1, ret)
-         output = re.sub(r'file://\S+', 'file://', output)
-@@ -265,16 +265,20 @@ unexpected file: binary1
- missing file: binary3
- """, output)
- 
--    def test_svnverify_corruption(self):
-+    def test_svnverify_stupid(self):
-+        self.test_svnverify(True)
-+
-+    def test_corruption(self, stupid=False):
-         SUCCESS = 0
-         FAILURE = 1
- 
-         repo, repo_path = self.load_and_fetch('correct.svndump', layout='single',
--                                              subdir='')
-+                                              subdir='', stupid=stupid)
- 
-         ui = self.ui()
- 
--        self.assertEqual(SUCCESS, svncommands.verify(ui, self.repo, rev='tip'))
-+        self.assertEqual(SUCCESS, svncommands.verify(ui, self.repo, rev='tip',
-+                                                     stupid=stupid))
- 
-         corrupt_source = test_util.fileurl(self.load_svndump('corrupt.svndump'))
- 
-@@ -300,6 +304,9 @@ missing file: binary3
- 
-         self.assertEqual((FAILURE, expected), (code, actual))
- 
-+    def test_corruption_stupid(self):
-+        self.test_corruption(True)
-+
- def suite():
-     all_tests = [unittest.TestLoader().loadTestsFromTestCase(UtilityTests),
-           ]

verify-test.diff

-# HG changeset patch
-# User Dan Villiom Podlaski Christiansen <danchr@gmail.com>
-# Date 1323817678 -3600
-# Node ID 7780f14edecbc1606dc552e08993ca9a31ce0e03
-# Parent 9ed0472375afcd6ab741862016f1c6ab5487d05b
-svn verify: add a test for corrupt repositories.
-
-This case contains a couple of unlikely (but not impossible) failure
-cases that the code previously did not handle. The verifier is updated
-to address these, and the output made a bit more consistent.
-
-diff --git a/hgsubversion/svncommands.py b/hgsubversion/svncommands.py
---- a/hgsubversion/svncommands.py
-+++ b/hgsubversion/svncommands.py
-@@ -66,24 +66,21 @@ def verify(ui, repo, args=None, **opts):
-         except error.LookupError:
-             result = 1
-             continue
--        dmatch = fctx.data() == data
--        mmatch = fctx.flags() == mode
--        if not (dmatch and mmatch):
--            ui.write('difference in file %s\n' % fn)
-+        if not fctx.data() == data:
-+            ui.write('difference in: %s\n' % fn)
-+            result = 1
-+        if not fctx.flags() == mode:
-+            ui.write('wrong flags for: %s\n' % fn)
-             result = 1
- 
-     hgfiles = set(ctx) - util.ignoredfiles
-     if hgfiles != svnfiles:
-         unexpected = hgfiles - svnfiles
--        if unexpected:
--            ui.write('unexpected files:\n')
--            for f in sorted(unexpected):
--                ui.write('  %s\n' % f)
-+        for f in sorted(unexpected):
-+            ui.write('unexpected file: %s\n' % f)
-         missing = svnfiles - hgfiles
--        if missing:
--            ui.write('missing files:\n')
--            for f in sorted(missing):
--                ui.write('  %s\n' % f)
-+        for f in sorted(missing):
-+            ui.write('missing file: %s\n' % f)
-         result = 1
- 
-     util.progress(ui, 'verify', None)
-diff --git a/tests/comprehensive/test_stupid_pull.py b/tests/comprehensive/test_stupid_pull.py
---- a/tests/comprehensive/test_stupid_pull.py
-+++ b/tests/comprehensive/test_stupid_pull.py
-@@ -45,6 +45,8 @@ def buildmethod(case, name, layout):
- attrs = {'_do_case': _do_case,
-          }
- for case in (f for f in os.listdir(test_util.FIXTURES) if f.endswith('.svndump')):
-+    if case == 'corrupt.svndump':
-+        continue
-     name = 'test_' + case[:-len('.svndump')]
-     # Automatic layout branchtag collision exposes a minor defect
-     # here, but since it isn't a regression we suppress the test case.
-diff --git a/tests/comprehensive/test_verify_and_startrev.py b/tests/comprehensive/test_verify_and_startrev.py
---- a/tests/comprehensive/test_verify_and_startrev.py
-+++ b/tests/comprehensive/test_verify_and_startrev.py
-@@ -21,6 +21,8 @@ from hgsubversion import svncommands
-     'binaryfiles.svndump',
-     'binaryfiles-broken.svndump',
-     'emptyrepo.svndump',
-+    'correct.svndump',
-+    'corrupt.svndump',
- ])
- 
- _skipall = set([
-@@ -29,6 +31,8 @@ from hgsubversion import svncommands
- 
- _skipstandard = set([
-     'subdir_is_file_prefix.svndump',
-+    'correct.svndump',
-+    'corrupt.svndump',
- ])
- 
- def _do_case(self, name, stupid, layout):
-diff --git a/tests/fixtures/correct.svndump b/tests/fixtures/correct.svndump
-new file mode 100644
---- /dev/null
-+++ b/tests/fixtures/correct.svndump
-@@ -0,0 +1,103 @@
-+SVN-fs-dump-format-version: 2
-+
-+UUID: 00000000-0000-0000-0000-000000000000
-+
-+Revision-number: 0
-+Prop-content-length: 56
-+Content-length: 56
-+
-+K 8
-+svn:date
-+V 27
-+2010-11-30T15:10:25.898546Z
-+PROPS-END
-+
-+Revision-number: 1
-+Prop-content-length: 100
-+Content-length: 100
-+
-+K 7
-+svn:log
-+V 0
-+
-+K 10
-+svn:author
-+V 6
-+danchr
-+K 8
-+svn:date
-+V 27
-+2010-11-30T15:16:01.077550Z
-+PROPS-END
-+
-+Node-path: empty-file
-+Node-kind: file
-+Node-action: add
-+Prop-content-length: 10
-+Text-content-length: 0
-+Text-content-md5: d41d8cd98f00b204e9800998ecf8427e
-+Text-content-sha1: da39a3ee5e6b4b0d3255bfef95601890afd80709
-+Content-length: 10
-+
-+PROPS-END
-+
-+
-+Node-path: executable-file
-+Node-kind: file
-+Node-action: add
-+Prop-content-length: 36
-+Text-content-length: 11
-+Text-content-md5: 01839ba8c81c3b2c7486607e0c683e62
-+Text-content-sha1: 5e70f8a25fe8ad4ad971bfd3388c258b019268d4
-+Content-length: 47
-+
-+K 14
-+svn:executable
-+V 1
-+*
-+PROPS-END
-+Executable
-+
-+
-+Node-path: regular-file
-+Node-kind: file
-+Node-action: add
-+Prop-content-length: 10
-+Text-content-length: 10
-+Text-content-md5: 2e01b7f4ab0c18c05a3059eb2e2420d9
-+Text-content-sha1: 6e530e985be313a43dc9734251656be8f0c94ab8
-+Content-length: 20
-+
-+PROPS-END
-+Contents.
-+
-+
-+Node-path: another-regular-file
-+Node-kind: file
-+Node-action: add
-+Prop-content-length: 10
-+Text-content-length: 10
-+Text-content-md5: 2e01b7f4ab0c18c05a3059eb2e2420d9
-+Text-content-sha1: 6e530e985be313a43dc9734251656be8f0c94ab8
-+Content-length: 20
-+
-+PROPS-END
-+Contents.
-+
-+
-+Node-path: symlink
-+Node-kind: file
-+Node-action: add
-+Prop-content-length: 33
-+Text-content-length: 6
-+Text-content-md5: 654580f41818cd6f51408c7cbd313728
-+Text-content-sha1: 130b8faaf3e1acc1b95f77ac835e9c8b6eee5c96
-+Content-length: 39
-+
-+K 11
-+svn:special
-+V 1
-+*
-+PROPS-END
-+link A
-+
-diff --git a/tests/fixtures/corrupt.svndump b/tests/fixtures/corrupt.svndump
-new file mode 100644
---- /dev/null
-+++ b/tests/fixtures/corrupt.svndump
-@@ -0,0 +1,97 @@
-+SVN-fs-dump-format-version: 2
-+
-+UUID: 00000000-0000-0000-0000-000000000000
-+
-+Revision-number: 0
-+Prop-content-length: 56
-+Content-length: 56
-+
-+K 8
-+svn:date
-+V 27
-+2010-11-30T15:10:25.898546Z
-+PROPS-END
-+
-+Revision-number: 1
-+Prop-content-length: 100
-+Content-length: 100
-+
-+K 10
-+svn:author
-+V 6
-+danchr
-+K 8
-+svn:date
-+V 27
-+2010-11-30T15:16:01.077550Z
-+K 7
-+svn:log
-+V 0
-+
-+PROPS-END
-+
-+Node-path: another-regular-file
-+Node-kind: file
-+Node-action: add
-+Prop-content-length: 10
-+Text-content-length: 0
-+Text-content-md5: d41d8cd98f00b204e9800998ecf8427e
-+Text-content-sha1: da39a3ee5e6b4b0d3255bfef95601890afd80709
-+Content-length: 10
-+
-+PROPS-END
-+
-+
-+Node-path: executable-file
-+Node-kind: file
-+Node-action: add
-+Prop-content-length: 10
-+Text-content-length: 11
-+Text-content-md5: 01839ba8c81c3b2c7486607e0c683e62
-+Text-content-sha1: 5e70f8a25fe8ad4ad971bfd3388c258b019268d4
-+Content-length: 21
-+
-+PROPS-END
-+Executable
-+
-+
-+Node-path: missing-file
-+Node-kind: file
-+Node-action: add
-+Prop-content-length: 10
-+Text-content-length: 0
-+Text-content-md5: d41d8cd98f00b204e9800998ecf8427e
-+Text-content-sha1: da39a3ee5e6b4b0d3255bfef95601890afd80709
-+Content-length: 10
-+
-+PROPS-END
-+
-+
-+Node-path: regular-file
-+Node-kind: file
-+Node-action: add
-+Prop-content-length: 33
-+Text-content-length: 18
-+Text-content-md5: adf66a0cec83e25644c63f3c3007ae7c
-+Text-content-sha1: 047e6e482d0c9cb812f89d18a9f07a43caab76bb
-+Content-length: 51
-+
-+K 11
-+svn:special
-+V 1
-+*
-+PROPS-END
-+link Bad contents.
-+
-+Node-path: symlink
-+Node-kind: file
-+Node-action: add
-+Prop-content-length: 10
-+Text-content-length: 1
-+Text-content-md5: 7fc56270e7a70fa81a5935b72eacbe29
-+Text-content-sha1: 6dcd4ce23d88e2ee9568ba546c007c63d9131c1b
-+Content-length: 11
-+
-+PROPS-END
-+A
-+
-diff --git a/tests/test_rebuildmeta.py b/tests/test_rebuildmeta.py
---- a/tests/test_rebuildmeta.py
-+++ b/tests/test_rebuildmeta.py
-@@ -101,11 +101,16 @@ def buildmethod(case, name, stupid, sing
-     return m
- 
- 
-+skip = set([
-+    'project_root_not_repo_root.svndump',
-+    'corrupt.svndump',
-+])
-+
- attrs = {'_do_case': _do_case,
-          }
- for case in [f for f in os.listdir(test_util.FIXTURES) if f.endswith('.svndump')]:
-     # this fixture results in an empty repository, don't use it
--    if case == 'project_root_not_repo_root.svndump':
-+    if case in skip:
-         continue
-     bname = 'test_' + case[:-len('.svndump')]
-     attrs[bname] = buildmethod(case, bname, False, False)
-diff --git a/tests/test_utility_commands.py b/tests/test_utility_commands.py
---- a/tests/test_utility_commands.py
-+++ b/tests/test_utility_commands.py
-@@ -260,13 +260,46 @@ class UtilityTests(test_util.TestBase):
-         output = re.sub(r'file://\S+', 'file://', output)
-         self.assertMultiLineEqual("""\
- verifying d51f46a715a1 against file://
--difference in file binary2
--unexpected files:
--  binary1
--missing files:
--  binary3
-+difference in: binary2
-+unexpected file: binary1
-+missing file: binary3
- """, output)
- 
-+    def test_svnverify_corruption(self):
-+        SUCCESS = 0
-+        FAILURE = 1
-+
-+        repo, repo_path = self.load_and_fetch('correct.svndump', layout='single',
-+                                              subdir='')
-+
-+        ui = self.ui()
-+
-+        self.assertEqual(SUCCESS, svncommands.verify(ui, self.repo, rev='tip'))
-+
-+        corrupt_source = test_util.fileurl(self.load_svndump('corrupt.svndump'))
-+
-+        repo.ui.setconfig('paths', 'default', corrupt_source)
-+
-+        ui.pushbuffer()
-+        code = svncommands.verify(ui, repo, rev='tip')
-+        actual = ui.popbuffer()
-+
-+        actual = actual.replace(corrupt_source, '$REPO')
-+        actual = set(actual.splitlines())
-+
-+        expected = set([
-+            'verifying 78e965230a13 against $REPO@1',
-+            'missing file: missing-file',
-+            'wrong flags for: executable-file',
-+            'wrong flags for: symlink',
-+            'wrong flags for: regular-file',
-+            'difference in: another-regular-file',
-+            'difference in: regular-file',
-+            'unexpected file: empty-file',
-+        ])
-+
-+        self.assertEqual((FAILURE, expected), (code, actual))
-+
- def suite():
-     all_tests = [unittest.TestLoader().loadTestsFromTestCase(UtilityTests),
-           ]