def test_diff_exclude(self): """Testing PerforceClient.normalize_exclude_patterns""" repo_root = self.chdir_tmp() os.mkdir('subdir') cwd = os.getcwd() class ExcludeWrapper(P4Wrapper): def info(self): return { 'Client root': repo_root, } client = PerforceClient(ExcludeWrapper) patterns = [ "//depot/path", os.path.join(os.path.sep, "foo"), "foo", ] normalized_patterns = [ # Depot paths should remain unchanged. patterns[0], # "Absolute" paths (i.e., ones that begin with a path separator) # should be relative to the repository root. os.path.join(repo_root, patterns[1][1:]), # Relative paths should be relative to the current working # directory. os.path.join(cwd, patterns[2]), ] result = client.normalize_exclude_patterns(patterns) self.assertEqual(result, normalized_patterns)
def _build_client(self): self.options.p4_client = 'myclient' self.options.p4_port = 'perforce.example.com:1666' self.options.p4_passwd = '' client = PerforceClient(self.P4DiffTestWrapper, options=self.options) client.p4d_version = (2012, 2) return client
def test_repository_info(self): """Testing PerforceClient.get_repository_info""" SERVER_PATH = 'perforce.example.com:1666' class TestWrapper(P4Wrapper): def is_supported(self): return True def info(self): return { 'Client root': os.getcwd(), 'Server address': SERVER_PATH, 'Server version': 'P4D/FREEBSD60X86_64/2012.2/525804 ' '(2012/09/18)', } client = PerforceClient(TestWrapper) info = client.get_repository_info() self.assertNotEqual(info, None) self.assertEqual(info.path, SERVER_PATH) self.assertEqual(client.p4d_version, (2012, 2))
def test_repository_info_with_server_address_and_encrypted(self): """Testing PerforceClient.get_repository_info with server address and broker encryption""" SERVER_PATH = 'perforce.example.com:1666' class TestWrapper(P4Wrapper): def is_supported(self): return True def counters(self): return {} def info(self): return { 'Client root': os.getcwd(), 'Server address': SERVER_PATH, 'Server encryption': 'encrypted', 'Server version': 'P4D/FREEBSD60X86_64/2012.2/525804 ' '(2012/09/18)', } client = PerforceClient(TestWrapper) info = client.get_repository_info() self.assertIsNotNone(info) self.assertEqual(info.path, [ 'ssl:%s' % SERVER_PATH, SERVER_PATH, ]) self.assertEqual(client.p4d_version, (2012, 2))
def test_diff_exclude(self): """Testing PerforceClient.normalize_exclude_patterns""" repo_root = self.chdir_tmp() os.mkdir('subdir') cwd = os.getcwd() class ExcludeWrapper(P4Wrapper): def info(self): return { 'Client root': repo_root, } client = PerforceClient(ExcludeWrapper) patterns = [ '//depot/path', os.path.join(os.path.sep, 'foo'), 'foo', ] normalized_patterns = [ # Depot paths should remain unchanged. patterns[0], # "Absolute" paths (i.e., ones that begin with a path separator) # should be relative to the repository root. os.path.join(repo_root, patterns[1][1:]), # Relative paths should be relative to the current working # directory. os.path.join(cwd, patterns[2]), ] result = client.normalize_exclude_patterns(patterns) self.assertEqual(result, normalized_patterns)
def test_repository_info_with_broker_address(self): """Testing PerforceClient.get_repository_info with broker address""" BROKER_PATH = 'broker.example.com:1666' SERVER_PATH = 'perforce.example.com:1666' class TestWrapper(P4Wrapper): def is_supported(self): return True def counters(self): return {} def info(self): return { 'Client root': os.getcwd(), 'Broker address': BROKER_PATH, 'Server address': SERVER_PATH, 'Server version': 'P4D/FREEBSD60X86_64/2012.2/525804 ' '(2012/09/18)', } client = PerforceClient(TestWrapper) info = client.get_repository_info() self.assertIsNotNone(info) self.assertEqual(info.path, BROKER_PATH) self.assertIsNone(info.name) self.assertEqual(client.p4d_version, (2012, 2))
def test_scan_for_server_with_reviewboard_url(self): """Testing PerforceClient.scan_for_server with reviewboard.url""" RB_URL = 'http://reviewboard.example.com/' class TestWrapper(P4Wrapper): def counters(self): return { 'reviewboard.url': RB_URL, 'foo': 'bar', } client = PerforceClient(TestWrapper) url = client.scan_for_server(None) self.assertEqual(url, RB_URL)
def test_scan_for_server_counter_with_reviewboard_url(self): """Testing PerforceClient.scan_for_server_counter with reviewboard.url""" RB_URL = 'http://reviewboard.example.com/' class TestWrapper(P4Wrapper): def counters(self): return { 'reviewboard.url': RB_URL, 'foo': 'bar', } client = PerforceClient(TestWrapper) url = client.scan_for_server_counter(None) self.assertEqual(url, RB_URL)
def scan_for_server(self, repository_info): # Scan first for dot files, since it's faster and will cover the # user's $HOME/.reviewboardrc server_url = super(GitClient, self).scan_for_server(repository_info) if server_url: return server_url # TODO: Maybe support a server per remote later? Is that useful? url = execute([self.git, "config", "--get", "reviewboard.url"], ignore_errors=True).strip() if url: return url if self.type == "svn": # Try using the reviewboard:url property on the SVN repo, if it # exists. prop = SVNClient().scan_for_server_property(repository_info) if prop: return prop elif self.type == 'perforce': prop = PerforceClient().scan_for_server(repository_info) if prop: return prop return None
def test_parse_revision_spec_two_args(self): """Testing PerforceClient.parse_revision_spec with two changelists""" class TestWrapper(P4Wrapper): def change(self, changelist): change = { 'Change': str(changelist), 'Date': '2013/12/19 11:32:45', 'User': '******', 'Description': 'My change description\n', } if changelist == '99' or changelist == '100': change['Status'] = 'submitted' elif changelist == '101': change['Status'] = 'pending' elif changelist == '102': change['Status'] = 'shelved' else: assert False return [change] client = PerforceClient(TestWrapper) revisions = client.parse_revision_spec(['99', '100']) 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'], '99') self.assertEqual(revisions['tip'], '100') self.assertRaises(InvalidRevisionSpecError, client.parse_revision_spec, ['99', '101']) self.assertRaises(InvalidRevisionSpecError, client.parse_revision_spec, ['99', '102']) self.assertRaises(InvalidRevisionSpecError, client.parse_revision_spec, ['101', '100']) self.assertRaises(InvalidRevisionSpecError, client.parse_revision_spec, ['102', '100']) self.assertRaises(InvalidRevisionSpecError, client.parse_revision_spec, ['102', '10284'])
def test_scan_for_server_counter_with_reviewboard_url_encoded(self): """Testing PerforceClient.scan_for_server_counter with encoded reviewboard.url.http:||""" URL_KEY = 'reviewboard.url.http:||reviewboard.example.com/' RB_URL = 'http://reviewboard.example.com/' class TestWrapper(P4Wrapper): def counters(self): return { URL_KEY: '1', 'foo': 'bar', } client = PerforceClient(TestWrapper) url = client.scan_for_server_counter(None) self.assertEqual(url, RB_URL)
def test_repository_info_outside_client_root(self): """Testing PerforceClient.get_repository_info outside client root""" SERVER_PATH = 'perforce.example.com:1666' class TestWrapper(P4Wrapper): def is_supported(self): return True def info(self): return { 'Client root': '/', 'Server address': SERVER_PATH, 'Server version': 'P4D/FREEBSD60X86_64/2012.2/525804 ' '(2012/09/18)', } client = PerforceClient(TestWrapper) info = client.get_repository_info() self.assertEqual(info, None)
def test_parse_revision_spec_submitted_cln(self): """Testing PerforceClient.parse_revision_spec with a submitted changelist""" class TestWrapper(P4Wrapper): def change(self, changelist): return [{ 'Change': '12345', 'Date': '2013/12/19 11:32:45', 'User': '******', 'Status': 'submitted', 'Description': 'My change description\n', }] client = PerforceClient(TestWrapper) revisions = client.parse_revision_spec(['12345']) 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'], '12344') self.assertEqual(revisions['tip'], '12345')
def test_parse_revision_spec_invalid_spec(self): """Testing PerforceClient.parse_revision_spec with invalid specifications""" class TestWrapper(P4Wrapper): def change(self, changelist): return [] client = PerforceClient(TestWrapper) self.assertRaises(InvalidRevisionSpecError, client.parse_revision_spec, ['aoeu']) self.assertRaises(TooManyRevisionsError, client.parse_revision_spec, ['1', '2', '3'])
def test_parse_revision_spec_pending_cln(self): """Testing PerforceClient.parse_revision_spec with a pending changelist""" class TestWrapper(P4Wrapper): def change(self, changelist): return [{ 'Change': '12345', 'Date': '2013/12/19 11:32:45', 'User': '******', 'Status': 'pending', 'Description': 'My change description\n', }] client = PerforceClient(TestWrapper) revisions = client.parse_revision_spec(['12345']) 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'], PerforceClient.REVISION_CURRENT_SYNC) self.assertEqual( revisions['tip'], PerforceClient.REVISION_PENDING_CLN_PREFIX + '12345')
def test_parse_revision_spec_pending_cln(self): """Testing PerforceClient.parse_revision_spec with a pending changelist""" class TestWrapper(P4Wrapper): def change(self, changelist): return [{ 'Change': '12345', 'Date': '2013/12/19 11:32:45', 'User': '******', 'Status': 'pending', 'Description': 'My change description\n', }] client = PerforceClient(TestWrapper) revisions = client.parse_revision_spec(['12345']) 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'], PerforceClient.REVISION_CURRENT_SYNC) self.assertEqual(revisions['tip'], PerforceClient.REVISION_PENDING_CLN_PREFIX + '12345')
def load_scmclients(options): global SCMCLIENTS 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 = [ CVSClient(options=options), ClearCaseClient(options=options), GitClient(options=options), MercurialClient(options=options), PerforceClient(options=options), PlasticClient(options=options), SVNClient(options=options), ]
def scan_for_server(self, repository_info): """Find the Review Board server matching this repository. Args: repository_info (rbtools.clients.RepositoryInfo): The repository information structure. Returns: unicode: The Review Board server URL, if available. """ # Scan first for dot files, since it's faster and will cover the # user's $HOME/.reviewboardrc server_url = super(GitClient, self).scan_for_server(repository_info) if server_url: return server_url # TODO: Maybe support a server per remote later? Is that useful? url = self._execute([self.git, 'config', '--get', 'reviewboard.url'], ignore_errors=True).strip() if url: return url if self._type == self.TYPE_GIT_SVN: # Try using the reviewboard:url property on the SVN repo, if it # exists. prop = SVNClient().scan_for_server_property(repository_info) if prop: return prop elif self._type == self.TYPE_GIT_P4: prop = PerforceClient().scan_for_server(repository_info) if prop: return prop return None
def test_diff_for_submitted_changelist(self): """Testing PerforceClient.diff with a submitted changelist""" class TestWrapper(self.P4DiffTestWrapper): def change(self, changelist): return [{ 'Change': '12345', 'Date': '2013/12/19 11:32:45', 'User': '******', 'Status': 'submitted', 'Description': 'My change description\n', }] def filelog(self, path): return [ { 'change0': '12345', 'action0': 'edit', 'rev0': '3', 'depotFile': '//mydepot/test/README', } ] client = PerforceClient(TestWrapper) client.p4.repo_files = [ { 'depotFile': '//mydepot/test/README', 'rev': '2', 'action': 'edit', 'change': '12345', 'text': 'This is a test.\n', }, { 'depotFile': '//mydepot/test/README', 'rev': '3', 'action': 'edit', 'change': '', 'text': 'This is a mess.\n', }, ] readme_file = make_tempfile() client.p4.print_file('//mydepot/test/README#3', readme_file) client.p4.where_files = { '//mydepot/test/README': readme_file, } client.p4.repo_files = [ { 'depotFile': '//mydepot/test/README', 'rev': '2', 'action': 'edit', 'change': '12345', 'text': 'This is a test.\n', }, { 'depotFile': '//mydepot/test/README', 'rev': '3', 'action': 'edit', 'change': '', 'text': 'This is a mess.\n', }, ] revisions = client.parse_revision_spec(['12345']) diff = client.diff(revisions) self._compare_diff(diff, '8af5576f5192ca87731673030efb5f39', expect_changenum=False)
def test_error_on_revision_range(self): """Testing that passing a revision_range causes the client to exit.""" self.options.revision_range = "12345" client = PerforceClient(options=self.options) client.check_options()
def test_diff_for_submitted_changelist(self): """Testing PerforceClient.diff with a submitted changelist""" class TestWrapper(self.P4DiffTestWrapper): def change(self, changelist): return [{ 'Change': '12345', 'Date': '2013/12/19 11:32:45', 'User': '******', 'Status': 'submitted', 'Description': 'My change description\n', }] def filelog(self, path): return [{ 'change0': '12345', 'action0': 'edit', 'rev0': '3', 'depotFile': '//mydepot/test/README', }] client = PerforceClient(TestWrapper) client.p4.repo_files = [ { 'depotFile': '//mydepot/test/README', 'rev': '2', 'action': 'edit', 'change': '12345', 'text': 'This is a test.\n', }, { 'depotFile': '//mydepot/test/README', 'rev': '3', 'action': 'edit', 'change': '', 'text': 'This is a mess.\n', }, ] readme_file = make_tempfile() client.p4.print_file('//mydepot/test/README#3', readme_file) client.p4.where_files = { '//mydepot/test/README': readme_file, } client.p4.repo_files = [ { 'depotFile': '//mydepot/test/README', 'rev': '2', 'action': 'edit', 'change': '12345', 'text': 'This is a test.\n', }, { 'depotFile': '//mydepot/test/README', 'rev': '3', 'action': 'edit', 'change': '', 'text': 'This is a mess.\n', }, ] revisions = client.parse_revision_spec(['12345']) diff = client.diff(revisions) self._compare_diff(diff, '8af5576f5192ca87731673030efb5f39', expect_changenum=False)