def setUp(self): if not is_exe_in_path('bzr'): raise SkipTest('bzr not found in path') super(BazaarClientTests, self).setUp() self.set_user_home(os.path.join(self.testdata_dir, 'homedir')) self.options.parent_branch = None self.client = BazaarClient(options=self.options)
def setUp(self): # This should come before the call to super to prevent # unbalanced calls to setUp/tearDown if not is_exe_in_path('bzr'): raise SkipTest('bzr not found in path') super(BazaarClientTests, self).setUp() self.original_branch = self.chdir_tmp() self.child_branch = self.create_tmp_dir() self._run_bzr(['init', '.']) self._bzr_add_file_commit('foo.txt', FOO, 'initial commit') self._run_bzr([ 'branch', '--use-existing-dir', self.original_branch, self.child_branch ]) self.client = BazaarClient(options=self.options) self.options.parent_branch = None
def setUp(self): super(BazaarClientTests, self).setUp() if not is_exe_in_path('bzr'): raise SkipTest('bzr not found in path') self.set_user_home(os.path.join(self.testdata_dir, 'homedir')) self.orig_dir = os.getcwd() self.original_branch = self.chdir_tmp() self._run_bzr(["init", "."]) self._bzr_add_file_commit("foo.txt", FOO, "initial commit") self.child_branch = mktemp() self._run_bzr(["branch", self.original_branch, self.child_branch]) self.client = BazaarClient(options=self.options) os.chdir(self.orig_dir) self.options.parent_branch = None
def setUp(self): super(BazaarClientTests, self).setUp() if not self.is_exe_in_path("bzr"): raise SkipTest("bzr not found in path") self.orig_dir = os.getcwd() self.original_branch = self.chdir_tmp() self._bzr_cmd(["init", "."]) self._bzr_add_file_commit("foo.txt", FOO, "initial commit") self.child_branch = mktemp() self._bzr_cmd(["branch", self.original_branch, self.child_branch]) self.client = BazaarClient(options=self.options) os.chdir(self.orig_dir) self.user_config = {} self.configs = [] self.client.user_config = self.user_config self.client.configs = self.configs self.options.parent_branch = None
def setUp(self): if not is_exe_in_path('bzr'): raise SkipTest('bzr not found in path') super(BazaarClientTests, self).setUp() self.set_user_home(os.path.join(self.testdata_dir, 'homedir')) self.original_branch = make_tempdir() self._run_bzr(['init', '.'], cwd=self.original_branch) self._bzr_add_file_commit('foo.txt', FOO, 'initial commit', cwd=self.original_branch) self.child_branch = make_tempdir() self._run_bzr([ 'branch', '--use-existing-dir', self.original_branch, self.child_branch ], cwd=self.original_branch) self.client = BazaarClient(options=self.options) self.options.parent_branch = None
def setUp(self): if not is_exe_in_path('bzr'): raise SkipTest('bzr not found in path') super(BazaarClientTests, self).setUp() self.set_user_home( os.path.join(self.testdata_dir, 'homedir')) self.original_branch = make_tempdir() self._run_bzr(['init', '.'], cwd=self.original_branch) self._bzr_add_file_commit('foo.txt', FOO, 'initial commit', cwd=self.original_branch) self.child_branch = make_tempdir() self._run_bzr(['branch', '--use-existing-dir', self.original_branch, self.child_branch], cwd=self.original_branch) self.client = BazaarClient(options=self.options) self.options.parent_branch = None
def setUp(self): super(BazaarClientTests, self).setUp() if not is_exe_in_path('bzr'): raise SkipTest('bzr not found in path') self.set_user_home( os.path.join(self.testdata_dir, 'homedir')) self.orig_dir = os.getcwd() self.original_branch = self.chdir_tmp() self._run_bzr(["init", "."]) self._bzr_add_file_commit("foo.txt", FOO, "initial commit") self.child_branch = mktemp() self._run_bzr(["branch", self.original_branch, self.child_branch]) self.client = BazaarClient(options=self.options) os.chdir(self.orig_dir) self.options.parent_branch = None
def load_scmclients(options): global SCMCLIENTS from rbtools.clients.bazaar import BazaarClient from rbtools.clients.clearcase import ClearCaseClient from rbtools.clients.cvs import CVSClient from rbtools.clients.git import GitClient from rbtools.clients.mercurial import MercurialClient from rbtools.clients.perforce import PerforceClient from rbtools.clients.plastic import PlasticClient from rbtools.clients.svn import SVNClient SCMCLIENTS = [ BazaarClient(options=options), CVSClient(options=options), ClearCaseClient(options=options), GitClient(options=options), MercurialClient(options=options), PerforceClient(options=options), PlasticClient(options=options), SVNClient(options=options), ]
class BazaarClientTests(SCMClientTests): """Unit tests for BazaarClient.""" def setUp(self): super(BazaarClientTests, self).setUp() if not is_exe_in_path('bzr'): raise SkipTest('bzr not found in path') self.set_user_home(os.path.join(self.testdata_dir, 'homedir')) self.orig_dir = os.getcwd() self.original_branch = self.chdir_tmp() self._run_bzr(["init", "."]) self._bzr_add_file_commit("foo.txt", FOO, "initial commit") self.child_branch = mktemp() self._run_bzr([ "branch", "--use-existing-dir", self.original_branch, self.child_branch ]) self.client = BazaarClient(options=self.options) os.chdir(self.orig_dir) self.options.parent_branch = None def _run_bzr(self, command, *args, **kwargs): return execute(['bzr'] + command, *args, **kwargs) def _bzr_add_file_commit(self, file, data, msg): """Add a file to a Bazaar repository with the content of data and commit with msg.""" with open(file, 'w') as foo: foo.write(data) self._run_bzr(["add", file]) self._run_bzr(["commit", "-m", msg, '--author', 'Test User']) def _compare_diffs(self, filename, full_diff, expected_diff_digest, change_type='modified'): """Testing that the full_diff for ``filename`` matches the ``expected_diff``.""" diff_lines = full_diff.splitlines() self.assertEqual( ('=== %s file \'%s\'' % (change_type, filename)).encode('utf-8'), diff_lines[0]) self.assertTrue(diff_lines[1].startswith( ('--- %s\t' % filename).encode('utf-8'))) self.assertTrue(diff_lines[2].startswith( ('+++ %s\t' % filename).encode('utf-8'))) diff_body = b'\n'.join(diff_lines[3:]) self.assertEqual(md5(diff_body).hexdigest(), expected_diff_digest) def _count_files_in_diff(self, diff): return len( [line for line in diff.split(b'\n') if line.startswith(b'===')]) def test_get_repository_info_original_branch(self): """Testing BazaarClient get_repository_info with original branch""" os.chdir(self.original_branch) ri = self.client.get_repository_info() self.assertTrue(isinstance(ri, RepositoryInfo)) self.assertEqual(os.path.realpath(ri.path), os.path.realpath(self.original_branch)) self.assertTrue(ri.supports_parent_diffs) self.assertEqual(ri.base_path, '/') self.assertFalse(ri.supports_changesets) def test_get_repository_info_child_branch(self): """Testing BazaarClient get_repository_info with child branch""" os.chdir(self.child_branch) ri = self.client.get_repository_info() self.assertTrue(isinstance(ri, RepositoryInfo)) self.assertEqual(os.path.realpath(ri.path), os.path.realpath(self.child_branch)) self.assertTrue(ri.supports_parent_diffs) self.assertEqual(ri.base_path, "/") self.assertFalse(ri.supports_changesets) def test_get_repository_info_no_branch(self): """Testing BazaarClient get_repository_info, no branch""" self.chdir_tmp() ri = self.client.get_repository_info() self.assertEqual(ri, None) def test_too_many_revisions(self): """Testing BazaarClient parse_revision_spec with too many revisions""" self.assertRaises(TooManyRevisionsError, self.client.parse_revision_spec, [1, 2, 3]) def test_diff_simple(self): """Testing BazaarClient simple diff case""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "delete and modify stuff") revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs('foo.txt', result['diff'], 'a6326b53933f8b255a4b840485d8e210') def test_diff_exclude(self): """Testing BazaarClient diff with file exclusion.""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "commit 1") self._bzr_add_file_commit("exclude.txt", FOO2, "commit 2") revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions, exclude_patterns=['exclude.txt']) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs('foo.txt', result['diff'], 'a6326b53933f8b255a4b840485d8e210') self.assertEqual(self._count_files_in_diff(result['diff']), 1) def test_diff_exclude_in_subdir(self): """Testing BazaarClient diff with file exclusion in a subdirectory.""" os.chdir(self.child_branch) self._bzr_add_file_commit('foo.txt', FOO1, 'commit 1') os.mkdir('subdir') os.chdir('subdir') self._bzr_add_file_commit('exclude.txt', FOO2, 'commit 2') revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions, exclude_patterns=['exclude.txt', '.']) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs('foo.txt', result['diff'], 'a6326b53933f8b255a4b840485d8e210') self.assertEqual(self._count_files_in_diff(result['diff']), 1) def test_diff_exclude_root_pattern_in_subdir(self): """Testing BazaarClient diff with file exclusion in the repo root.""" os.chdir(self.child_branch) self._bzr_add_file_commit('exclude.txt', FOO2, 'commit 1') os.mkdir('subdir') os.chdir('subdir') self._bzr_add_file_commit('foo.txt', FOO1, 'commit 2') revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions, exclude_patterns=[ os.path.sep + 'exclude.txt', os.path.sep + 'subdir' ]) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs(os.path.join('subdir', 'foo.txt'), result['diff'], '4deffcb296180fa166eddff2512bd0e4', change_type='added') def test_diff_specific_files(self): """Testing BazaarClient diff with specific files""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "delete and modify stuff") self._bzr_add_file_commit("bar.txt", "baz", "added bar") revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions, ['foo.txt']) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs('foo.txt', result['diff'], 'a6326b53933f8b255a4b840485d8e210') def test_diff_simple_multiple(self): """Testing BazaarClient simple diff with multiple commits case""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "commit 1") self._bzr_add_file_commit("foo.txt", FOO2, "commit 2") self._bzr_add_file_commit("foo.txt", FOO3, "commit 3") revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs('foo.txt', result['diff'], '4109cc082dce22288c2f1baca9b107b6') def test_diff_parent(self): """Testing BazaarClient diff with changes only in the parent branch""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "delete and modify stuff") grand_child_branch = mktemp() self._run_bzr([ "branch", "--use-existing-dir", self.child_branch, grand_child_branch ]) os.chdir(grand_child_branch) revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self.assertEqual(result['diff'], None) def test_diff_grand_parent(self): """Testing BazaarClient diff with changes between a 2nd level descendant""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "delete and modify stuff") grand_child_branch = mktemp() self._run_bzr([ "branch", "--use-existing-dir", self.child_branch, grand_child_branch ]) os.chdir(grand_child_branch) # Requesting the diff between the grand child branch and its grand # parent: self.options.parent_branch = self.original_branch revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs("foo.txt", result['diff'], 'a6326b53933f8b255a4b840485d8e210') def test_guessed_summary_and_description(self): """Testing BazaarClient guessing summary and description""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "commit 1") self._bzr_add_file_commit("foo.txt", FOO2, "commit 2") self._bzr_add_file_commit("foo.txt", FOO3, "commit 3") self.options.guess_summary = True self.options.guess_description = True revisions = self.client.parse_revision_spec([]) commit_message = self.client.get_commit_message(revisions) self.assertEqual("commit 3", commit_message['summary']) description = commit_message['description'] self.assertTrue("commit 1" in description) self.assertTrue("commit 2" in description) self.assertFalse("commit 3" in description) def test_guessed_summary_and_description_in_grand_parent_branch(self): """Testing BazaarClient guessing summary and description for grand parent branch.""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "commit 1") self._bzr_add_file_commit("foo.txt", FOO2, "commit 2") self._bzr_add_file_commit("foo.txt", FOO3, "commit 3") self.options.guess_summary = True self.options.guess_description = True grand_child_branch = mktemp() self._run_bzr([ "branch", "--use-existing-dir", self.child_branch, grand_child_branch ]) os.chdir(grand_child_branch) # Requesting the diff between the grand child branch and its grand # parent: self.options.parent_branch = self.original_branch revisions = self.client.parse_revision_spec([]) commit_message = self.client.get_commit_message(revisions) self.assertEqual("commit 3", commit_message['summary']) description = commit_message['description'] self.assertTrue("commit 1" in description) self.assertTrue("commit 2" in description) self.assertFalse("commit 3" in description) def test_guessed_summary_and_description_with_revision_range(self): """Testing BazaarClient guessing summary and description with a revision range.""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "commit 1") self._bzr_add_file_commit("foo.txt", FOO2, "commit 2") self._bzr_add_file_commit("foo.txt", FOO3, "commit 3") self.options.guess_summary = True self.options.guess_description = True revisions = self.client.parse_revision_spec(['2..3']) commit_message = self.client.get_commit_message(revisions) self.assertEqual("commit 2", commit_message['summary']) self.assertEqual("commit 2", commit_message['description']) def test_parse_revision_spec_no_args(self): """Testing BazaarClient.parse_revision_spec with no specified revisions""" os.chdir(self.child_branch) base_commit_id = self.client._get_revno() self._bzr_add_file_commit("foo.txt", FOO1, "commit 1") tip_commit_id = self.client._get_revno() revisions = self.client.parse_revision_spec() self.assertTrue(isinstance(revisions, dict)) self.assertTrue('base' in revisions) self.assertTrue('tip' in revisions) self.assertTrue('parent_base' not in revisions) self.assertEqual(revisions['base'], base_commit_id) self.assertEqual(revisions['tip'], tip_commit_id) def test_parse_revision_spec_one_arg(self): """Testing BazaarClient.parse_revision_spec with one specified revision""" os.chdir(self.child_branch) base_commit_id = self.client._get_revno() self._bzr_add_file_commit("foo.txt", FOO1, "commit 1") tip_commit_id = self.client._get_revno() revisions = self.client.parse_revision_spec([tip_commit_id]) self.assertTrue(isinstance(revisions, dict)) self.assertTrue('base' in revisions) self.assertTrue('tip' in revisions) self.assertTrue('parent_base' not in revisions) self.assertEqual(revisions['base'], base_commit_id) self.assertEqual(revisions['tip'], tip_commit_id) def test_parse_revision_spec_one_arg_parent(self): """Testing BazaarClient.parse_revision_spec with one specified revision and a parent diff""" os.chdir(self.original_branch) parent_base_commit_id = self.client._get_revno() grand_child_branch = mktemp() self._run_bzr([ "branch", "--use-existing-dir", self.child_branch, grand_child_branch ]) os.chdir(grand_child_branch) base_commit_id = self.client._get_revno() self._bzr_add_file_commit("foo.txt", FOO2, "commit 2") tip_commit_id = self.client._get_revno() self.options.parent_branch = self.child_branch revisions = self.client.parse_revision_spec([tip_commit_id]) self.assertTrue(isinstance(revisions, dict)) self.assertTrue('parent_base' in revisions) self.assertTrue('base' in revisions) self.assertTrue('tip' in revisions) self.assertEqual(revisions['parent_base'], parent_base_commit_id) self.assertEqual(revisions['base'], base_commit_id) self.assertEqual(revisions['tip'], tip_commit_id) def test_parse_revision_spec_one_arg_split(self): """Testing BazaarClient.parse_revision_spec with R1..R2 syntax""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "commit 1") base_commit_id = self.client._get_revno() self._bzr_add_file_commit("foo.txt", FOO2, "commit 2") tip_commit_id = self.client._get_revno() revisions = self.client.parse_revision_spec( ['%s..%s' % (base_commit_id, tip_commit_id)]) self.assertTrue(isinstance(revisions, dict)) self.assertTrue('parent_base' not in revisions) self.assertTrue('base' in revisions) self.assertTrue('tip' in revisions) self.assertEqual(revisions['base'], base_commit_id) self.assertEqual(revisions['tip'], tip_commit_id) def test_parse_revision_spec_two_args(self): """Testing BazaarClient.parse_revision_spec with two revisions""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "commit 1") base_commit_id = self.client._get_revno() self._bzr_add_file_commit("foo.txt", FOO2, "commit 2") tip_commit_id = self.client._get_revno() revisions = self.client.parse_revision_spec( [base_commit_id, tip_commit_id]) self.assertTrue(isinstance(revisions, dict)) self.assertTrue('parent_base' not in revisions) self.assertTrue('base' in revisions) self.assertTrue('tip' in revisions) self.assertEqual(revisions['base'], base_commit_id) self.assertEqual(revisions['tip'], tip_commit_id)
class BazaarClientTests(SCMClientTests): """Unit tests for BazaarClient.""" def setUp(self): if not is_exe_in_path('bzr'): raise SkipTest('bzr not found in path') super(BazaarClientTests, self).setUp() self.set_user_home(os.path.join(self.testdata_dir, 'homedir')) self.original_branch = make_tempdir() self._run_bzr(['init', '.'], cwd=self.original_branch) self._bzr_add_file_commit('foo.txt', FOO, 'initial commit', cwd=self.original_branch) self.child_branch = make_tempdir() self._run_bzr([ 'branch', '--use-existing-dir', self.original_branch, self.child_branch ], cwd=self.original_branch) self.client = BazaarClient(options=self.options) self.options.parent_branch = None def _run_bzr(self, command, *args, **kwargs): return execute(['bzr'] + command, *args, **kwargs) def _bzr_add_file_commit(self, filename, data, msg, cwd=None, *args, **kwargs): """Add a file to a Bazaar repository. Args: filename (unicode): The name of the file to add. data (bytes): The data to write to the file. msg (unicode): The commit message to use. cwd (unicode, optional): A working directory to use when running the bzr commands. *args (list): Positional arguments to pass through to :py:func:`rbtools.utils.process.execute`. **kwargs (dict): Keyword arguments to pass through to :py:func:`rbtools.utils.process.execute`. """ if cwd is not None: filename = os.path.join(cwd, filename) with open(filename, 'wb') as f: f.write(data) self._run_bzr(['add', filename], cwd=cwd, *args, **kwargs) self._run_bzr(['commit', '-m', msg, '--author', 'Test User'], cwd=cwd, *args, **kwargs) def _compare_diffs(self, filename, full_diff, expected_diff_digest, change_type='modified'): """Testing that the full_diff for ``filename`` matches the ``expected_diff``.""" diff_lines = full_diff.splitlines() self.assertEqual( ('=== %s file \'%s\'' % (change_type, filename)).encode('utf-8'), diff_lines[0]) self.assertTrue(diff_lines[1].startswith( ('--- %s\t' % filename).encode('utf-8'))) self.assertTrue(diff_lines[2].startswith( ('+++ %s\t' % filename).encode('utf-8'))) diff_body = b'\n'.join(diff_lines[3:]) self.assertEqual(md5(diff_body).hexdigest(), expected_diff_digest) def _count_files_in_diff(self, diff): return len( [line for line in diff.split(b'\n') if line.startswith(b'===')]) def test_get_repository_info_original_branch(self): """Testing BazaarClient get_repository_info with original branch""" os.chdir(self.original_branch) ri = self.client.get_repository_info() self.assertTrue(isinstance(ri, RepositoryInfo)) self.assertEqual(os.path.realpath(ri.path), os.path.realpath(self.original_branch)) self.assertTrue(ri.supports_parent_diffs) self.assertEqual(ri.base_path, '/') self.assertFalse(ri.supports_changesets) def test_get_repository_info_child_branch(self): """Testing BazaarClient get_repository_info with child branch""" os.chdir(self.child_branch) ri = self.client.get_repository_info() self.assertTrue(isinstance(ri, RepositoryInfo)) self.assertEqual(os.path.realpath(ri.path), os.path.realpath(self.child_branch)) self.assertTrue(ri.supports_parent_diffs) self.assertEqual(ri.base_path, "/") self.assertFalse(ri.supports_changesets) def test_get_repository_info_no_branch(self): """Testing BazaarClient get_repository_info, no branch""" self.chdir_tmp() ri = self.client.get_repository_info() self.assertEqual(ri, None) def test_too_many_revisions(self): """Testing BazaarClient parse_revision_spec with too many revisions""" self.assertRaises(TooManyRevisionsError, self.client.parse_revision_spec, [1, 2, 3]) def test_diff_simple(self): """Testing BazaarClient simple diff case""" os.chdir(self.child_branch) self._bzr_add_file_commit('foo.txt', FOO1, 'delete and modify stuff') revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs('foo.txt', result['diff'], 'a6326b53933f8b255a4b840485d8e210') def test_diff_exclude(self): """Testing BazaarClient diff with file exclusion""" os.chdir(self.child_branch) self._bzr_add_file_commit('foo.txt', FOO1, 'commit 1') self._bzr_add_file_commit('exclude.txt', FOO2, 'commit 2') revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions, exclude_patterns=['exclude.txt']) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs('foo.txt', result['diff'], 'a6326b53933f8b255a4b840485d8e210') self.assertEqual(self._count_files_in_diff(result['diff']), 1) def test_diff_exclude_in_subdir(self): """Testing BazaarClient diff with file exclusion in a subdirectory""" os.chdir(self.child_branch) self._bzr_add_file_commit('foo.txt', FOO1, 'commit 1') os.mkdir('subdir') os.chdir('subdir') self._bzr_add_file_commit('exclude.txt', FOO2, 'commit 2') revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions, exclude_patterns=['exclude.txt', '.']) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs('foo.txt', result['diff'], 'a6326b53933f8b255a4b840485d8e210') self.assertEqual(self._count_files_in_diff(result['diff']), 1) def test_diff_exclude_root_pattern_in_subdir(self): """Testing BazaarClient diff with file exclusion in the repo root""" os.chdir(self.child_branch) self._bzr_add_file_commit('exclude.txt', FOO2, 'commit 1') os.mkdir('subdir') os.chdir('subdir') self._bzr_add_file_commit('foo.txt', FOO1, 'commit 2') revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions, exclude_patterns=[ os.path.sep + 'exclude.txt', os.path.sep + 'subdir' ]) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs(os.path.join('subdir', 'foo.txt'), result['diff'], '4deffcb296180fa166eddff2512bd0e4', change_type='added') def test_diff_specific_files(self): """Testing BazaarClient diff with specific files""" os.chdir(self.child_branch) self._bzr_add_file_commit('foo.txt', FOO1, 'delete and modify stuff') self._bzr_add_file_commit('bar.txt', b'baz', 'added bar') revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions, ['foo.txt']) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs('foo.txt', result['diff'], 'a6326b53933f8b255a4b840485d8e210') def test_diff_simple_multiple(self): """Testing BazaarClient simple diff with multiple commits case""" os.chdir(self.child_branch) self._bzr_add_file_commit('foo.txt', FOO1, 'commit 1') self._bzr_add_file_commit('foo.txt', FOO2, 'commit 2') self._bzr_add_file_commit('foo.txt', FOO3, 'commit 3') revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs('foo.txt', result['diff'], '4109cc082dce22288c2f1baca9b107b6') def test_diff_parent(self): """Testing BazaarClient diff with changes only in the parent branch""" self._bzr_add_file_commit('foo.txt', FOO1, 'delete and modify stuff', cwd=self.child_branch) grand_child_branch = make_tempdir() self._run_bzr([ 'branch', '--use-existing-dir', self.child_branch, grand_child_branch ], cwd=self.child_branch) os.chdir(grand_child_branch) revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self.assertEqual(result['diff'], None) def test_diff_grand_parent(self): """Testing BazaarClient diff with changes between a 2nd level descendant""" self._bzr_add_file_commit('foo.txt', FOO1, 'delete and modify stuff', cwd=self.child_branch) grand_child_branch = make_tempdir() self._run_bzr([ 'branch', '--use-existing-dir', self.child_branch, grand_child_branch ], cwd=self.child_branch) os.chdir(grand_child_branch) # Requesting the diff between the grand child branch and its grand # parent: self.options.parent_branch = self.original_branch revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs('foo.txt', result['diff'], 'a6326b53933f8b255a4b840485d8e210') def test_guessed_summary_and_description(self): """Testing BazaarClient guessing summary and description""" os.chdir(self.child_branch) self._bzr_add_file_commit('foo.txt', FOO1, 'commit 1') self._bzr_add_file_commit('foo.txt', FOO2, 'commit 2') self._bzr_add_file_commit('foo.txt', FOO3, 'commit 3') self.options.guess_summary = True self.options.guess_description = True revisions = self.client.parse_revision_spec([]) commit_message = self.client.get_commit_message(revisions) self.assertEqual('commit 3', commit_message['summary']) description = commit_message['description'] self.assertTrue('commit 1' in description) self.assertTrue('commit 2' in description) self.assertFalse('commit 3' in description) def test_guessed_summary_and_description_in_grand_parent_branch(self): """Testing BazaarClient guessing summary and description for grand parent branch""" self._bzr_add_file_commit('foo.txt', FOO1, 'commit 1', cwd=self.child_branch) self._bzr_add_file_commit('foo.txt', FOO2, 'commit 2', cwd=self.child_branch) self._bzr_add_file_commit('foo.txt', FOO3, 'commit 3', cwd=self.child_branch) self.options.guess_summary = True self.options.guess_description = True grand_child_branch = make_tempdir() self._run_bzr([ 'branch', '--use-existing-dir', self.child_branch, grand_child_branch ], cwd=self.child_branch) os.chdir(grand_child_branch) # Requesting the diff between the grand child branch and its grand # parent: self.options.parent_branch = self.original_branch revisions = self.client.parse_revision_spec([]) commit_message = self.client.get_commit_message(revisions) self.assertEqual('commit 3', commit_message['summary']) description = commit_message['description'] self.assertTrue('commit 1' in description) self.assertTrue('commit 2' in description) self.assertFalse('commit 3' in description) def test_guessed_summary_and_description_with_revision_range(self): """Testing BazaarClient guessing summary and description with a revision range""" os.chdir(self.child_branch) self._bzr_add_file_commit('foo.txt', FOO1, 'commit 1') self._bzr_add_file_commit('foo.txt', FOO2, 'commit 2') self._bzr_add_file_commit('foo.txt', FOO3, 'commit 3') self.options.guess_summary = True self.options.guess_description = True revisions = self.client.parse_revision_spec(['2..3']) commit_message = self.client.get_commit_message(revisions) self.assertEqual('commit 2', commit_message['summary']) self.assertEqual('commit 2', commit_message['description']) def test_parse_revision_spec_no_args(self): """Testing BazaarClient.parse_revision_spec with no specified revisions""" os.chdir(self.child_branch) base_commit_id = self.client._get_revno() self._bzr_add_file_commit('foo.txt', FOO1, 'commit 1') tip_commit_id = self.client._get_revno() revisions = self.client.parse_revision_spec() self.assertTrue(isinstance(revisions, dict)) self.assertTrue('base' in revisions) self.assertTrue('tip' in revisions) self.assertTrue('parent_base' not in revisions) self.assertEqual(revisions['base'], base_commit_id) self.assertEqual(revisions['tip'], tip_commit_id) def test_parse_revision_spec_one_arg(self): """Testing BazaarClient.parse_revision_spec with one specified revision""" os.chdir(self.child_branch) base_commit_id = self.client._get_revno() self._bzr_add_file_commit('foo.txt', FOO1, 'commit 1') tip_commit_id = self.client._get_revno() revisions = self.client.parse_revision_spec([tip_commit_id]) self.assertTrue(isinstance(revisions, dict)) self.assertTrue('base' in revisions) self.assertTrue('tip' in revisions) self.assertTrue('parent_base' not in revisions) self.assertEqual(revisions['base'], base_commit_id) self.assertEqual(revisions['tip'], tip_commit_id) def test_parse_revision_spec_one_arg_parent(self): """Testing BazaarClient.parse_revision_spec with one specified revision and a parent diff""" os.chdir(self.original_branch) parent_base_commit_id = self.client._get_revno() grand_child_branch = make_tempdir() self._run_bzr([ 'branch', '--use-existing-dir', self.child_branch, grand_child_branch ]) os.chdir(grand_child_branch) base_commit_id = self.client._get_revno() self._bzr_add_file_commit('foo.txt', FOO2, 'commit 2') tip_commit_id = self.client._get_revno() self.options.parent_branch = self.child_branch revisions = self.client.parse_revision_spec([tip_commit_id]) self.assertTrue(isinstance(revisions, dict)) self.assertTrue('parent_base' in revisions) self.assertTrue('base' in revisions) self.assertTrue('tip' in revisions) self.assertEqual(revisions['parent_base'], parent_base_commit_id) self.assertEqual(revisions['base'], base_commit_id) self.assertEqual(revisions['tip'], tip_commit_id) def test_parse_revision_spec_one_arg_split(self): """Testing BazaarClient.parse_revision_spec with R1..R2 syntax""" os.chdir(self.child_branch) self._bzr_add_file_commit('foo.txt', FOO1, 'commit 1') base_commit_id = self.client._get_revno() self._bzr_add_file_commit('foo.txt', FOO2, 'commit 2') tip_commit_id = self.client._get_revno() revisions = self.client.parse_revision_spec( ['%s..%s' % (base_commit_id, tip_commit_id)]) self.assertTrue(isinstance(revisions, dict)) self.assertTrue('parent_base' not in revisions) self.assertTrue('base' in revisions) self.assertTrue('tip' in revisions) self.assertEqual(revisions['base'], base_commit_id) self.assertEqual(revisions['tip'], tip_commit_id) def test_parse_revision_spec_two_args(self): """Testing BazaarClient.parse_revision_spec with two revisions""" os.chdir(self.child_branch) self._bzr_add_file_commit('foo.txt', FOO1, 'commit 1') base_commit_id = self.client._get_revno() self._bzr_add_file_commit('foo.txt', FOO2, 'commit 2') tip_commit_id = self.client._get_revno() revisions = self.client.parse_revision_spec( [base_commit_id, tip_commit_id]) self.assertTrue(isinstance(revisions, dict)) self.assertTrue('parent_base' not in revisions) self.assertTrue('base' in revisions) self.assertTrue('tip' in revisions) self.assertEqual(revisions['base'], base_commit_id) self.assertEqual(revisions['tip'], tip_commit_id)
class BazaarClientTests(SCMClientTests): """Unit tests for BazaarClient.""" def setUp(self): if not is_exe_in_path('bzr'): raise SkipTest('bzr not found in path') super(BazaarClientTests, self).setUp() self.set_user_home( os.path.join(self.testdata_dir, 'homedir')) self.original_branch = make_tempdir() self._run_bzr(['init', '.'], cwd=self.original_branch) self._bzr_add_file_commit('foo.txt', FOO, 'initial commit', cwd=self.original_branch) self.child_branch = make_tempdir() self._run_bzr(['branch', '--use-existing-dir', self.original_branch, self.child_branch], cwd=self.original_branch) self.client = BazaarClient(options=self.options) self.options.parent_branch = None def _run_bzr(self, command, *args, **kwargs): return execute(['bzr'] + command, *args, **kwargs) def _bzr_add_file_commit(self, filename, data, msg, cwd=None, *args, **kwargs): """Add a file to a Bazaar repository. Args: filename (unicode): The name of the file to add. data (bytes): The data to write to the file. msg (unicode): The commit message to use. cwd (unicode, optional): A working directory to use when running the bzr commands. *args (list): Positional arguments to pass through to :py:func:`rbtools.utils.process.execute`. **kwargs (dict): Keyword arguments to pass through to :py:func:`rbtools.utils.process.execute`. """ if cwd is not None: filename = os.path.join(cwd, filename) with open(filename, 'wb') as f: f.write(data) self._run_bzr(['add', filename], cwd=cwd, *args, **kwargs) self._run_bzr(['commit', '-m', msg, '--author', 'Test User'], cwd=cwd, *args, **kwargs) def _compare_diffs(self, filename, full_diff, expected_diff_digest, change_type='modified'): """Testing that the full_diff for ``filename`` matches the ``expected_diff``.""" diff_lines = full_diff.splitlines() self.assertEqual(('=== %s file \'%s\'' % (change_type, filename)).encode('utf-8'), diff_lines[0]) self.assertTrue(diff_lines[1].startswith( ('--- %s\t' % filename).encode('utf-8'))) self.assertTrue(diff_lines[2].startswith( ('+++ %s\t' % filename).encode('utf-8'))) diff_body = b'\n'.join(diff_lines[3:]) self.assertEqual(md5(diff_body).hexdigest(), expected_diff_digest) def _count_files_in_diff(self, diff): return len([ line for line in diff.split(b'\n') if line.startswith(b'===') ]) def test_get_repository_info_original_branch(self): """Testing BazaarClient get_repository_info with original branch""" os.chdir(self.original_branch) ri = self.client.get_repository_info() self.assertTrue(isinstance(ri, RepositoryInfo)) self.assertEqual(os.path.realpath(ri.path), os.path.realpath(self.original_branch)) self.assertTrue(ri.supports_parent_diffs) self.assertEqual(ri.base_path, '/') self.assertFalse(ri.supports_changesets) def test_get_repository_info_child_branch(self): """Testing BazaarClient get_repository_info with child branch""" os.chdir(self.child_branch) ri = self.client.get_repository_info() self.assertTrue(isinstance(ri, RepositoryInfo)) self.assertEqual(os.path.realpath(ri.path), os.path.realpath(self.child_branch)) self.assertTrue(ri.supports_parent_diffs) self.assertEqual(ri.base_path, "/") self.assertFalse(ri.supports_changesets) def test_get_repository_info_no_branch(self): """Testing BazaarClient get_repository_info, no branch""" self.chdir_tmp() ri = self.client.get_repository_info() self.assertEqual(ri, None) def test_too_many_revisions(self): """Testing BazaarClient parse_revision_spec with too many revisions""" self.assertRaises(TooManyRevisionsError, self.client.parse_revision_spec, [1, 2, 3]) def test_diff_simple(self): """Testing BazaarClient simple diff case""" os.chdir(self.child_branch) self._bzr_add_file_commit('foo.txt', FOO1, 'delete and modify stuff') revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs('foo.txt', result['diff'], 'a6326b53933f8b255a4b840485d8e210') def test_diff_exclude(self): """Testing BazaarClient diff with file exclusion""" os.chdir(self.child_branch) self._bzr_add_file_commit('foo.txt', FOO1, 'commit 1') self._bzr_add_file_commit('exclude.txt', FOO2, 'commit 2') revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions, exclude_patterns=['exclude.txt']) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs('foo.txt', result['diff'], 'a6326b53933f8b255a4b840485d8e210') self.assertEqual(self._count_files_in_diff(result['diff']), 1) def test_diff_exclude_in_subdir(self): """Testing BazaarClient diff with file exclusion in a subdirectory""" os.chdir(self.child_branch) self._bzr_add_file_commit('foo.txt', FOO1, 'commit 1') os.mkdir('subdir') os.chdir('subdir') self._bzr_add_file_commit('exclude.txt', FOO2, 'commit 2') revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions, exclude_patterns=['exclude.txt', '.']) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs('foo.txt', result['diff'], 'a6326b53933f8b255a4b840485d8e210') self.assertEqual(self._count_files_in_diff(result['diff']), 1) def test_diff_exclude_root_pattern_in_subdir(self): """Testing BazaarClient diff with file exclusion in the repo root""" os.chdir(self.child_branch) self._bzr_add_file_commit('exclude.txt', FOO2, 'commit 1') os.mkdir('subdir') os.chdir('subdir') self._bzr_add_file_commit('foo.txt', FOO1, 'commit 2') revisions = self.client.parse_revision_spec([]) result = self.client.diff( revisions, exclude_patterns=[os.path.sep + 'exclude.txt', os.path.sep + 'subdir']) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs(os.path.join('subdir', 'foo.txt'), result['diff'], '4deffcb296180fa166eddff2512bd0e4', change_type='added') def test_diff_specific_files(self): """Testing BazaarClient diff with specific files""" os.chdir(self.child_branch) self._bzr_add_file_commit('foo.txt', FOO1, 'delete and modify stuff') self._bzr_add_file_commit('bar.txt', b'baz', 'added bar') revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions, ['foo.txt']) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs('foo.txt', result['diff'], 'a6326b53933f8b255a4b840485d8e210') def test_diff_simple_multiple(self): """Testing BazaarClient simple diff with multiple commits case""" os.chdir(self.child_branch) self._bzr_add_file_commit('foo.txt', FOO1, 'commit 1') self._bzr_add_file_commit('foo.txt', FOO2, 'commit 2') self._bzr_add_file_commit('foo.txt', FOO3, 'commit 3') revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs('foo.txt', result['diff'], '4109cc082dce22288c2f1baca9b107b6') def test_diff_parent(self): """Testing BazaarClient diff with changes only in the parent branch""" self._bzr_add_file_commit('foo.txt', FOO1, 'delete and modify stuff', cwd=self.child_branch) grand_child_branch = make_tempdir() self._run_bzr(['branch', '--use-existing-dir', self.child_branch, grand_child_branch], cwd=self.child_branch) os.chdir(grand_child_branch) revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self.assertEqual(result['diff'], None) def test_diff_grand_parent(self): """Testing BazaarClient diff with changes between a 2nd level descendant""" self._bzr_add_file_commit('foo.txt', FOO1, 'delete and modify stuff', cwd=self.child_branch) grand_child_branch = make_tempdir() self._run_bzr(['branch', '--use-existing-dir', self.child_branch, grand_child_branch], cwd=self.child_branch) os.chdir(grand_child_branch) # Requesting the diff between the grand child branch and its grand # parent: self.options.parent_branch = self.original_branch revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs('foo.txt', result['diff'], 'a6326b53933f8b255a4b840485d8e210') def test_guessed_summary_and_description(self): """Testing BazaarClient guessing summary and description""" os.chdir(self.child_branch) self._bzr_add_file_commit('foo.txt', FOO1, 'commit 1') self._bzr_add_file_commit('foo.txt', FOO2, 'commit 2') self._bzr_add_file_commit('foo.txt', FOO3, 'commit 3') self.options.guess_summary = True self.options.guess_description = True revisions = self.client.parse_revision_spec([]) commit_message = self.client.get_commit_message(revisions) self.assertEqual('commit 3', commit_message['summary']) description = commit_message['description'] self.assertTrue('commit 1' in description) self.assertTrue('commit 2' in description) self.assertFalse('commit 3' in description) def test_guessed_summary_and_description_in_grand_parent_branch(self): """Testing BazaarClient guessing summary and description for grand parent branch""" self._bzr_add_file_commit('foo.txt', FOO1, 'commit 1', cwd=self.child_branch) self._bzr_add_file_commit('foo.txt', FOO2, 'commit 2', cwd=self.child_branch) self._bzr_add_file_commit('foo.txt', FOO3, 'commit 3', cwd=self.child_branch) self.options.guess_summary = True self.options.guess_description = True grand_child_branch = make_tempdir() self._run_bzr(['branch', '--use-existing-dir', self.child_branch, grand_child_branch], cwd=self.child_branch) os.chdir(grand_child_branch) # Requesting the diff between the grand child branch and its grand # parent: self.options.parent_branch = self.original_branch revisions = self.client.parse_revision_spec([]) commit_message = self.client.get_commit_message(revisions) self.assertEqual('commit 3', commit_message['summary']) description = commit_message['description'] self.assertTrue('commit 1' in description) self.assertTrue('commit 2' in description) self.assertFalse('commit 3' in description) def test_guessed_summary_and_description_with_revision_range(self): """Testing BazaarClient guessing summary and description with a revision range""" os.chdir(self.child_branch) self._bzr_add_file_commit('foo.txt', FOO1, 'commit 1') self._bzr_add_file_commit('foo.txt', FOO2, 'commit 2') self._bzr_add_file_commit('foo.txt', FOO3, 'commit 3') self.options.guess_summary = True self.options.guess_description = True revisions = self.client.parse_revision_spec(['2..3']) commit_message = self.client.get_commit_message(revisions) self.assertEqual('commit 2', commit_message['summary']) self.assertEqual('commit 2', commit_message['description']) def test_parse_revision_spec_no_args(self): """Testing BazaarClient.parse_revision_spec with no specified revisions""" os.chdir(self.child_branch) base_commit_id = self.client._get_revno() self._bzr_add_file_commit('foo.txt', FOO1, 'commit 1') tip_commit_id = self.client._get_revno() revisions = self.client.parse_revision_spec() self.assertTrue(isinstance(revisions, dict)) self.assertTrue('base' in revisions) self.assertTrue('tip' in revisions) self.assertTrue('parent_base' not in revisions) self.assertEqual(revisions['base'], base_commit_id) self.assertEqual(revisions['tip'], tip_commit_id) def test_parse_revision_spec_one_arg(self): """Testing BazaarClient.parse_revision_spec with one specified revision""" os.chdir(self.child_branch) base_commit_id = self.client._get_revno() self._bzr_add_file_commit('foo.txt', FOO1, 'commit 1') tip_commit_id = self.client._get_revno() revisions = self.client.parse_revision_spec([tip_commit_id]) self.assertTrue(isinstance(revisions, dict)) self.assertTrue('base' in revisions) self.assertTrue('tip' in revisions) self.assertTrue('parent_base' not in revisions) self.assertEqual(revisions['base'], base_commit_id) self.assertEqual(revisions['tip'], tip_commit_id) def test_parse_revision_spec_one_arg_parent(self): """Testing BazaarClient.parse_revision_spec with one specified revision and a parent diff""" os.chdir(self.original_branch) parent_base_commit_id = self.client._get_revno() grand_child_branch = make_tempdir() self._run_bzr(['branch', '--use-existing-dir', self.child_branch, grand_child_branch]) os.chdir(grand_child_branch) base_commit_id = self.client._get_revno() self._bzr_add_file_commit('foo.txt', FOO2, 'commit 2') tip_commit_id = self.client._get_revno() self.options.parent_branch = self.child_branch revisions = self.client.parse_revision_spec([tip_commit_id]) self.assertTrue(isinstance(revisions, dict)) self.assertTrue('parent_base' in revisions) self.assertTrue('base' in revisions) self.assertTrue('tip' in revisions) self.assertEqual(revisions['parent_base'], parent_base_commit_id) self.assertEqual(revisions['base'], base_commit_id) self.assertEqual(revisions['tip'], tip_commit_id) def test_parse_revision_spec_one_arg_split(self): """Testing BazaarClient.parse_revision_spec with R1..R2 syntax""" os.chdir(self.child_branch) self._bzr_add_file_commit('foo.txt', FOO1, 'commit 1') base_commit_id = self.client._get_revno() self._bzr_add_file_commit('foo.txt', FOO2, 'commit 2') tip_commit_id = self.client._get_revno() revisions = self.client.parse_revision_spec( ['%s..%s' % (base_commit_id, tip_commit_id)]) self.assertTrue(isinstance(revisions, dict)) self.assertTrue('parent_base' not in revisions) self.assertTrue('base' in revisions) self.assertTrue('tip' in revisions) self.assertEqual(revisions['base'], base_commit_id) self.assertEqual(revisions['tip'], tip_commit_id) def test_parse_revision_spec_two_args(self): """Testing BazaarClient.parse_revision_spec with two revisions""" os.chdir(self.child_branch) self._bzr_add_file_commit('foo.txt', FOO1, 'commit 1') base_commit_id = self.client._get_revno() self._bzr_add_file_commit('foo.txt', FOO2, 'commit 2') tip_commit_id = self.client._get_revno() revisions = self.client.parse_revision_spec( [base_commit_id, tip_commit_id]) self.assertTrue(isinstance(revisions, dict)) self.assertTrue('parent_base' not in revisions) self.assertTrue('base' in revisions) self.assertTrue('tip' in revisions) self.assertEqual(revisions['base'], base_commit_id) self.assertEqual(revisions['tip'], tip_commit_id)
class BazaarClientTests(SCMClientTests): """Unit tests for BazaarClient.""" def setUp(self): super(BazaarClientTests, self).setUp() if not is_exe_in_path('bzr'): raise SkipTest('bzr not found in path') self.set_user_home( os.path.join(self.testdata_dir, 'homedir')) self.orig_dir = os.getcwd() self.original_branch = self.chdir_tmp() self._run_bzr(["init", "."]) self._bzr_add_file_commit("foo.txt", FOO, "initial commit") self.child_branch = mktemp() self._run_bzr(["branch", self.original_branch, self.child_branch]) self.client = BazaarClient(options=self.options) os.chdir(self.orig_dir) self.options.parent_branch = None def _run_bzr(self, command, *args, **kwargs): return execute(['bzr'] + command, *args, **kwargs) def _bzr_add_file_commit(self, file, data, msg): """Add a file to a Bazaar repository with the content of data and commit with msg.""" with open(file, 'w') as foo: foo.write(data) self._run_bzr(["add", file]) self._run_bzr(["commit", "-m", msg, '--author', 'Test User']) def _compare_diffs(self, filename, full_diff, expected_diff_digest, change_type='modified'): """Testing that the full_diff for ``filename`` matches the ``expected_diff``.""" diff_lines = full_diff.splitlines() self.assertEqual(('=== %s file \'%s\'' % (change_type, filename)).encode('utf-8'), diff_lines[0]) self.assertTrue(diff_lines[1].startswith( ('--- %s\t' % filename).encode('utf-8'))) self.assertTrue(diff_lines[2].startswith( ('+++ %s\t' % filename).encode('utf-8'))) diff_body = b'\n'.join(diff_lines[3:]) self.assertEqual(md5(diff_body).hexdigest(), expected_diff_digest) def _count_files_in_diff(self, diff): return len([ line for line in diff.split(b'\n') if line.startswith(b'===') ]) def test_get_repository_info_original_branch(self): """Testing BazaarClient get_repository_info with original branch""" os.chdir(self.original_branch) ri = self.client.get_repository_info() self.assertTrue(isinstance(ri, RepositoryInfo)) self.assertEqual(os.path.realpath(ri.path), os.path.realpath(self.original_branch)) self.assertTrue(ri.supports_parent_diffs) self.assertEqual(ri.base_path, '/') self.assertFalse(ri.supports_changesets) def test_get_repository_info_child_branch(self): """Testing BazaarClient get_repository_info with child branch""" os.chdir(self.child_branch) ri = self.client.get_repository_info() self.assertTrue(isinstance(ri, RepositoryInfo)) self.assertEqual(os.path.realpath(ri.path), os.path.realpath(self.child_branch)) self.assertTrue(ri.supports_parent_diffs) self.assertEqual(ri.base_path, "/") self.assertFalse(ri.supports_changesets) def test_get_repository_info_no_branch(self): """Testing BazaarClient get_repository_info, no branch""" self.chdir_tmp() ri = self.client.get_repository_info() self.assertEqual(ri, None) def test_too_many_revisions(self): """Testing BazaarClient parse_revision_spec with too many revisions""" self.assertRaises(TooManyRevisionsError, self.client.parse_revision_spec, [1, 2, 3]) def test_diff_simple(self): """Testing BazaarClient simple diff case""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "delete and modify stuff") revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs('foo.txt', result['diff'], 'a6326b53933f8b255a4b840485d8e210') def test_diff_exclude(self): """Testing BazaarClient diff with file exclusion.""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "commit 1") self._bzr_add_file_commit("exclude.txt", FOO2, "commit 2") revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions, exclude_patterns=['exclude.txt']) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs('foo.txt', result['diff'], 'a6326b53933f8b255a4b840485d8e210') self.assertEqual(self._count_files_in_diff(result['diff']), 1) def test_diff_exclude_in_subdir(self): """Testing BazaarClient diff with file exclusion in a subdirectory.""" os.chdir(self.child_branch) self._bzr_add_file_commit('foo.txt', FOO1, 'commit 1') os.mkdir('subdir') os.chdir('subdir') self._bzr_add_file_commit('exclude.txt', FOO2, 'commit 2') revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions, exclude_patterns=['exclude.txt', '.']) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs('foo.txt', result['diff'], 'a6326b53933f8b255a4b840485d8e210') self.assertEqual(self._count_files_in_diff(result['diff']), 1) def test_diff_exclude_root_pattern_in_subdir(self): """Testing BazaarClient diff with file exclusion in the repo root.""" os.chdir(self.child_branch) self._bzr_add_file_commit('exclude.txt', FOO2, 'commit 1') os.mkdir('subdir') os.chdir('subdir') self._bzr_add_file_commit('foo.txt', FOO1, 'commit 2') revisions = self.client.parse_revision_spec([]) result = self.client.diff( revisions, exclude_patterns=[os.path.sep + 'exclude.txt', os.path.sep + 'subdir']) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs(os.path.join('subdir', 'foo.txt'), result['diff'], '4deffcb296180fa166eddff2512bd0e4', change_type='added') def test_diff_specific_files(self): """Testing BazaarClient diff with specific files""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "delete and modify stuff") self._bzr_add_file_commit("bar.txt", "baz", "added bar") revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions, ['foo.txt']) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs('foo.txt', result['diff'], 'a6326b53933f8b255a4b840485d8e210') def test_diff_simple_multiple(self): """Testing BazaarClient simple diff with multiple commits case""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "commit 1") self._bzr_add_file_commit("foo.txt", FOO2, "commit 2") self._bzr_add_file_commit("foo.txt", FOO3, "commit 3") revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs('foo.txt', result['diff'], '4109cc082dce22288c2f1baca9b107b6') def test_diff_parent(self): """Testing BazaarClient diff with changes only in the parent branch""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "delete and modify stuff") grand_child_branch = mktemp() self._run_bzr(["branch", self.child_branch, grand_child_branch]) os.chdir(grand_child_branch) revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self.assertEqual(result['diff'], None) def test_diff_grand_parent(self): """Testing BazaarClient diff with changes between a 2nd level descendant""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "delete and modify stuff") grand_child_branch = mktemp() self._run_bzr(["branch", self.child_branch, grand_child_branch]) os.chdir(grand_child_branch) # Requesting the diff between the grand child branch and its grand # parent: self.options.parent_branch = self.original_branch revisions = self.client.parse_revision_spec([]) result = self.client.diff(revisions) self.assertTrue(isinstance(result, dict)) self.assertTrue('diff' in result) self._compare_diffs("foo.txt", result['diff'], 'a6326b53933f8b255a4b840485d8e210') def test_guessed_summary_and_description(self): """Testing BazaarClient guessing summary and description""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "commit 1") self._bzr_add_file_commit("foo.txt", FOO2, "commit 2") self._bzr_add_file_commit("foo.txt", FOO3, "commit 3") self.options.guess_summary = True self.options.guess_description = True revisions = self.client.parse_revision_spec([]) commit_message = self.client.get_commit_message(revisions) self.assertEqual("commit 3", commit_message['summary']) description = commit_message['description'] self.assertTrue("commit 1" in description) self.assertTrue("commit 2" in description) self.assertFalse("commit 3" in description) def test_guessed_summary_and_description_in_grand_parent_branch(self): """Testing BazaarClient guessing summary and description for grand parent branch.""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "commit 1") self._bzr_add_file_commit("foo.txt", FOO2, "commit 2") self._bzr_add_file_commit("foo.txt", FOO3, "commit 3") self.options.guess_summary = True self.options.guess_description = True grand_child_branch = mktemp() self._run_bzr(["branch", self.child_branch, grand_child_branch]) os.chdir(grand_child_branch) # Requesting the diff between the grand child branch and its grand # parent: self.options.parent_branch = self.original_branch revisions = self.client.parse_revision_spec([]) commit_message = self.client.get_commit_message(revisions) self.assertEqual("commit 3", commit_message['summary']) description = commit_message['description'] self.assertTrue("commit 1" in description) self.assertTrue("commit 2" in description) self.assertFalse("commit 3" in description) def test_guessed_summary_and_description_with_revision_range(self): """Testing BazaarClient guessing summary and description with a revision range.""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "commit 1") self._bzr_add_file_commit("foo.txt", FOO2, "commit 2") self._bzr_add_file_commit("foo.txt", FOO3, "commit 3") self.options.guess_summary = True self.options.guess_description = True revisions = self.client.parse_revision_spec(['2..3']) commit_message = self.client.get_commit_message(revisions) self.assertEqual("commit 2", commit_message['summary']) self.assertEqual("commit 2", commit_message['description']) def test_parse_revision_spec_no_args(self): """Testing BazaarClient.parse_revision_spec with no specified revisions""" os.chdir(self.child_branch) base_commit_id = self.client._get_revno() self._bzr_add_file_commit("foo.txt", FOO1, "commit 1") tip_commit_id = self.client._get_revno() revisions = self.client.parse_revision_spec() self.assertTrue(isinstance(revisions, dict)) self.assertTrue('base' in revisions) self.assertTrue('tip' in revisions) self.assertTrue('parent_base' not in revisions) self.assertEqual(revisions['base'], base_commit_id) self.assertEqual(revisions['tip'], tip_commit_id) def test_parse_revision_spec_one_arg(self): """Testing BazaarClient.parse_revision_spec with one specified revision""" os.chdir(self.child_branch) base_commit_id = self.client._get_revno() self._bzr_add_file_commit("foo.txt", FOO1, "commit 1") tip_commit_id = self.client._get_revno() revisions = self.client.parse_revision_spec([tip_commit_id]) self.assertTrue(isinstance(revisions, dict)) self.assertTrue('base' in revisions) self.assertTrue('tip' in revisions) self.assertTrue('parent_base' not in revisions) self.assertEqual(revisions['base'], base_commit_id) self.assertEqual(revisions['tip'], tip_commit_id) def test_parse_revision_spec_one_arg_parent(self): """Testing BazaarClient.parse_revision_spec with one specified revision and a parent diff""" os.chdir(self.original_branch) parent_base_commit_id = self.client._get_revno() grand_child_branch = mktemp() self._run_bzr(["branch", self.child_branch, grand_child_branch]) os.chdir(grand_child_branch) base_commit_id = self.client._get_revno() self._bzr_add_file_commit("foo.txt", FOO2, "commit 2") tip_commit_id = self.client._get_revno() self.options.parent_branch = self.child_branch revisions = self.client.parse_revision_spec([tip_commit_id]) self.assertTrue(isinstance(revisions, dict)) self.assertTrue('parent_base' in revisions) self.assertTrue('base' in revisions) self.assertTrue('tip' in revisions) self.assertEqual(revisions['parent_base'], parent_base_commit_id) self.assertEqual(revisions['base'], base_commit_id) self.assertEqual(revisions['tip'], tip_commit_id) def test_parse_revision_spec_one_arg_split(self): """Testing BazaarClient.parse_revision_spec with R1..R2 syntax""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "commit 1") base_commit_id = self.client._get_revno() self._bzr_add_file_commit("foo.txt", FOO2, "commit 2") tip_commit_id = self.client._get_revno() revisions = self.client.parse_revision_spec( ['%s..%s' % (base_commit_id, tip_commit_id)]) self.assertTrue(isinstance(revisions, dict)) self.assertTrue('parent_base' not in revisions) self.assertTrue('base' in revisions) self.assertTrue('tip' in revisions) self.assertEqual(revisions['base'], base_commit_id) self.assertEqual(revisions['tip'], tip_commit_id) def test_parse_revision_spec_two_args(self): """Testing BazaarClient.parse_revision_spec with two revisions""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "commit 1") base_commit_id = self.client._get_revno() self._bzr_add_file_commit("foo.txt", FOO2, "commit 2") tip_commit_id = self.client._get_revno() revisions = self.client.parse_revision_spec( [base_commit_id, tip_commit_id]) self.assertTrue(isinstance(revisions, dict)) self.assertTrue('parent_base' not in revisions) self.assertTrue('base' in revisions) self.assertTrue('tip' in revisions) self.assertEqual(revisions['base'], base_commit_id) self.assertEqual(revisions['tip'], tip_commit_id)
class BazaarClientTests(SCMClientTests): def _bzr_cmd(self, command, *args, **kwargs): full_command = ["bzr"] + command return execute(full_command, *args, **kwargs) def _bzr_add_file_commit(self, file, data, msg): """ Add a file to a Bazaar repository with the content of data and commit with msg. """ foo = open(file, "w") foo.write(data) foo.close() self._bzr_cmd(["add", file]) self._bzr_cmd(["commit", "-m", msg]) def _compare_diffs(self, filename, full_diff, expected_diff): """ Test that the full_diff for ``filename`` matches the ``expected_diff``. """ diff_lines = full_diff.splitlines() self.assertEqual("=== modified file %r" % filename, diff_lines[0]) self.assert_(diff_lines[1].startswith("--- %s\t" % filename)) self.assert_(diff_lines[2].startswith("+++ %s\t" % filename)) diff_body = "\n".join(diff_lines[3:]) self.assertEqual(diff_body, expected_diff) def setUp(self): super(BazaarClientTests, self).setUp() if not self.is_exe_in_path("bzr"): raise SkipTest("bzr not found in path") self.orig_dir = os.getcwd() self.original_branch = self.chdir_tmp() self._bzr_cmd(["init", "."]) self._bzr_add_file_commit("foo.txt", FOO, "initial commit") self.child_branch = mktemp() self._bzr_cmd(["branch", self.original_branch, self.child_branch]) self.client = BazaarClient(options=self.options) os.chdir(self.orig_dir) self.user_config = {} self.configs = [] self.client.user_config = self.user_config self.client.configs = self.configs self.options.parent_branch = None def test_get_repository_info_original_branch(self): """Test BazaarClient get_repository_info with original branch""" os.chdir(self.original_branch) ri = self.client.get_repository_info() self.assert_(isinstance(ri, RepositoryInfo)) self.assertEqual(ri.path, self.original_branch) self.assertTrue(ri.supports_parent_diffs) self.assertEqual(ri.base_path, "/") self.assertFalse(ri.supports_changesets) def test_get_repository_info_child_branch(self): """Test BazaarClient get_repository_info with child branch""" os.chdir(self.child_branch) ri = self.client.get_repository_info() self.assert_(isinstance(ri, RepositoryInfo)) self.assertEqual(ri.path, self.child_branch) self.assertTrue(ri.supports_parent_diffs) self.assertEqual(ri.base_path, "/") self.assertFalse(ri.supports_changesets) def test_get_repository_info_no_branch(self): """Test BazaarClient get_repository_info, no branch""" self.chdir_tmp() ri = self.client.get_repository_info() self.assertEqual(ri, None) def test_diff_simple(self): """Test BazaarClient simple diff case""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "delete and modify stuff") outgoing_diff, parent_diff = self.client.diff(None) self._compare_diffs("foo.txt", outgoing_diff, EXPECTED_BZR_DIFF_0) self.assertEqual(parent_diff, None) def test_diff_specific_files(self): """Test BazaarClient diff with specific files""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "delete and modify stuff") self._bzr_add_file_commit("bar.txt", "baz", "added bar") outgoing_diff, parent_diff = self.client.diff(["foo.txt"]) self._compare_diffs("foo.txt", outgoing_diff, EXPECTED_BZR_DIFF_0) self.assertEqual(parent_diff, None) def test_diff_simple_multiple(self): """Test BazaarClient simple diff with multiple commits case""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "commit 1") self._bzr_add_file_commit("foo.txt", FOO2, "commit 2") self._bzr_add_file_commit("foo.txt", FOO3, "commit 3") outgoing_diff, parent_diff = self.client.diff(None) self._compare_diffs("foo.txt", outgoing_diff, EXPECTED_BZR_DIFF_1) self.assertEqual(parent_diff, None) def test_diff_parent(self): """Test BazaarClient diff with changes only in the parent branch""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "delete and modify stuff") grand_child_branch = mktemp() self._bzr_cmd(["branch", self.child_branch, grand_child_branch]) os.chdir(grand_child_branch) outgoing_diff, parent_diff = self.client.diff(None) self.assertEqual(outgoing_diff, None) self.assertEqual(parent_diff, None) def test_diff_grand_parent(self): """Test BazaarClient diff with changes between a 2nd level descendant""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "delete and modify stuff") grand_child_branch = mktemp() self._bzr_cmd(["branch", self.child_branch, grand_child_branch]) os.chdir(grand_child_branch) # Requesting the diff between the grand child branch and its grand # parent: self.options.parent_branch = self.original_branch outgoing_diff, parent_diff = self.client.diff(None) self._compare_diffs("foo.txt", outgoing_diff, EXPECTED_BZR_DIFF_0) self.assertEqual(parent_diff, None) def test_guessed_summary_and_description_in_diff(self): """Test BazaarClient diff with summary and description guessed""" os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "commit 1") self._bzr_add_file_commit("foo.txt", FOO2, "commit 2") self._bzr_add_file_commit("foo.txt", FOO3, "commit 3") self.options.guess_summary = True self.options.guess_description = True self.client.diff(None) self.assertEquals("commit 3", self.options.summary) description = self.options.description self.assert_("commit 1" in description, description) self.assert_("commit 2" in description, description) self.assert_("commit 3" in description, description) def test_guessed_summary_and_description_in_grand_parent_branch_diff(self): """ Test BazaarClient diff with summary and description guessed for grand parent branch. """ os.chdir(self.child_branch) self._bzr_add_file_commit("foo.txt", FOO1, "commit 1") self._bzr_add_file_commit("foo.txt", FOO2, "commit 2") self._bzr_add_file_commit("foo.txt", FOO3, "commit 3") self.options.guess_summary = True self.options.guess_description = True grand_child_branch = mktemp() self._bzr_cmd(["branch", self.child_branch, grand_child_branch]) os.chdir(grand_child_branch) # Requesting the diff between the grand child branch and its grand # parent: self.options.parent_branch = self.original_branch self.client.diff(None) self.assertEquals("commit 3", self.options.summary) description = self.options.description self.assert_("commit 1" in description, description) self.assert_("commit 2" in description, description) self.assert_("commit 3" in description, description)