From 00da57f2daaf23cbe41a8f4c547378c60371db96 Mon Sep 17 00:00:00 2001 From: Aleksey Khoroshilov Date: Tue, 20 Sep 2022 20:36:39 +0700 Subject: [PATCH] Add chromium PRESUBMIT configuration support. --- chromium_presubmit_config.json5 | 299 +++++++++++++++++++++ patches/PRESUBMIT.py.patch | 4 +- script/chromium_presubmit_overrides.py | 357 +++++++++++++------------ script/lib/chromium_presubmit_utils.py | 42 --- script/override_utils.py | 18 +- 5 files changed, 502 insertions(+), 218 deletions(-) create mode 100644 chromium_presubmit_config.json5 delete mode 100644 script/lib/chromium_presubmit_utils.py diff --git a/chromium_presubmit_config.json5 b/chromium_presubmit_config.json5 new file mode 100644 index 00000000000..604ce3c184f --- /dev/null +++ b/chromium_presubmit_config.json5 @@ -0,0 +1,299 @@ +{ + "disabled_checks": { + // Checks defined in the PRESUBMIT.py global scope. + "global": [ + // We don't use OWNERS files. + "CheckSecurityOwners", + // This validates added strings with screenshot tests which we don't use. + "CheckStrings", + // We don't update upstream pydeps. + "CheckPydepsNeedsUpdating", + // Disable check for .*google.* images being added to the repository. + "CheckNoProductIconsAddedToPublicRepo", + // Disable check for Google support URLs. + "CheckGoogleSupportAnswerUrlOnUpload", + // Disable check for hardcoded Google API urls. + "CheckHardcodedGoogleHostsInLowerLayers", + ], + // Checks defined in depot_tools/presubmit_canned_checks.py. + "canned": [ + // Disable Chromium license check. We use our own checker. + "CheckLicense", + // We don't use OWNERS files. + "CheckOwnersFormat", + "CheckOwners", + // We don't use AUTHORS file. + "CheckAuthorizedAuthor", + // We don't upload change to Chromium version control. + "CheckChangeWasUploaded", + "CheckChangeHasBugField", + "CheckTreeIsOpen", + ], + }, + + // Checks that should trigger presubmit errors instead of warnings. + "checks_to_force_presubmit_errors": { + "global": [ + "CheckBuildConfigMacrosWithoutInclude", + "CheckForSuperfluousStlIncludesInHeaders", + "CheckForIncludeGuards", + "CheckGnGlobForward", + "CheckNewHeaderWithoutGnChangeOnUpload", + ], + "canned": [ + "CheckChangeLintsClean", + "GetPylint", + "CheckPatchFormatted", + ], + }, + + // Files to skip in all checks. + "default_files_to_skip": [ + "\\.storybook/", + "ios/browser/api/ledger/legacy_database/core_data_models/", + "win_build_output/", + ], + + // Regex to match function names in the current presubmit stack trace. Matched + // functions are used in `per_check_files_to_skip` filter. + "check_function_regex": "_?Check", + + // Files to skip per check. + "per_check_files_to_skip": { + // Permanent ignores. + "CheckNewHeaderWithoutGnChangeOnUpload": ["chromium_src/"], + "CheckForCcIncludes": ["chromium_src/"], + "CheckForRelativeIncludes": ["chromium_src/"], + "CheckParseErrors": [ + ".*tsconfig\\.json", + "vendor/bat-native-ads/data/test/invalid\\.json", + ], + + // Checks to be fixed. + "CheckJavaStyle": [".*\\.java"], + "CheckUnwantedDependencies": [".*\\.java"], + "CheckNoBannedFunctions": [ + "base/mac/conversions\\.h", + "browser/brave_ads/notification_helper/notification_helper_impl_win\\.cc", + "browser/mac/sparkle_glue\\.mm", + "browser/net/brave_ad_block_csp_network_delegate_helper\\.cc", + "browser/net/brave_ad_block_csp_network_delegate_helper\\.h", + "browser/net/brave_ad_block_tp_network_delegate_helper\\.cc", + "browser/net/brave_ad_block_tp_network_delegate_helper\\.h", + "browser/net/brave_ad_block_tp_network_delegate_helper_unittest\\.cc", + "browser/net/brave_common_static_redirect_network_delegate_helper\\.cc", + "browser/net/brave_common_static_redirect_network_delegate_helper\\.h", + "browser/net/brave_httpse_network_delegate_helper\\.cc", + "browser/net/brave_httpse_network_delegate_helper\\.h", + "browser/net/brave_httpse_network_delegate_helper_unittest\\.cc", + "browser/net/brave_proxying_url_loader_factory\\.h", + "browser/net/brave_proxying_web_socket\\.h", + "browser/net/brave_reduce_language_network_delegate_helper\\.cc", + "browser/net/brave_reduce_language_network_delegate_helper\\.h", + "browser/net/brave_referrals_network_delegate_helper\\.cc", + "browser/net/brave_referrals_network_delegate_helper\\.h", + "browser/net/brave_request_handler\\.cc", + "browser/net/brave_request_handler\\.h", + "browser/net/brave_service_key_network_delegate_helper\\.cc", + "browser/net/brave_service_key_network_delegate_helper\\.h", + "browser/net/brave_site_hacks_network_delegate_helper\\.cc", + "browser/net/brave_site_hacks_network_delegate_helper\\.h", + "browser/net/brave_static_redirect_network_delegate_helper\\.cc", + "browser/net/brave_static_redirect_network_delegate_helper\\.h", + "browser/net/brave_torrent_redirect_network_delegate_helper\\.cc", + "browser/net/brave_torrent_redirect_network_delegate_helper\\.h", + "browser/net/decentralized_dns_network_delegate_helper\\.cc", + "browser/net/decentralized_dns_network_delegate_helper\\.h", + "browser/net/global_privacy_control_network_delegate_helper\\.cc", + "browser/net/global_privacy_control_network_delegate_helper\\.h", + "browser/net/ipfs_redirect_network_delegate_helper\\.cc", + "browser/net/ipfs_redirect_network_delegate_helper\\.h", + "browser/net/url_context\\.cc", + "browser/net/url_context\\.h", + "browser/ui/webui/brave_rewards_page_ui\\.cc", + "browser/ui/webui/new_tab_page/brave_new_tab_ui_browsertest\\.cc", + "browser/ui/webui/private_new_tab_page/brave_private_new_tab_page_browsertest\\.cc", + "chromium_src/chrome/install_static/brave_install_util_unittest\\.cc", + "chromium_src/components/search_engines/brave_template_url_prepopulate_data_unittest\\.cc", + "components/brave_rewards/browser/net/network_delegate_helper\\.cc", + "components/brave_rewards/browser/net/network_delegate_helper\\.h", + "components/brave_rewards/browser/test/rewards_state_browsertest\\.cc", + "components/brave_shields/browser/ad_block_engine\\.cc", + "components/brave_shields/browser/https_everywhere_service\\.cc", + "components/brave_wallet/browser/rlp_encode_unittest\\.cc", + "components/brave_wallet/common/eth_address\\.cc", + "components/ipfs/ipfs_json_parser\\.cc", + "components/safe_builtins/renderer/safe_builtins\\.cc", + "components/services/bat_ads/bat_ads_impl\\.cc", + "components/services/bat_ledger/bat_ledger_impl\\.cc", + "components/services/bat_ledger/public/cpp/ledger_client_mojo_bridge\\.cc", + "ios/browser/api/ads/brave_ads\\.mm", + "utility/importer/chrome_importer\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/bitflyer/bitflyer\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/bitflyer/bitflyer_transfer\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution\\.h", + "vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_ac\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_external_wallet\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_monthly\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_sku\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_sku\\.h", + "vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_tip\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_unblinded\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_unblinded\\.h", + "vendor/bat-native-ledger/src/bat/ledger/internal/contribution/unverified\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_promotion\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/credentials/credentials_sku\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_activity_info\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_balance_report\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_contribution_info\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_contribution_info\\.h", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_contribution_info_publishers\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_contribution_queue\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_contribution_queue\\.h", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_contribution_queue_publishers\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_creds_batch\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_event_log\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_initialize\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_media_publisher_info\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_multi_tables\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_pending_contribution\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_processed_publisher\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_promotion\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_publisher_info\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_recurring_tip\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_server_publisher_banner\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_server_publisher_info\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_server_publisher_links\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_sku_order\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_sku_order\\.h", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_sku_order_items\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_sku_transaction\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/database/database_unblinded_token\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/bitflyer/post_transaction/post_transaction_bitflyer\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/gemini/get_transaction/get_transaction_gemini\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/gemini/post_cancel_transaction/post_cancel_transaction_gemini\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/gemini/post_transaction/post_transaction_gemini\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_order/post_order\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_gemini/post_transaction_sku_gemini\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_transaction_uphold/post_transaction_uphold\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/payment/post_votes/post_votes\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/private_cdn/get_publisher/get_publisher\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/promotion/delete_claim/delete_claim\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/promotion/get_drain/get_drain\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/promotion/get_recover_wallet/get_recover_wallet\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/promotion/get_wallet/get_wallet\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/promotion/post_bat_loss/post_bat_loss\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/promotion/post_clobbered_claims/post_clobbered_claims\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/promotion/post_suggestions/post_suggestions\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/rewards/get_prefix_list/get_prefix_list\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/uphold/post_oauth/post_oauth\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/uphold/post_transaction/post_transaction\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/endpoint/uphold/post_transaction_commit/post_transaction_commit\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/gemini/gemini\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/gemini/gemini_transfer\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/legacy/bat_state\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/legacy/bat_util\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/legacy/media/github\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/legacy/media/reddit\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/legacy/media/twitch\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/legacy/media/twitter\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/legacy/media/vimeo\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/legacy/media/youtube\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/legacy/publisher_state\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion\\.h", + "vendor/bat-native-ledger/src/bat/ledger/internal/publisher/publisher\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/publisher/publisher_prefix_list_updater\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/publisher/publisher_status_helper\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/publisher/server_publisher_fetcher\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/recovery/recovery_empty_balance\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/report/report\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/report/report\\.h", + "vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_brave\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_common\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_merchant\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_merchant\\.h", + "vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_order\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/sku/sku_transaction\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/state/state_migration\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/state/state_migration_v1\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/state/state_migration_v10\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/state/state_migration_v2\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/uphold/uphold\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/uphold/uphold_authorization\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/uphold/uphold_transfer\\.cc", + "vendor/bat-native-ledger/src/bat/ledger/internal/wallet/wallet_recover\\.cc", + ], + "CheckSpamLogging": [ + "browser/brave_ads/notification_helper/notification_helper_impl_mac\\.mm", + "browser/brave_ads/notification_helper/notification_helper_impl_win\\.cc", + "browser/browsing_data/brave_clear_browsing_data\\.cc", + "chromium_src/chrome/browser/ui/startup/startup_browser_creator\\.cc", + "components/brave_ads/browser/ads_service_impl\\.cc", + "components/brave_vpn/winvpntool\\.cc", + "components/greaselion/browser/greaselion_download_service\\.cc", + "components/permissions/permission_lifetime_utils\\.cc", + "components/tor/tor_launcher_factory\\.cc", + "components/webcompat_reporter/browser/webcompat_report_uploader\\.cc", + "ios/browser/api/ledger/legacy_database/legacy_ledger_database\\.mm", + "ios/browser/api/ledger/promotion_solution\\.mm", + ], + "CheckUniquePtrOnUpload": [ + "components/brave_sync/qr_code_data\\.cc", + "components/brave_today/browser/direct_feed_controller\\.cc", + "components/brave_wallet/browser/tx_service\\.cc", + "components/brave_wallet/common/eth_sign_typed_data_helper\\.cc", + "components/tor/tor_profile_service_impl\\.cc", + ], + "_CheckAndroidCrLogUsage": [ + "android/java/org/chromium/base/BraveCommandLineInitUtil\\.java", + "android/java/org/chromium/chrome/browser/BraveAdaptiveCaptchaUtils\\.java", + "android/java/org/chromium/chrome/browser/crypto_wallet/fragments/EditVisibleAssetsBottomSheetDialogFragment\\.java", + "android/java/org/chromium/chrome/browser/help/BraveHelpAndFeedbackLauncher\\.java", + "android/java/org/chromium/chrome/browser/search_engines/settings/BraveSearchEngineAdapter\\.java", + "android/java/org/chromium/chrome/browser/settings/BravePreferenceDialogFragment\\.java", + "android/java/org/chromium/chrome/browser/upgrade/BraveUpgradeJobIntentServiceImpl\\.java", + ], + "_CheckAndroidToastUsage": [ + "android/java/org/chromium/chrome/browser/brave_news/BraveNewsBottomSheetDialogFragment\\.java", + "android/java/org/chromium/chrome/browser/crypto_wallet/activities/AccountPrivateKeyActivity\\.java", + "android/java/org/chromium/chrome/browser/crypto_wallet/activities/NetworkSelectorActivity\\.java", + "android/java/org/chromium/chrome/browser/crypto_wallet/fragments/PortfolioFragment\\.java", + "android/java/org/chromium/chrome/browser/crypto_wallet/fragments/onboarding_fragments/BackupWalletFragment\\.java", + "android/java/org/chromium/chrome/browser/crypto_wallet/fragments/onboarding_fragments/SecurePasswordFragment\\.java", + "android/java/org/chromium/chrome/browser/crypto_wallet/fragments/onboarding_fragments/UnlockWalletFragment\\.java", + "android/java/org/chromium/chrome/browser/crypto_wallet/modal/BraveWalletPanel\\.java", + "android/java/org/chromium/chrome/browser/rate/RateDialogFragment\\.java", + "android/java/org/chromium/chrome/browser/settings/BraveStatsPreferences\\.java", + "android/java/org/chromium/chrome/browser/settings/BraveSyncScreensPreference\\.java", + "android/java/org/chromium/chrome/browser/settings/developer/BraveQAPreferences\\.java", + "android/java/org/chromium/chrome/browser/util/BraveDbUtil\\.java", + ], + "_CheckAndroidNoBannedImports": [ + "android/java/org/chromium/chrome/browser/notifications/BraveNotificationSettingsBridge\\.java", + "android/java/org/chromium/chrome/browser/qrreader/CameraSource\\.java", + "browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/BraveNotificationManagerProxyImpl\\.java", + ], + "CheckForDeprecatedOSMacros": [ + "browser/ntp_background/custom_background_file_manager\\.h", + "browser/ntp_background/ntp_custom_background_images_service_delegate\\.cc", + "browser/ui/webui/new_tab_page/brave_new_tab_page_handler\\.cc", + "components/brave_sync/network_time_helper\\.cc", + ], + "CheckConsistentGrdChanges": [ + "browser/ui/android/strings/android_brave_strings\\.grd", + ], + "CheckRawPtrUsage": [ + "components/brave_search/renderer/brave_search_default_js_handler\\.h", + "components/brave_search/renderer/brave_search_fallback_js_handler\\.h", + "components/brave_search/renderer/brave_search_service_worker_holder\\.h", + "components/brave_wallet/renderer/js_ethereum_provider\\.h", + "components/content_settings/renderer/brave_content_settings_agent_impl_autoplay_browsertest\\.cc", + "components/cosmetic_filters/renderer/cosmetic_filters_js_handler\\.h", + "components/speedreader/renderer/speedreader_js_handler\\.h", + ], + }, +} diff --git a/patches/PRESUBMIT.py.patch b/patches/PRESUBMIT.py.patch index 516cf329a28..8b2f4198460 100644 --- a/patches/PRESUBMIT.py.patch +++ b/patches/PRESUBMIT.py.patch @@ -1,9 +1,9 @@ diff --git a/PRESUBMIT.py b/PRESUBMIT.py -index 6ad8be3d1364859899c9a7eafc1a28b62a800cd4..a168b0e763feed9d60d6825a8801714732fe69da 100644 +index 6ad8be3d1364859899c9a7eafc1a28b62a800cd4..3387bb646508707da3d6f40599a9deee590e13d9 100644 --- a/PRESUBMIT.py +++ b/PRESUBMIT.py @@ -6168,3 +6168,4 @@ Robolectric tests do not need a @Batch or @DoNotBatch annotations. """, extra_annotation_errors)) return results -+from import_inline import inline_module; inline_module('chromium_presubmit_overrides', globals(), locals()) ++import chromium_presubmit_overrides; chromium_presubmit_overrides.Apply(globals()) diff --git a/script/chromium_presubmit_overrides.py b/script/chromium_presubmit_overrides.py index 33fb647e5da..79d541960d0 100644 --- a/script/chromium_presubmit_overrides.py +++ b/script/chromium_presubmit_overrides.py @@ -3,75 +3,136 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this file, # You can obtain one at http://mozilla.org/MPL/2.0/. */ -# This file is executed (not imported) in the context of src/PRESUBMIT.py, it -# uses existing functions from a global scope to change them. This allows us to -# alter root Chromium presubmit checks without introducing too much conflict. +# This file is imported in the context of src/PRESUBMIT.py, it uses existing +# functions from a global scope to change them. This allows us to alter root +# Chromium presubmit checks without introducing too much conflict. import copy +import inspect +import re +import sys -import lib.chromium_presubmit_utils as chromium_presubmit_utils import override_utils +import import_inline -_BRAVE_DEFAULT_FILES_TO_SKIP = (r'win_build_output[\\/].*', ) +# pylint: disable=line-too-long,protected-access,unused-variable + +GLOBAL_CHECKS_KEY = 'global' +CANNED_CHECKS_KEY = 'canned' -# Modify depot_tools-bundled checks (Chromium calls them canned checks). -# These modification will stay active across all PRESUBMIT.py files, i.e. -# src/PRESUBMIT.py, src/brave/PRESUBMIT.py. -def _modify_canned_checks(canned_checks): - # pylint: disable=unused-variable +# Helper to load json5 presubmit config. +def load_presubmit_config(): + try: + json5_path = import_inline.join_src_dir('third_party', 'pyjson5', + 'src') + sys.path.append(json5_path) + # pylint: disable=import-outside-toplevel,import-error + import json5 + return json5.load( + open( + import_inline.join_src_dir('brave', + 'chromium_presubmit_config.json5'))) + finally: + # Restore sys.path to what it was before. + sys.path.remove(json5_path) - # Disable upstream-specific license check. - @chromium_presubmit_utils.override_check(canned_checks) - def CheckLicense(*_, **__): - return [] - # We don't use OWNERS files. - @chromium_presubmit_utils.override_check(canned_checks) - def CheckOwnersFormat(*_, **__): - return [] +config = load_presubmit_config() - # We don't use OWNERS files. - @chromium_presubmit_utils.override_check(canned_checks) - def CheckOwners(*_, **__): - return [] - # We don't use AUTHORS file. - @chromium_presubmit_utils.override_check(canned_checks) - def CheckAuthorizedAuthor(*_, **__): - return [] +# Empty check stub that does nothing and returns empty presubmit result. +def noop_check(*_, **__): + return [] - # We don't upload change to Chromium git. - @chromium_presubmit_utils.override_check(canned_checks) - def CheckChangeWasUploaded(*_, **__): - return [] - # We don't upload change to Chromium git. - @chromium_presubmit_utils.override_check(canned_checks) - def CheckChangeHasBugField(*_, **__): - return [] +# Replaces existing PRESUBMIT check. Can be used with globals() scope or a class +# scope (such as input_api.canned_checks). Doesn't fail if the Check is not +# found, only prints a warning message.""" +def override_check(scope, name=None): + def decorator(new_func): + is_dict_scope = isinstance(scope, dict) + check_name = name or new_func.__name__ + if is_dict_scope: + original_check = scope.get(check_name, None) + else: + original_check = getattr(scope, check_name, None) - # We don't upload change to Chromium git. - @chromium_presubmit_utils.override_check(canned_checks) - def CheckTreeIsOpen(*_, **__): - return [] + if not callable(original_check): + print(f'WARNING: {check_name} check to override not found.\n' + 'Please update chromium_presubmit_overrides.py!') + + return noop_check + + return override_utils.override_function(scope, name=name)(new_func) + + return decorator + + +# Returns first Check* method from the scope. +def get_first_check_name(scope): + assert isinstance(scope, dict) + for key, value in scope.items(): + if key.startswith('Check') and callable(value): + return key + raise LookupError('Check* method not found in scope') + + +# Override src/PRESUBMIT.py checks. +def override_global_checks(global_checks): + apply_generic_check_overrides(global_checks, GLOBAL_CHECKS_KEY) # Changes from upstream: - # 1. Generate PresubmitError instead of Warning on format issue. - # 2. Replace suggested command from upstream-specific to 'npm run format'. - @chromium_presubmit_utils.override_check(canned_checks) - def CheckPatchFormatted(original_check, input_api, output_api, *args, - **kwargs): + # 1. Add 'brave/' prefix for header guard checks to properly validate + # guards. + @override_check(global_checks) + def CheckForIncludeGuards(original_check, input_api, output_api, **kwargs): + def AffectedSourceFiles(self, original_method, source_file): + def PrependBrave(affected_file): + affected_file = copy.copy(affected_file) + affected_file._path = f'brave/{affected_file._path}' + return affected_file + + return [ + PrependBrave(f) for f in filter(self.FilterSourceFile, + original_method(source_file)) + ] + + with override_utils.override_scope_function(input_api, + AffectedSourceFiles): + return original_check(input_api, output_api, **kwargs) + + # Changes from upstream: + # 1. Remove ^(chrome|components|content|extensions) filter to cover all + # files in the repository, because brave/ structure is slightly + # different. + @override_check(global_checks) + def CheckMPArchApiUsage(original_check, input_api, output_api, **kwargs): + def AffectedFiles(self, original_method, *args, **kwargs): + kwargs['file_filter'] = self.FilterSourceFile + return original_method(*args, **kwargs) + + with override_utils.override_scope_function(input_api, AffectedFiles): + return original_check(input_api, output_api, **kwargs) + + +# Override canned checks (depot_tools/presubmit_canned_checks.py). +def override_canned_checks(canned_checks): + apply_generic_check_overrides(canned_checks, CANNED_CHECKS_KEY) + + # Changes from upstream: + # 1. Replace suggested command from upstream-specific to 'npm run format'. + @override_check(canned_checks) + def CheckPatchFormatted(original_check, input_api, output_api, **kwargs): kwargs = { **kwargs, 'bypass_warnings': False, 'check_python': True, - 'result_factory': output_api.PresubmitError, } - result = original_check(input_api, output_api, *args, **kwargs) + result = original_check(input_api, output_api, **kwargs) # If presubmit generates "Please run git cl format --js" message, we - # should replace the command with "npm run format -- --js". The order of - # these replacements ensure we do this properly. + # should replace the command with "npm run format -- --js". The + # order of these replacements ensure we do this properly. replacements = [ (' format --', ' format -- --'), ('git cl format', 'npm run format'), @@ -81,19 +142,18 @@ def _modify_canned_checks(canned_checks): ] for item in result: for replacement in replacements: - # pylint: disable=protected-access item._message = item._message.replace(replacement[0], replacement[1]) return result # Changes from upstream: - # 1. Run lint only on *changed* files instead of getting *all* files from - # the directory. Upstream does it to catch breakages in unmodified files, - # but it's very resource intensive, moreover for our setup it covers all - # files from vendor and other directories which we should ignore. - # 2. Set is_committing=True to force PresubmitErrors instead of Warnings. - @chromium_presubmit_utils.override_check(canned_checks) - def GetPylint(original_check, input_api, *args, **kwargs): + # 1. Run pylint only on *changed* files instead of getting *all* files + # from the directory. Upstream does it to catch breakages in + # unmodified files, but it's very resource intensive, moreover for + # our setup it covers all files from vendor and other directories + # which we should ignore. + @override_check(canned_checks) + def GetPylint(original_check, input_api, output_api, **kwargs): def _FetchAllFiles(_, input_api, files_to_check, files_to_skip): src_filter = lambda f: input_api.FilterSourceFile( f, files_to_check=files_to_check, files_to_skip=files_to_skip) @@ -104,125 +164,86 @@ def _modify_canned_checks(canned_checks): with override_utils.override_scope_function(input_api.canned_checks, _FetchAllFiles): - with override_utils.override_scope_variable( - input_api, 'is_committing', True): - return original_check(input_api, *args, **kwargs) + return original_check(input_api, output_api, **kwargs) -# Override the first ever check defined in PRESUBMIT.py to make changes to -# input_api before any real check is run. -@chromium_presubmit_utils.override_check( - globals(), chromium_presubmit_utils.get_first_check_name(globals())) -def OverriddenFirstCheck(original_check, input_api, output_api): - _modify_canned_checks(input_api.canned_checks) - input_api.DEFAULT_FILES_TO_SKIP += _BRAVE_DEFAULT_FILES_TO_SKIP - return original_check(input_api, output_api) +# Overrides canned checks and installs per-check file filter. +def modify_input_api(input_api): + override_canned_checks(input_api.canned_checks) + setup_per_check_file_filter(input_api) + input_api.DEFAULT_FILES_TO_SKIP += (*config['default_files_to_skip'], ) -# We don't use OWNERS files. -@chromium_presubmit_utils.override_check(globals()) -def CheckSecurityOwners(*_, **__): - return [] +# Disables checks or forces presubmit errors for checks listed in the config. +def apply_generic_check_overrides(scope, config_key): + for disabled_check in config['disabled_checks'][config_key]: + override_check(scope, name=disabled_check)(noop_check) + + def force_presubmit_error_wrapper(original_check, input_api, output_api, + **kwargs): + with override_utils.override_scope_variable(output_api, + 'PresubmitPromptWarning', + output_api.PresubmitError): + return original_check(input_api, output_api, **kwargs) + + for force_error_check in config['checks_to_force_presubmit_errors'][ + config_key]: + override_check(scope, + name=force_error_check)(force_presubmit_error_wrapper) -# This validates added strings with screenshot tests which we don't use. -@chromium_presubmit_utils.override_check(globals()) -def CheckStrings(*_, **__): - return [] +# Wraps input_api.change.AffectedFiles method to manually filter files available +# for a current check. The current check is found using the Python stack trace. +def setup_per_check_file_filter(input_api): + check_function_re = re.compile(config['check_function_regex']) + + def get_check_names(frame): + check_names = set() + while frame: + co_name = frame.f_code.co_name + if co_name == '_run_check_function': + break + if check_function_re.match(co_name): + check_names.add(co_name) + frame = frame.f_back + return check_names + + per_check_files_to_skip = config['per_check_files_to_skip'] + + def get_files_to_skip(check_names): + files_to_skip = [] + for check_name in check_names: + files_to_skip.extend(per_check_files_to_skip.get(check_name, [])) + return files_to_skip + + @override_utils.override_method(input_api.change) + def AffectedFiles(_self, original_method, *args, **kwargs): + files_to_skip = get_files_to_skip( + get_check_names(inspect.currentframe().f_back)) + affected_files = input_api.change._affected_files + if files_to_skip: + + def file_filter(affected_file): + local_path = affected_file.LocalPath().replace('\\', '/') + for file_to_skip in files_to_skip: + if re.match(file_to_skip, local_path): + return False + return True + + affected_files = [*filter(file_filter, affected_files)] + + with override_utils.override_scope_variable(input_api.change, + '_affected_files', + affected_files): + return original_method(*args, **kwargs) -# Don't check upstream pydeps. -@chromium_presubmit_utils.override_check(globals()) -def CheckPydepsNeedsUpdating(*_, **__): - return [] +def Apply(_globals): + override_global_checks(_globals) - -# Changes from upstream: -# 1. Add 'brave/' prefix for header guard checks to properly validate guards. -@chromium_presubmit_utils.override_check(globals()) -def CheckForIncludeGuards(original_check, input_api, output_api): - def AffectedSourceFiles(self, original_method, source_file): - def PrependBrave(affected_file): - # pylint: disable=protected-access - affected_file = copy.copy(affected_file) - affected_file._path = f'brave/{affected_file._path}' - return affected_file - - return [ - PrependBrave(f) for f in filter(self.FilterSourceFile, - original_method(source_file)) - ] - - with override_utils.override_scope_function(input_api, - AffectedSourceFiles): - return original_check(input_api, output_api) - - -# Changes from upstream: -# 1. Extend _KNOWN_TEST_DATA_AND_INVALID_JSON_FILE_PATTERNS with files to -# ignore. -@chromium_presubmit_utils.override_check(globals()) -def CheckParseErrors(original_check, input_api, output_api): - # pylint: disable=undefined-variable - _KNOWN_TEST_DATA_AND_INVALID_JSON_FILE_PATTERNS.append(r'tsconfig\.json$') - return original_check(input_api, output_api) - - -# Changes from upstream: -# 1. Remove ^(chrome|components|content|extensions) filter to cover all files -# in the repository, because brave/ structure is slightly different. -@chromium_presubmit_utils.override_check(globals()) -def CheckMPArchApiUsage(original_check, input_api, output_api): - def AffectedFiles(self, original_method, *args, **kwargs): - kwargs['file_filter'] = self.FilterSourceFile - return original_method(*args, **kwargs) - - with override_utils.override_scope_function(input_api, AffectedFiles): - return original_check(input_api, output_api) - - -# Changes from upstream: -# 1. Skip chromium_src/ files. -@chromium_presubmit_utils.override_check(globals()) -def CheckForRelativeIncludes(original_check, input_api, output_api): - def AffectedFiles(self, original_method, *args, **kwargs): - files_to_skip = input_api.DEFAULT_FILES_TO_SKIP + ( - r'^chromium_src[\\/]', ) - file_filter = lambda x: self.FilterSourceFile( - x, files_to_skip=files_to_skip) - kwargs['file_filter'] = file_filter - return original_method(*args, **kwargs) - - with override_utils.override_scope_function(input_api, AffectedFiles): - return original_check(input_api, output_api) - - -# Changes from upstream: -# 1. Skip chromium_src/ files. -@chromium_presubmit_utils.override_check(globals()) -def CheckForCcIncludes(original_check, input_api, output_api): - def AffectedFiles(self, original_method, *args, **kwargs): - files_to_skip = input_api.DEFAULT_FILES_TO_SKIP + ( - r'^chromium_src[\\/]', ) - file_filter = lambda x: self.FilterSourceFile( - x, files_to_skip=files_to_skip) - kwargs['file_filter'] = file_filter - return original_method(*args, **kwargs) - - with override_utils.override_scope_function(input_api, AffectedFiles): - return original_check(input_api, output_api) - - -# Changes from upstream: -# 1. Ignore java files, currently a lot of DEPS issues. -@chromium_presubmit_utils.override_check(globals()) -def CheckUnwantedDependencies(original_check, input_api, output_api): - def AffectedFiles(self, original_method, *args, **kwargs): - files_to_skip = input_api.DEFAULT_FILES_TO_SKIP + (r'.*\.java$', ) - file_filter = lambda x: self.FilterSourceFile( - x, files_to_skip=files_to_skip) - kwargs['file_filter'] = file_filter - return original_method(*args, **kwargs) - - with override_utils.override_scope_function(input_api, AffectedFiles): - return original_check(input_api, output_api) + # Override the first global check to modify input_api before any check is + # run. + @override_check(_globals, get_first_check_name(_globals)) + def OverriddenFirstCheck(original_check, input_api, output_api, **kwargs): + modify_input_api(input_api) + return original_check(input_api, output_api, **kwargs) diff --git a/script/lib/chromium_presubmit_utils.py b/script/lib/chromium_presubmit_utils.py deleted file mode 100644 index 319b46d339b..00000000000 --- a/script/lib/chromium_presubmit_utils.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright (c) 2022 The Brave Authors. All rights reserved. -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this file, -# You can obtain one at http://mozilla.org/MPL/2.0/. */ - -import override_utils - - -def override_check(scope, name=None): - """Replaces existing PRESUBMIT check. Can be used with globals() scope or a - class scope (such as input_api.canned_checks). Doesn't fail if the Check is - not found, only prints a warning message.""" - - def decorator(new_func): - is_dict_scope = isinstance(scope, dict) - check_name = name or new_func.__name__ - if is_dict_scope: - original_check = scope.get(check_name, None) - else: - original_check = getattr(scope, check_name, None) - - if not callable(original_check): - print(f'WARNING: {check_name} check to override not found.\n' - 'Please update chromium_presubmit_overrides.py!') - - def noop_check(*_, **__): - return [] - - return noop_check - - return override_utils.override_function(scope, name=name)(new_func) - - return decorator - - -def get_first_check_name(scope): - """Returns first Check* method from the scope.""" - assert isinstance(scope, dict) - for key, value in scope.items(): - if key.startswith('Check') and callable(value): - return key - raise LookupError('Check* method not found in scope') diff --git a/script/override_utils.py b/script/override_utils.py index 45217ec1348..07a772eeba7 100644 --- a/script/override_utils.py +++ b/script/override_utils.py @@ -40,22 +40,28 @@ def override_function(scope, name=None, condition=True): return decorator + def override_method(scope, name=None, condition=True): """Replaces an existing method in the class scope.""" def decorator(new_method): - assert(not isinstance(scope, dict)) + assert not isinstance(scope, dict) method_name = name or new_method.__name__ original_method = getattr(scope, method_name, None) - assert(inspect.isfunction(original_method)) - - def wrapped_method(self, *args, **kwargs): - return new_method(self, original_method, *args, **kwargs) if not condition: wrapped_method = original_method + else: - setattr(scope, method_name, wrapped_method) + def wrapped_method(self, *args, **kwargs): + return new_method(self, original_method, *args, **kwargs) + + if inspect.ismethod(original_method): + setattr(scope, method_name, + types.MethodType(wrapped_method, scope)) + else: + assert inspect.isfunction(original_method) + setattr(scope, method_name, wrapped_method) return wrapped_method