Files
brave-core/build/commands/scripts/commands.js
T

277 lines
14 KiB
JavaScript

/* 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/. */
const program = require('commander');
const path = require('path')
const fs = require('fs-extra')
const config = require('../lib/config')
const util = require('../lib/util')
const build = require('../lib/build')
const versions = require('../lib/versions')
const start = require('../lib/start')
const applyPatches = require('../lib/applyPatches')
const updatePatches = require('./updatePatches')
const pullL10n = require('../lib/pullL10n')
const pushL10n = require('../lib/pushL10n')
const chromiumRebaseL10n = require('../lib/chromiumRebaseL10n')
const l10nDeleteTranslations = require('../lib/l10nDeleteTranslations')
const createDist = require('../lib/createDist')
const test = require('../lib/test')
const gnCheck = require('../lib/gnCheck')
const pylint = require('../lib/pylint')
const collect = (value, accumulator) => {
accumulator.push(value)
return accumulator
}
function commaSeparatedList(value, dummyPrevious) {
return value.split(',')
}
// Use this wrapper function instead of JavaScript's parseInt() with option()
// when defining integer optional parameters, or the default value might get
// passed as well into the radix parameter of parseInt(), causing wrong results.
// https://github.com/brave/brave-browser/issues/13724
function parseInteger(string) {
// As per the spec [1], not passing the optional radix parameter to parseInt()
// will make parsing to interpret the string passed as a decimal number unless
// it's prefixed with '0' (octal) or '0x' (hexadecimal). We only need decimal
// in this particular case so let's be explicit about that.
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt
return parseInt(string, 10)
}
const parsedArgs = program.parseOptions(process.argv)
program
.version(process.env.npm_package_version)
program
.command('versions')
.action(versions)
program
.command('gn_check')
.option('-C <build_dir>', 'build config (out/Debug, out/Release')
.option('--target_os <target_os>', 'target OS')
.option('--target_arch <target_arch>', 'target architecture')
.option('--target_android_base <target_android_base>', 'target Android OS apk (classic, modern, mono)', 'classic')
.option('--target_environment <target_environment>', 'target environment (device, catalyst, simulator)')
.arguments('[build_config]')
.action(gnCheck)
program
.command('apply_patches')
.arguments('[build_config]')
.action(applyPatches)
program
.command('build')
.option('-C <build_dir>', 'build config (out/Debug, out/Release')
.option('--target_os <target_os>', 'target OS')
.option('--target_arch <target_arch>', 'target architecture')
.option('--target_android_base <target_android_base>', 'target Android SDK level for apk or aab (classic, modern, mono)', 'classic')
.option('--target_android_output_format <target_android_output_format>', 'target Android output format (apk, aab)')
.option('--target_environment <target_environment>', 'target environment (device, catalyst, simulator)')
.option('--android_override_version_name <android_override_version_name>', 'Android version number')
.option('--mac_signing_identifier <id>', 'The identifier to use for signing')
.option('--mac_signing_keychain <keychain>', 'The identifier to use for signing', 'login')
.option('--brave_google_api_key <brave_google_api_key>')
.option('--brave_google_api_endpoint <brave_google_api_endpoint>')
.option('--brave_infura_project_id <brave_infura_project_id>')
.option('--binance_client_id <binance_client_id>')
.option('--ftx_client_id <ftx_client_id>')
.option('--ftx_client_secret <ftx_client_secret>')
.option('--bitflyer_client_id <bitflyer_client_id>')
.option('--bitflyer_client_secret <bitflyer_client_secret>')
.option('--bitflyer_staging_client_id <bitflyer_staging_client_id>')
.option('--bitflyer_staging_client_secret <bitflyer_staging_client_secret>')
.option('--bitflyer_staging_url <bitflyer_staging_url>')
.option('--gemini_client_id <gemini_client_id>')
.option('--gemini_client_secret <gemini_client_secret>')
.option('--uphold_client_id <uphold_client_id>')
.option('--uphold_client_secret <uphold_client_secret>')
.option('--uphold_staging_client_id <uphold_staging_client_id>')
.option('--uphold_staging_client_secret <uphold_staging_client_secret>')
.option('--channel <target_channel>', 'target channel to build', /^(beta|dev|nightly|release)$/i)
.option('--ignore_compile_failure', 'Keep compiling regardless of error')
.option('--skip_signing', 'skip signing binaries')
.option('--xcode_gen <target>', 'Generate an Xcode workspace ("ios" or a list of semi-colon separated label patterns, run `gn help label_pattern` for more info.')
.option('--gn <arg>', 'Additional gn args, in the form <key>:<value>', collect, [])
.option('--ninja <opt>', 'Additional Ninja command-line options, in the form <key>:<value>', collect, [])
.option('--brave_safetynet_api_key <brave_safetynet_api_key>')
.option('--is_asan', 'is asan enabled')
.option('--use_goma [arg]', 'whether to use Goma for building', JSON.parse)
.option('--goma_offline', 'use offline mode for goma')
.option('--force_gn_gen', 'always run gn gen')
.option('--target <target>', 'Custom target to build, instead of the default browser target')
.arguments('[build_config]')
.action(build)
program
.command('create_dist')
.option('-C <build_dir>', 'build config (out/Debug, out/Release')
.option('--mac_signing_identifier <id>', 'The identifier to use for signing')
.option('--mac_installer_signing_identifier <id>', 'The identifier to use for signing the installer')
.option('--mac_signing_keychain <keychain>', 'The identifier to use for signing', 'login')
.option('--brave_google_api_key <brave_google_api_key>')
.option('--brave_google_api_endpoint <brave_google_api_endpoint>')
.option('--brave_infura_project_id <brave_infura_project_id>')
.option('--binance_client_id <binance_client_id>')
.option('--ftx_client_id <ftx_client_id>')
.option('--ftx_client_secret <ftx_client_secret>')
.option('--bitflyer_client_id <bitflyer_client_id>')
.option('--bitflyer_client_secret <bitflyer_client_secret>')
.option('--bitflyer_staging_client_id <bitflyer_staging_client_id>')
.option('--bitflyer_staging_client_secret <bitflyer_staging_client_secret>')
.option('--bitflyer_staging_url <bitflyer_staging_url>')
.option('--gemini_client_id <gemini_client_id>')
.option('--gemini_client_secret <gemini_client_secret>')
.option('--uphold_client_id <uphold_client_id>')
.option('--uphold_client_secret <uphold_client_secret>')
.option('--uphold_staging_client_id <uphold_staging_client_id>')
.option('--uphold_staging_client_secret <uphold_staging_client_secret>')
.option('--channel <target_channel>', 'target channel to build', /^(beta|dev|nightly|release)$/i)
.option('--build_omaha', 'build omaha stub/standalone installer')
.option('--tag_ap <ap>', 'ap for stub/standalone installer')
.option('--skip_signing', 'skip signing dmg/brave_installer.exe')
.option('--build_delta_installer', 'build delta mini installer')
.option('--last_chrome_installer <last_chrome_installer>', 'folder contains previous version uncompressed chrome.7z pack file. This folder should be in out dir.')
.option('--android_override_version_name <android_override_version_name>', 'Android version number')
.option('--brave_safetynet_api_key <brave_safetynet_api_key>')
.option('--notarize', 'notarize the macOS app with Apple')
.option('--target_os <target_os>', 'target OS')
.option('--target_arch <target_arch>', 'target architecture')
.option('--target_android_base <target_android_base>', 'target Android SDK level for apk or aab (classic, modern, mono)', 'classic')
.option('--target_android_output_format <target_android_output_format>', 'target Android output format (apk, aab)', 'aab')
.option('--universal', 'build a universal binary distribution')
.option('--is_asan', 'is asan enabled')
.option('--use_goma [arg]', 'whether to use Goma for building', JSON.parse)
.option('--goma_offline', 'use offline mode for goma')
.option('--force_gn_gen', 'always run gn gen')
.arguments('[build_config]')
.action(createDist)
program
.command('start')
.allowUnknownOption(true)
.option('-C <build_dir>', 'build config (out/Debug, out/Release')
.option('--v [log_level]', 'set log level to [log_level]', parseInteger, '0')
.option('--vmodule [modules]', 'verbose log from specific modules')
.option('--user_data_dir_name [base_name]', 'set user data directory base name to [base_name]')
.option('--no_sandbox', 'disable the sandbox')
.option('--disable_brave_extension', 'disable loading the Brave extension')
.option('--disable_brave_rewards_extension', 'disable loading the Brave Rewards extension')
.option('--disable_pdfjs_extension', 'disable loading the PDFJS extension')
.option('--disable_webtorrent_extension', 'disable loading the WebTorrent extension')
.option('--ui_mode <ui_mode>', 'which built-in ui appearance mode to use', /^(dark|light)$/i)
.option('--show_component_extensions', 'show component extensions in chrome://extensions')
.option('--enable_brave_update', 'enable brave update')
.option('--channel <target_channel>', 'target channel to start', /^(beta|dev|nightly|release)$/i, 'release')
.option('--official_build <official_build>', 'force official build settings')
// See https://github.com/brave/brave-browser/wiki/Rewards#flags for more information
.option('--rewards [options]', 'options for rewards')
.option('--brave_ads_testing', 'ads testing')
.option('--brave_ads_production', 'ads production')
.option('--brave_ads_staging', 'ads staging')
.option('--brave_ads_debug', 'ads debug')
.option('--single_process', 'use a single process')
.option('--output_path [pathname]', 'use the Brave binary located at [pathname]')
.arguments('[build_config]')
.action(start.bind(null, parsedArgs.unknown))
program
.command('pull_l10n')
.option('--extension <extension>', 'Scope this command to localize a Brave extension such as ethereum-remote-client')
.option('--grd_path <grd_path>', `Relative path to match end of full GRD path, e.g: 'generated_resources.grd'.`)
.option('--debug', `Dumps downloaded content for one language into TransifexCurrent.txt file in the temp directory.`)
.action(pullL10n)
program
.command('push_l10n')
.option('--extension <extension>', 'Scope this command to localize a Brave extension such as ethereum-remote-client')
.option('--extension_path <extension_path>', 'Local path for extension')
.option('--grd_path <grd_path>', `Relative path to match end of full GRD path, e.g: 'generated_resources.grd'.`)
.action(pushL10n)
program
.command('delete_string_translations')
.option(
'--string_ids <string_ids>',
'Transifex string hash IDs to clear translated values from all languages (comma separated), e.g: "647dde44fb7eb1e62cd502c4b1c25cb8,8b03500bd8f2fa55928521a68bed4b1b"',
commaSeparatedList
)
.option(
'--resource_name <resource_name>',
'Transifex resource name from which to clear all translations for specified string IDs, e.g: "generated_resources"'
)
.action(l10nDeleteTranslations)
program
.command('chromium_rebase_l10n')
.action(chromiumRebaseL10n)
program
.command('update_patches')
.action(updatePatches)
program
.command('cibuild')
.option('--target_arch <target_arch>', 'target architecture')
.action((options) => {
build('Release', options)
})
program
.command('test <suite>')
.allowUnknownOption(true)
.option('-C <build_dir>', 'build config (out/Debug, out/Release')
.option('--v [log_level]', 'set log level to [log_level]', parseInteger, '0')
.option('--vmodule [modules]', 'verbose log from specific modules')
.option('--filter <filter>', 'set test filter')
.option('--output <output>', 'set test output (results) file path')
.option('--disable_brave_extension', 'disable loading the Brave extension')
.option('--single_process', 'uses a single process to run tests to help with debugging')
.option('--test_launcher_jobs <test_launcher_jobs>', 'Number of jobs to launch', parseInteger, '4')
.option('--target_os <target_os>', 'target OS')
.option('--target_arch <target_arch>', 'target architecture')
.option('--run_disabled_tests', 'run disabled tests')
.option('--manual_android_test_device', 'indicates that Android test device is run manually')
.option('--use_goma [arg]', 'whether to use Goma for building', JSON.parse)
.option('--goma_offline', 'use offline mode for goma')
.arguments('[build_config]')
.action(test.bind(null, parsedArgs.unknown))
program
.command('lint')
.option('--base <base branch>', 'set the destination branch for the PR')
.action(util.lint)
program
.command('presubmit')
.option('--base <base branch>', 'set the destination branch for the PR')
.option('--all', 'run presubmit on all files')
.action(util.presubmit)
program
.command('pylint')
.option('--base <base_branch>', 'only analyse files changed relative to base_branch')
.option('--all', 'run pylint on all files')
.option('--report', 'produce a parseable report file')
.action(pylint)
program
.command('format')
.option('--base <base branch>', 'set the destination branch for the PR')
.option('--full', 'format all lines in changed files instead of only the changed lines')
.option('--js', 'format javascript code with clang-format')
.option('--rust', 'enables formatting of Rust file types using rustfmt')
.option('--swift',
'enables formatting of Swift file types using swift-format')
.action(util.format)
program
.parse(process.argv)