# Copyright 2024 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
PRESUBMIT_VERSION = '2.0.0'
USE_PYTHON3 = True
def _CheckDepsFileProhibitingChromeExists(input_api, output_api):
"""Enforce that each top-level directory in //chrome/browser/ash has DEPS file
which prohibits //chrome.
This ensures that any new //chrome dependencies added in this directory are
reviewed by a //chrome OWNER. There is an active effort to refactor
//chrome/browser/ash to break these dependencies; see b/332804822.
"""
_CHROME_BROWSER_ASH = input_api.os_path.join('chrome', 'browser', 'ash')
missing_deps_files = set()
deps_files_not_prohibiting_chrome = set()
for f in input_api.AffectedFiles(False):
# Path relative to chrome/browser/ash.
# Example: For 'chrome/browser/ash/foo/bar/baz.h' => 'foo/bar/baz.h'.
relative_path = input_api.os_path.relpath(f.LocalPath(),
_CHROME_BROWSER_ASH)
# Split path for this relative path.
# Example: For 'foo/bar/baz.h' => ['foo' 'bar/baz.h'].
splitPath = relative_path.split(input_api.os_path.sep, 1)
# If the split path contains 1 or fewer elements, it is not in a
# subdirectory (e.g., len == 1 would be a file directly in
# //chrome/browser/ash).
if len(splitPath) <= 1:
continue
# DEPS relative to chrome/browser/ash.
relative_deps_files_path = input_api.os_path.join(splitPath[0], 'DEPS')
# Absolute DEPS path.
deps_file_path = input_api.os_path.join(input_api.PresubmitLocalPath(),
relative_deps_files_path)
# DEPS relative to repo root.
local_deps_file_path = input_api.os_path.join(_CHROME_BROWSER_ASH,
relative_deps_files_path)
if not input_api.os_path.exists(deps_file_path):
missing_deps_files.add(local_deps_file_path)
continue
# If the affected file is not a DEPS file, move onto the next file to check.
if f.LocalPath() != local_deps_file_path:
continue
# If the affected file *is* a DEPS file, confirm that it has a "-chrome"
# rule, prohibiting new //chrome dependencies.
prohibit_chrome_pattern = input_api.re.compile(r'\"\-chrome\"')
if not prohibit_chrome_pattern.search(input_api.ReadFile(deps_file_path)):
deps_files_not_prohibiting_chrome.add(local_deps_file_path)
results = []
if missing_deps_files:
dir_text = ''
for dir in missing_deps_files:
dir_text += dir + ', '
dir_text = dir_text[:-2]
results.append(output_api.PresubmitError(
"Subdirectories in //chrome/browser/ash require a DEPS file. Please "
"create DEPS files: [%s]. See b/332805865 and "
"//tools/chromeos/gen_deps.sh for details." % (dir_text)
))
if deps_files_not_prohibiting_chrome:
deps_text = ''
for deps_file in deps_files_not_prohibiting_chrome:
deps_text += deps_file + ', '
deps_text = deps_text[:-2]
results.append(output_api.PresubmitError(
"DEPS files in subdirectories of in //chrome/browser/ash must prohibit "
"new //chrome dependencies. Please ensure a \"-chrome\" rule is added "
"in [%s]. See b/332805865 and //tools/chromeos/gen_deps.sh for "
" details." % (deps_text)
))
return results
def CheckChangeOnUpload(input_api, output_api):
return _CheckDepsFileProhibitingChromeExists(input_api, output_api)
def CheckChangeOnCommit(input_api, output_api):
return _CheckDepsFileProhibitingChromeExists(input_api, output_api)