# HG changeset patch # User Dan Villiom Podlaski Christiansen # Date 1375946530 -7200 # Node ID 3092b3c109a8e2ac501b1392ae97d9b79d10fbdb # Parent 36fe4b316a6b973161b3d623b19174dca31243ea tests: split single directory tests that push & clone in two modules diff --git a/tests/run.py b/tests/run.py --- a/tests/run.py +++ b/tests/run.py @@ -28,6 +28,7 @@ def tests(): import test_push_eol import test_push_autoprops import test_single_dir_clone + import test_single_dir_push import test_svnwrap import test_tags import test_template_keywords diff --git a/tests/test_single_dir_clone.py b/tests/test_single_dir_clone.py --- a/tests/test_single_dir_clone.py +++ b/tests/test_single_dir_clone.py @@ -10,7 +10,7 @@ from mercurial import hg from mercurial import node from mercurial import ui -class TestSingleDir(test_util.TestBase): +class TestSingleDirClone(test_util.TestBase): def test_clone_single_dir_simple(self): repo = self._load_fixture_and_fetch('branch_from_tag.svndump', stupid=False, @@ -86,191 +86,3 @@ class TestSingleDir(test_util.TestBase): expect = '' # Not honestly sure what this should be... test = 4 self.assertEqual(self.repo[test]['.hgsvnexternals'].data(), expect) - - def test_push_single_dir(self): - # Tests simple pushing from default branch to a single dir repo - repo, repo_path = self.load_and_fetch('branch_from_tag.svndump', - stupid=False, - layout='single', - subdir='') - def file_callback(repo, memctx, path): - if path == 'adding_file': - return context.memfilectx(path=path, - data='foo', - islink=False, - isexec=False, - copied=False) - elif path == 'adding_binary': - return context.memfilectx(path=path, - data='\0binary', - islink=False, - isexec=False, - copied=False) - raise IOError(errno.EINVAL, 'Invalid operation: ' + path) - ctx = context.memctx(repo, - (repo['tip'].node(), node.nullid), - 'automated test', - ['adding_file', 'adding_binary'], - file_callback, - 'an_author', - '2009-10-19 18:49:30 -0500', - {'branch': 'default', }) - repo.commitctx(ctx) - hg.update(repo, repo['tip'].node()) - self.pushrevisions() - self.assertTrue('adding_file' in test_util.svnls(repo_path, '')) - self.assertEqual('application/octet-stream', - test_util.svnpropget(repo_path, 'adding_binary', - 'svn:mime-type')) - # Now add another commit and test mime-type being reset - changes = [('adding_binary', 'adding_binary', 'no longer binary')] - self.commitchanges(changes) - self.pushrevisions() - self.assertEqual('', test_util.svnpropget(repo_path, 'adding_binary', - 'svn:mime-type')) - - def test_push_single_dir_at_subdir(self): - repo = self._load_fixture_and_fetch('branch_from_tag.svndump', - stupid=False, - layout='single', - subdir='trunk') - def filectxfn(repo, memctx, path): - return context.memfilectx(path=path, - data='contents of %s' % path, - islink=False, - isexec=False, - copied=False) - ctx = context.memctx(repo, - (repo['tip'].node(), node.nullid), - 'automated test', - ['bogus'], - filectxfn, - 'an_author', - '2009-10-19 18:49:30 -0500', - {'branch': 'localhacking', }) - n = repo.commitctx(ctx) - self.assertEqual(self.repo['tip']['bogus'].data(), - 'contents of bogus') - before = repo['tip'].hex() - hg.update(repo, self.repo['tip'].hex()) - self.pushrevisions() - self.assertNotEqual(before, self.repo['tip'].hex()) - self.assertEqual(self.repo['tip']['bogus'].data(), - 'contents of bogus') - - def test_push_single_dir_one_incoming_and_two_outgoing(self): - # Tests simple pushing from default branch to a single dir repo - # Pushes two outgoing over one incoming svn rev - # (used to cause an "unknown revision") - # This can happen if someone committed to svn since our last pull (race). - repo, repo_path = self.load_and_fetch('branch_from_tag.svndump', - stupid=False, - layout='single', - subdir='trunk') - self.add_svn_rev(repo_path, {'trunk/alpha': 'Changed'}) - def file_callback(repo, memctx, path): - return context.memfilectx(path=path, - data='data of %s' % path, - islink=False, - isexec=False, - copied=False) - for fn in ['one', 'two']: - ctx = context.memctx(repo, - (repo['tip'].node(), node.nullid), - 'automated test', - [fn], - file_callback, - 'an_author', - '2009-10-19 18:49:30 -0500', - {'branch': 'default', }) - repo.commitctx(ctx) - hg.update(repo, repo['tip'].node()) - self.pushrevisions(expected_extra_back=1) - self.assertTrue('trunk/one' in test_util.svnls(repo_path, '')) - self.assertTrue('trunk/two' in test_util.svnls(repo_path, '')) - - def test_push_single_dir_branch(self): - # Tests local branches pushing to a single dir repo. Creates a fork at - # tip. The default branch adds a file called default, while branch foo - # adds a file called foo, then tries to push the foo branch and default - # branch in that order. - repo, repo_path = self.load_and_fetch('branch_from_tag.svndump', - stupid=False, - layout='single', - subdir='') - def file_callback(data): - def cb(repo, memctx, path): - if path == data: - return context.memfilectx(path=path, - data=data, - islink=False, - isexec=False, - copied=False) - raise IOError(errno.EINVAL, 'Invalid operation: ' + path) - return cb - - def commit_to_branch(name, parent): - repo.commitctx(context.memctx(repo, - (parent, node.nullid), - 'automated test (%s)' % name, - [name], - file_callback(name), - 'an_author', - '2009-10-19 18:49:30 -0500', - {'branch': name, })) - - parent = repo['tip'].node() - commit_to_branch('default', parent) - commit_to_branch('foo', parent) - hg.update(repo, repo['foo'].node()) - self.pushrevisions() - repo = self.repo # repo is outdated after the rebase happens, refresh - self.assertTrue('foo' in test_util.svnls(repo_path, '')) - self.assertEqual(repo.branchtags().keys(), ['default']) - # Have to cross to another branch head, so hg.update doesn't work - commands.update(ui.ui(), - self.repo, - self.repo.branchheads('default')[1], - clean=True) - self.pushrevisions() - self.assertTrue('default' in test_util.svnls(repo_path, '')) - self.assertEquals(len(self.repo.branchheads('default')), 1) - - @test_util.requiresoption('branch') - def test_push_single_dir_renamed_branch(self, stupid=False): - # Tests pulling and pushing with a renamed branch - # Based on test_push_single_dir - repo_path = self.load_svndump('branch_from_tag.svndump') - cmd = ['clone', '--layout=single', '--branch=flaf'] - if stupid: - cmd.append('--stupid') - cmd += [test_util.fileurl(repo_path), self.wc_path] - test_util.dispatch(cmd) - - def file_callback(repo, memctx, path): - if path == 'adding_file': - return context.memfilectx(path=path, - data='foo', - islink=False, - isexec=False, - copied=False) - raise IOError(errno.EINVAL, 'Invalid operation: ' + path) - ctx = context.memctx(self.repo, - (self.repo['tip'].node(), node.nullid), - 'automated test', - ['adding_file'], - file_callback, - 'an_author', - '2009-10-19 18:49:30 -0500', - {'branch': 'default', }) - self.repo.commitctx(ctx) - hg.update(self.repo, self.repo['tip'].node()) - self.pushrevisions() - self.assertTrue('adding_file' in test_util.svnls(repo_path, '')) - - self.assertEquals(set(['flaf']), - set(self.repo[i].branch() for i in self.repo)) - - @test_util.requiresoption('branch') - def test_push_single_dir_renamed_branch_stupid(self): - self.test_push_single_dir_renamed_branch(True) diff --git a/tests/test_single_dir_push.py b/tests/test_single_dir_push.py new file mode 100644 --- /dev/null +++ b/tests/test_single_dir_push.py @@ -0,0 +1,200 @@ +import test_util + +import errno +import shutil +import unittest + +from mercurial import commands +from mercurial import context +from mercurial import hg +from mercurial import node +from mercurial import ui + +class TestSingleDirPush(test_util.TestBase): + def test_push_single_dir(self): + # Tests simple pushing from default branch to a single dir repo + repo, repo_path = self.load_and_fetch('branch_from_tag.svndump', + stupid=False, + layout='single', + subdir='') + def file_callback(repo, memctx, path): + if path == 'adding_file': + return context.memfilectx(path=path, + data='foo', + islink=False, + isexec=False, + copied=False) + elif path == 'adding_binary': + return context.memfilectx(path=path, + data='\0binary', + islink=False, + isexec=False, + copied=False) + raise IOError(errno.EINVAL, 'Invalid operation: ' + path) + ctx = context.memctx(repo, + (repo['tip'].node(), node.nullid), + 'automated test', + ['adding_file', 'adding_binary'], + file_callback, + 'an_author', + '2009-10-19 18:49:30 -0500', + {'branch': 'default', }) + repo.commitctx(ctx) + hg.update(repo, repo['tip'].node()) + self.pushrevisions() + self.assertTrue('adding_file' in test_util.svnls(repo_path, '')) + self.assertEqual('application/octet-stream', + test_util.svnpropget(repo_path, 'adding_binary', + 'svn:mime-type')) + # Now add another commit and test mime-type being reset + changes = [('adding_binary', 'adding_binary', 'no longer binary')] + self.commitchanges(changes) + self.pushrevisions() + self.assertEqual('', test_util.svnpropget(repo_path, 'adding_binary', + 'svn:mime-type')) + + def test_push_single_dir_at_subdir(self): + repo = self._load_fixture_and_fetch('branch_from_tag.svndump', + stupid=False, + layout='single', + subdir='trunk') + def filectxfn(repo, memctx, path): + return context.memfilectx(path=path, + data='contents of %s' % path, + islink=False, + isexec=False, + copied=False) + ctx = context.memctx(repo, + (repo['tip'].node(), node.nullid), + 'automated test', + ['bogus'], + filectxfn, + 'an_author', + '2009-10-19 18:49:30 -0500', + {'branch': 'localhacking', }) + n = repo.commitctx(ctx) + self.assertEqual(self.repo['tip']['bogus'].data(), + 'contents of bogus') + before = repo['tip'].hex() + hg.update(repo, self.repo['tip'].hex()) + self.pushrevisions() + self.assertNotEqual(before, self.repo['tip'].hex()) + self.assertEqual(self.repo['tip']['bogus'].data(), + 'contents of bogus') + + def test_push_single_dir_one_incoming_and_two_outgoing(self): + # Tests simple pushing from default branch to a single dir repo + # Pushes two outgoing over one incoming svn rev + # (used to cause an "unknown revision") + # This can happen if someone committed to svn since our last pull (race). + repo, repo_path = self.load_and_fetch('branch_from_tag.svndump', + stupid=False, + layout='single', + subdir='trunk') + self.add_svn_rev(repo_path, {'trunk/alpha': 'Changed'}) + def file_callback(repo, memctx, path): + return context.memfilectx(path=path, + data='data of %s' % path, + islink=False, + isexec=False, + copied=False) + for fn in ['one', 'two']: + ctx = context.memctx(repo, + (repo['tip'].node(), node.nullid), + 'automated test', + [fn], + file_callback, + 'an_author', + '2009-10-19 18:49:30 -0500', + {'branch': 'default', }) + repo.commitctx(ctx) + hg.update(repo, repo['tip'].node()) + self.pushrevisions(expected_extra_back=1) + self.assertTrue('trunk/one' in test_util.svnls(repo_path, '')) + self.assertTrue('trunk/two' in test_util.svnls(repo_path, '')) + + def test_push_single_dir_branch(self): + # Tests local branches pushing to a single dir repo. Creates a fork at + # tip. The default branch adds a file called default, while branch foo + # adds a file called foo, then tries to push the foo branch and default + # branch in that order. + repo, repo_path = self.load_and_fetch('branch_from_tag.svndump', + stupid=False, + layout='single', + subdir='') + def file_callback(data): + def cb(repo, memctx, path): + if path == data: + return context.memfilectx(path=path, + data=data, + islink=False, + isexec=False, + copied=False) + raise IOError(errno.EINVAL, 'Invalid operation: ' + path) + return cb + + def commit_to_branch(name, parent): + repo.commitctx(context.memctx(repo, + (parent, node.nullid), + 'automated test (%s)' % name, + [name], + file_callback(name), + 'an_author', + '2009-10-19 18:49:30 -0500', + {'branch': name, })) + + parent = repo['tip'].node() + commit_to_branch('default', parent) + commit_to_branch('foo', parent) + hg.update(repo, repo['foo'].node()) + self.pushrevisions() + repo = self.repo # repo is outdated after the rebase happens, refresh + self.assertTrue('foo' in test_util.svnls(repo_path, '')) + self.assertEqual(repo.branchtags().keys(), ['default']) + # Have to cross to another branch head, so hg.update doesn't work + commands.update(ui.ui(), + self.repo, + self.repo.branchheads('default')[1], + clean=True) + self.pushrevisions() + self.assertTrue('default' in test_util.svnls(repo_path, '')) + self.assertEquals(len(self.repo.branchheads('default')), 1) + + @test_util.requiresoption('branch') + def test_push_single_dir_renamed_branch(self, stupid=False): + # Tests pulling and pushing with a renamed branch + # Based on test_push_single_dir + repo_path = self.load_svndump('branch_from_tag.svndump') + cmd = ['clone', '--layout=single', '--branch=flaf'] + if stupid: + cmd.append('--stupid') + cmd += [test_util.fileurl(repo_path), self.wc_path] + test_util.dispatch(cmd) + + def file_callback(repo, memctx, path): + if path == 'adding_file': + return context.memfilectx(path=path, + data='foo', + islink=False, + isexec=False, + copied=False) + raise IOError(errno.EINVAL, 'Invalid operation: ' + path) + ctx = context.memctx(self.repo, + (self.repo['tip'].node(), node.nullid), + 'automated test', + ['adding_file'], + file_callback, + 'an_author', + '2009-10-19 18:49:30 -0500', + {'branch': 'default', }) + self.repo.commitctx(ctx) + hg.update(self.repo, self.repo['tip'].node()) + self.pushrevisions() + self.assertTrue('adding_file' in test_util.svnls(repo_path, '')) + + self.assertEquals(set(['flaf']), + set(self.repo[i].branch() for i in self.repo)) + + @test_util.requiresoption('branch') + def test_push_single_dir_renamed_branch_stupid(self): + self.test_push_single_dir_renamed_branch(True)