[owners][git-cl] Use owners client to show all owners for a file.
Change-Id: I04949d95ca466452a58ea91cf2db86852c0621bd
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/2551378
Commit-Queue: Edward Lesmes <ehmaldonado@chromium.org>
Auto-Submit: Edward Lesmes <ehmaldonado@chromium.org>
Reviewed-by: Anthony Polito <apolito@google.com>
diff --git a/git_cl.py b/git_cl.py
index f1772c7..b9a3567 100755
--- a/git_cl.py
+++ b/git_cl.py
@@ -43,6 +43,7 @@
import metrics
import metrics_utils
import owners
+import owners_client
import owners_finder
import presubmit_canned_checks
import presubmit_support
@@ -1251,7 +1252,7 @@
assert self.GetIssue(), 'issue is required to update description'
if gerrit_util.HasPendingChangeEdit(
- self._GetGerritHost(), self._GerritChangeIdentifier()):
+ self.GetGerritHost(), self._GerritChangeIdentifier()):
if not force:
confirm_or_exit(
'The description cannot be modified while the issue has a pending '
@@ -1259,9 +1260,9 @@
'or delete it.\n\n', action='delete the unpublished edit')
gerrit_util.DeletePendingChangeEdit(
- self._GetGerritHost(), self._GerritChangeIdentifier())
+ self.GetGerritHost(), self._GerritChangeIdentifier())
gerrit_util.SetCommitMessage(
- self._GetGerritHost(), self._GerritChangeIdentifier(),
+ self.GetGerritHost(), self._GerritChangeIdentifier(),
description, notify='NONE')
self.description = description
@@ -1307,7 +1308,7 @@
gclient_utils.FileWrite(description_file, description)
args.extend(['--json_output', json_output])
args.extend(['--description_file', description_file])
- args.extend(['--gerrit_project', self._GetGerritProject()])
+ args.extend(['--gerrit_project', self.GetGerritProject()])
start = time_time()
cmd = ['vpython', PRESUBMIT_SUPPORT] + args
@@ -1479,7 +1480,7 @@
labels = {'Commit-Queue': vote_map[new_state]}
notify = False if new_state == _CQState.DRY_RUN else None
gerrit_util.SetReview(
- self._GetGerritHost(), self._GerritChangeIdentifier(),
+ self.GetGerritHost(), self._GerritChangeIdentifier(),
labels=labels, notify=notify)
return 0
except KeyboardInterrupt:
@@ -1497,7 +1498,7 @@
# Still raise exception so that stack trace is printed.
raise
- def _GetGerritHost(self):
+ def GetGerritHost(self):
# Lazy load of configs.
self.GetCodereviewServer()
if self._gerrit_host and '.' not in self._gerrit_host:
@@ -1536,7 +1537,7 @@
self._gerrit_server = 'https://%s' % self._gerrit_host
return self._gerrit_server
- def _GetGerritProject(self):
+ def GetGerritProject(self):
"""Returns Gerrit project name based on remote git URL."""
remote_url = self.GetRemoteUrl()
if remote_url is None:
@@ -1561,7 +1562,7 @@
Not to be confused by value of "Change-Id:" footer.
If Gerrit project can be determined, this will speed up Gerrit HTTP API RPC.
"""
- project = self._GetGerritProject()
+ project = self.GetGerritProject()
if project:
return gerrit_util.ChangeIdentifier(project, self.GetIssue())
# Fall back on still unique, but less efficient change number.
@@ -1647,14 +1648,14 @@
if not isinstance(cookies_auth, gerrit_util.CookiesAuthenticator):
return
- cookies_user = cookies_auth.get_auth_email(self._GetGerritHost())
+ cookies_user = cookies_auth.get_auth_email(self.GetGerritHost())
if self.GetIssueOwner() == cookies_user:
return
logging.debug('change %s owner is %s, cookies user is %s',
self.GetIssue(), self.GetIssueOwner(), cookies_user)
# Maybe user has linked accounts or something like that,
# so ask what Gerrit thinks of this user.
- details = gerrit_util.GetAccountDetails(self._GetGerritHost(), 'self')
+ details = gerrit_util.GetAccountDetails(self.GetGerritHost(), 'self')
if details['email'] == self.GetIssueOwner():
return
if not force:
@@ -1757,7 +1758,7 @@
def AddComment(self, message, publish=None):
gerrit_util.SetReview(
- self._GetGerritHost(), self._GerritChangeIdentifier(),
+ self.GetGerritHost(), self._GerritChangeIdentifier(),
msg=message, ready=publish)
def GetCommentsSummary(self, readable=True):
@@ -1768,9 +1769,9 @@
options=['MESSAGES', 'DETAILED_ACCOUNTS',
'CURRENT_REVISION']).get('messages', [])
file_comments = gerrit_util.GetChangeComments(
- self._GetGerritHost(), self._GerritChangeIdentifier())
+ self.GetGerritHost(), self._GerritChangeIdentifier())
robot_file_comments = gerrit_util.GetChangeRobotComments(
- self._GetGerritHost(), self._GerritChangeIdentifier())
+ self.GetGerritHost(), self._GerritChangeIdentifier())
# Add the robot comments onto the list of comments, but only
# keep those that are from the latest patchset.
@@ -1796,7 +1797,7 @@
patchset = 'PS%d' % comment['patch_set']
line = comment.get('line', 0)
url = ('https://%s/c/%s/%s/%s#%s%s' %
- (self._GetGerritHost(), self.GetIssue(), comment['patch_set'], path,
+ (self.GetGerritHost(), self.GetIssue(), comment['patch_set'], path,
'b' if comment.get('side') == 'PARENT' else '',
str(line) if line else ''))
comments[key][path][patchset][line] = (url, comment['message'])
@@ -1856,11 +1857,11 @@
def CloseIssue(self):
gerrit_util.AbandonChange(
- self._GetGerritHost(), self._GerritChangeIdentifier(), msg='')
+ self.GetGerritHost(), self._GerritChangeIdentifier(), msg='')
def SubmitIssue(self, wait_for_merge=True):
gerrit_util.SubmitChange(
- self._GetGerritHost(), self._GerritChangeIdentifier(),
+ self.GetGerritHost(), self._GerritChangeIdentifier(),
wait_for_merge=wait_for_merge)
def _GetChangeDetail(self, options=None):
@@ -1888,7 +1889,7 @@
try:
data = gerrit_util.GetChangeDetail(
- self._GetGerritHost(), self._GerritChangeIdentifier(), options_set)
+ self.GetGerritHost(), self._GerritChangeIdentifier(), options_set)
except gerrit_util.GerritError as e:
if e.http_status == 404:
raise GerritChangeNotExists(self.GetIssue(), self.GetCodereviewServer())
@@ -1901,7 +1902,7 @@
assert self.GetIssue(), 'issue must be set to query Gerrit'
try:
data = gerrit_util.GetChangeCommit(
- self._GetGerritHost(), self._GerritChangeIdentifier())
+ self.GetGerritHost(), self._GerritChangeIdentifier())
except gerrit_util.GerritError as e:
if e.http_status == 404:
raise GerritChangeNotExists(self.GetIssue(), self.GetCodereviewServer())
@@ -2189,7 +2190,7 @@
remote, remote_branch = self.GetRemoteBranch()
should_retry = remote_branch == DEFAULT_OLD_BRANCH and \
gerrit_util.GetProjectHead(
- self._gerrit_host, self._GetGerritProject()) == 'refs/heads/main'
+ self._gerrit_host, self.GetGerritProject()) == 'refs/heads/main'
if not should_retry:
DieWithError(str(e), change_desc)
@@ -2273,12 +2274,12 @@
cc = [email.strip() for email in cc if email.strip()]
if change_desc.get_cced():
cc.extend(change_desc.get_cced())
- if self._GetGerritHost() == 'chromium-review.googlesource.com':
+ if self.GetGerritHost() == 'chromium-review.googlesource.com':
valid_accounts = set(reviewers + cc)
# TODO(crbug/877717): relax this for all hosts.
else:
valid_accounts = gerrit_util.ValidAccounts(
- self._GetGerritHost(), reviewers + cc)
+ self.GetGerritHost(), reviewers + cc)
logging.info('accounts %s are recognized, %s invalid',
sorted(valid_accounts),
set(reviewers + cc).difference(set(valid_accounts)))
@@ -2341,8 +2342,8 @@
if change_desc.get_reviewers(tbr_only=True):
score = gerrit_util.GetCodeReviewTbrScore(
- self._GetGerritHost(),
- self._GetGerritProject())
+ self.GetGerritHost(),
+ self.GetGerritProject())
refspec_opts.append('l=Code-Review+%s' % score)
# Gerrit sorts hashtags, so order is not important.
@@ -2359,7 +2360,7 @@
refspec = '%s:refs/for/%s%s' % (ref_to_push, branch, refspec_suffix)
git_push_metadata = {
- 'gerrit_host': self._GetGerritHost(),
+ 'gerrit_host': self.GetGerritHost(),
'title': options.title or '<untitled>',
'change_id': change_id,
'description': change_desc.description,
@@ -2383,7 +2384,7 @@
# GetIssue() is not set in case of non-squash uploads according to tests.
# TODO(crbug.com/751901): non-squash uploads in git cl should be removed.
gerrit_util.AddReviewers(
- self._GetGerritHost(),
+ self.GetGerritHost(),
self._GerritChangeIdentifier(),
reviewers, cc,
notify=bool(options.send_mail))
@@ -4769,12 +4770,15 @@
if len(args) == 0:
print('No files specified for --show-all. Nothing to do.')
return 0
+ project = cl.GetGerritProject()
+ branch = cl.GetCommonAncestorWithUpstream()
+ client = owners_client.DepotToolsClient(
+ host=cl.GetGerritHost(),
+ root=settings.GetRoot(),
+ branch=branch)
for arg in args:
- base_branch = cl.GetCommonAncestorWithUpstream()
- database = owners.Database(settings.GetRoot(), open, os.path)
- database.load_data_needed_for([arg])
print('Owners for %s:' % arg)
- for owner in sorted(database.all_possible_owners([arg], None)):
+ for owner in client.ListOwnersForFile(project, branch, arg):
print(' - %s' % owner)
return 0
diff --git a/owners_client.py b/owners_client.py
index e5f2be1..49be62f 100644
--- a/owners_client.py
+++ b/owners_client.py
@@ -79,7 +79,7 @@
class DepotToolsClient(OwnersClient):
"""Implement OwnersClient using owners.py Database."""
- def __init__(self, host, root, fopen, os_path, branch):
+ def __init__(self, host, root, branch, fopen=open, os_path=os.path):
super(DepotToolsClient, self).__init__(host)
self._root = root
self._fopen = fopen
diff --git a/tests/git_cl_test.py b/tests/git_cl_test.py
index 18852b1..8b144e8 100755
--- a/tests/git_cl_test.py
+++ b/tests/git_cl_test.py
@@ -231,7 +231,7 @@
side_effect=[git_cl.GitPushError(), None]).start()
mock.patch('git_cl.Changelist.GetRemoteBranch',
return_value=('foo', 'bar')).start()
- mock.patch('git_cl.Changelist._GetGerritProject',
+ mock.patch('git_cl.Changelist.GetGerritProject',
return_value='foo').start()
mock.patch('git_cl.gerrit_util.GetProjectHead',
return_value='refs/heads/main').start()
@@ -253,7 +253,7 @@
side_effect=[git_cl.GitPushError(), None]).start()
mock.patch('git_cl.Changelist.GetRemoteBranch',
return_value=('foo', git_cl.DEFAULT_OLD_BRANCH)).start()
- mock.patch('git_cl.Changelist._GetGerritProject',
+ mock.patch('git_cl.Changelist.GetGerritProject',
return_value='foo').start()
mock.patch('git_cl.gerrit_util.GetProjectHead',
return_value='refs/heads/old_default').start()
@@ -275,7 +275,7 @@
side_effect=[git_cl.GitPushError(), None]).start()
mock.patch('git_cl.Changelist.GetRemoteBranch',
return_value=('foo', git_cl.DEFAULT_OLD_BRANCH)).start()
- mock.patch('git_cl.Changelist._GetGerritProject',
+ mock.patch('git_cl.Changelist.GetGerritProject',
return_value='foo').start()
mock.patch('git_cl.gerrit_util.GetProjectHead',
return_value='refs/heads/main').start()
@@ -2236,7 +2236,7 @@
sys.stdout.getvalue())
def _mock_gerrit_changes_for_detail_cache(self):
- mock.patch('git_cl.Changelist._GetGerritHost', lambda _: 'host').start()
+ mock.patch('git_cl.Changelist.GetGerritHost', lambda _: 'host').start()
def test_gerrit_change_detail_cache_simple(self):
self._mock_gerrit_changes_for_detail_cache()
@@ -2760,7 +2760,7 @@
mock.patch('git_cl.time_time').start()
mock.patch('metrics.collector').start()
mock.patch('subprocess2.Popen').start()
- mock.patch('git_cl.Changelist._GetGerritProject',
+ mock.patch('git_cl.Changelist.GetGerritProject',
return_value='https://chromium-review.googlesource.com').start()
self.addCleanup(mock.patch.stopall)
self.temp_count = 0
@@ -2987,7 +2987,7 @@
'git_cl.Changelist.GetCodereviewServer',
return_value='https://chromium-review.googlesource.com').start()
mock.patch(
- 'git_cl.Changelist._GetGerritHost',
+ 'git_cl.Changelist.GetGerritHost',
return_value='chromium-review.googlesource.com').start()
mock.patch(
'git_cl.Changelist.GetMostRecentPatchset',
diff --git a/tests/owners_client_test.py b/tests/owners_client_test.py
index 691c24e..58cc4cc 100644
--- a/tests/owners_client_test.py
+++ b/tests/owners_client_test.py
@@ -78,7 +78,7 @@
return_value={}).start()
self.addCleanup(mock.patch.stopall)
self.client = owners_client.DepotToolsClient(
- 'host', '/', self.fopen, self.repo, 'branch')
+ 'host', '/', 'branch', self.fopen, self.repo)
def testListOwners(self):
self.assertEquals(