Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
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'])
'review request.')
if self.options.parent_branch:
result['parent_base'] = result['base']
result['base'] = self._identify_revision(
self.options.parent_branch)
elif n_revisions == 1:
# One revision: Use the given revision for tip, and find its parent
# for base.
result['tip'] = self._identify_revision(revisions[0])
result['commit_id'] = result['tip']
result['base'] = self._execute(
['hg', 'parents', '--hidden', '-r', result['tip'],
'--template', '{node|short}']).split()[0]
if len(result['base']) != 12:
raise InvalidRevisionSpecError(
"Can't determine parent revision"
)
elif n_revisions == 2:
# Two revisions: Just use the given revisions
result['base'] = self._identify_revision(revisions[0])
result['tip'] = self._identify_revision(revisions[1])
else:
raise TooManyRevisionsError
if 'base' not in result or 'tip' not in result:
raise InvalidRevisionSpecError(
'"%s" does not appear to be a valid revision spec' % revisions)
if self._type == 'hg' and 'parent_base' not in result:
# If there are missing changesets between base and the remote, we
# need to generate a parent diff.
return {
'base': self.REVISION_LABEL_BASE,
'tip': [x[len(self.REVISION_BRANCH_PREFIX):]
for x in revisions],
}
# TODO:
# baseline:baseline1[@pvob] baseline:baseline2[@pvob]
# => review changes between these two
# baselines
pass
pairs = []
for r in revisions:
p = r.split(':')
if len(p) != 2:
raise InvalidRevisionSpecError(
'"%s" is not a valid file@revision pair' % r)
pairs.append(p)
return {
'base': self.REVISION_FILES,
'tip': pairs,
}
result['base'] = self._execute(
['hg', 'parents', '--hidden', '-r', result['tip'],
'--template', '{node|short}']).split()[0]
if len(result['base']) != 12:
raise InvalidRevisionSpecError(
"Can't determine parent revision"
)
elif n_revisions == 2:
# Two revisions: Just use the given revisions
result['base'] = self._identify_revision(revisions[0])
result['tip'] = self._identify_revision(revisions[1])
else:
raise TooManyRevisionsError
if 'base' not in result or 'tip' not in result:
raise InvalidRevisionSpecError(
'"%s" does not appear to be a valid revision spec' % revisions)
if self._type == 'hg' and 'parent_base' not in result:
# If there are missing changesets between base and the remote, we
# need to generate a parent diff.
outgoing = self._get_outgoing_changesets(self._get_remote_branch(),
rev=result['base'])
logging.debug('%d outgoing changesets between remote and base.',
len(outgoing))
if not outgoing:
return result
parent_base = self._execute(
['hg', 'parents', '--hidden', '-r', outgoing[0][1],
result['base'] = revisions[0]
elif status in ('pending', 'shelved'):
raise InvalidRevisionSpecError(
'%s cannot be used as the base CLN for a diff because '
'it is %s.' % (revisions[0], status))
else:
raise InvalidRevisionSpecError(
'%s does not appear to be a valid changelist' %
revisions[0])
# Tip revision can be any of submitted, pending, or shelved CLNs
status = self._get_changelist_status(revisions[1])
if status == 'submitted':
result['tip'] = revisions[1]
elif status in ('pending', 'shelved'):
raise InvalidRevisionSpecError(
'%s cannot be used for a revision range diff because it '
'is %s' % (revisions[1], status))
else:
raise InvalidRevisionSpecError(
'%s does not appear to be a valid changelist' %
revisions[1])
return result
else:
raise TooManyRevisionsError
if self.options.svn_changelist:
raise CommandError(
'The --svn-changelist argument has been removed. To use a '
'Subversion changelist, pass the changelist name as an '
'additional argument after the command.')
repository_info, tool = self.initialize_scm_tool(
client_name=self.options.repository_type)
server_url = self.get_server_url(repository_info, tool)
api_client, api_root = self.get_api(server_url)
self.setup_tool(tool, api_root=api_root)
try:
revisions = tool.parse_revision_spec(args)
extra_args = None
except InvalidRevisionSpecError:
if not tool.supports_diff_extra_args:
raise
revisions = None
extra_args = args
if (self.options.exclude_patterns and
not tool.supports_diff_exclude_patterns):
raise CommandError(
'The %s backend does not support excluding files via the '
'-X/--exclude commandline options or the EXCLUDE_PATTERNS '
'.reviewboardrc option.' % tool.name)
diff_kwargs = {}
if not self.options.repository_url:
status = self._run_svn(
['status', '--cl', six.text_type(revision),
'--ignore-externals', '--xml'],
results_unicode=False)
cl = ElementTree.fromstring(status).find('changelist')
if cl is not None:
# TODO: this should warn about mixed-revision working
# copies that affect the list of files changed (see
# bug 2392).
return {
'base': 'BASE',
'tip': self.REVISION_CHANGELIST_PREFIX + revision
}
raise InvalidRevisionSpecError(
'"%s" does not appear to be a valid revision or '
'changelist name' % revision)
elif n_revisions == 2:
# Diff between two numeric revisions
try:
return {
'base': self._convert_symbolic_revision(revisions[0]),
'tip': self._convert_symbolic_revision(revisions[1]),
}
except ValueError:
raise InvalidRevisionSpecError(
'Could not parse specified revisions: %s' % revisions)
else:
raise TooManyRevisionsError
# can therefore let ElementTree determine how to decode it.
data = self._run_tf(args, results_unicode=False)
try:
root = ET.fromstring(data)
item = root.find('./changeset')
if item is not None:
return int(item.attrib['id'])
else:
raise Exception('No changesets found')
except Exception as e:
logging.debug('Failed to parse output from "tf history": %s\n%s',
e, data, exc_info=True)
raise InvalidRevisionSpecError(
'"%s" does not appear to be a valid versionspec' % revision)
"""An error for when amending a commit fails."""
class OptionsCheckError(Exception):
"""An error for when command line options are used incorrectly."""
class InvalidRevisionSpecError(Exception):
"""An error for when the specified revisions are invalid."""
class MinimumVersionError(Exception):
"""An error for when software doesn't meet version requirements."""
class TooManyRevisionsError(InvalidRevisionSpecError):
"""An error for when too many revisions were specified."""
def __init__(self):
"""Initialize the error."""
super(TooManyRevisionsError, self).__init__(
'Too many revisions specified')
class EmptyChangeError(Exception):
"""An error for when there are no changed files."""
def __init__(self):
"""Initialize the error."""
super(EmptyChangeError, self).__init__(
"Couldn't find any affected files for this change.")
are using other patch-stack tools who want to use parent diffs with
CVS will have to generate their diffs by hand.
Because :command:`cvs diff` uses multiple arguments to define
multiple tags, there's no single-argument/multiple-revision syntax
available.
"""
n_revs = len(revisions)
if n_revs == 0:
return {
'base': 'BASE',
'tip': self.REVISION_WORKING_COPY,
}
elif n_revs == 1:
raise InvalidRevisionSpecError(
'CVS does not support passing in a single revision.')
elif n_revs == 2:
return {
'base': revisions[0],
'tip': revisions[1],
}
else:
raise TooManyRevisionsError
return {
'base': None,
'tip': None,
}