# HG changeset patch # User Patrick Mezard # Date 1230690836 21600 # Node ID f1919e1c35bf67f9595c98c6561db1fdcc40c531 # Parent 4f26fa0494528da7204e43fa33a67197effeafef fetch_command: cancel patching when encountering binary diffs Mercurial patching code does not support hunks with embedded nul characters. diff --git a/fetch_command.py b/fetch_command.py --- a/fetch_command.py +++ b/fetch_command.py @@ -229,6 +229,8 @@ def stupid_diff_branchrev(ui, svn, hg_ed if (hasattr(e, 'apr_err') and e.apr_err != 160013): raise raise BadPatchApply('previous revision does not exist') + if '\0' in d: + raise BadPatchApply('binary diffs are not supported') files_data = {} binary_files = {} touched_files = {} diff --git a/tests/fixtures/binaryfiles.sh b/tests/fixtures/binaryfiles.sh new file mode 100755 --- /dev/null +++ b/tests/fixtures/binaryfiles.sh @@ -0,0 +1,36 @@ +#!/bin/sh +# +# Generate binaryfiles.svndump +# + +mkdir temp +cd temp + +mkdir project-orig +cd project-orig +mkdir trunk +cd .. + +svnadmin create testrepo +svnurl=file://`pwd`/testrepo +svn import project-orig $svnurl -m "init project" + +svn co $svnurl project +cd project/trunk +# Add a regular binary file, and an unflagged one +python -c "file('binary1', 'wb').write('a\0\0\nb\0b')" +python -c "file('binary2', 'wb').write('b\0\0\nc\0d')" +svn add binary1 binary2 +svn propset svn:mime-type application/octet-stream binary1 +svn propdel svn:mime-type binary2 +svn ci -m 'add binaries' +# Update them +python -c "file('binary1', 'wb').write('a\0\0\nc\0d')" +python -c "file('binary2', 'wb').write('b\0\0\0\nd\0e')" +svn ci -m 'change binaries' +# Remove them +svn rm binary1 binary2 +svn ci -m 'remove binaries' +cd ../.. + +svnadmin dump testrepo > ../binaryfiles.svndump diff --git a/tests/fixtures/binaryfiles.svndump b/tests/fixtures/binaryfiles.svndump new file mode 100644 index 0000000000000000000000000000000000000000..9317774582e19bb0031a149757920c9e853197ca GIT binary patch literal 1886 zc$}?NNp9OP6!n^?&;^)q9<*(`C<>%OrbTxgz8p2y0GT$Lp1!n#01hOlZtSHVDZLT8 zd%VWg8plo39vZNe*Pm+7f2q(Wb&5c*yiwBEL5bP3R7!8Bro7)%*v z_MYmJsFKMG%7qf*C%U=)adU^iUSG}d(s^D=#e{f=WoA7xuexO>rVQ0>or-?wenCk2 zl#=n-ZPHUW-$w5+)mzQ7ZN1A zP6N1R&#PN3kYD(Np4lfo=T?sP%r(B bXKdf(AF<*}{zv<7QASun{_ww=m|Xu0)b>EF diff --git a/tests/run.py b/tests/run.py --- a/tests/run.py +++ b/tests/run.py @@ -4,6 +4,7 @@ import unittest sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +import test_binaryfiles import test_diff import test_fetch_branches import test_fetch_command @@ -22,7 +23,8 @@ import test_tags import test_utility_commands def suite(): - return unittest.TestSuite([test_diff.suite(), + return unittest.TestSuite([test_binaryfiles.suite(), + test_diff.suite(), test_fetch_branches.suite(), test_fetch_command.suite(), test_fetch_command_regexes.suite(), diff --git a/tests/test_binaryfiles.py b/tests/test_binaryfiles.py new file mode 100644 --- /dev/null +++ b/tests/test_binaryfiles.py @@ -0,0 +1,18 @@ +import unittest + +from mercurial import node + +import test_util + +class TestFetchBinaryFiles(test_util.TestBase): + def test_binaryfiles(self, stupid=False): + repo = self._load_fixture_and_fetch('binaryfiles.svndump', stupid=stupid) + self.assertEqual('cce7fe400d8d', str(repo['tip'])) + + def test_binaryfiles_stupid(self): + self.test_binaryfiles(True) + +def suite(): + all = [unittest.TestLoader().loadTestsFromTestCase(TestFetchBinaryFiles), + ] + return unittest.TestSuite(all)