aboutsummaryrefslogtreecommitdiffhomepage
Commit message (Collapse)AuthorAge
* Automatically set --jobs based on the number of CPU threads.Gravatar Julio Merino2017-03-20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This change adds the new magic value "auto" to --jobs and makes this the default. When --jobs=auto, we determine the number of available CPU threads and set a reasonable value for --jobs based on this number. I'm explicitly not defining what "reasonable" means because we may want to change the heuristics later on. The goal here is to reduce the load on the system when running Bazel while not adversely affecting build times significantly. Previous versions of Bazel defaulted --jobs to 200, which could easily overload the local machine with a lot of processes. This value was derived from Blaze's default, which makes sense because most jobs are network-bound due to distributed execution; however, in the Bazel case, this never made sense and is actually harmful. This change was initiated by problems observed on Macs where Bazel would bring machines to their knees due to system resource overload. It's likely that the overload is caused by too much RAM usage rather than CPU, but both of these should go down with a more limited jobs value. Should help alleviate issue #1160. RELNOTES: The --jobs flag now defaults to "auto", which causes Bazel to use a reasonable degree of parallelism based on the local machine's capacity. -- PiperOrigin-RevId: 150466088 MOS_MIGRATED_REVID=150466088
* Make JavaCompileAction subclass SpawnActionGravatar Liam Miller-Cushon2017-03-20
| | | | | | | | | | | | | instead of rolling its out action logic. Also remove support for the 'min classpath' optimization. JavaCompileAction is a subclass (instead of a SpawnAction instance) only to allow tests to use the Java-specific getters that were added to JavaCompilationAction. -- PiperOrigin-RevId: 150463724 MOS_MIGRATED_REVID=150463724
* Move library R generation to a separate action, ensuring the merging happensGravatar Googler2017-03-20
| | | | | | | | off the java critical path. -- PiperOrigin-RevId: 150460041 MOS_MIGRATED_REVID=150460041
* Enable docker on local version of local remote build serverGravatar Googler2017-03-20
| | | | | | | | | | Allow the local version of local remote build server to pick up the temporary Docker override flags and start a command from within a docker container. -- PiperOrigin-RevId: 150456019 MOS_MIGRATED_REVID=150456019
* Add sh_test rule for help_test.sh.Gravatar John Cater2017-03-20
| | | | | | | | -- Change-Id: I9b1677b383f197e2884c7f68b6647cf8c641a863 Reviewed-on: https://cr.bazel.build/9411 PiperOrigin-RevId: 150445941 MOS_MIGRATED_REVID=150445941
* Add sourcepath to java_common.compileGravatar Irina Iancu2017-03-20
| | | | | | | | | | | | and remove support for -sourcepath through javacopts. Progress on #2606. Supporting -implicit:none by default will be done in an upcoming change. -- PiperOrigin-RevId: 150445185 MOS_MIGRATED_REVID=150445185
* BEP: Indicate caching status in TestResult Gravatar Klaus Aehlig2017-03-20
| | | | | | | | | | | | | | For a test result indicate if it was cached locally by the tool. Note that this bit will not be set for tests cached by the remote execution. Also clarify the meaning of the timing; it need not be set for locally cached test results, but it may (and in this case reporting the timing of the initial invocation of the cached test). -- Change-Id: Ic83c4a58c1a85f6f4da82138999eaa545d8f60a6 Reviewed-on: https://cr.bazel.build/9376 PiperOrigin-RevId: 150442579 MOS_MIGRATED_REVID=150442579
* Refactor benchmark for enabling CppCodeGenerator.Gravatar Yue Gan2017-03-20
| | | | | | -- PiperOrigin-RevId: 150440499 MOS_MIGRATED_REVID=150440499
* Build a version of Bazel with a bundled OpenJDK inside the binary.Gravatar Philipp Wollermann2017-03-20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We're using Azul Systems, Inc.'s Zulu® OpenJDK build[1], as it's a good vanilla build of OpenJDK available for our three most important platforms: zulu8.20.0.5-jdk8.0.121-linux_x64.tar.gz zulu8.20.0.5-jdk8.0.121-macosx_x64.zip zulu8.20.0.5-jdk8.0.121-win_x64.zip You can build & run a Bazel binary with an embedded JDK by simple doing: bazel build //src:bazel_with_jdk bazel-bin/src/bazel_with_jdk info The "bazel license" command prints the license of the embedded OpenJDK. We mirror the binaries and sources of the OpenJDK used for bundling on this website: https://bazel-mirror.storage.googleapis.com/openjdk/index.html RELNOTES: Bazel can now be built with a bundled version of the OpenJDK. This makes it possible to use Bazel on systems without a JDK, or where the installed JDK is too old. [1] http://www.azul.com/downloads/zulu/ -- PiperOrigin-RevId: 150440467 MOS_MIGRATED_REVID=150440467
* Fix link (maybe)?Gravatar Jon Brandvein2017-03-20
| | | | | | -- PiperOrigin-RevId: 150439226 MOS_MIGRATED_REVID=150439226
* Fix Label.toShorthandString() with non-main/default repositoryGravatar Googler2017-03-20
| | | | | | | | (repository name was added twice in a non-shorthand result). -- PiperOrigin-RevId: 150437337 MOS_MIGRATED_REVID=150437337
* Add the java-runtime, java-vm, java-home and character-encoding items to ↵Gravatar Philipp Wollermann2017-03-20
| | | | | | | | | | | | "bazel info". java-runtime and java-vm print version info about Bazel's JVM. java-home prints the path to Bazel's JVM. character-encoding prints the default character encoding of Bazel's JVM. -- PiperOrigin-RevId: 150437135 MOS_MIGRATED_REVID=150437135
* Flip deprecated_generated_xcode_project default to false.Gravatar Peter Schmitt2017-03-20
| | | | | | | | | This should be safe as it has already been set to false in the rc files for Blaze and Exoblaze. -- PiperOrigin-RevId: 150436179 MOS_MIGRATED_REVID=150436179
* Reword a commentGravatar Googler2017-03-20
| | | | | | -- PiperOrigin-RevId: 150435164 MOS_MIGRATED_REVID=150435164
* Add a new command "bazel license" that prints the license files of Bazel and ↵Gravatar Philipp Wollermann2017-03-20
| | | | | | | | all embedded open-source components. -- PiperOrigin-RevId: 150435047 MOS_MIGRATED_REVID=150435047
* Add CppCodeGenerator for bencharmk without enabling it. It will be enabled ↵Gravatar Yue Gan2017-03-20
| | | | | | | | in a following change. -- PiperOrigin-RevId: 150434910 MOS_MIGRATED_REVID=150434910
* windows: Improve env var handling of shell integration tests.Gravatar Philipp Wollermann2017-03-20
| | | | | | | | | | | | | | | | | | | | | | Use a unique TEST_TMPDIR for each running test on Windows, too. The old behavior caused shell tests to share the same TEST_TMPDIR, which caused conflicts when multiple tests were run in parallel. Set Bazel's TEST_TMPDIR root on Windows to c:/temp by default in TestStrategy. This avoids tripping the 260-character limit for paths. We still have to keep the override in testenv.sh for the time being, because Bazel's tests are often run with the latest released Bazel and thus we have to wait for a new Bazel release before we can remove the TEST_TMPDIR override from testenv.sh. Once that is done, the flag --test_tmpdir should also magically start working on Windows. Move the Python detection logic out of bazel_windows_example_test.sh into testenv.sh. This is better than copying that code into every new test's set_up method. -- PiperOrigin-RevId: 150433265 MOS_MIGRATED_REVID=150433265
* Fix broken link: s/html/md/Gravatar Googler2017-03-20
| | | | | | -- PiperOrigin-RevId: 150431342 MOS_MIGRATED_REVID=150431342
* Add SpawnInputExpander helper class to arrange runfiles for spawn strategiesGravatar Ulf Adams2017-03-17
| | | | | | | | | | | | | | | | | This new class is a combination of SpawnHelper and our internal code; the plan is to migrate all spawn strategies to the new class. The strict flag should be enabled by default, but that's a breaking change, so we need to do it later. - Use it in SandboxStrategy. - Add ActionInput.getExecPath to return a PathFragment; this avoids lots of back and forth between path fragments and strings. This is a step towards #1593. -- PiperOrigin-RevId: 150427021 MOS_MIGRATED_REVID=150427021
* Rollback of commit ae4b02fb21772effd6836599a7e1792b26ff95e0.Gravatar Yun Peng2017-03-17
| | | | | | | | | | | | *** Reason for rollback *** Broken MSVC Bazel build on CI https://github.com/bazelbuild/bazel/issues/2695 -- PiperOrigin-RevId: 150423895 MOS_MIGRATED_REVID=150423895
* Don't declare parameters of type Iterable<Path>Gravatar Liam Miller-Cushon2017-03-17
| | | | | | | | context: https://bugs.openjdk.java.net/browse/JDK-8150111 -- PiperOrigin-RevId: 150390207 MOS_MIGRATED_REVID=150390207
* Add a flag (--only_desugar_javac9_for_lint) to disable desugaring lambda ↵Gravatar Chengnian Sun2017-03-17
| | | | | | | | | | expressions for Android Lint. RELNOTES: n/a -- PiperOrigin-RevId: 150378522 MOS_MIGRATED_REVID=150378522
* Make mobile-install wait for debuggerGravatar Googler2017-03-17
| | | | | | -- PiperOrigin-RevId: 150372383 MOS_MIGRATED_REVID=150372383
* Sink automatic SDK frameworks into legacy compilation support.Gravatar Googler2017-03-17
| | | | | | -- PiperOrigin-RevId: 150353881 MOS_MIGRATED_REVID=150353881
* Add caching of computed file digests based on file metadata.Gravatar Julio Merino2017-03-17
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This change modifies DigestUtils to add a cache of (path, inode, mtime, size) to the digest of the file for those digests that are computed by reading the file contents. The cache itself is optional because relying on file metadata to cache the file digests could lead to correctness issues. Enabling the cache is exposed via a new (undocumented) --cache_computed_file_digests flag that we can use post-release to tune the built-in values if they prove to be incorrect or problematic. For Bazel, enable this cache unconditionally because the rest of Bazel already relies on mtimes and other file metadata to determine changes to files. The rationale for this change is performance: once we have lost the in-memory file metadata (e.g. because of a flag flip), Bazel has to redigest all of the output files to recompute action cache keys. For a pathological case of rebuilding a large app with 5GB of outputs and then flipping the --[no]check_visibility flag on the command line, we get the following numbers before this change: ____Elapsed time: 11.170s, Critical Path: 8.34s ____Elapsed time: 11.027s, Critical Path: 8.20s ____Elapsed time: 11.084s, Critical Path: 7.46s ____Elapsed time: 11.051s, Critical Path: 6.61s ____Elapsed time: 11.211s, Critical Path: 7.81s ____Elapsed time: 10.884s, Critical Path: 8.20s ____Elapsed time: 11.385s, Critical Path: 8.12s ____Elapsed time: 11.723s, Critical Path: 8.18s ____Elapsed time: 11.327s, Critical Path: 7.73s ____Elapsed time: 11.028s, Critical Path: 7.89s And after this change: ____Elapsed time: 4.294s, Critical Path: 0.27s ____Elapsed time: 4.376s, Critical Path: 0.83s ____Elapsed time: 8.083s, Critical Path: 0.52s ____Elapsed time: 4.302s, Critical Path: 0.64s ____Elapsed time: 4.282s, Critical Path: 0.37s ____Elapsed time: 4.219s, Critical Path: 0.61s ____Elapsed time: 4.214s, Critical Path: 0.97s ____Elapsed time: 4.185s, Critical Path: 0.71s ____Elapsed time: 7.962s, Critical Path: 4.30s ____Elapsed time: 4.149s, Critical Path: 1.03s -- PiperOrigin-RevId: 150351444 MOS_MIGRATED_REVID=150351444
* Display an error message when there is a status command errorGravatar Kristina Chodorow2017-03-17
| | | | | | | | This was printing, fairly unhelpfully `ERROR: Process exited with status 127.` when the .sh file did not exist. -- PiperOrigin-RevId: 150344684 MOS_MIGRATED_REVID=150344684
* Consolidate JavaCompileAction command line flag handlingGravatar Liam Miller-Cushon2017-03-17
| | | | | | | | | Construct the command line flags in a single step. This is a follow-up to commit 58a5a7d5d765979eb06e7515a6935ea5fe34fb3b. -- PiperOrigin-RevId: 150341925 MOS_MIGRATED_REVID=150341925
* Rollback of commit adf051ead3b747081639600fb4a9e043a798b2df.Gravatar Googler2017-03-16
| | | | | | | | | | | | | | | *** Reason for rollback *** this flag isn't needed with unknown commit *** Original change description *** Add --activity_name_file flag and modify --start flag in incremental_install. This is a first step to add the ability for mobile-install to wait for the debugger before starting the app. -- PiperOrigin-RevId: 150340712 MOS_MIGRATED_REVID=150340712
* Break apart the monolithic docker.bzl into smaller pieces that logically ↵Gravatar Googler2017-03-16
| | | | | | | | group functions, constants and rules. -- PiperOrigin-RevId: 150326696 MOS_MIGRATED_REVID=150326696
* No longer crash when running "bazel help <rule>".Gravatar Florian Weikert2017-03-16
| | | | | | | | Fixes #2270. -- PiperOrigin-RevId: 150324978 MOS_MIGRATED_REVID=150324978
* Improve javadoc for the environment functions in the BuildConfiguration Gravatar Klaus Aehlig2017-03-16
| | | | | | | | | | | | In particular, emphasize that that both, the static and dynamic part of the configuration has to be collected to get the environment to be used by actions. -- Change-Id: I035def947d06dbd8f58460b5bf293b35a8ae038c Reviewed-on: https://cr.bazel.build/9373 PiperOrigin-RevId: 150319122 MOS_MIGRATED_REVID=150319122
* Bazel client, Windows: support colorful outputGravatar Laszlo Csomor2017-03-16
| | | | | | | | See https://github.com/bazelbuild/bazel/issues/2107 -- PiperOrigin-RevId: 150314355 MOS_MIGRATED_REVID=150314355
* Bazel client, Windows: fix console handling bugsGravatar Laszlo Csomor2017-03-16
| | | | | | | | | | | | | | | | Fix 3 bugs in blaze_util_windows: - off-by-one error in the loop ensuring the std handles are all open - don't auto-close stdout's HANDLE after querying the console window's size - error-handling for when stdout is redirected thus ::GetStdHandle returns an invalid handle See https://github.com/bazelbuild/bazel/issues/2107 -- PiperOrigin-RevId: 150310578 MOS_MIGRATED_REVID=150310578
* Change the UUID of actions consuming the set of build info keys.Gravatar Lukacs Berki2017-03-16
| | | | | | | | | | This should have been part of commit a068bd16d4dfa78516b85812177c1ccfec430fd1 which in itself causes problems if the Blaze version used changes because the language-specific header actions are then erroneously cached. Ideally, we'd add the set of build info headers into the key, but that's not available in computeKey(). The next best thing would be to reify them as artifacts, but that's a little too intrusive for the urgency of the issue. -- PiperOrigin-RevId: 150299218 MOS_MIGRATED_REVID=150299218
* Release 0.4.5 (2017-03-16)Gravatar Bazel Release System2017-03-16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Baseline: 2e689c29d5fc8a747216563235e905b1b62d63b0 Cherry picks: + a28b54033227d930672ec7f2714de52e5e0a67eb: Fix Cpp action caching + 6d1d424b4c0da724e20e14235de8012f05c470f8: Fix paths of binaries in .deb packages. + 0785cbb672357d950e0c045770c4567df9fbdc43: Update to guava 21.0 and Error Prone version 2.0.18-20160224 + 30490512eb0e48a3774cc4e4ef78680e77dd4e47: Update to latest javac and Error Prone + 867d16eab3bfabae070567ecd878c291978ff338: Allow ' ', '(', ')' and '$' in labels + 7b295d34f3a4f42c13aafc1cc8afba3cb4aa2985: Pass through -sourcepath to the JavaBuilder + 14e4755ce554cdfc685fc9cc2bfb5b699a3b48f4: PathFragment comparisons are now platform-aware + ed7795234ca7ccd2567007f2c502f853cd947e50: Flag to import external repositories in python import path + 81ae08bbc13f5f4a04f18caae339ca77ae2699c1: Suppress error for non-exhaustive switches + e8d1177eef9a9798d2b971630b8cea59471eec33: Correctly returns null if an environment variables is missing + 869d52f145c077e3499b88df752cebc60af51d66: Fix NPE in Android{S,N}dkRepositoryFunction. + d72bc57b60b26245e64f5ccafe023a5ede81cc7f: Select the good guava jars for JDK7 build + 92ecbaeaf6fa11dff161254df38d743d48be8c61: Windows: Assist JNI builds with a target for jni_md.h. + 36958806f2cd38dc51e64cd7bcc557bd143bbdb6: Add java_common.create_provider to allow creating a java_common.provider + 8c00f398d7be863c4f502bde3f5d282b1e18f504: Improve handling of unknown NDK revisions in android_ndk_repository. + b6ea0d33d3ab72922c8fb3ec1ff0e437af09584d: Add the appropriate cxx_builtin_include_directory entries for clang to the Android NDK crosstool created by android_ndk_repository. Incompatible changes: - Depsets (former sets) are converted to strings as "depset(...)" instead of "set(...)". - Using --symlink_prefix is now applied to the output symlink (e.g. bazel-out) and the exec root symlink (e.g. bazel-workspace). - Bazel now uses the test's PATH for commands specified as --run_under; this can affect users who explicitly set PATH to a more restrictive value than the default, which is to forward the local PATH - It's not allowed anymore to compare objects of different types (i.e. a string to an integer) and objects for which comparison rules are not defined (i.e. a dict to another dict) using order operators. New features: - environ parameter to the repository_rule function let defines a list of environment variables for which a change of value will trigger a repository refetching. Important changes: - android_ndk_repository now supports Android NDK R13. - Android resource shrinking is now available for android_binary rules. To enable, set the attribute 'shrink_resources = 1'. See https://bazel.build/versions/master/docs/be/android.html#android_b inary.shrink_resources. - resolve_command/action's input_manifest return/parameter is now list - For increased compatibility with environments where UTS namespaces are not available, the Linux sandbox no longer hides the hostname of the local machine by default. Use --sandbox_fake_hostname to re-enable this feature. - proto_library: alias libraries produce empty files for descriptor sets. - Adds pkg_rpm rule for generating RPM packages. - Allow CROSSTOOL files to have linker flags specific to static shared libraries. - Make it mandatory for Java test suites in bazel codebase, to contain at least one test. - Support for Java 8 lambdas, method references, type annotations and repeated annotations in Android builds with --experimental_desugar_for_android. - Removed .xcodeproj automatic output from objc rules. It can still be generated by requesting it explicitly on the command line. - Flips --explicit_jre_deps flag on by default. - Activate the "dbg", "fastbuild", and "opt" features in the objc CROSSTOOL. - Remove support for configuring JDKs with filegroups; use java_runtime and java_runtime_suite instead - android_ndk_repository api_level attribute is now optional. If not specified, the highest api level in the ndk/platforms directory is used.
* Catch attempts to fork from a multithreaded bazel launcher process.Gravatar Googler2017-03-16
| | | | | | | | This is prone to deadlock. -- PiperOrigin-RevId: 150263255 MOS_MIGRATED_REVID=150263255
* Fix some bugs preventing the crosstool from making use of the min_version ↵Gravatar Googler2017-03-16
| | | | | | | | for darwin builds. -- PiperOrigin-RevId: 150252792 MOS_MIGRATED_REVID=150252792
* Stop Bazel from crashing on data-bound Android libraries with no resources.Gravatar Greg Estren2017-03-16
| | | | | | | | | | These libraries don't produce data binding outputs on resource processing (since there's nothing to process). Their only role is to pass through the outputs of their deps. -- PiperOrigin-RevId: 150251921 MOS_MIGRATED_REVID=150251921
* Remove support for --apk_signing_method=legacy_v1.Gravatar Adam Michael2017-03-16
| | | | | | | | The default has been v1 since late October. -- PiperOrigin-RevId: 150250180 MOS_MIGRATED_REVID=150250180
* Header thinning feature now ships the appropriate Apple SDK with header ↵Gravatar Googler2017-03-16
| | | | | | | | scanner tool to ensure that the correct headers are detected without building any assumptions into the tool. -- PiperOrigin-RevId: 150238621 MOS_MIGRATED_REVID=150238621
* Uniquify bridge methods generated during lambda desugaringGravatar Kevin Bierhoff2017-03-16
| | | | | | -- PiperOrigin-RevId: 150236330 MOS_MIGRATED_REVID=150236330
* Fix typo in help string for --action_envGravatar Klaus Aehlig2017-03-16
| | | | | | | | -- Change-Id: I3221e27e99c740b8ff2bdec8c242cc5cf30c16b5 Reviewed-on: https://cr.bazel.build/9375 PiperOrigin-RevId: 150229108 MOS_MIGRATED_REVID=150229108
* Breaking up is hard to do: AndroidResourceProcessorGravatar Googler2017-03-16
| | | | | | | | | | | * Extract merging methods to a static class * Extract output methods to a static class * Extract manifest processing methods to a class * Move ExecutorCloserService to the top level -- PiperOrigin-RevId: 150219121 MOS_MIGRATED_REVID=150219121
* Refactor objc tests to test both crosstool/legacy. Legacy tests are madeGravatar Cal Peyser2017-03-16
| | | | | | | | | subclasses of crosstool tests, with tests that only work in the legacy case kept in that subclass. -- PiperOrigin-RevId: 150213251 MOS_MIGRATED_REVID=150213251
* Print repository context's execute outputGravatar Kristina Chodorow2017-03-16
| | | | | | | | RELNOTES: Repository context's execute() function can print stdout/stderr while running. To enable, pass quiet=False. -- PiperOrigin-RevId: 150206218 MOS_MIGRATED_REVID=150206218
* Make Bazel work with all MSVS 2017 editions Gravatar Alexander Chung2017-03-16
| | | | | | | | | | | | | Added support for Enterprise, Professional, and Community editions of Microsoft Visual Studio 2017. In the Community edition, the working directory changes after vcvarsall.bat is called. Not sure why. Closes #2658. -- Reviewed-on: https://github.com/bazelbuild/bazel/pull/2658 PiperOrigin-RevId: 150203876 MOS_MIGRATED_REVID=150203876
* Bazel client, Windows: support "d:/" output rootGravatar Laszlo Csomor2017-03-16
| | | | | | | | | | | | | Support drive roots as --output_user_root values, so "d:\" and "d:/" will now work. However "d:" doesn't work yet because that's shorthand for the current working directory on "D:". See https://github.com/bazelbuild/bazel/issues/2683 -- PiperOrigin-RevId: 150203657 MOS_MIGRATED_REVID=150203657
* Add ThinLTO support for py_binary targets.Gravatar Googler2017-03-16
| | | | | | | | | | | | Builds of py_binary targets were failing with --features=thin_lto during the link because the C++ source files were compiled into bitcode, but the link (which is set up by GooglePythonSemantics.java) did not have support for ThinLTO actions and attempted to do a native link of the bitcode objects. -- PiperOrigin-RevId: 150201765 MOS_MIGRATED_REVID=150201765
* --Gravatar Kristina Chodorow2017-03-16
| | | | | PiperOrigin-RevId: 150197521 MOS_MIGRATED_REVID=150197521
* windows: Don't try to breakaway from an existing Job in batch mode.Gravatar Philipp Wollermann2017-03-16
| | | | | | | | | | | | | | | | | | | | | | | | Reasoning: It never worked anyway, because Bazel didn't set the JOB_OBJECT_LIMIT_BREAKAWAY_OK limit on its job. This is why running Bazel in batch mode inside a shell integration test on Windows caused a "CreateProcess() failed: access denied" error. By no longer using CREATE_BREAKAWAY_FROM_JOB, this will instead cause us to use nested jobs, which is exactly the right thing to do: - If our parent dies, we and our children still get reliably killed. - But if *only* we die, then just our children will be reliably killed. If we're on an older Windows that doesn't support nested jobs and are running inside an existing job, we should assume that our parent handles process management - for example like Bazel, which runs all spawned processes in their own job. Also remove the CREATE_NEW_PROCESS_GROUP flag in Bazel's batch mode, because I can't see how this makes sense for a non-daemon process. -- PiperOrigin-RevId: 150194586 MOS_MIGRATED_REVID=150194586