Commit b08ce7a3 authored by Mike Frysinger's avatar Mike Frysinger Committed by Commit Bot

externs: refactor the list of generated externs

This makes the externs util code easier to use by other presubmit
tests by reducing a lot of boilerplate.

This also enforces a rule that was being used in practice: the input
& output names have to match (other than file extension).  So instead
of letting the code map "downloads.idl" to the externs "whatever.js"
name, the output must now always be "downloads.js".

If we ignore the Chromecast & app_shell forks of the Chromium project,
this rule holds.  Those forks cause problems by providing extensions
to a few APIs and thus use duplicate source names.  imo, those forks
should be providing their own separate externs tree if they want to
provide externs (which they don't currently), although I suspect the
users are so few that no one will bother.

Bug: 469920
Change-Id: Icb9d2ba4ad78c3c607a09402c82841fb745b4b78
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2215901
Commit-Queue: Mike Frysinger <vapier@chromium.org>
Reviewed-by: default avatarDevlin <rdevlin.cronin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#771917}
parent 300e9bdf
...@@ -13,47 +13,15 @@ import sys ...@@ -13,47 +13,15 @@ import sys
def _CheckExterns(input_api, output_api): def _CheckExterns(input_api, output_api):
original_sys_path = sys.path original_sys_path = sys.path
join = input_api.os_path.join join = input_api.os_path.join
api_root = input_api.PresubmitLocalPath() src_root = input_api.change.RepositoryRoot()
src_root = join(api_root, '..', '..', '..', '..')
try: try:
sys.path.append(join(src_root, 'extensions', 'common', 'api')) sys.path.append(join(src_root, 'extensions', 'common', 'api'))
from externs_checker import ExternsChecker from externs_checker import ExternsChecker
finally: finally:
sys.path = original_sys_path sys.path = original_sys_path
externs_root = join(src_root, 'third_party', 'closure_compiler', 'externs') return ExternsChecker(input_api, output_api).RunChecks()
api_pair_names = {
'accessibility_private.json': 'accessibility_private.js',
'activity_log_private.json': 'activity_log_private.js',
'autofill_private.idl': 'autofill_private.js',
'developer_private.idl': 'developer_private.js',
'bookmark_manager_private.json': 'bookmark_manager_private.js',
'command_line_private.json': 'command_line_private.js',
'file_manager_private.idl': 'file_manager_private.js',
'file_system_provider.idl': 'file_system_provider.js',
'input_method_private.json': 'input_method_private.js',
'language_settings_private.idl': 'language_settings_private.js',
'media_player_private.json': 'media_player_private.js',
'passwords_private.idl': 'passwords_private.js',
'quick_unlock_private.idl': 'quick_unlock_private.js',
'resources_private.idl': 'resources_private.js',
'safe_browsing_private.idl': 'safe_browsing_private.js',
'settings_private.idl': 'settings_private.js',
'system_private.json': 'system_private.js',
'terminal_private.json': 'terminal_private.js',
'users_private.idl': 'users_private.js',
# TODO(rdevlin.cronin): Add more!
}
normpath = input_api.os_path.normpath
api_pairs = {
normpath(join(api_root, k)):
normpath(join(externs_root, v)) for k, v in api_pair_names.items()
}
return ExternsChecker(input_api, output_api, api_pairs).RunChecks()
def CheckChangeOnUpload(input_api, output_api): def CheckChangeOnUpload(input_api, output_api):
......
# All APIs that have their externs generated.
# TODO(rdevlin.cronin): Add more!
accessibility_private.json
activity_log_private.json
autofill_private.idl
bookmark_manager_private.json
command_line_private.json
developer_private.idl
file_manager_private.idl
file_system_provider.idl
input_method_private.json
language_settings_private.idl
media_player_private.json
passwords_private.idl
quick_unlock_private.idl
resources_private.idl
safe_browsing_private.idl
settings_private.idl
system_private.json
terminal_private.json
users_private.idl
...@@ -13,38 +13,13 @@ import sys ...@@ -13,38 +13,13 @@ import sys
def _CheckExterns(input_api, output_api): def _CheckExterns(input_api, output_api):
original_sys_path = sys.path original_sys_path = sys.path
try: try:
sys.path.append(input_api.PresubmitLocalPath()) sys.path.append(input_api.PresubmitLocalPath())
from externs_checker import ExternsChecker from externs_checker import ExternsChecker
finally: finally:
sys.path = original_sys_path sys.path = original_sys_path
join = input_api.os_path.join return ExternsChecker(input_api, output_api).RunChecks()
api_root = input_api.PresubmitLocalPath()
externs_root = input_api.os_path.abspath(join(
api_root, '..', '..', '..', 'third_party', 'closure_compiler', 'externs'))
api_pairs = {
join(api_root, 'audio.idl'): join(externs_root, 'audio.js'),
join(api_root, 'automation.idl'): join(externs_root, 'automation.js'),
join(api_root, 'bluetooth.idl'): join(externs_root, 'bluetooth.js'),
join(api_root, 'bluetooth_private.idl'):
join(externs_root, 'bluetooth_private.js'),
join(api_root, 'clipboard.idl'): join(externs_root, 'clipboard.js'),
join(api_root, 'management.json'): join(externs_root, 'management.js'),
join(api_root, 'metrics_private.json'):
join(externs_root, 'metrics_private.js'),
join(api_root, 'mime_handler_private.idl'):
join(externs_root, 'mime_handler_private.js'),
join(api_root, 'networking_private.idl'):
join(externs_root, 'networking_private.js'),
join(api_root, 'system_display.idl'):
join(externs_root, 'system_display.js'),
# TODO(rdevlin.cronin): Add more!
}
return ExternsChecker(input_api, output_api, api_pairs).RunChecks()
def CheckChangeOnUpload(input_api, output_api): def CheckChangeOnUpload(input_api, output_api):
......
...@@ -7,7 +7,10 @@ class ExternsChecker(object): ...@@ -7,7 +7,10 @@ class ExternsChecker(object):
src/ $ python tools/json_schema_compiler/compiler.py\ src/ $ python tools/json_schema_compiler/compiler.py\
%s --root=. --generator=externs > %s""" %s --root=. --generator=externs > %s"""
def __init__(self, input_api, output_api, api_pairs): def __init__(self, input_api, output_api, api_pairs=None, api_root=None):
if api_pairs is None:
api_pairs = self.ParseApiFileList(input_api, api_root=api_root)
self._input_api = input_api self._input_api = input_api
self._output_api = output_api self._output_api = output_api
self._api_pairs = api_pairs self._api_pairs = api_pairs
...@@ -16,6 +19,31 @@ class ExternsChecker(object): ...@@ -16,6 +19,31 @@ class ExternsChecker(object):
if not input_api.os_path.exists(path): if not input_api.os_path.exists(path):
raise OSError('Path Not Found: %s' % path) raise OSError('Path Not Found: %s' % path)
@staticmethod
def ParseApiFileList(input_api, api_root=None):
"""Extract the API pairs from the registered list."""
if api_root is None:
api_root = input_api.PresubmitLocalPath()
externs_root = input_api.os_path.join(
input_api.change.RepositoryRoot(), 'third_party', 'closure_compiler',
'externs')
ret = {}
listing = input_api.os_path.join(api_root, 'generated_externs_list.txt')
for line in input_api.ReadFile(listing).splitlines():
# Skip blank & comment lines.
if not line.split('#', 1)[0].strip():
continue
source = input_api.os_path.join(api_root, line)
api_name, ext = line.rsplit('.', 1)
assert ext == 'json' or ext == 'idl'
externs = input_api.os_path.join(externs_root, api_name + '.js')
ret[source] = externs
assert ret
return ret
def RunChecks(self): def RunChecks(self):
bad_files = [] bad_files = []
affected = [f.AbsoluteLocalPath() for f in affected = [f.AbsoluteLocalPath() for f in
......
# APIs that have their externs generated.
# TODO(rdevlin.cronin): Add more!
audio.idl
automation.idl
bluetooth.idl
bluetooth_private.idl
clipboard.idl
management.json
metrics_private.json
mime_handler_private.idl
networking_private.idl
system_display.idl
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment