Use GetCodeOwnersClient in presubmit_support

This change also adds a target_ref flag to presubmit_support.py.

Recipe-Nontrivial-Roll: build
Change-Id: I6de6bb87fc1482b88d9fbebe5e4ad1dbd8ce9748
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/2702792
Commit-Queue: Gavin Mak <gavinmak@google.com>
Reviewed-by: Edward Lesmes <ehmaldonado@chromium.org>
Reviewed-by: Josip Sokcevic <sokcevic@google.com>
changes/92/2702792/16
Gavin Mak 5 years ago committed by LUCI CQ
parent c2358f484d
commit 7a67bca65a

@ -1294,6 +1294,8 @@ class Changelist(object):
gerrit_url = self.GetCodereviewServer() gerrit_url = self.GetCodereviewServer()
issue = self.GetIssue() issue = self.GetIssue()
patchset = self.GetPatchset() patchset = self.GetPatchset()
remote, remote_branch = self.GetRemoteBranch()
target_ref = GetTargetRef(remote, remote_branch, None)
if author: if author:
args.extend(['--author', author]) args.extend(['--author', author])
if gerrit_url: if gerrit_url:
@ -1302,6 +1304,8 @@ class Changelist(object):
args.extend(['--issue', str(issue)]) args.extend(['--issue', str(issue)])
if patchset: if patchset:
args.extend(['--patchset', str(patchset)]) args.extend(['--patchset', str(patchset)])
if target_ref:
args.extend(['--target_ref', target_ref])
return args return args

@ -228,6 +228,6 @@ def GetCodeOwnersClient(root, host, project, branch):
Defaults to GerritClient, and falls back to DepotToolsClient if code-owners Defaults to GerritClient, and falls back to DepotToolsClient if code-owners
plugin is not available.""" plugin is not available."""
if gerrit_util.IsCodeOwnersEnabled(host): if host and gerrit_util.IsCodeOwnersEnabled(host):
return GerritClient(host, project, branch) return GerritClient(host, project, branch)
return DepotToolsClient(root, branch) return DepotToolsClient(root, branch)

@ -376,8 +376,10 @@ class GerritAccessor(object):
To avoid excessive Gerrit calls, caches the results. To avoid excessive Gerrit calls, caches the results.
""" """
def __init__(self, host): def __init__(self, host, project=None, branch=None):
self.host = host self.host = host
self.project = project
self.branch = branch
self.cache = {} self.cache = {}
def _FetchChangeDetail(self, issue): def _FetchChangeDetail(self, issue):
@ -650,10 +652,19 @@ class InputApi(object):
# Temporary files we must manually remove at the end of a run. # Temporary files we must manually remove at the end of a run.
self._named_temporary_files = [] self._named_temporary_files = []
# TODO(dpranke): figure out a list of all approved owners for a repo host = ''
# in order to be able to handle wildcard OWNERS files? project = ''
self.owners_client = owners_client.DepotToolsClient( branch = ''
change.RepositoryRoot(), change.UpstreamBranch(), os_path=self.os_path) if gerrit_obj:
host = gerrit_obj.host or ''
project = gerrit_obj.project or ''
branch = gerrit_obj.branch or ''
self.owners_client = owners_client.GetCodeOwnersClient(
root=change.RepositoryRoot(),
host=host,
project=project,
branch=branch)
self.owners_db = owners_db.Database( self.owners_db = owners_db.Database(
change.RepositoryRoot(), fopen=open, os_path=self.os_path) change.RepositoryRoot(), fopen=open, os_path=self.os_path)
self.owners_finder = owners_finder.OwnersFinder self.owners_finder = owners_finder.OwnersFinder
@ -1507,7 +1518,7 @@ def DoPostUploadExecuter(change,
class PresubmitExecuter(object): class PresubmitExecuter(object):
def __init__(self, change, committing, verbose, gerrit_obj, dry_run=None, def __init__(self, change, committing, verbose, gerrit_obj, dry_run=None,
thread_pool=None, parallel=False, gerrit_project=None): thread_pool=None, parallel=False):
""" """
Args: Args:
change: The Change object. change: The Change object.
@ -1525,7 +1536,6 @@ class PresubmitExecuter(object):
self.more_cc = [] self.more_cc = []
self.thread_pool = thread_pool self.thread_pool = thread_pool
self.parallel = parallel self.parallel = parallel
self.gerrit_project = gerrit_project
def ExecPresubmitScript(self, script_text, presubmit_path): def ExecPresubmitScript(self, script_text, presubmit_path):
"""Executes a single presubmit script. """Executes a single presubmit script.
@ -1568,9 +1578,10 @@ class PresubmitExecuter(object):
# Get the URL of git remote origin and use it to identify host and project # Get the URL of git remote origin and use it to identify host and project
host = '' host = ''
if self.gerrit and self.gerrit.host: project = ''
host = self.gerrit.host if self.gerrit:
project = self.gerrit_project or '' host = self.gerrit.host or ''
project = self.gerrit.project or ''
# Prefix for test names # Prefix for test names
prefix = 'presubmit:%s/%s:%s/' % (host, project, rel_path) prefix = 'presubmit:%s/%s:%s/' % (host, project, rel_path)
@ -1669,8 +1680,7 @@ def DoPresubmitChecks(change,
gerrit_obj, gerrit_obj,
dry_run=None, dry_run=None,
parallel=False, parallel=False,
json_output=None, json_output=None):
gerrit_project=None):
"""Runs all presubmit checks that apply to the files in the change. """Runs all presubmit checks that apply to the files in the change.
This finds all PRESUBMIT.py files in directories enclosing the files in the This finds all PRESUBMIT.py files in directories enclosing the files in the
@ -1713,7 +1723,7 @@ def DoPresubmitChecks(change,
results = [] results = []
thread_pool = ThreadPool() thread_pool = ThreadPool()
executer = PresubmitExecuter(change, committing, verbose, gerrit_obj, executer = PresubmitExecuter(change, committing, verbose, gerrit_obj,
dry_run, thread_pool, parallel, gerrit_project) dry_run, thread_pool, parallel)
if default_presubmit: if default_presubmit:
if verbose: if verbose:
sys.stdout.write('Running default presubmit script.\n') sys.stdout.write('Running default presubmit script.\n')
@ -1870,11 +1880,15 @@ def _parse_gerrit_options(parser, options):
parser: The parser used to parse the arguments from command line. parser: The parser used to parse the arguments from command line.
options: The arguments parsed from command line. options: The arguments parsed from command line.
Returns: Returns:
A GerritAccessor object if options.gerrit_url is set, or None otherwise. A GerritAccessor object if options.gerrit_url or options.gerrit_project are
set, or None otherwise.
""" """
gerrit_obj = None gerrit_obj = None
if options.gerrit_url: if options.gerrit_url or options.gerrit_project:
gerrit_obj = GerritAccessor(urlparse.urlparse(options.gerrit_url).netloc) gerrit_obj = GerritAccessor(
urlparse.urlparse(options.gerrit_url or '').netloc,
options.gerrit_project,
options.target_ref)
if not options.gerrit_fetch: if not options.gerrit_fetch:
return gerrit_obj return gerrit_obj
@ -1960,6 +1974,8 @@ def main(argv=None):
'executing presubmit or post-upload hooks. fnmatch ' 'executing presubmit or post-upload hooks. fnmatch '
'wildcards can also be used.') 'wildcards can also be used.')
parser.add_argument('--gerrit_project', help=argparse.SUPPRESS) parser.add_argument('--gerrit_project', help=argparse.SUPPRESS)
parser.add_argument('--target_ref',
help='The remote branch ref to use for the change.')
options = parser.parse_args(argv) options = parser.parse_args(argv)
log_level = logging.ERROR log_level = logging.ERROR
@ -1992,8 +2008,7 @@ def main(argv=None):
gerrit_obj, gerrit_obj,
options.dry_run, options.dry_run,
options.parallel, options.parallel,
options.json_output, options.json_output)
options.gerrit_project)
except PresubmitFailure as e: except PresubmitFailure as e:
print(e, file=sys.stderr) print(e, file=sys.stderr)
print('Maybe your depot_tools is out of date?', file=sys.stderr) print('Maybe your depot_tools is out of date?', file=sys.stderr)

@ -98,6 +98,7 @@ class PresubmitApi(recipe_api.RecipeApi):
'--issue', self.m.tryserver.gerrit_change.change, '--issue', self.m.tryserver.gerrit_change.change,
'--patchset', self.m.tryserver.gerrit_change.patchset, '--patchset', self.m.tryserver.gerrit_change.patchset,
'--gerrit_url', 'https://%s' % self.m.tryserver.gerrit_change.host, '--gerrit_url', 'https://%s' % self.m.tryserver.gerrit_change.host,
'--target_ref', self.m.tryserver.gerrit_change_target_ref,
'--gerrit_fetch', '--gerrit_fetch',
] ]
if self.m.cq.state == self.m.cq.DRY: if self.m.cq.state == self.m.cq.DRY:

@ -2958,6 +2958,9 @@ class ChangelistTest(unittest.TestCase):
mock.patch('git_cl.Changelist.GetAuthor', return_value='author').start() mock.patch('git_cl.Changelist.GetAuthor', return_value='author').start()
mock.patch('git_cl.Changelist.GetIssue', return_value=123456).start() mock.patch('git_cl.Changelist.GetIssue', return_value=123456).start()
mock.patch('git_cl.Changelist.GetPatchset', return_value=7).start() mock.patch('git_cl.Changelist.GetPatchset', return_value=7).start()
mock.patch('git_cl.Changelist.GetRemoteBranch',
return_value=('foo', 'bar')).start()
mock.patch('git_cl.GetTargetRef', return_value='ref').start()
mock.patch('git_cl.PRESUBMIT_SUPPORT', 'PRESUBMIT_SUPPORT').start() mock.patch('git_cl.PRESUBMIT_SUPPORT', 'PRESUBMIT_SUPPORT').start()
mock.patch('git_cl.Settings.GetRoot', return_value='root').start() mock.patch('git_cl.Settings.GetRoot', return_value='root').start()
mock.patch('git_cl.time_time').start() mock.patch('git_cl.time_time').start()
@ -3000,6 +3003,7 @@ class ChangelistTest(unittest.TestCase):
'--gerrit_url', 'https://chromium-review.googlesource.com', '--gerrit_url', 'https://chromium-review.googlesource.com',
'--issue', '123456', '--issue', '123456',
'--patchset', '7', '--patchset', '7',
'--target_ref', 'ref',
'--commit', '--commit',
'--may_prompt', '--may_prompt',
'--parallel', '--parallel',
@ -3048,6 +3052,7 @@ class ChangelistTest(unittest.TestCase):
'vpython', 'PRESUBMIT_SUPPORT', 'vpython', 'PRESUBMIT_SUPPORT',
'--root', 'root', '--root', 'root',
'--upstream', 'upstream', '--upstream', 'upstream',
'--target_ref', 'ref',
'--upload', '--upload',
'--json_output', '/tmp/fake-temp2', '--json_output', '/tmp/fake-temp2',
'--description_file', '/tmp/fake-temp1', '--description_file', '/tmp/fake-temp1',
@ -3095,6 +3100,7 @@ class ChangelistTest(unittest.TestCase):
'vpython', 'PRESUBMIT_SUPPORT', 'vpython', 'PRESUBMIT_SUPPORT',
'--root', 'root', '--root', 'root',
'--upstream', 'upstream', '--upstream', 'upstream',
'--target_ref', 'ref',
'--upload', '--upload',
'--json_output', '/tmp/fake-temp2', '--json_output', '/tmp/fake-temp2',
'--description_file', '/tmp/fake-temp1', '--description_file', '/tmp/fake-temp1',
@ -3135,6 +3141,7 @@ class ChangelistTest(unittest.TestCase):
'--gerrit_url', 'https://chromium-review.googlesource.com', '--gerrit_url', 'https://chromium-review.googlesource.com',
'--issue', '123456', '--issue', '123456',
'--patchset', '7', '--patchset', '7',
'--target_ref', 'ref',
'--post_upload', '--post_upload',
'--description_file', '/tmp/fake-temp1', '--description_file', '/tmp/fake-temp1',
]) ])

@ -275,6 +275,13 @@ class GetCodeOwnersClientTest(unittest.TestCase):
mock.patch('gerrit_util.IsCodeOwnersEnabled').start() mock.patch('gerrit_util.IsCodeOwnersEnabled').start()
self.addCleanup(mock.patch.stopall) self.addCleanup(mock.patch.stopall)
def testGetCodeOwnersClient_NoHost(self):
owners_client.GetCodeOwnersClient('root', None, 'project', 'branch')
gerrit_util.IsCodeOwnersEnabled.assert_not_called()
owners_client.GetCodeOwnersClient('root', '', 'project', 'branch')
gerrit_util.IsCodeOwnersEnabled.assert_not_called()
def testGetCodeOwnersClient_GerritClient(self): def testGetCodeOwnersClient_GerritClient(self):
gerrit_util.IsCodeOwnersEnabled.return_value = True gerrit_util.IsCodeOwnersEnabled.return_value = True
self.assertIsInstance( self.assertIsInstance(

@ -184,6 +184,7 @@ index fe3de7b..54ae6e1 100755
mock.patch('os.path.abspath', lambda f: f).start() mock.patch('os.path.abspath', lambda f: f).start()
mock.patch('os.path.isfile').start() mock.patch('os.path.isfile').start()
mock.patch('os.remove').start() mock.patch('os.remove').start()
mock.patch('owners_client.GetCodeOwnersClient').start()
mock.patch('presubmit_support._parse_files').start() mock.patch('presubmit_support._parse_files').start()
mock.patch('presubmit_support.rdb_wrapper.client', mock.patch('presubmit_support.rdb_wrapper.client',
return_value=self.rdb_client).start() return_value=self.rdb_client).start()
@ -1144,9 +1145,10 @@ def CheckChangeOnCommit(input_api, output_api):
upstream=options.upstream) upstream=options.upstream)
scm.GIT.GetAllFiles.assert_called_once_with(options.root) scm.GIT.GetAllFiles.assert_called_once_with(options.root)
def testParseGerritOptions_NoGerritUrl(self): def testParseGerritOptions_NoGerritUrlOrProject(self):
options = mock.Mock( options = mock.Mock(
gerrit_url=None, gerrit_url=None,
gerrit_project=None,
gerrit_fetch=False, gerrit_fetch=False,
author='author', author='author',
description='description') description='description')
@ -1160,14 +1162,16 @@ def CheckChangeOnCommit(input_api, output_api):
def testParseGerritOptions_NoGerritFetch(self): def testParseGerritOptions_NoGerritFetch(self):
options = mock.Mock( options = mock.Mock(
gerrit_url='https://foo-review.googlesource.com/bar', gerrit_url='https://foo-review.googlesource.com/bar',
gerrit_project='baz/project',
gerrit_fetch=False, gerrit_fetch=False,
target_ref='refs/heads/foobar',
author='author', author='author',
description='description') description='description')
gerrit_obj = presubmit._parse_gerrit_options(None, options) gerrit_obj = presubmit._parse_gerrit_options(None, options)
presubmit.GerritAccessor.assert_called_once_with( presubmit.GerritAccessor.assert_called_once_with(
'foo-review.googlesource.com') 'foo-review.googlesource.com', 'baz/project', 'refs/heads/foobar')
self.assertEqual(presubmit.GerritAccessor.return_value, gerrit_obj) self.assertEqual(presubmit.GerritAccessor.return_value, gerrit_obj)
self.assertEqual('author', options.author) self.assertEqual('author', options.author)
self.assertEqual('description', options.description) self.assertEqual('description', options.description)
@ -1181,14 +1185,16 @@ def CheckChangeOnCommit(input_api, output_api):
options = mock.Mock( options = mock.Mock(
gerrit_url='https://foo-review.googlesource.com/bar', gerrit_url='https://foo-review.googlesource.com/bar',
gerrit_project='baz/project',
gerrit_fetch=True, gerrit_fetch=True,
target_ref='refs/heads/foobar',
issue=123, issue=123,
patchset=4) patchset=4)
gerrit_obj = presubmit._parse_gerrit_options(None, options) gerrit_obj = presubmit._parse_gerrit_options(None, options)
presubmit.GerritAccessor.assert_called_once_with( presubmit.GerritAccessor.assert_called_once_with(
'foo-review.googlesource.com') 'foo-review.googlesource.com', 'baz/project', 'refs/heads/foobar')
self.assertEqual(presubmit.GerritAccessor.return_value, gerrit_obj) self.assertEqual(presubmit.GerritAccessor.return_value, gerrit_obj)
self.assertEqual('new owner', options.author) self.assertEqual('new owner', options.author)
self.assertEqual('new description', options.description) self.assertEqual('new description', options.description)

Loading…
Cancel
Save