libv8 8.4.255.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/.gitmodules +3 -0
- data/.rspec +3 -0
- data/.travis.yml +45 -0
- data/CHANGELOG.md +111 -0
- data/Gemfile +4 -0
- data/README.md +152 -0
- data/Rakefile +125 -0
- data/appveyor.yml.disabled +36 -0
- data/ext/libv8/arch.rb +20 -0
- data/ext/libv8/builder.rb +106 -0
- data/ext/libv8/extconf.rb +7 -0
- data/ext/libv8/location.rb +89 -0
- data/ext/libv8/paths.rb +28 -0
- data/lib/libv8.rb +9 -0
- data/lib/libv8/version.rb +3 -0
- data/libv8.gemspec +30 -0
- data/scaleway.png +0 -0
- data/spec/location_spec.rb +69 -0
- data/spec/spec_helper.rb +4 -0
- data/thefrontside.png +0 -0
- data/vendor/depot_tools/.cipd_impl.ps1 +129 -0
- data/vendor/depot_tools/.gitattributes +55 -0
- data/vendor/depot_tools/.gitignore +92 -0
- data/vendor/depot_tools/.style.yapf +4 -0
- data/vendor/depot_tools/.vpython +55 -0
- data/vendor/depot_tools/.vpython3 +23 -0
- data/vendor/depot_tools/CROS_OWNERS +7 -0
- data/vendor/depot_tools/GOMA_OWNERS +9 -0
- data/vendor/depot_tools/LICENSE +27 -0
- data/vendor/depot_tools/LUCI_OWNERS +5 -0
- data/vendor/depot_tools/OWNERS +39 -0
- data/vendor/depot_tools/PRESUBMIT.py +150 -0
- data/vendor/depot_tools/README.gclient.md +67 -0
- data/vendor/depot_tools/README.git-cl.md +99 -0
- data/vendor/depot_tools/README.md +78 -0
- data/vendor/depot_tools/WATCHLISTS +26 -0
- data/vendor/depot_tools/auth.py +163 -0
- data/vendor/depot_tools/autoninja +36 -0
- data/vendor/depot_tools/autoninja.bat +33 -0
- data/vendor/depot_tools/autoninja.py +148 -0
- data/vendor/depot_tools/bb +12 -0
- data/vendor/depot_tools/bb.bat +7 -0
- data/vendor/depot_tools/bootstrap/README.md +155 -0
- data/vendor/depot_tools/bootstrap/bootstrap.py +356 -0
- data/vendor/depot_tools/bootstrap/git-bash.template.sh +12 -0
- data/vendor/depot_tools/bootstrap/git.template.bat +5 -0
- data/vendor/depot_tools/bootstrap/manifest.txt +27 -0
- data/vendor/depot_tools/bootstrap/manifest_bleeding_edge.txt +27 -0
- data/vendor/depot_tools/bootstrap/profile.d.python.sh +20 -0
- data/vendor/depot_tools/bootstrap/python27.bat +46 -0
- data/vendor/depot_tools/bootstrap/python3.bat +46 -0
- data/vendor/depot_tools/bootstrap/win_tools.bat +79 -0
- data/vendor/depot_tools/bootstrap_python3 +35 -0
- data/vendor/depot_tools/breakpad.py +12 -0
- data/vendor/depot_tools/cbuildbot +1 -0
- data/vendor/depot_tools/chrome_set_ver +1 -0
- data/vendor/depot_tools/cipd +247 -0
- data/vendor/depot_tools/cipd.bat +67 -0
- data/vendor/depot_tools/cipd_bin_setup.bat +6 -0
- data/vendor/depot_tools/cipd_bin_setup.sh +22 -0
- data/vendor/depot_tools/cipd_client_version +1 -0
- data/vendor/depot_tools/cipd_client_version.digests +22 -0
- data/vendor/depot_tools/cipd_manifest.txt +63 -0
- data/vendor/depot_tools/cipd_manifest.versions +438 -0
- data/vendor/depot_tools/cit +8 -0
- data/vendor/depot_tools/cit.bat +12 -0
- data/vendor/depot_tools/cit.py +167 -0
- data/vendor/depot_tools/clang-format +8 -0
- data/vendor/depot_tools/clang-format.bat +12 -0
- data/vendor/depot_tools/clang_format.py +79 -0
- data/vendor/depot_tools/clang_format_merge_driver +8 -0
- data/vendor/depot_tools/clang_format_merge_driver.bat +12 -0
- data/vendor/depot_tools/clang_format_merge_driver.py +69 -0
- data/vendor/depot_tools/codereview.settings +6 -0
- data/vendor/depot_tools/compile_single_file +8 -0
- data/vendor/depot_tools/compile_single_file.bat +11 -0
- data/vendor/depot_tools/compile_single_file.py +79 -0
- data/vendor/depot_tools/cpplint.bat +11 -0
- data/vendor/depot_tools/cpplint.py +6097 -0
- data/vendor/depot_tools/cpplint_chromium.py +50 -0
- data/vendor/depot_tools/cros +87 -0
- data/vendor/depot_tools/cros_sdk +1 -0
- data/vendor/depot_tools/crosjobs +13 -0
- data/vendor/depot_tools/detect_host_arch.py +55 -0
- data/vendor/depot_tools/dirmd +12 -0
- data/vendor/depot_tools/dirmd.bat +7 -0
- data/vendor/depot_tools/download_from_google_storage +8 -0
- data/vendor/depot_tools/download_from_google_storage.bat +12 -0
- data/vendor/depot_tools/download_from_google_storage.py +634 -0
- data/vendor/depot_tools/ensure_bootstrap +53 -0
- data/vendor/depot_tools/fetch +21 -0
- data/vendor/depot_tools/fetch.bat +28 -0
- data/vendor/depot_tools/fetch.py +319 -0
- data/vendor/depot_tools/fetch_configs/android.py +34 -0
- data/vendor/depot_tools/fetch_configs/android_internal.py +34 -0
- data/vendor/depot_tools/fetch_configs/breakpad.py +44 -0
- data/vendor/depot_tools/fetch_configs/chromium.py +66 -0
- data/vendor/depot_tools/fetch_configs/config_util.py +52 -0
- data/vendor/depot_tools/fetch_configs/crashpad.py +41 -0
- data/vendor/depot_tools/fetch_configs/dart.py +45 -0
- data/vendor/depot_tools/fetch_configs/depot_tools.py +44 -0
- data/vendor/depot_tools/fetch_configs/devtools-frontend.py +44 -0
- data/vendor/depot_tools/fetch_configs/goma_client.py +41 -0
- data/vendor/depot_tools/fetch_configs/gyp.py +41 -0
- data/vendor/depot_tools/fetch_configs/infra.py +40 -0
- data/vendor/depot_tools/fetch_configs/infra_internal.py +45 -0
- data/vendor/depot_tools/fetch_configs/inspector_protocol.py +40 -0
- data/vendor/depot_tools/fetch_configs/ios.py +34 -0
- data/vendor/depot_tools/fetch_configs/ios_internal.py +39 -0
- data/vendor/depot_tools/fetch_configs/nacl.py +48 -0
- data/vendor/depot_tools/fetch_configs/naclports.py +47 -0
- data/vendor/depot_tools/fetch_configs/node-ci.py +41 -0
- data/vendor/depot_tools/fetch_configs/pdfium.py +40 -0
- data/vendor/depot_tools/fetch_configs/skia.py +41 -0
- data/vendor/depot_tools/fetch_configs/skia_buildbot.py +41 -0
- data/vendor/depot_tools/fetch_configs/syzygy.py +41 -0
- data/vendor/depot_tools/fetch_configs/v8.py +44 -0
- data/vendor/depot_tools/fetch_configs/webrtc.py +52 -0
- data/vendor/depot_tools/fetch_configs/webrtc_android.py +34 -0
- data/vendor/depot_tools/fetch_configs/webrtc_ios.py +34 -0
- data/vendor/depot_tools/fix_encoding.py +385 -0
- data/vendor/depot_tools/gclient +38 -0
- data/vendor/depot_tools/gclient-new-workdir.py +124 -0
- data/vendor/depot_tools/gclient.bat +32 -0
- data/vendor/depot_tools/gclient.py +3198 -0
- data/vendor/depot_tools/gclient_completion.sh +76 -0
- data/vendor/depot_tools/gclient_eval.py +891 -0
- data/vendor/depot_tools/gclient_paths.py +152 -0
- data/vendor/depot_tools/gclient_scm.py +1615 -0
- data/vendor/depot_tools/gclient_utils.py +1280 -0
- data/vendor/depot_tools/gerrit_client.py +151 -0
- data/vendor/depot_tools/gerrit_util.py +996 -0
- data/vendor/depot_tools/git-cache +6 -0
- data/vendor/depot_tools/git-cl +6 -0
- data/vendor/depot_tools/git-crrev-parse +53 -0
- data/vendor/depot_tools/git-drover +6 -0
- data/vendor/depot_tools/git-find-releases +6 -0
- data/vendor/depot_tools/git-footers +6 -0
- data/vendor/depot_tools/git-freeze +8 -0
- data/vendor/depot_tools/git-gs +9 -0
- data/vendor/depot_tools/git-hyper-blame +6 -0
- data/vendor/depot_tools/git-map +6 -0
- data/vendor/depot_tools/git-map-branches +6 -0
- data/vendor/depot_tools/git-mark-merge-base +6 -0
- data/vendor/depot_tools/git-nav-downstream +6 -0
- data/vendor/depot_tools/git-nav-upstream +6 -0
- data/vendor/depot_tools/git-new-branch +6 -0
- data/vendor/depot_tools/git-number +6 -0
- data/vendor/depot_tools/git-rebase-update +6 -0
- data/vendor/depot_tools/git-rename-branch +6 -0
- data/vendor/depot_tools/git-reparent-branch +6 -0
- data/vendor/depot_tools/git-retry +8 -0
- data/vendor/depot_tools/git-runhooks +23 -0
- data/vendor/depot_tools/git-squash-branch +6 -0
- data/vendor/depot_tools/git-templates/description +3 -0
- data/vendor/depot_tools/git-templates/hooks/applypatch-msg +4 -0
- data/vendor/depot_tools/git-templates/hooks/post-applypatch +4 -0
- data/vendor/depot_tools/git-templates/hooks/post-checkout +4 -0
- data/vendor/depot_tools/git-templates/hooks/post-commit +4 -0
- data/vendor/depot_tools/git-templates/hooks/post-merge +4 -0
- data/vendor/depot_tools/git-templates/hooks/post-update +4 -0
- data/vendor/depot_tools/git-templates/hooks/pre-applypatch +4 -0
- data/vendor/depot_tools/git-templates/hooks/pre-auto-gc +4 -0
- data/vendor/depot_tools/git-templates/hooks/pre-commit +4 -0
- data/vendor/depot_tools/git-templates/hooks/pre-rebase +4 -0
- data/vendor/depot_tools/git-templates/hooks/prepare-commit-msg +4 -0
- data/vendor/depot_tools/git-templates/info/exclude +6 -0
- data/vendor/depot_tools/git-thaw +13 -0
- data/vendor/depot_tools/git-upstream-diff +9 -0
- data/vendor/depot_tools/git_cache.py +786 -0
- data/vendor/depot_tools/git_cl.py +5158 -0
- data/vendor/depot_tools/git_cl_completion.sh +48 -0
- data/vendor/depot_tools/git_common.py +1101 -0
- data/vendor/depot_tools/git_dates.py +62 -0
- data/vendor/depot_tools/git_drover.py +469 -0
- data/vendor/depot_tools/git_find_releases.py +67 -0
- data/vendor/depot_tools/git_footers.py +261 -0
- data/vendor/depot_tools/git_freezer.py +40 -0
- data/vendor/depot_tools/git_hyper_blame.py +391 -0
- data/vendor/depot_tools/git_map.py +166 -0
- data/vendor/depot_tools/git_map_branches.py +354 -0
- data/vendor/depot_tools/git_mark_merge_base.py +73 -0
- data/vendor/depot_tools/git_nav_downstream.py +69 -0
- data/vendor/depot_tools/git_new_branch.py +82 -0
- data/vendor/depot_tools/git_number.py +301 -0
- data/vendor/depot_tools/git_rebase_update.py +351 -0
- data/vendor/depot_tools/git_rename_branch.py +55 -0
- data/vendor/depot_tools/git_reparent_branch.py +101 -0
- data/vendor/depot_tools/git_retry.py +181 -0
- data/vendor/depot_tools/git_squash_branch.py +28 -0
- data/vendor/depot_tools/git_upstream_diff.py +64 -0
- data/vendor/depot_tools/gn +8 -0
- data/vendor/depot_tools/gn.bat +12 -0
- data/vendor/depot_tools/gn.py +78 -0
- data/vendor/depot_tools/goma_auth +12 -0
- data/vendor/depot_tools/goma_auth.bat +8 -0
- data/vendor/depot_tools/goma_ctl +12 -0
- data/vendor/depot_tools/goma_ctl.bat +8 -0
- data/vendor/depot_tools/gsutil.py +190 -0
- data/vendor/depot_tools/gsutil.py.bat +23 -0
- data/vendor/depot_tools/gsutil.vpython +120 -0
- data/vendor/depot_tools/infra/README.md +1 -0
- data/vendor/depot_tools/infra/config/OWNERS +7 -0
- data/vendor/depot_tools/infra/config/README.md +1 -0
- data/vendor/depot_tools/infra/config/recipes.cfg +26 -0
- data/vendor/depot_tools/led +12 -0
- data/vendor/depot_tools/led.bat +7 -0
- data/vendor/depot_tools/lockfile.py +116 -0
- data/vendor/depot_tools/luci-auth +13 -0
- data/vendor/depot_tools/luci-auth.bat +8 -0
- data/vendor/depot_tools/lucicfg +12 -0
- data/vendor/depot_tools/lucicfg.bat +7 -0
- data/vendor/depot_tools/mac_toolchain +12 -0
- data/vendor/depot_tools/man/html/depot_tools.html +934 -0
- data/vendor/depot_tools/man/html/depot_tools_tutorial.html +1593 -0
- data/vendor/depot_tools/man/html/git-cl.html +1033 -0
- data/vendor/depot_tools/man/html/git-drover.html +1048 -0
- data/vendor/depot_tools/man/html/git-footers.html +878 -0
- data/vendor/depot_tools/man/html/git-freeze.html +859 -0
- data/vendor/depot_tools/man/html/git-hyper-blame.html +878 -0
- data/vendor/depot_tools/man/html/git-map-branches.html +904 -0
- data/vendor/depot_tools/man/html/git-map.html +887 -0
- data/vendor/depot_tools/man/html/git-mark-merge-base.html +826 -0
- data/vendor/depot_tools/man/html/git-nav-downstream.html +844 -0
- data/vendor/depot_tools/man/html/git-nav-upstream.html +853 -0
- data/vendor/depot_tools/man/html/git-new-branch.html +932 -0
- data/vendor/depot_tools/man/html/git-rebase-update.html +961 -0
- data/vendor/depot_tools/man/html/git-rename-branch.html +794 -0
- data/vendor/depot_tools/man/html/git-reparent-branch.html +847 -0
- data/vendor/depot_tools/man/html/git-retry.html +858 -0
- data/vendor/depot_tools/man/html/git-squash-branch.html +881 -0
- data/vendor/depot_tools/man/html/git-thaw.html +794 -0
- data/vendor/depot_tools/man/html/git-upstream-diff.html +923 -0
- data/vendor/depot_tools/man/man1/git-cl.1 +198 -0
- data/vendor/depot_tools/man/man1/git-drover.1 +330 -0
- data/vendor/depot_tools/man/man1/git-footers.1 +144 -0
- data/vendor/depot_tools/man/man1/git-freeze.1 +113 -0
- data/vendor/depot_tools/man/man1/git-hyper-blame.1 +128 -0
- data/vendor/depot_tools/man/man1/git-map-branches.1 +210 -0
- data/vendor/depot_tools/man/man1/git-map.1 +179 -0
- data/vendor/depot_tools/man/man1/git-mark-merge-base.1 +69 -0
- data/vendor/depot_tools/man/man1/git-nav-downstream.1 +112 -0
- data/vendor/depot_tools/man/man1/git-nav-upstream.1 +122 -0
- data/vendor/depot_tools/man/man1/git-new-branch.1 +176 -0
- data/vendor/depot_tools/man/man1/git-rebase-update.1 +177 -0
- data/vendor/depot_tools/man/man1/git-rename-branch.1 +53 -0
- data/vendor/depot_tools/man/man1/git-reparent-branch.1 +93 -0
- data/vendor/depot_tools/man/man1/git-retry.1 +108 -0
- data/vendor/depot_tools/man/man1/git-squash-branch.1 +129 -0
- data/vendor/depot_tools/man/man1/git-thaw.1 +54 -0
- data/vendor/depot_tools/man/man1/git-upstream-diff.1 +153 -0
- data/vendor/depot_tools/man/man7/depot_tools.7 +139 -0
- data/vendor/depot_tools/man/man7/depot_tools_tutorial.7 +1061 -0
- data/vendor/depot_tools/man/push_to_gs.sh +4 -0
- data/vendor/depot_tools/man/src/.gitignore +5 -0
- data/vendor/depot_tools/man/src/_aliases.txt +5 -0
- data/vendor/depot_tools/man/src/_footer.txt +8 -0
- data/vendor/depot_tools/man/src/_git-cl_desc.helper.txt +1 -0
- data/vendor/depot_tools/man/src/_git-drover_desc.helper.txt +2 -0
- data/vendor/depot_tools/man/src/_git-footers_desc.helper.txt +1 -0
- data/vendor/depot_tools/man/src/_git-freeze_desc.helper.txt +1 -0
- data/vendor/depot_tools/man/src/_git-hyper-blame_desc.helper.txt +1 -0
- data/vendor/depot_tools/man/src/_git-map-branches_desc.helper.txt +4 -0
- data/vendor/depot_tools/man/src/_git-map_desc.helper.txt +3 -0
- data/vendor/depot_tools/man/src/_git-mark-merge-base_desc.helper.txt +1 -0
- data/vendor/depot_tools/man/src/_git-nav-downstream_desc.helper.txt +1 -0
- data/vendor/depot_tools/man/src/_git-nav-upstream_desc.helper.txt +1 -0
- data/vendor/depot_tools/man/src/_git-new-branch_desc.helper.txt +1 -0
- data/vendor/depot_tools/man/src/_git-rebase-update_desc.helper.txt +1 -0
- data/vendor/depot_tools/man/src/_git-rename-branch_desc.helper.txt +1 -0
- data/vendor/depot_tools/man/src/_git-reparent-branch_desc.helper.txt +1 -0
- data/vendor/depot_tools/man/src/_git-retry_desc.helper.txt +2 -0
- data/vendor/depot_tools/man/src/_git-squash-branch_desc.helper.txt +1 -0
- data/vendor/depot_tools/man/src/_git-thaw_desc.helper.txt +2 -0
- data/vendor/depot_tools/man/src/_git-upstream-diff_desc.helper.txt +1 -0
- data/vendor/depot_tools/man/src/_helper_prefix.txt +1 -0
- data/vendor/depot_tools/man/src/asciidoc-override.css +7 -0
- data/vendor/depot_tools/man/src/common_demo_functions.sh +84 -0
- data/vendor/depot_tools/man/src/demo_repo.sh +43 -0
- data/vendor/depot_tools/man/src/depot_tools.txt +28 -0
- data/vendor/depot_tools/man/src/depot_tools_tutorial.demo.walkthrough.sh +155 -0
- data/vendor/depot_tools/man/src/depot_tools_tutorial.txt +432 -0
- data/vendor/depot_tools/man/src/filter_demo_output.py +141 -0
- data/vendor/depot_tools/man/src/git-cl.txt +119 -0
- data/vendor/depot_tools/man/src/git-drover.demo.1.sh +22 -0
- data/vendor/depot_tools/man/src/git-drover.demo.2.sh +23 -0
- data/vendor/depot_tools/man/src/git-drover.demo.3.sh +27 -0
- data/vendor/depot_tools/man/src/git-drover.demo.4.sh +39 -0
- data/vendor/depot_tools/man/src/git-drover.demo.common.sh +19 -0
- data/vendor/depot_tools/man/src/git-drover.txt +102 -0
- data/vendor/depot_tools/man/src/git-footers.demo.1.sh +17 -0
- data/vendor/depot_tools/man/src/git-footers.txt +71 -0
- data/vendor/depot_tools/man/src/git-freeze.demo.1.sh +23 -0
- data/vendor/depot_tools/man/src/git-freeze.txt +54 -0
- data/vendor/depot_tools/man/src/git-hyper-blame.demo.1.sh +3 -0
- data/vendor/depot_tools/man/src/git-hyper-blame.demo.2.sh +4 -0
- data/vendor/depot_tools/man/src/git-hyper-blame.demo.common.sh +57 -0
- data/vendor/depot_tools/man/src/git-hyper-blame.txt +85 -0
- data/vendor/depot_tools/man/src/git-map-branches.demo.1.sh +8 -0
- data/vendor/depot_tools/man/src/git-map-branches.txt +64 -0
- data/vendor/depot_tools/man/src/git-map.demo.1.sh +3 -0
- data/vendor/depot_tools/man/src/git-map.txt +67 -0
- data/vendor/depot_tools/man/src/git-mark-merge-base.txt +46 -0
- data/vendor/depot_tools/man/src/git-nav-downstream.demo.1.sh +12 -0
- data/vendor/depot_tools/man/src/git-nav-downstream.txt +40 -0
- data/vendor/depot_tools/man/src/git-nav-upstream.demo.1.sh +12 -0
- data/vendor/depot_tools/man/src/git-nav-upstream.txt +39 -0
- data/vendor/depot_tools/man/src/git-new-branch.demo.1.sh +17 -0
- data/vendor/depot_tools/man/src/git-new-branch.txt +82 -0
- data/vendor/depot_tools/man/src/git-rebase-update.txt +141 -0
- data/vendor/depot_tools/man/src/git-rename-branch.txt +28 -0
- data/vendor/depot_tools/man/src/git-reparent-branch.txt +61 -0
- data/vendor/depot_tools/man/src/git-retry.txt +67 -0
- data/vendor/depot_tools/man/src/git-squash-branch.demo.1.sh +12 -0
- data/vendor/depot_tools/man/src/git-squash-branch.txt +59 -0
- data/vendor/depot_tools/man/src/git-thaw.txt +29 -0
- data/vendor/depot_tools/man/src/git-upstream-diff.txt +107 -0
- data/vendor/depot_tools/man/src/make_docs.sh +260 -0
- data/vendor/depot_tools/man/src/prep_demo_repo.sh +103 -0
- data/vendor/depot_tools/metrics.README.md +101 -0
- data/vendor/depot_tools/metrics.py +297 -0
- data/vendor/depot_tools/metrics_utils.py +293 -0
- data/vendor/depot_tools/my_activity.py +971 -0
- data/vendor/depot_tools/ninja +44 -0
- data/vendor/depot_tools/ninja-linux32 +0 -0
- data/vendor/depot_tools/ninja-linux64 +0 -0
- data/vendor/depot_tools/ninja-mac +0 -0
- data/vendor/depot_tools/ninja.exe +0 -0
- data/vendor/depot_tools/ninjalog.README.md +64 -0
- data/vendor/depot_tools/ninjalog_uploader.py +233 -0
- data/vendor/depot_tools/ninjalog_uploader_wrapper.py +125 -0
- data/vendor/depot_tools/owners.py +641 -0
- data/vendor/depot_tools/owners_finder.py +385 -0
- data/vendor/depot_tools/post_build_ninja_summary.py +350 -0
- data/vendor/depot_tools/presubmit_canned_checks.py +1655 -0
- data/vendor/depot_tools/presubmit_support.py +1923 -0
- data/vendor/depot_tools/profile.xml +8 -0
- data/vendor/depot_tools/prpc +13 -0
- data/vendor/depot_tools/prpc.bat +8 -0
- data/vendor/depot_tools/pylint +9 -0
- data/vendor/depot_tools/pylint-1.5 +78 -0
- data/vendor/depot_tools/pylint-1.6 +78 -0
- data/vendor/depot_tools/pylint-1.7 +78 -0
- data/vendor/depot_tools/pylint-1.8 +78 -0
- data/vendor/depot_tools/pylint-1.9 +78 -0
- data/vendor/depot_tools/pylint.bat +12 -0
- data/vendor/depot_tools/pylint_main.py +45 -0
- data/vendor/depot_tools/pylintrc +349 -0
- data/vendor/depot_tools/python-bin/python3 +7 -0
- data/vendor/depot_tools/python_runner.sh +60 -0
- data/vendor/depot_tools/rdb +12 -0
- data/vendor/depot_tools/rdb.bat +7 -0
- data/vendor/depot_tools/recipes/OWNERS +4 -0
- data/vendor/depot_tools/recipes/README.recipes.md +1079 -0
- data/vendor/depot_tools/recipes/recipe_modules/OWNERS +1 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/OWNERS +2 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/__init__.py +38 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/api.py +516 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic.json +117 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic_luci.json +117 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic_with_branch_heads.json +118 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/clobber.json +211 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/deprecated_got_revision_mapping.json +194 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/gerrit_no_rebase_patch_ref.json +211 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/gerrit_no_reset.json +211 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/input_commit_with_id_without_repo.json +210 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/multiple_patch_refs.json +214 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_apply_patch_on_gclient.json +265 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_cp_checkout_HEAD.json +65 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_cp_checkout_a_branch_head.json +65 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_cp_checkout_a_specific_commit.json +65 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_cp_checkout_master.json +65 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/refs.json +212 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/reset_root_solution_revision.json +210 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/resolve_chromium_fixed_version.json +117 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail.json +95 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail_patch.json +209 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail_patch_download.json +193 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_angle.json +265 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_branch_heads.json +261 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_feature_branch.json +261 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_v8_feature_branch.json +265 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_webrtc.json +265 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_v8.json +265 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_v8_head_by_default.json +265 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/unrecognized_commit_repo.json +8 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/with_tags.json +211 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.py +308 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/resources/__init__.py +0 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/resources/bot_update.py +1258 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/test_api.py +93 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/tests/do_not_retry_patch_failures_in_cq.py +42 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/tests/ensure_checkout.py +35 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/__init__.py +9 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/api.py +455 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/basic.json +403 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/basic_pkg.json +403 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/describe-failed.json +82 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/describe-many-instances.json +411 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/mac64.json +403 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_file.json +315 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_mode.json +313 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_verfile.json +313 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/win64.json +403 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.py +187 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/junk arch.json +5 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/junk bits.json +5 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_arm_32.json +12 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_arm_64.json +12 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_intel_32.json +12 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_intel_64.json +12 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_mips_64.json +12 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/mac_intel_64.json +12 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/win_intel_32.json +12 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/win_intel_64.json +12 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.py +59 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/test_api.py +93 -0
- data/vendor/depot_tools/recipes/recipe_modules/depot_tools/__init__.py +9 -0
- data/vendor/depot_tools/recipes/recipe_modules/depot_tools/api.py +75 -0
- data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/basic.json +83 -0
- data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/basic_luci.json +83 -0
- data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/win.json +83 -0
- data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.py +55 -0
- data/vendor/depot_tools/recipes/recipe_modules/gclient/__init__.py +13 -0
- data/vendor/depot_tools/recipes/recipe_modules/gclient/api.py +428 -0
- data/vendor/depot_tools/recipes/recipe_modules/gclient/config.py +462 -0
- data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/basic.json +238 -0
- data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/revision.json +240 -0
- data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/tryserver.json +238 -0
- data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.py +95 -0
- data/vendor/depot_tools/recipes/recipe_modules/gclient/resources/diff_deps.py +16 -0
- data/vendor/depot_tools/recipes/recipe_modules/gclient/test_api.py +36 -0
- data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/diff_deps.expected/basic.json +55 -0
- data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/diff_deps.expected/dont have revision yet.json +84 -0
- data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/diff_deps.expected/no change, exception.json +83 -0
- data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/diff_deps.expected/windows.json +55 -0
- data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/diff_deps.py +88 -0
- data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/patch_project.py +92 -0
- data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/sync_failure.py +24 -0
- data/vendor/depot_tools/recipes/recipe_modules/gerrit/__init__.py +8 -0
- data/vendor/depot_tools/recipes/recipe_modules/gerrit/api.py +178 -0
- data/vendor/depot_tools/recipes/recipe_modules/gerrit/examples/full.expected/basic.json +284 -0
- data/vendor/depot_tools/recipes/recipe_modules/gerrit/examples/full.py +73 -0
- data/vendor/depot_tools/recipes/recipe_modules/gerrit/test_api.py +53 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/__init__.py +11 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/api.py +405 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic.json +217 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_branch.json +217 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_file_name.json +219 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_hash.json +216 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_ref.json +217 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_submodule_update_force.json +218 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_tags.json +218 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/can_fail_build.json +164 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/cannot_fail_build.json +220 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/cat-file_test.json +239 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_delta.json +290 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_failed.json +220 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_with_bad_output.json +222 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_with_bad_output_fails_build.json +111 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/curl_trace_file.json +218 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/git-cache-checkout.json +265 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/platform_win.json +217 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/rebase_failed.json +221 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/remote_not_origin.json +219 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/set_got_revision.json +218 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.py +170 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/resources/git_setup.py +52 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/test_api.py +18 -0
- data/vendor/depot_tools/recipes/recipe_modules/git_cl/__init__.py +5 -0
- data/vendor/depot_tools/recipes/recipe_modules/git_cl/api.py +50 -0
- data/vendor/depot_tools/recipes/recipe_modules/git_cl/config.py +22 -0
- data/vendor/depot_tools/recipes/recipe_modules/git_cl/examples/full.expected/basic.json +105 -0
- data/vendor/depot_tools/recipes/recipe_modules/git_cl/examples/full.py +47 -0
- data/vendor/depot_tools/recipes/recipe_modules/gitiles/OWNERS +2 -0
- data/vendor/depot_tools/recipes/recipe_modules/gitiles/__init__.py +12 -0
- data/vendor/depot_tools/recipes/recipe_modules/gitiles/api.py +257 -0
- data/vendor/depot_tools/recipes/recipe_modules/gitiles/examples/full.expected/basic.json +596 -0
- data/vendor/depot_tools/recipes/recipe_modules/gitiles/examples/full.py +93 -0
- data/vendor/depot_tools/recipes/recipe_modules/gitiles/resources/gerrit_client.py +251 -0
- data/vendor/depot_tools/recipes/recipe_modules/gitiles/test_api.py +95 -0
- data/vendor/depot_tools/recipes/recipe_modules/gitiles/tests/parse_repo_url.expected/basic.json +5 -0
- data/vendor/depot_tools/recipes/recipe_modules/gitiles/tests/parse_repo_url.py +49 -0
- data/vendor/depot_tools/recipes/recipe_modules/gsutil/__init__.py +4 -0
- data/vendor/depot_tools/recipes/recipe_modules/gsutil/api.py +222 -0
- data/vendor/depot_tools/recipes/recipe_modules/gsutil/examples/full.expected/basic.json +247 -0
- data/vendor/depot_tools/recipes/recipe_modules/gsutil/examples/full.py +92 -0
- data/vendor/depot_tools/recipes/recipe_modules/gsutil/resources/gsutil_smart_retry.py +69 -0
- data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/__init__.py +36 -0
- data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/api.py +140 -0
- data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/ancient_version.json +83 -0
- data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/automatic_version.json +83 -0
- data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/explicit_version.json +83 -0
- data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/linux.json +21 -0
- data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/mac.json +83 -0
- data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/win.json +21 -0
- data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.py +42 -0
- data/vendor/depot_tools/recipes/recipe_modules/presubmit/__init__.py +27 -0
- data/vendor/depot_tools/recipes/recipe_modules/presubmit/api.py +251 -0
- data/vendor/depot_tools/recipes/recipe_modules/presubmit/examples/full.expected/basic.json +27 -0
- data/vendor/depot_tools/recipes/recipe_modules/presubmit/examples/full.py +19 -0
- data/vendor/depot_tools/recipes/recipe_modules/presubmit/properties.proto +14 -0
- data/vendor/depot_tools/recipes/recipe_modules/presubmit/test_api.py +19 -0
- data/vendor/depot_tools/recipes/recipe_modules/presubmit/tests/execute.py +247 -0
- data/vendor/depot_tools/recipes/recipe_modules/presubmit/tests/prepare.py +49 -0
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/__init__.py +18 -0
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/api.py +264 -0
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/basic_tags.json +57 -0
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch.json +190 -0
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch_and_target_ref.json +190 -0
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch.json +21 -0
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch_new.json +22 -0
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.py +95 -0
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/test_api.py +14 -0
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/tests/gerrit_change_fetch_ref_timeout.py +29 -0
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/tests/gerrit_change_owner.expected/basic.json +5 -0
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/tests/gerrit_change_owner.py +22 -0
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/tests/gerrit_change_target_ref.py +32 -0
- data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/__init__.py +25 -0
- data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/api.py +137 -0
- data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/linux.json +21 -0
- data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/mac.json +21 -0
- data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/win.json +108 -0
- data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.py +21 -0
- data/vendor/depot_tools/recipes/recipes.py +249 -0
- data/vendor/depot_tools/recipes/recipes/fetch_end_to_end_test.expected/basic.json +175 -0
- data/vendor/depot_tools/recipes/recipes/fetch_end_to_end_test.py +56 -0
- data/vendor/depot_tools/recipes/trigger_recipe_roller.txt +13 -0
- data/vendor/depot_tools/repo +1194 -0
- data/vendor/depot_tools/roll-dep +21 -0
- data/vendor/depot_tools/roll-dep.bat +21 -0
- data/vendor/depot_tools/roll_dep.py +282 -0
- data/vendor/depot_tools/scm.py +415 -0
- data/vendor/depot_tools/setup_color.py +130 -0
- data/vendor/depot_tools/split_cl.py +263 -0
- data/vendor/depot_tools/subcommand.py +261 -0
- data/vendor/depot_tools/subprocess2.py +258 -0
- data/vendor/depot_tools/third_party/__init__.py +5 -0
- data/vendor/depot_tools/third_party/colorama/LICENSE.txt +27 -0
- data/vendor/depot_tools/third_party/colorama/README.chromium +12 -0
- data/vendor/depot_tools/third_party/colorama/README.rst +346 -0
- data/vendor/depot_tools/third_party/colorama/__init__.py +6 -0
- data/vendor/depot_tools/third_party/colorama/ansi.py +102 -0
- data/vendor/depot_tools/third_party/colorama/ansitowin32.py +257 -0
- data/vendor/depot_tools/third_party/colorama/initialise.py +80 -0
- data/vendor/depot_tools/third_party/colorama/win32.py +152 -0
- data/vendor/depot_tools/third_party/colorama/winterm.py +169 -0
- data/vendor/depot_tools/third_party/coverage/AUTHORS.txt +43 -0
- data/vendor/depot_tools/third_party/coverage/PKG-INFO +41 -0
- data/vendor/depot_tools/third_party/coverage/README.chromium +13 -0
- data/vendor/depot_tools/third_party/coverage/__init__.py +120 -0
- data/vendor/depot_tools/third_party/coverage/__main__.py +4 -0
- data/vendor/depot_tools/third_party/coverage/annotate.py +101 -0
- data/vendor/depot_tools/third_party/coverage/backward.py +184 -0
- data/vendor/depot_tools/third_party/coverage/bytecode.py +75 -0
- data/vendor/depot_tools/third_party/coverage/cmdline.py +740 -0
- data/vendor/depot_tools/third_party/coverage/codeunit.py +145 -0
- data/vendor/depot_tools/third_party/coverage/collector.py +353 -0
- data/vendor/depot_tools/third_party/coverage/config.py +213 -0
- data/vendor/depot_tools/third_party/coverage/control.py +776 -0
- data/vendor/depot_tools/third_party/coverage/data.py +278 -0
- data/vendor/depot_tools/third_party/coverage/debug.py +54 -0
- data/vendor/depot_tools/third_party/coverage/execfile.py +171 -0
- data/vendor/depot_tools/third_party/coverage/files.py +309 -0
- data/vendor/depot_tools/third_party/coverage/fullcoverage/encodings.py +57 -0
- data/vendor/depot_tools/third_party/coverage/html.py +387 -0
- data/vendor/depot_tools/third_party/coverage/htmlfiles/coverage_html.js +376 -0
- data/vendor/depot_tools/third_party/coverage/htmlfiles/index.html +104 -0
- data/vendor/depot_tools/third_party/coverage/htmlfiles/jquery-1.4.3.min.js +166 -0
- data/vendor/depot_tools/third_party/coverage/htmlfiles/jquery.hotkeys.js +99 -0
- data/vendor/depot_tools/third_party/coverage/htmlfiles/jquery.isonscreen.js +53 -0
- data/vendor/depot_tools/third_party/coverage/htmlfiles/jquery.min.js +166 -0
- data/vendor/depot_tools/third_party/coverage/htmlfiles/jquery.tablesorter.min.js +2 -0
- data/vendor/depot_tools/third_party/coverage/htmlfiles/keybd_closed.png +0 -0
- data/vendor/depot_tools/third_party/coverage/htmlfiles/keybd_open.png +0 -0
- data/vendor/depot_tools/third_party/coverage/htmlfiles/pyfile.html +90 -0
- data/vendor/depot_tools/third_party/coverage/htmlfiles/style.css +300 -0
- data/vendor/depot_tools/third_party/coverage/misc.py +163 -0
- data/vendor/depot_tools/third_party/coverage/parser.py +666 -0
- data/vendor/depot_tools/third_party/coverage/phystokens.py +208 -0
- data/vendor/depot_tools/third_party/coverage/report.py +92 -0
- data/vendor/depot_tools/third_party/coverage/results.py +286 -0
- data/vendor/depot_tools/third_party/coverage/summary.py +86 -0
- data/vendor/depot_tools/third_party/coverage/templite.py +166 -0
- data/vendor/depot_tools/third_party/coverage/version.py +9 -0
- data/vendor/depot_tools/third_party/coverage/xmlreport.py +155 -0
- data/vendor/depot_tools/third_party/httplib2/LICENSE +1339 -0
- data/vendor/depot_tools/third_party/httplib2/README.chromium +15 -0
- data/vendor/depot_tools/third_party/httplib2/__init__.py +1780 -0
- data/vendor/depot_tools/third_party/httplib2/cacerts.txt +2196 -0
- data/vendor/depot_tools/third_party/httplib2/iri2uri.py +110 -0
- data/vendor/depot_tools/third_party/httplib2/socks.py +448 -0
- data/vendor/depot_tools/third_party/repo/COPYING +202 -0
- data/vendor/depot_tools/third_party/repo/README.chromium +4 -0
- data/vendor/depot_tools/third_party/repo/__init__.py +0 -0
- data/vendor/depot_tools/third_party/repo/progress.py +117 -0
- data/vendor/depot_tools/third_party/retry_decorator/LICENSE.google +30 -0
- data/vendor/depot_tools/third_party/retry_decorator/__init__.py +0 -0
- data/vendor/depot_tools/third_party/retry_decorator/decorators.py +45 -0
- data/vendor/depot_tools/third_party/schema/.editorconfig +15 -0
- data/vendor/depot_tools/third_party/schema/.gitignore +174 -0
- data/vendor/depot_tools/third_party/schema/.travis.yml +37 -0
- data/vendor/depot_tools/third_party/schema/LICENSE-MIT +19 -0
- data/vendor/depot_tools/third_party/schema/MANIFEST.in +1 -0
- data/vendor/depot_tools/third_party/schema/README.chromium +12 -0
- data/vendor/depot_tools/third_party/schema/README.rst +382 -0
- data/vendor/depot_tools/third_party/schema/__init__.py +1 -0
- data/vendor/depot_tools/third_party/schema/schema.py +338 -0
- data/vendor/depot_tools/third_party/schema/setup.cfg +5 -0
- data/vendor/depot_tools/third_party/schema/setup.py +30 -0
- data/vendor/depot_tools/third_party/schema/test_schema.py +556 -0
- data/vendor/depot_tools/third_party/schema/tox.ini +33 -0
- data/vendor/depot_tools/third_party/six/LICENSE.txt +18 -0
- data/vendor/depot_tools/third_party/six/README.chromium +10 -0
- data/vendor/depot_tools/third_party/six/__init__.py +762 -0
- data/vendor/depot_tools/update_depot_tools +138 -0
- data/vendor/depot_tools/update_depot_tools.bat +65 -0
- data/vendor/depot_tools/update_depot_tools_toggle.py +38 -0
- data/vendor/depot_tools/upload_metrics.py +26 -0
- data/vendor/depot_tools/upload_to_google_storage.py +306 -0
- data/vendor/depot_tools/vpython +42 -0
- data/vendor/depot_tools/vpython.bat +7 -0
- data/vendor/depot_tools/vpython3 +55 -0
- data/vendor/depot_tools/vpython3.bat +12 -0
- data/vendor/depot_tools/watchlists.py +141 -0
- data/vendor/depot_tools/weekly +54 -0
- data/vendor/depot_tools/win32imports.py +61 -0
- data/vendor/depot_tools/win_toolchain/OWNERS +2 -0
- data/vendor/depot_tools/win_toolchain/README.md +74 -0
- data/vendor/depot_tools/win_toolchain/get_toolchain_if_necessary.py +599 -0
- data/vendor/depot_tools/win_toolchain/package_from_installed.py +524 -0
- data/vendor/depot_tools/wtf +81 -0
- data/vendor/depot_tools/yapf +21 -0
- data/vendor/depot_tools/yapf.bat +12 -0
- data/vendor/depot_tools/zsh-goodies/README +6 -0
- data/vendor/depot_tools/zsh-goodies/_gclient +14 -0
- metadata +729 -0
|
File without changes
|
|
@@ -0,0 +1,1258 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# Copyright 2014 The Chromium Authors. All rights reserved.
|
|
3
|
+
# Use of this source code is governed by a BSD-style license that can be
|
|
4
|
+
# found in the LICENSE file.
|
|
5
|
+
|
|
6
|
+
# TODO(hinoka): Use logging.
|
|
7
|
+
|
|
8
|
+
from __future__ import print_function
|
|
9
|
+
|
|
10
|
+
import cStringIO
|
|
11
|
+
import codecs
|
|
12
|
+
from contextlib import contextmanager
|
|
13
|
+
import copy
|
|
14
|
+
import ctypes
|
|
15
|
+
from datetime import datetime
|
|
16
|
+
import json
|
|
17
|
+
import optparse
|
|
18
|
+
import os
|
|
19
|
+
import pprint
|
|
20
|
+
import random
|
|
21
|
+
import re
|
|
22
|
+
import subprocess
|
|
23
|
+
import sys
|
|
24
|
+
import tempfile
|
|
25
|
+
import threading
|
|
26
|
+
import time
|
|
27
|
+
import urllib2
|
|
28
|
+
import urlparse
|
|
29
|
+
import uuid
|
|
30
|
+
|
|
31
|
+
import os.path as path
|
|
32
|
+
|
|
33
|
+
# How many bytes at a time to read from pipes.
|
|
34
|
+
BUF_SIZE = 256
|
|
35
|
+
|
|
36
|
+
# How many seconds of no stdout activity before process is considered stale. Can
|
|
37
|
+
# be overridden via environmnet variable `STALE_PROCESS_DURATION`. If set to 0,
|
|
38
|
+
# process won't be terminated.
|
|
39
|
+
STALE_PROCESS_DURATION = 1200
|
|
40
|
+
|
|
41
|
+
# Define a bunch of directory paths.
|
|
42
|
+
# Relative to this script's filesystem path.
|
|
43
|
+
THIS_DIR = path.dirname(path.abspath(__file__))
|
|
44
|
+
|
|
45
|
+
DEPOT_TOOLS_DIR = path.abspath(path.join(THIS_DIR, '..', '..', '..', '..'))
|
|
46
|
+
|
|
47
|
+
CHROMIUM_GIT_HOST = 'https://chromium.googlesource.com'
|
|
48
|
+
CHROMIUM_SRC_URL = CHROMIUM_GIT_HOST + '/chromium/src.git'
|
|
49
|
+
|
|
50
|
+
BRANCH_HEADS_REFSPEC = '+refs/branch-heads/*'
|
|
51
|
+
TAGS_REFSPEC = '+refs/tags/*'
|
|
52
|
+
|
|
53
|
+
# Regular expression to match sha1 git revision.
|
|
54
|
+
COMMIT_HASH_RE = re.compile(r'[0-9a-f]{5,40}', re.IGNORECASE)
|
|
55
|
+
|
|
56
|
+
# Regular expression that matches a single commit footer line.
|
|
57
|
+
COMMIT_FOOTER_ENTRY_RE = re.compile(r'([^:]+):\s*(.*)')
|
|
58
|
+
|
|
59
|
+
# Footer metadata keys for regular and gsubtreed mirrored commit positions.
|
|
60
|
+
COMMIT_POSITION_FOOTER_KEY = 'Cr-Commit-Position'
|
|
61
|
+
COMMIT_ORIGINAL_POSITION_FOOTER_KEY = 'Cr-Original-Commit-Position'
|
|
62
|
+
|
|
63
|
+
# Regular expression to parse gclient's revinfo entries.
|
|
64
|
+
REVINFO_RE = re.compile(r'^([^:]+):\s+([^@]+)@(.+)$')
|
|
65
|
+
|
|
66
|
+
# Copied from scripts/recipes/chromium.py.
|
|
67
|
+
GOT_REVISION_MAPPINGS = {
|
|
68
|
+
CHROMIUM_SRC_URL: {
|
|
69
|
+
'got_revision': 'src/',
|
|
70
|
+
'got_nacl_revision': 'src/native_client/',
|
|
71
|
+
'got_swarm_client_revision': 'src/tools/swarm_client/',
|
|
72
|
+
'got_swarming_client_revision': 'src/tools/swarming_client/',
|
|
73
|
+
'got_v8_revision': 'src/v8/',
|
|
74
|
+
'got_webkit_revision': 'src/third_party/WebKit/',
|
|
75
|
+
'got_webrtc_revision': 'src/third_party/webrtc/',
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
GCLIENT_TEMPLATE = """solutions = %(solutions)s
|
|
81
|
+
|
|
82
|
+
cache_dir = r%(cache_dir)s
|
|
83
|
+
%(target_os)s
|
|
84
|
+
%(target_os_only)s
|
|
85
|
+
%(target_cpu)s
|
|
86
|
+
"""
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
GIT_CACHE_PATH = path.join(DEPOT_TOOLS_DIR, 'git_cache.py')
|
|
90
|
+
GCLIENT_PATH = path.join(DEPOT_TOOLS_DIR, 'gclient.py')
|
|
91
|
+
|
|
92
|
+
class SubprocessFailed(Exception):
|
|
93
|
+
def __init__(self, message, code, output):
|
|
94
|
+
Exception.__init__(self, message)
|
|
95
|
+
self.code = code
|
|
96
|
+
self.output = output
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class PatchFailed(SubprocessFailed):
|
|
100
|
+
pass
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
class GclientSyncFailed(SubprocessFailed):
|
|
104
|
+
pass
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class InvalidDiff(Exception):
|
|
108
|
+
pass
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
RETRY = object()
|
|
112
|
+
OK = object()
|
|
113
|
+
FAIL = object()
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
class ProcessObservers(object):
|
|
117
|
+
"""ProcessObservers allows monitoring of child process."""
|
|
118
|
+
|
|
119
|
+
def poke(self):
|
|
120
|
+
"""poke is called when child process sent `BUF_SIZE` data to stdout."""
|
|
121
|
+
pass
|
|
122
|
+
|
|
123
|
+
def cancel(self):
|
|
124
|
+
"""cancel is called once proc exists successfully."""
|
|
125
|
+
pass
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
class PsPrinter(ProcessObservers):
|
|
129
|
+
def __init__(self, interval=300):
|
|
130
|
+
self.interval = interval
|
|
131
|
+
self.active = sys.platform.startswith('linux2')
|
|
132
|
+
self.thread = None
|
|
133
|
+
|
|
134
|
+
def print_pstree(self):
|
|
135
|
+
"""Debugging function used to print "ps auxwwf" for stuck processes."""
|
|
136
|
+
# Add new line for cleaner output
|
|
137
|
+
print()
|
|
138
|
+
subprocess.call(['ps', 'auxwwf'])
|
|
139
|
+
|
|
140
|
+
# Restart timer, we want to continue printing until the process is
|
|
141
|
+
# terminated.
|
|
142
|
+
self.poke()
|
|
143
|
+
|
|
144
|
+
def poke(self):
|
|
145
|
+
if self.active:
|
|
146
|
+
self.cancel()
|
|
147
|
+
self.thread = threading.Timer(self.interval, self.print_pstree)
|
|
148
|
+
self.thread.start()
|
|
149
|
+
|
|
150
|
+
def cancel(self):
|
|
151
|
+
if self.active and self.thread is not None:
|
|
152
|
+
self.thread.cancel()
|
|
153
|
+
self.thread = None
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
class StaleProcess(ProcessObservers):
|
|
157
|
+
'''StaleProcess terminates process if there is no poke call in `interval`. '''
|
|
158
|
+
|
|
159
|
+
def __init__(self, interval, proc):
|
|
160
|
+
self.interval = interval
|
|
161
|
+
self.proc = proc
|
|
162
|
+
self.thread = None
|
|
163
|
+
|
|
164
|
+
def _terminate_process(self):
|
|
165
|
+
print('Terminating stale process...')
|
|
166
|
+
self.proc.terminate()
|
|
167
|
+
|
|
168
|
+
def poke(self):
|
|
169
|
+
self.cancel()
|
|
170
|
+
if self.interval > 0:
|
|
171
|
+
self.thread = threading.Timer(self.interval, self._terminate_process)
|
|
172
|
+
self.thread.start()
|
|
173
|
+
|
|
174
|
+
def cancel(self):
|
|
175
|
+
if self.thread is not None:
|
|
176
|
+
self.thread.cancel()
|
|
177
|
+
self.thread = None
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def call(*args, **kwargs): # pragma: no cover
|
|
181
|
+
"""Interactive subprocess call."""
|
|
182
|
+
kwargs['stdout'] = subprocess.PIPE
|
|
183
|
+
kwargs['stderr'] = subprocess.STDOUT
|
|
184
|
+
kwargs.setdefault('bufsize', BUF_SIZE)
|
|
185
|
+
cwd = kwargs.get('cwd', os.getcwd())
|
|
186
|
+
stdin_data = kwargs.pop('stdin_data', None)
|
|
187
|
+
if stdin_data:
|
|
188
|
+
kwargs['stdin'] = subprocess.PIPE
|
|
189
|
+
out = cStringIO.StringIO()
|
|
190
|
+
new_env = kwargs.get('env', {})
|
|
191
|
+
env = os.environ.copy()
|
|
192
|
+
env.update(new_env)
|
|
193
|
+
kwargs['env'] = env
|
|
194
|
+
|
|
195
|
+
if new_env:
|
|
196
|
+
print('===Injecting Environment Variables===')
|
|
197
|
+
for k, v in sorted(new_env.items()):
|
|
198
|
+
print('%s: %s' % (k, v))
|
|
199
|
+
print('%s ===Running %s ===' % (datetime.now(), ' '.join(args),))
|
|
200
|
+
print('In directory: %s' % cwd)
|
|
201
|
+
start_time = time.time()
|
|
202
|
+
proc = subprocess.Popen(args, **kwargs)
|
|
203
|
+
if stdin_data:
|
|
204
|
+
proc.stdin.write(stdin_data)
|
|
205
|
+
proc.stdin.close()
|
|
206
|
+
stale_process_duration = env.get('STALE_PROCESS_DURATION',
|
|
207
|
+
STALE_PROCESS_DURATION)
|
|
208
|
+
observers = [PsPrinter(), StaleProcess(int(stale_process_duration), proc)]
|
|
209
|
+
# This is here because passing 'sys.stdout' into stdout for proc will
|
|
210
|
+
# produce out of order output.
|
|
211
|
+
hanging_cr = False
|
|
212
|
+
while True:
|
|
213
|
+
for observer in observers:
|
|
214
|
+
observer.poke()
|
|
215
|
+
buf = proc.stdout.read(BUF_SIZE)
|
|
216
|
+
if not buf:
|
|
217
|
+
break
|
|
218
|
+
if hanging_cr:
|
|
219
|
+
buf = '\r' + buf
|
|
220
|
+
hanging_cr = buf.endswith('\r')
|
|
221
|
+
if hanging_cr:
|
|
222
|
+
buf = buf[:-1]
|
|
223
|
+
buf = buf.replace('\r\n', '\n').replace('\r', '\n')
|
|
224
|
+
sys.stdout.write(buf)
|
|
225
|
+
out.write(buf)
|
|
226
|
+
if hanging_cr:
|
|
227
|
+
sys.stdout.write('\n')
|
|
228
|
+
out.write('\n')
|
|
229
|
+
for observer in observers:
|
|
230
|
+
observer.cancel()
|
|
231
|
+
|
|
232
|
+
code = proc.wait()
|
|
233
|
+
elapsed_time = ((time.time() - start_time) / 60.0)
|
|
234
|
+
outval = out.getvalue()
|
|
235
|
+
if code:
|
|
236
|
+
print('%s ===Failed in %.1f mins of %s ===' %
|
|
237
|
+
(datetime.now(), elapsed_time, ' '.join(args)))
|
|
238
|
+
print()
|
|
239
|
+
raise SubprocessFailed('%s failed with code %d in %s.' %
|
|
240
|
+
(' '.join(args), code, cwd),
|
|
241
|
+
code, outval)
|
|
242
|
+
|
|
243
|
+
print('%s ===Succeeded in %.1f mins of %s ===' %
|
|
244
|
+
(datetime.now(), elapsed_time, ' '.join(args)))
|
|
245
|
+
print()
|
|
246
|
+
return outval
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def git(*args, **kwargs): # pragma: no cover
|
|
250
|
+
"""Wrapper around call specifically for Git commands."""
|
|
251
|
+
if args and args[0] == 'cache':
|
|
252
|
+
# Rewrite "git cache" calls into "python git_cache.py".
|
|
253
|
+
cmd = (sys.executable, '-u', GIT_CACHE_PATH) + args[1:]
|
|
254
|
+
else:
|
|
255
|
+
git_executable = 'git'
|
|
256
|
+
# On windows, subprocess doesn't fuzzy-match 'git' to 'git.bat', so we
|
|
257
|
+
# have to do it explicitly. This is better than passing shell=True.
|
|
258
|
+
if sys.platform.startswith('win'):
|
|
259
|
+
git_executable += '.bat'
|
|
260
|
+
cmd = (git_executable,) + args
|
|
261
|
+
return call(*cmd, **kwargs)
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
def get_gclient_spec(solutions, target_os, target_os_only, target_cpu,
|
|
265
|
+
git_cache_dir):
|
|
266
|
+
return GCLIENT_TEMPLATE % {
|
|
267
|
+
'solutions': pprint.pformat(solutions, indent=4),
|
|
268
|
+
'cache_dir': '"%s"' % git_cache_dir,
|
|
269
|
+
'target_os': ('\ntarget_os=%s' % target_os) if target_os else '',
|
|
270
|
+
'target_os_only': '\ntarget_os_only=%s' % target_os_only,
|
|
271
|
+
'target_cpu': ('\ntarget_cpu=%s' % target_cpu) if target_cpu else ''
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
def solutions_printer(solutions):
|
|
276
|
+
"""Prints gclient solution to stdout."""
|
|
277
|
+
print('Gclient Solutions')
|
|
278
|
+
print('=================')
|
|
279
|
+
for solution in solutions:
|
|
280
|
+
name = solution.get('name')
|
|
281
|
+
url = solution.get('url')
|
|
282
|
+
print('%s (%s)' % (name, url))
|
|
283
|
+
if solution.get('deps_file'):
|
|
284
|
+
print(' Dependencies file is %s' % solution['deps_file'])
|
|
285
|
+
if 'managed' in solution:
|
|
286
|
+
print(' Managed mode is %s' % ('ON' if solution['managed'] else 'OFF'))
|
|
287
|
+
custom_vars = solution.get('custom_vars')
|
|
288
|
+
if custom_vars:
|
|
289
|
+
print(' Custom Variables:')
|
|
290
|
+
for var_name, var_value in sorted(custom_vars.items()):
|
|
291
|
+
print(' %s = %s' % (var_name, var_value))
|
|
292
|
+
custom_deps = solution.get('custom_deps')
|
|
293
|
+
if 'custom_deps' in solution:
|
|
294
|
+
print(' Custom Dependencies:')
|
|
295
|
+
for deps_name, deps_value in sorted(custom_deps.items()):
|
|
296
|
+
if deps_value:
|
|
297
|
+
print(' %s -> %s' % (deps_name, deps_value))
|
|
298
|
+
else:
|
|
299
|
+
print(' %s: Ignore' % deps_name)
|
|
300
|
+
for k, v in solution.items():
|
|
301
|
+
# Print out all the keys we don't know about.
|
|
302
|
+
if k in ['name', 'url', 'deps_file', 'custom_vars', 'custom_deps',
|
|
303
|
+
'managed']:
|
|
304
|
+
continue
|
|
305
|
+
print(' %s is %s' % (k, v))
|
|
306
|
+
print()
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
def modify_solutions(input_solutions):
|
|
310
|
+
"""Modifies urls in solutions to point at Git repos.
|
|
311
|
+
|
|
312
|
+
returns: new solution dictionary
|
|
313
|
+
"""
|
|
314
|
+
assert input_solutions
|
|
315
|
+
solutions = copy.deepcopy(input_solutions)
|
|
316
|
+
for solution in solutions:
|
|
317
|
+
original_url = solution['url']
|
|
318
|
+
parsed_url = urlparse.urlparse(original_url)
|
|
319
|
+
parsed_path = parsed_url.path
|
|
320
|
+
|
|
321
|
+
solution['managed'] = False
|
|
322
|
+
# We don't want gclient to be using a safesync URL. Instead it should
|
|
323
|
+
# using the lkgr/lkcr branch/tags.
|
|
324
|
+
if 'safesync_url' in solution:
|
|
325
|
+
print('Removing safesync url %s from %s' % (solution['safesync_url'],
|
|
326
|
+
parsed_path))
|
|
327
|
+
del solution['safesync_url']
|
|
328
|
+
|
|
329
|
+
return solutions
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
def remove(target, cleanup_dir):
|
|
333
|
+
"""Remove a target by moving it into cleanup_dir."""
|
|
334
|
+
if not path.exists(cleanup_dir):
|
|
335
|
+
os.makedirs(cleanup_dir)
|
|
336
|
+
dest = path.join(cleanup_dir, '%s_%s' % (
|
|
337
|
+
path.basename(target), uuid.uuid4().hex))
|
|
338
|
+
print('Marking for removal %s => %s' % (target, dest))
|
|
339
|
+
try:
|
|
340
|
+
os.rename(target, dest)
|
|
341
|
+
except Exception as e:
|
|
342
|
+
print('Error renaming %s to %s: %s' % (target, dest, str(e)))
|
|
343
|
+
raise
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
def ensure_no_checkout(dir_names, cleanup_dir):
|
|
347
|
+
"""Ensure that there is no undesired checkout under build/."""
|
|
348
|
+
build_dir = os.getcwd()
|
|
349
|
+
has_checkout = any(path.exists(path.join(build_dir, dir_name, '.git'))
|
|
350
|
+
for dir_name in dir_names)
|
|
351
|
+
if has_checkout:
|
|
352
|
+
for filename in os.listdir(build_dir):
|
|
353
|
+
deletion_target = path.join(build_dir, filename)
|
|
354
|
+
print('.git detected in checkout, deleting %s...' % deletion_target,)
|
|
355
|
+
remove(deletion_target, cleanup_dir)
|
|
356
|
+
print('done')
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
def call_gclient(*args, **kwargs):
|
|
360
|
+
"""Run the "gclient.py" tool with the supplied arguments.
|
|
361
|
+
|
|
362
|
+
Args:
|
|
363
|
+
args: command-line arguments to pass to gclient.
|
|
364
|
+
kwargs: keyword arguments to pass to call.
|
|
365
|
+
"""
|
|
366
|
+
cmd = [sys.executable, '-u', GCLIENT_PATH]
|
|
367
|
+
cmd.extend(args)
|
|
368
|
+
# Disable metrics collection on bots, since it's not supported anyway.
|
|
369
|
+
kwargs.setdefault('env', {})['DEPOT_TOOLS_METRICS'] = '0'
|
|
370
|
+
return call(*cmd, **kwargs)
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
def gclient_configure(solutions, target_os, target_os_only, target_cpu,
|
|
374
|
+
git_cache_dir):
|
|
375
|
+
"""Should do the same thing as gclient --spec='...'."""
|
|
376
|
+
with codecs.open('.gclient', mode='w', encoding='utf-8') as f:
|
|
377
|
+
f.write(get_gclient_spec(
|
|
378
|
+
solutions, target_os, target_os_only, target_cpu, git_cache_dir))
|
|
379
|
+
|
|
380
|
+
|
|
381
|
+
@contextmanager
|
|
382
|
+
def git_config_if_not_set(key, value):
|
|
383
|
+
"""Set git config for key equal to value if key was not set.
|
|
384
|
+
|
|
385
|
+
If key was not set, unset it once we're done."""
|
|
386
|
+
should_unset = True
|
|
387
|
+
try:
|
|
388
|
+
git('config', '--global', key)
|
|
389
|
+
should_unset = False
|
|
390
|
+
except SubprocessFailed as e:
|
|
391
|
+
git('config', '--global', key, value)
|
|
392
|
+
try:
|
|
393
|
+
yield
|
|
394
|
+
finally:
|
|
395
|
+
if should_unset:
|
|
396
|
+
git('config', '--global', '--unset', key)
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
def gclient_sync(
|
|
400
|
+
with_branch_heads, with_tags, revisions, break_repo_locks,
|
|
401
|
+
disable_syntax_validation, patch_refs, gerrit_reset,
|
|
402
|
+
gerrit_rebase_patch_ref):
|
|
403
|
+
# We just need to allocate a filename.
|
|
404
|
+
fd, gclient_output_file = tempfile.mkstemp(suffix='.json')
|
|
405
|
+
os.close(fd)
|
|
406
|
+
|
|
407
|
+
args = ['sync', '--verbose', '--reset', '--force',
|
|
408
|
+
'--ignore_locks', '--output-json', gclient_output_file,
|
|
409
|
+
'--nohooks', '--noprehooks', '--delete_unversioned_trees']
|
|
410
|
+
if with_branch_heads:
|
|
411
|
+
args += ['--with_branch_heads']
|
|
412
|
+
if with_tags:
|
|
413
|
+
args += ['--with_tags']
|
|
414
|
+
if break_repo_locks:
|
|
415
|
+
args += ['--break_repo_locks']
|
|
416
|
+
if disable_syntax_validation:
|
|
417
|
+
args += ['--disable-syntax-validation']
|
|
418
|
+
for name, revision in sorted(revisions.items()):
|
|
419
|
+
if revision.upper() == 'HEAD':
|
|
420
|
+
revision = 'origin/master'
|
|
421
|
+
args.extend(['--revision', '%s@%s' % (name, revision)])
|
|
422
|
+
|
|
423
|
+
if patch_refs:
|
|
424
|
+
for patch_ref in patch_refs:
|
|
425
|
+
args.extend(['--patch-ref', patch_ref])
|
|
426
|
+
if not gerrit_reset:
|
|
427
|
+
args.append('--no-reset-patch-ref')
|
|
428
|
+
if not gerrit_rebase_patch_ref:
|
|
429
|
+
args.append('--no-rebase-patch-ref')
|
|
430
|
+
|
|
431
|
+
try:
|
|
432
|
+
call_gclient(*args)
|
|
433
|
+
except SubprocessFailed as e:
|
|
434
|
+
# If gclient sync is handling patching, parse the output for a patch error
|
|
435
|
+
# message.
|
|
436
|
+
if 'Failed to apply patch.' in e.output:
|
|
437
|
+
raise PatchFailed(e.message, e.code, e.output)
|
|
438
|
+
# Throw a GclientSyncFailed exception so we can catch this independently.
|
|
439
|
+
raise GclientSyncFailed(e.message, e.code, e.output)
|
|
440
|
+
else:
|
|
441
|
+
with open(gclient_output_file) as f:
|
|
442
|
+
return json.load(f)
|
|
443
|
+
finally:
|
|
444
|
+
os.remove(gclient_output_file)
|
|
445
|
+
|
|
446
|
+
|
|
447
|
+
def gclient_revinfo():
|
|
448
|
+
return call_gclient('revinfo', '-a') or ''
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
def normalize_git_url(url):
|
|
452
|
+
"""Normalize a git url to be consistent.
|
|
453
|
+
|
|
454
|
+
This recognizes urls to the googlesoruce.com domain. It ensures that
|
|
455
|
+
the url:
|
|
456
|
+
* Do not end in .git
|
|
457
|
+
* Do not contain /a/ in their path.
|
|
458
|
+
"""
|
|
459
|
+
try:
|
|
460
|
+
p = urlparse.urlparse(url)
|
|
461
|
+
except Exception:
|
|
462
|
+
# Not a url, just return it back.
|
|
463
|
+
return url
|
|
464
|
+
if not p.netloc.endswith('.googlesource.com'):
|
|
465
|
+
# Not a googlesource.com URL, can't normalize this, just return as is.
|
|
466
|
+
return url
|
|
467
|
+
upath = p.path
|
|
468
|
+
if upath.startswith('/a'):
|
|
469
|
+
upath = upath[len('/a'):]
|
|
470
|
+
if upath.endswith('.git'):
|
|
471
|
+
upath = upath[:-len('.git')]
|
|
472
|
+
return 'https://%s%s' % (p.netloc, upath)
|
|
473
|
+
|
|
474
|
+
|
|
475
|
+
# TODO(hinoka): Remove this once all downstream recipes stop using this format.
|
|
476
|
+
def create_manifest_old():
|
|
477
|
+
manifest = {}
|
|
478
|
+
output = gclient_revinfo()
|
|
479
|
+
for line in output.strip().splitlines():
|
|
480
|
+
match = REVINFO_RE.match(line.strip())
|
|
481
|
+
if match:
|
|
482
|
+
manifest[match.group(1)] = {
|
|
483
|
+
'repository': match.group(2),
|
|
484
|
+
'revision': match.group(3),
|
|
485
|
+
}
|
|
486
|
+
else:
|
|
487
|
+
print("WARNING: Couldn't match revinfo line:\n%s" % line)
|
|
488
|
+
return manifest
|
|
489
|
+
|
|
490
|
+
|
|
491
|
+
# TODO(hinoka): Include patch revision.
|
|
492
|
+
def create_manifest(gclient_output, patch_root):
|
|
493
|
+
"""Return the JSONPB equivalent of the source manifest proto.
|
|
494
|
+
|
|
495
|
+
The source manifest proto is defined here:
|
|
496
|
+
https://chromium.googlesource.com/infra/luci/recipes-py/+/master/recipe_engine/source_manifest.proto
|
|
497
|
+
|
|
498
|
+
This is based off of:
|
|
499
|
+
* The gclient_output (from calling gclient.py --output-json) which contains
|
|
500
|
+
the directory -> repo:revision mapping.
|
|
501
|
+
* Gerrit Patch info which contains info about patched revisions.
|
|
502
|
+
|
|
503
|
+
We normalize the URLs using the normalize_git_url function.
|
|
504
|
+
"""
|
|
505
|
+
manifest = {
|
|
506
|
+
'version': 0, # Currently the only valid version is 0.
|
|
507
|
+
}
|
|
508
|
+
dirs = {}
|
|
509
|
+
if patch_root:
|
|
510
|
+
patch_root = patch_root.strip('/') # Normalize directory names.
|
|
511
|
+
for directory, info in gclient_output.get('solutions', {}).items():
|
|
512
|
+
directory = directory.strip('/') # Normalize the directory name.
|
|
513
|
+
# The format of the url is "https://repo.url/blah.git@abcdefabcdef" or
|
|
514
|
+
# just "https://repo.url/blah.git"
|
|
515
|
+
url = info.get('url') or ''
|
|
516
|
+
repo, _, url_revision = url.partition('@')
|
|
517
|
+
repo = normalize_git_url(repo)
|
|
518
|
+
# There are two places to get the revision from, we do it in this order:
|
|
519
|
+
# 1. In the "revision" field
|
|
520
|
+
# 2. At the end of the URL, after @
|
|
521
|
+
revision = info.get('revision') or url_revision
|
|
522
|
+
if repo and revision:
|
|
523
|
+
dirs[directory] = {
|
|
524
|
+
'git_checkout': {
|
|
525
|
+
'repo_url': repo,
|
|
526
|
+
'revision': revision,
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
manifest['directories'] = dirs
|
|
531
|
+
return manifest
|
|
532
|
+
|
|
533
|
+
|
|
534
|
+
def get_commit_message_footer_map(message):
|
|
535
|
+
"""Returns: (dict) A dictionary of commit message footer entries.
|
|
536
|
+
"""
|
|
537
|
+
footers = {}
|
|
538
|
+
|
|
539
|
+
# Extract the lines in the footer block.
|
|
540
|
+
lines = []
|
|
541
|
+
for line in message.strip().splitlines():
|
|
542
|
+
line = line.strip()
|
|
543
|
+
if len(line) == 0:
|
|
544
|
+
del lines[:]
|
|
545
|
+
continue
|
|
546
|
+
lines.append(line)
|
|
547
|
+
|
|
548
|
+
# Parse the footer
|
|
549
|
+
for line in lines:
|
|
550
|
+
m = COMMIT_FOOTER_ENTRY_RE.match(line)
|
|
551
|
+
if not m:
|
|
552
|
+
# If any single line isn't valid, continue anyway for compatibility with
|
|
553
|
+
# Gerrit (which itself uses JGit for this).
|
|
554
|
+
continue
|
|
555
|
+
footers[m.group(1)] = m.group(2).strip()
|
|
556
|
+
return footers
|
|
557
|
+
|
|
558
|
+
|
|
559
|
+
def get_commit_message_footer(message, key):
|
|
560
|
+
"""Returns: (str/None) The footer value for 'key', or None if none was found.
|
|
561
|
+
"""
|
|
562
|
+
return get_commit_message_footer_map(message).get(key)
|
|
563
|
+
|
|
564
|
+
|
|
565
|
+
# Derived from:
|
|
566
|
+
# http://code.activestate.com/recipes/577972-disk-usage/?in=user-4178764
|
|
567
|
+
def get_total_disk_space():
|
|
568
|
+
cwd = os.getcwd()
|
|
569
|
+
# Windows is the only platform that doesn't support os.statvfs, so
|
|
570
|
+
# we need to special case this.
|
|
571
|
+
if sys.platform.startswith('win'):
|
|
572
|
+
_, total, free = (ctypes.c_ulonglong(), ctypes.c_ulonglong(), \
|
|
573
|
+
ctypes.c_ulonglong())
|
|
574
|
+
if sys.version_info >= (3,) or isinstance(cwd, unicode):
|
|
575
|
+
fn = ctypes.windll.kernel32.GetDiskFreeSpaceExW
|
|
576
|
+
else:
|
|
577
|
+
fn = ctypes.windll.kernel32.GetDiskFreeSpaceExA
|
|
578
|
+
ret = fn(cwd, ctypes.byref(_), ctypes.byref(total), ctypes.byref(free))
|
|
579
|
+
if ret == 0:
|
|
580
|
+
# WinError() will fetch the last error code.
|
|
581
|
+
raise ctypes.WinError()
|
|
582
|
+
return (total.value, free.value)
|
|
583
|
+
|
|
584
|
+
else:
|
|
585
|
+
st = os.statvfs(cwd)
|
|
586
|
+
free = st.f_bavail * st.f_frsize
|
|
587
|
+
total = st.f_blocks * st.f_frsize
|
|
588
|
+
return (total, free)
|
|
589
|
+
|
|
590
|
+
|
|
591
|
+
def _get_target_branch_and_revision(solution_name, git_url, revisions):
|
|
592
|
+
normalized_name = solution_name.strip('/')
|
|
593
|
+
if normalized_name in revisions:
|
|
594
|
+
configured = revisions[normalized_name]
|
|
595
|
+
elif git_url in revisions:
|
|
596
|
+
configured = revisions[git_url]
|
|
597
|
+
else:
|
|
598
|
+
return 'master', 'HEAD'
|
|
599
|
+
|
|
600
|
+
parts = configured.split(':', 1)
|
|
601
|
+
if len(parts) == 2:
|
|
602
|
+
# Support for "branch:revision" syntax.
|
|
603
|
+
return parts
|
|
604
|
+
if COMMIT_HASH_RE.match(configured):
|
|
605
|
+
return 'master', configured
|
|
606
|
+
return configured, 'HEAD'
|
|
607
|
+
|
|
608
|
+
|
|
609
|
+
def get_target_pin(solution_name, git_url, revisions):
|
|
610
|
+
"""Returns revision to be checked out if it is pinned, else None."""
|
|
611
|
+
_, revision = _get_target_branch_and_revision(
|
|
612
|
+
solution_name, git_url, revisions)
|
|
613
|
+
if COMMIT_HASH_RE.match(revision):
|
|
614
|
+
return revision
|
|
615
|
+
return None
|
|
616
|
+
|
|
617
|
+
|
|
618
|
+
def force_solution_revision(solution_name, git_url, revisions, cwd):
|
|
619
|
+
branch, revision = _get_target_branch_and_revision(
|
|
620
|
+
solution_name, git_url, revisions)
|
|
621
|
+
if revision and revision.upper() != 'HEAD':
|
|
622
|
+
treeish = revision
|
|
623
|
+
else:
|
|
624
|
+
# TODO(machenbach): This won't work with branch-heads, as Gerrit's
|
|
625
|
+
# destination branch would be e.g. refs/branch-heads/123. But here
|
|
626
|
+
# we need to pass refs/remotes/branch-heads/123 to check out.
|
|
627
|
+
# This will also not work if somebody passes a local refspec like
|
|
628
|
+
# refs/heads/master. It needs to translate to refs/remotes/origin/master
|
|
629
|
+
# first. See also https://crbug.com/740456 .
|
|
630
|
+
if branch.startswith(('refs/', 'origin/')):
|
|
631
|
+
treeish = branch
|
|
632
|
+
else:
|
|
633
|
+
treeish = 'origin/' + branch
|
|
634
|
+
|
|
635
|
+
# Note that -- argument is necessary to ensure that git treats `treeish`
|
|
636
|
+
# argument as revision or ref, and not as a file/directory which happens to
|
|
637
|
+
# have the exact same name.
|
|
638
|
+
git('checkout', '--force', treeish, '--', cwd=cwd)
|
|
639
|
+
|
|
640
|
+
|
|
641
|
+
def _has_in_git_cache(revision_sha1, refs, git_cache_dir, url):
|
|
642
|
+
"""Returns whether given revision_sha1 is contained in cache of a given repo.
|
|
643
|
+
"""
|
|
644
|
+
try:
|
|
645
|
+
mirror_dir = git(
|
|
646
|
+
'cache', 'exists', '--quiet', '--cache-dir', git_cache_dir, url).strip()
|
|
647
|
+
git('cat-file', '-e', revision_sha1, cwd=mirror_dir)
|
|
648
|
+
for ref in refs:
|
|
649
|
+
git('cat-file', '-e', ref, cwd=mirror_dir)
|
|
650
|
+
return True
|
|
651
|
+
except SubprocessFailed:
|
|
652
|
+
return False
|
|
653
|
+
|
|
654
|
+
|
|
655
|
+
def is_broken_repo_dir(repo_dir):
|
|
656
|
+
# Treat absence of 'config' as a signal of a partially deleted repo.
|
|
657
|
+
return not path.exists(os.path.join(repo_dir, '.git', 'config'))
|
|
658
|
+
|
|
659
|
+
|
|
660
|
+
def _maybe_break_locks(checkout_path, tries=3):
|
|
661
|
+
"""This removes all .lock files from this repo's .git directory.
|
|
662
|
+
|
|
663
|
+
In particular, this will cleanup index.lock files, as well as ref lock
|
|
664
|
+
files.
|
|
665
|
+
"""
|
|
666
|
+
def attempt():
|
|
667
|
+
git_dir = os.path.join(checkout_path, '.git')
|
|
668
|
+
for dirpath, _, filenames in os.walk(git_dir):
|
|
669
|
+
for filename in filenames:
|
|
670
|
+
if filename.endswith('.lock'):
|
|
671
|
+
to_break = os.path.join(dirpath, filename)
|
|
672
|
+
print('breaking lock: %s' % to_break)
|
|
673
|
+
try:
|
|
674
|
+
os.remove(to_break)
|
|
675
|
+
except OSError as ex:
|
|
676
|
+
print('FAILED to break lock: %s: %s' % (to_break, ex))
|
|
677
|
+
raise
|
|
678
|
+
|
|
679
|
+
for _ in xrange(tries):
|
|
680
|
+
try:
|
|
681
|
+
attempt()
|
|
682
|
+
return
|
|
683
|
+
except Exception:
|
|
684
|
+
pass
|
|
685
|
+
|
|
686
|
+
|
|
687
|
+
|
|
688
|
+
def git_checkouts(solutions, revisions, refs, no_fetch_tags, git_cache_dir,
|
|
689
|
+
cleanup_dir):
|
|
690
|
+
build_dir = os.getcwd()
|
|
691
|
+
first_solution = True
|
|
692
|
+
for sln in solutions:
|
|
693
|
+
sln_dir = path.join(build_dir, sln['name'])
|
|
694
|
+
_git_checkout(sln, sln_dir, revisions, refs, no_fetch_tags, git_cache_dir,
|
|
695
|
+
cleanup_dir)
|
|
696
|
+
if first_solution:
|
|
697
|
+
git_ref = git('log', '--format=%H', '--max-count=1',
|
|
698
|
+
cwd=path.join(build_dir, sln['name'])
|
|
699
|
+
).strip()
|
|
700
|
+
first_solution = False
|
|
701
|
+
return git_ref
|
|
702
|
+
|
|
703
|
+
|
|
704
|
+
def _git_checkout(sln, sln_dir, revisions, refs, no_fetch_tags, git_cache_dir,
|
|
705
|
+
cleanup_dir):
|
|
706
|
+
name = sln['name']
|
|
707
|
+
url = sln['url']
|
|
708
|
+
populate_cmd = (['cache', 'populate', '--ignore_locks', '-v',
|
|
709
|
+
'--cache-dir', git_cache_dir, url, '--reset-fetch-config'])
|
|
710
|
+
if no_fetch_tags:
|
|
711
|
+
populate_cmd.extend(['--no-fetch-tags'])
|
|
712
|
+
for ref in refs:
|
|
713
|
+
populate_cmd.extend(['--ref', ref])
|
|
714
|
+
|
|
715
|
+
env = {}
|
|
716
|
+
if url == CHROMIUM_SRC_URL or url + '.git' == CHROMIUM_SRC_URL:
|
|
717
|
+
# This is for performance investigation of `git fetch` in chromium/src.
|
|
718
|
+
env = {
|
|
719
|
+
'GIT_TRACE': 'true',
|
|
720
|
+
'GIT_TRACE_PERFORMANCE': 'true',
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
# Step 1: populate/refresh cache, if necessary.
|
|
724
|
+
pin = get_target_pin(name, url, revisions)
|
|
725
|
+
if not pin:
|
|
726
|
+
# Refresh only once.
|
|
727
|
+
git(*populate_cmd, env=env)
|
|
728
|
+
elif _has_in_git_cache(pin, refs, git_cache_dir, url):
|
|
729
|
+
# No need to fetch at all, because we already have needed revision.
|
|
730
|
+
pass
|
|
731
|
+
else:
|
|
732
|
+
# We may need to retry a bit due to eventual consinstency in replication of
|
|
733
|
+
# git servers.
|
|
734
|
+
soft_deadline = time.time() + 60
|
|
735
|
+
attempt = 0
|
|
736
|
+
while True:
|
|
737
|
+
attempt += 1
|
|
738
|
+
# TODO(tandrii): propagate the pin to git server per recommendation of
|
|
739
|
+
# maintainers of *.googlesource.com (workaround git server replication
|
|
740
|
+
# lag).
|
|
741
|
+
git(*populate_cmd, env=env)
|
|
742
|
+
if _has_in_git_cache(pin, refs, git_cache_dir, url):
|
|
743
|
+
break
|
|
744
|
+
overrun = time.time() - soft_deadline
|
|
745
|
+
# Only kick in deadline after second attempt to ensure we retry at least
|
|
746
|
+
# once after initial fetch from not-yet-replicated server.
|
|
747
|
+
if attempt >= 2 and overrun > 0:
|
|
748
|
+
print('Ran %s seconds past deadline. Aborting.' % (overrun,))
|
|
749
|
+
# TODO(tandrii): raise exception immediately here, instead of doing
|
|
750
|
+
# useless step 2 trying to fetch something that we know doesn't exist
|
|
751
|
+
# in cache **after production data gives us confidence to do so**.
|
|
752
|
+
break
|
|
753
|
+
|
|
754
|
+
sleep_secs = min(60, 2**attempt)
|
|
755
|
+
print('waiting %s seconds and trying to fetch again...' % sleep_secs)
|
|
756
|
+
time.sleep(sleep_secs)
|
|
757
|
+
|
|
758
|
+
# Step 2: populate a checkout from local cache. All operations are local.
|
|
759
|
+
mirror_dir = git(
|
|
760
|
+
'cache', 'exists', '--quiet', '--cache-dir', git_cache_dir, url).strip()
|
|
761
|
+
first_try = True
|
|
762
|
+
while True:
|
|
763
|
+
try:
|
|
764
|
+
# If repo deletion was aborted midway, it may have left .git in broken
|
|
765
|
+
# state.
|
|
766
|
+
if path.exists(sln_dir) and is_broken_repo_dir(sln_dir):
|
|
767
|
+
print('Git repo %s appears to be broken, removing it' % sln_dir)
|
|
768
|
+
remove(sln_dir, cleanup_dir)
|
|
769
|
+
|
|
770
|
+
# Use "tries=1", since we retry manually in this loop.
|
|
771
|
+
if not path.isdir(sln_dir):
|
|
772
|
+
git('clone', '--no-checkout', '--local', '--shared', mirror_dir,
|
|
773
|
+
sln_dir)
|
|
774
|
+
# Detach HEAD to be consistent with the non-clone case
|
|
775
|
+
git('checkout', 'master', '--detach', cwd=sln_dir)
|
|
776
|
+
_git_disable_gc(sln_dir)
|
|
777
|
+
else:
|
|
778
|
+
_git_disable_gc(sln_dir)
|
|
779
|
+
git('remote', 'set-url', 'origin', mirror_dir, cwd=sln_dir)
|
|
780
|
+
git('fetch', 'origin', cwd=sln_dir)
|
|
781
|
+
git('remote', 'set-url', '--push', 'origin', url, cwd=sln_dir)
|
|
782
|
+
for ref in refs:
|
|
783
|
+
refspec = '%s:%s' % (ref, ref.lstrip('+'))
|
|
784
|
+
git('fetch', 'origin', refspec, cwd=sln_dir)
|
|
785
|
+
|
|
786
|
+
# Windows sometimes has trouble deleting files.
|
|
787
|
+
# This can make git commands that rely on locks fail.
|
|
788
|
+
# Try a few times in case Windows has trouble again (and again).
|
|
789
|
+
if sys.platform.startswith('win'):
|
|
790
|
+
_maybe_break_locks(sln_dir, tries=3)
|
|
791
|
+
|
|
792
|
+
force_solution_revision(name, url, revisions, sln_dir)
|
|
793
|
+
git('clean', '-dff', cwd=sln_dir)
|
|
794
|
+
return
|
|
795
|
+
except SubprocessFailed as e:
|
|
796
|
+
# Exited abnormally, there's probably something wrong.
|
|
797
|
+
print('Something failed: %s.' % str(e))
|
|
798
|
+
if first_try:
|
|
799
|
+
first_try = False
|
|
800
|
+
# Lets wipe the checkout and try again.
|
|
801
|
+
remove(sln_dir, cleanup_dir)
|
|
802
|
+
else:
|
|
803
|
+
raise
|
|
804
|
+
|
|
805
|
+
def _git_disable_gc(cwd):
|
|
806
|
+
git('config', 'gc.auto', '0', cwd=cwd)
|
|
807
|
+
git('config', 'gc.autodetach', '0', cwd=cwd)
|
|
808
|
+
git('config', 'gc.autopacklimit', '0', cwd=cwd)
|
|
809
|
+
|
|
810
|
+
|
|
811
|
+
def get_commit_position(git_path, revision='HEAD'):
|
|
812
|
+
"""Dumps the 'git' log for a specific revision and parses out the commit
|
|
813
|
+
position.
|
|
814
|
+
|
|
815
|
+
If a commit position metadata key is found, its value will be returned.
|
|
816
|
+
"""
|
|
817
|
+
# TODO(iannucci): Use git-footers for this.
|
|
818
|
+
git_log = git('log', '--format=%B', '-n1', revision, cwd=git_path)
|
|
819
|
+
footer_map = get_commit_message_footer_map(git_log)
|
|
820
|
+
|
|
821
|
+
# Search for commit position metadata
|
|
822
|
+
value = (footer_map.get(COMMIT_POSITION_FOOTER_KEY) or
|
|
823
|
+
footer_map.get(COMMIT_ORIGINAL_POSITION_FOOTER_KEY))
|
|
824
|
+
if value:
|
|
825
|
+
return value
|
|
826
|
+
return None
|
|
827
|
+
|
|
828
|
+
|
|
829
|
+
def parse_got_revision(gclient_output, got_revision_mapping):
|
|
830
|
+
"""Translate git gclient revision mapping to build properties."""
|
|
831
|
+
properties = {}
|
|
832
|
+
solutions_output = {
|
|
833
|
+
# Make sure path always ends with a single slash.
|
|
834
|
+
'%s/' % path.rstrip('/') : solution_output for path, solution_output
|
|
835
|
+
in gclient_output['solutions'].items()
|
|
836
|
+
}
|
|
837
|
+
for property_name, dir_name in got_revision_mapping.items():
|
|
838
|
+
# Make sure dir_name always ends with a single slash.
|
|
839
|
+
dir_name = '%s/' % dir_name.rstrip('/')
|
|
840
|
+
if dir_name not in solutions_output:
|
|
841
|
+
continue
|
|
842
|
+
solution_output = solutions_output[dir_name]
|
|
843
|
+
if solution_output.get('scm') is None:
|
|
844
|
+
# This is an ignored DEPS, so the output got_revision should be 'None'.
|
|
845
|
+
revision = commit_position = None
|
|
846
|
+
else:
|
|
847
|
+
# Since we are using .DEPS.git, everything had better be git.
|
|
848
|
+
assert solution_output.get('scm') == 'git'
|
|
849
|
+
revision = git('rev-parse', 'HEAD', cwd=dir_name).strip()
|
|
850
|
+
commit_position = get_commit_position(dir_name)
|
|
851
|
+
|
|
852
|
+
properties[property_name] = revision
|
|
853
|
+
if commit_position:
|
|
854
|
+
properties['%s_cp' % property_name] = commit_position
|
|
855
|
+
|
|
856
|
+
return properties
|
|
857
|
+
|
|
858
|
+
|
|
859
|
+
def emit_json(out_file, did_run, gclient_output=None, **kwargs):
|
|
860
|
+
"""Write run information into a JSON file."""
|
|
861
|
+
output = {}
|
|
862
|
+
output.update(gclient_output if gclient_output else {})
|
|
863
|
+
output.update({'did_run': did_run})
|
|
864
|
+
output.update(kwargs)
|
|
865
|
+
with open(out_file, 'wb') as f:
|
|
866
|
+
f.write(json.dumps(output, sort_keys=True))
|
|
867
|
+
|
|
868
|
+
|
|
869
|
+
def ensure_checkout(solutions, revisions, first_sln, target_os, target_os_only,
|
|
870
|
+
target_cpu, patch_root, patch_refs, gerrit_rebase_patch_ref,
|
|
871
|
+
no_fetch_tags, refs, git_cache_dir, cleanup_dir,
|
|
872
|
+
gerrit_reset, disable_syntax_validation):
|
|
873
|
+
# Get a checkout of each solution, without DEPS or hooks.
|
|
874
|
+
# Calling git directly because there is no way to run Gclient without
|
|
875
|
+
# invoking DEPS.
|
|
876
|
+
print('Fetching Git checkout')
|
|
877
|
+
|
|
878
|
+
git_checkouts(solutions, revisions, refs, no_fetch_tags, git_cache_dir,
|
|
879
|
+
cleanup_dir)
|
|
880
|
+
|
|
881
|
+
# Ensure our build/ directory is set up with the correct .gclient file.
|
|
882
|
+
gclient_configure(solutions, target_os, target_os_only, target_cpu,
|
|
883
|
+
git_cache_dir)
|
|
884
|
+
|
|
885
|
+
# Windows sometimes has trouble deleting files. This can make git commands
|
|
886
|
+
# that rely on locks fail.
|
|
887
|
+
break_repo_locks = True if sys.platform.startswith('win') else False
|
|
888
|
+
# We want to pass all non-solution revisions into the gclient sync call.
|
|
889
|
+
solution_dirs = {sln['name'] for sln in solutions}
|
|
890
|
+
gc_revisions = {
|
|
891
|
+
dirname: rev for dirname, rev in revisions.items()
|
|
892
|
+
if dirname not in solution_dirs}
|
|
893
|
+
# Gclient sometimes ignores "unmanaged": "False" in the gclient solution
|
|
894
|
+
# if --revision <anything> is passed (for example, for subrepos).
|
|
895
|
+
# This forces gclient to always treat solutions deps as unmanaged.
|
|
896
|
+
for solution_name in list(solution_dirs):
|
|
897
|
+
gc_revisions[solution_name] = 'unmanaged'
|
|
898
|
+
|
|
899
|
+
with git_config_if_not_set('user.name', 'chrome-bot'), \
|
|
900
|
+
git_config_if_not_set('user.email', 'chrome-bot@chromium.org'):
|
|
901
|
+
# Let gclient do the DEPS syncing.
|
|
902
|
+
# The branch-head refspec is a special case because it's possible Chrome
|
|
903
|
+
# src, which contains the branch-head refspecs, is DEPSed in.
|
|
904
|
+
gclient_output = gclient_sync(
|
|
905
|
+
BRANCH_HEADS_REFSPEC in refs,
|
|
906
|
+
TAGS_REFSPEC in refs,
|
|
907
|
+
gc_revisions,
|
|
908
|
+
break_repo_locks,
|
|
909
|
+
disable_syntax_validation,
|
|
910
|
+
patch_refs,
|
|
911
|
+
gerrit_reset,
|
|
912
|
+
gerrit_rebase_patch_ref)
|
|
913
|
+
|
|
914
|
+
# Now that gclient_sync has finished, we should revert any .DEPS.git so that
|
|
915
|
+
# presubmit doesn't complain about it being modified.
|
|
916
|
+
if git('ls-files', '.DEPS.git', cwd=first_sln).strip():
|
|
917
|
+
git('checkout', 'HEAD', '--', '.DEPS.git', cwd=first_sln)
|
|
918
|
+
|
|
919
|
+
# Reset the deps_file point in the solutions so that hooks get run properly.
|
|
920
|
+
for sln in solutions:
|
|
921
|
+
sln['deps_file'] = sln.get('deps_file', 'DEPS').replace('.DEPS.git', 'DEPS')
|
|
922
|
+
gclient_configure(solutions, target_os, target_os_only, target_cpu,
|
|
923
|
+
git_cache_dir)
|
|
924
|
+
|
|
925
|
+
return gclient_output
|
|
926
|
+
|
|
927
|
+
|
|
928
|
+
def parse_revisions(revisions, root):
|
|
929
|
+
"""Turn a list of revision specs into a nice dictionary.
|
|
930
|
+
|
|
931
|
+
We will always return a dict with {root: something}. By default if root
|
|
932
|
+
is unspecified, or if revisions is [], then revision will be assigned 'HEAD'
|
|
933
|
+
"""
|
|
934
|
+
results = {root.strip('/'): 'HEAD'}
|
|
935
|
+
expanded_revisions = []
|
|
936
|
+
for revision in revisions:
|
|
937
|
+
# Allow rev1,rev2,rev3 format.
|
|
938
|
+
# TODO(hinoka): Delete this when webkit switches to recipes.
|
|
939
|
+
expanded_revisions.extend(revision.split(','))
|
|
940
|
+
for revision in expanded_revisions:
|
|
941
|
+
split_revision = revision.split('@', 1)
|
|
942
|
+
if len(split_revision) == 1:
|
|
943
|
+
# This is just a plain revision, set it as the revision for root.
|
|
944
|
+
results[root] = split_revision[0]
|
|
945
|
+
else:
|
|
946
|
+
# This is an alt_root@revision argument.
|
|
947
|
+
current_root, current_rev = split_revision
|
|
948
|
+
|
|
949
|
+
parsed_root = urlparse.urlparse(current_root)
|
|
950
|
+
if parsed_root.scheme in ['http', 'https']:
|
|
951
|
+
# We want to normalize git urls into .git urls.
|
|
952
|
+
normalized_root = 'https://' + parsed_root.netloc + parsed_root.path
|
|
953
|
+
if not normalized_root.endswith('.git'):
|
|
954
|
+
normalized_root += '.git'
|
|
955
|
+
elif parsed_root.scheme:
|
|
956
|
+
print('WARNING: Unrecognized scheme %s, ignoring' % parsed_root.scheme)
|
|
957
|
+
continue
|
|
958
|
+
else:
|
|
959
|
+
# This is probably a local path.
|
|
960
|
+
normalized_root = current_root.strip('/')
|
|
961
|
+
|
|
962
|
+
results[normalized_root] = current_rev
|
|
963
|
+
|
|
964
|
+
return results
|
|
965
|
+
|
|
966
|
+
|
|
967
|
+
def parse_args():
|
|
968
|
+
parse = optparse.OptionParser()
|
|
969
|
+
|
|
970
|
+
parse.add_option('--root', dest='patch_root',
|
|
971
|
+
help='DEPRECATED: Use --patch_root.')
|
|
972
|
+
parse.add_option('--patch_root', help='Directory to patch on top of.')
|
|
973
|
+
parse.add_option('--patch_ref', dest='patch_refs', action='append', default=[],
|
|
974
|
+
help='Git repository & ref to apply, as REPO@REF.')
|
|
975
|
+
parse.add_option('--gerrit_no_rebase_patch_ref', action='store_true',
|
|
976
|
+
help='Bypass rebase of Gerrit patch ref after checkout.')
|
|
977
|
+
parse.add_option('--gerrit_no_reset', action='store_true',
|
|
978
|
+
help='Bypass calling reset after applying a gerrit ref.')
|
|
979
|
+
parse.add_option('--specs', help='Gcilent spec.')
|
|
980
|
+
parse.add_option('--spec-path', help='Path to a Gcilent spec file.')
|
|
981
|
+
parse.add_option('--revision_mapping_file',
|
|
982
|
+
help=('Path to a json file of the form '
|
|
983
|
+
'{"property_name": "path/to/repo/"}'))
|
|
984
|
+
parse.add_option('--revision', action='append', default=[],
|
|
985
|
+
help='Revision to check out. Can be any form of git ref. '
|
|
986
|
+
'Can prepend root@<rev> to specify which repository, '
|
|
987
|
+
'where root is either a filesystem path or git https '
|
|
988
|
+
'url. To specify Tip of Tree, set rev to HEAD. ')
|
|
989
|
+
parse.add_option(
|
|
990
|
+
'--no_fetch_tags',
|
|
991
|
+
action='store_true',
|
|
992
|
+
help=('Don\'t fetch tags from the server for the git checkout. '
|
|
993
|
+
'This can speed up fetch considerably when '
|
|
994
|
+
'there are many tags.'))
|
|
995
|
+
# TODO(machenbach): Remove the flag when all uses have been removed.
|
|
996
|
+
parse.add_option('--output_manifest', action='store_true',
|
|
997
|
+
help=('Deprecated.'))
|
|
998
|
+
parse.add_option('--clobber', action='store_true',
|
|
999
|
+
help='Delete checkout first, always')
|
|
1000
|
+
parse.add_option('--output_json',
|
|
1001
|
+
help='Output JSON information into a specified file')
|
|
1002
|
+
parse.add_option('--refs', action='append',
|
|
1003
|
+
help='Also fetch this refspec for the main solution(s). '
|
|
1004
|
+
'Eg. +refs/branch-heads/*')
|
|
1005
|
+
parse.add_option('--with_branch_heads', action='store_true',
|
|
1006
|
+
help='Always pass --with_branch_heads to gclient. This '
|
|
1007
|
+
'does the same thing as --refs +refs/branch-heads/*')
|
|
1008
|
+
parse.add_option('--with_tags', action='store_true',
|
|
1009
|
+
help='Always pass --with_tags to gclient. This '
|
|
1010
|
+
'does the same thing as --refs +refs/tags/*')
|
|
1011
|
+
parse.add_option('--git-cache-dir', help='Path to git cache directory.')
|
|
1012
|
+
parse.add_option('--cleanup-dir',
|
|
1013
|
+
help='Path to a cleanup directory that can be used for '
|
|
1014
|
+
'deferred file cleanup.')
|
|
1015
|
+
parse.add_option(
|
|
1016
|
+
'--disable-syntax-validation', action='store_true',
|
|
1017
|
+
help='Disable validation of .gclient and DEPS syntax.')
|
|
1018
|
+
|
|
1019
|
+
options, args = parse.parse_args()
|
|
1020
|
+
|
|
1021
|
+
if options.spec_path:
|
|
1022
|
+
if options.specs:
|
|
1023
|
+
parse.error('At most one of --spec-path and --specs may be specified.')
|
|
1024
|
+
with open(options.spec_path, 'r') as fd:
|
|
1025
|
+
options.specs = fd.read()
|
|
1026
|
+
|
|
1027
|
+
if not options.output_json:
|
|
1028
|
+
parse.error('--output_json is required')
|
|
1029
|
+
|
|
1030
|
+
if not options.git_cache_dir:
|
|
1031
|
+
parse.error('--git-cache-dir is required')
|
|
1032
|
+
|
|
1033
|
+
if not options.refs:
|
|
1034
|
+
options.refs = []
|
|
1035
|
+
|
|
1036
|
+
if options.with_branch_heads:
|
|
1037
|
+
options.refs.append(BRANCH_HEADS_REFSPEC)
|
|
1038
|
+
del options.with_branch_heads
|
|
1039
|
+
|
|
1040
|
+
if options.with_tags:
|
|
1041
|
+
options.refs.append(TAGS_REFSPEC)
|
|
1042
|
+
del options.with_tags
|
|
1043
|
+
|
|
1044
|
+
try:
|
|
1045
|
+
if not options.revision_mapping_file:
|
|
1046
|
+
parse.error('--revision_mapping_file is required')
|
|
1047
|
+
|
|
1048
|
+
with open(options.revision_mapping_file, 'r') as f:
|
|
1049
|
+
options.revision_mapping = json.load(f)
|
|
1050
|
+
except Exception as e:
|
|
1051
|
+
print(
|
|
1052
|
+
'WARNING: Caught exception while parsing revision_mapping*: %s'
|
|
1053
|
+
% (str(e),))
|
|
1054
|
+
|
|
1055
|
+
# Because we print CACHE_DIR out into a .gclient file, and then later run
|
|
1056
|
+
# eval() on it, backslashes need to be escaped, otherwise "E:\b\build" gets
|
|
1057
|
+
# parsed as "E:[\x08][\x08]uild".
|
|
1058
|
+
if sys.platform.startswith('win'):
|
|
1059
|
+
options.git_cache_dir = options.git_cache_dir.replace('\\', '\\\\')
|
|
1060
|
+
|
|
1061
|
+
return options, args
|
|
1062
|
+
|
|
1063
|
+
|
|
1064
|
+
def prepare(options, git_slns, active):
|
|
1065
|
+
"""Prepares the target folder before we checkout."""
|
|
1066
|
+
dir_names = [sln.get('name') for sln in git_slns if 'name' in sln]
|
|
1067
|
+
if options.clobber:
|
|
1068
|
+
ensure_no_checkout(dir_names, options.cleanup_dir)
|
|
1069
|
+
# Make sure we tell recipes that we didn't run if the script exits here.
|
|
1070
|
+
emit_json(options.output_json, did_run=active)
|
|
1071
|
+
|
|
1072
|
+
total_disk_space, free_disk_space = get_total_disk_space()
|
|
1073
|
+
total_disk_space_gb = int(total_disk_space / (1024 * 1024 * 1024))
|
|
1074
|
+
used_disk_space_gb = int((total_disk_space - free_disk_space)
|
|
1075
|
+
/ (1024 * 1024 * 1024))
|
|
1076
|
+
percent_used = int(used_disk_space_gb * 100 / total_disk_space_gb)
|
|
1077
|
+
step_text = '[%dGB/%dGB used (%d%%)]' % (used_disk_space_gb,
|
|
1078
|
+
total_disk_space_gb,
|
|
1079
|
+
percent_used)
|
|
1080
|
+
# The first solution is where the primary DEPS file resides.
|
|
1081
|
+
first_sln = dir_names[0]
|
|
1082
|
+
|
|
1083
|
+
# Split all the revision specifications into a nice dict.
|
|
1084
|
+
print('Revisions: %s' % options.revision)
|
|
1085
|
+
revisions = parse_revisions(options.revision, first_sln)
|
|
1086
|
+
print('Fetching Git checkout at %s@%s' % (first_sln, revisions[first_sln]))
|
|
1087
|
+
return revisions, step_text
|
|
1088
|
+
|
|
1089
|
+
|
|
1090
|
+
def checkout(options, git_slns, specs, revisions, step_text):
|
|
1091
|
+
print('Using Python version: %s' % (sys.version,))
|
|
1092
|
+
print('Checking git version...')
|
|
1093
|
+
ver = git('version').strip()
|
|
1094
|
+
print('Using %s' % ver)
|
|
1095
|
+
|
|
1096
|
+
try:
|
|
1097
|
+
protocol = git('config', '--get', 'protocol.version')
|
|
1098
|
+
print('Using git protocol version %s' % protocol)
|
|
1099
|
+
except SubprocessFailed as e:
|
|
1100
|
+
print('git protocol version is not specified.')
|
|
1101
|
+
|
|
1102
|
+
first_sln = git_slns[0]['name']
|
|
1103
|
+
dir_names = [sln.get('name') for sln in git_slns if 'name' in sln]
|
|
1104
|
+
dirty_path = '.dirty_bot_checkout'
|
|
1105
|
+
if os.path.exists(dirty_path):
|
|
1106
|
+
ensure_no_checkout(dir_names, options.cleanup_dir)
|
|
1107
|
+
|
|
1108
|
+
with open(dirty_path, 'w') as f:
|
|
1109
|
+
# create file, no content
|
|
1110
|
+
pass
|
|
1111
|
+
|
|
1112
|
+
should_delete_dirty_file = False
|
|
1113
|
+
|
|
1114
|
+
try:
|
|
1115
|
+
# Outer try is for catching patch failures and exiting gracefully.
|
|
1116
|
+
# Inner try is for catching gclient failures and retrying gracefully.
|
|
1117
|
+
try:
|
|
1118
|
+
checkout_parameters = dict(
|
|
1119
|
+
# First, pass in the base of what we want to check out.
|
|
1120
|
+
solutions=git_slns,
|
|
1121
|
+
revisions=revisions,
|
|
1122
|
+
first_sln=first_sln,
|
|
1123
|
+
|
|
1124
|
+
# Also, target os variables for gclient.
|
|
1125
|
+
target_os=specs.get('target_os', []),
|
|
1126
|
+
target_os_only=specs.get('target_os_only', False),
|
|
1127
|
+
|
|
1128
|
+
# Also, target cpu variables for gclient.
|
|
1129
|
+
target_cpu=specs.get('target_cpu', []),
|
|
1130
|
+
|
|
1131
|
+
# Then, pass in information about how to patch.
|
|
1132
|
+
patch_root=options.patch_root,
|
|
1133
|
+
patch_refs=options.patch_refs,
|
|
1134
|
+
gerrit_rebase_patch_ref=not options.gerrit_no_rebase_patch_ref,
|
|
1135
|
+
|
|
1136
|
+
# Control how the fetch step will occur.
|
|
1137
|
+
no_fetch_tags=options.no_fetch_tags,
|
|
1138
|
+
|
|
1139
|
+
# Finally, extra configurations cleanup dir location.
|
|
1140
|
+
refs=options.refs,
|
|
1141
|
+
git_cache_dir=options.git_cache_dir,
|
|
1142
|
+
cleanup_dir=options.cleanup_dir,
|
|
1143
|
+
gerrit_reset=not options.gerrit_no_reset,
|
|
1144
|
+
disable_syntax_validation=options.disable_syntax_validation)
|
|
1145
|
+
gclient_output = ensure_checkout(**checkout_parameters)
|
|
1146
|
+
should_delete_dirty_file = True
|
|
1147
|
+
except GclientSyncFailed:
|
|
1148
|
+
print('We failed gclient sync, lets delete the checkout and retry.')
|
|
1149
|
+
ensure_no_checkout(dir_names, options.cleanup_dir)
|
|
1150
|
+
gclient_output = ensure_checkout(**checkout_parameters)
|
|
1151
|
+
should_delete_dirty_file = True
|
|
1152
|
+
except PatchFailed as e:
|
|
1153
|
+
# Tell recipes information such as root, got_revision, etc.
|
|
1154
|
+
emit_json(options.output_json,
|
|
1155
|
+
did_run=True,
|
|
1156
|
+
root=first_sln,
|
|
1157
|
+
patch_apply_return_code=e.code,
|
|
1158
|
+
patch_root=options.patch_root,
|
|
1159
|
+
patch_failure=True,
|
|
1160
|
+
failed_patch_body=e.output,
|
|
1161
|
+
step_text='%s PATCH FAILED' % step_text,
|
|
1162
|
+
fixed_revisions=revisions)
|
|
1163
|
+
should_delete_dirty_file = True
|
|
1164
|
+
raise
|
|
1165
|
+
finally:
|
|
1166
|
+
if should_delete_dirty_file:
|
|
1167
|
+
try:
|
|
1168
|
+
os.remove(dirty_path)
|
|
1169
|
+
except OSError:
|
|
1170
|
+
print('Dirty file %s has been removed by a different process.' %
|
|
1171
|
+
dirty_path)
|
|
1172
|
+
|
|
1173
|
+
# Take care of got_revisions outputs.
|
|
1174
|
+
revision_mapping = GOT_REVISION_MAPPINGS.get(git_slns[0]['url'], {})
|
|
1175
|
+
if options.revision_mapping:
|
|
1176
|
+
revision_mapping.update(options.revision_mapping)
|
|
1177
|
+
|
|
1178
|
+
# If the repo is not in the default GOT_REVISION_MAPPINGS and no
|
|
1179
|
+
# revision_mapping were specified on the command line then
|
|
1180
|
+
# default to setting 'got_revision' based on the first solution.
|
|
1181
|
+
if not revision_mapping:
|
|
1182
|
+
revision_mapping['got_revision'] = first_sln
|
|
1183
|
+
|
|
1184
|
+
got_revisions = parse_got_revision(gclient_output, revision_mapping)
|
|
1185
|
+
|
|
1186
|
+
if not got_revisions:
|
|
1187
|
+
# TODO(hinoka): We should probably bail out here, but in the interest
|
|
1188
|
+
# of giving mis-configured bots some time to get fixed use a dummy
|
|
1189
|
+
# revision here.
|
|
1190
|
+
got_revisions = { 'got_revision': 'BOT_UPDATE_NO_REV_FOUND' }
|
|
1191
|
+
#raise Exception('No got_revision(s) found in gclient output')
|
|
1192
|
+
|
|
1193
|
+
# Tell recipes information such as root, got_revision, etc.
|
|
1194
|
+
emit_json(options.output_json,
|
|
1195
|
+
did_run=True,
|
|
1196
|
+
root=first_sln,
|
|
1197
|
+
patch_root=options.patch_root,
|
|
1198
|
+
step_text=step_text,
|
|
1199
|
+
fixed_revisions=revisions,
|
|
1200
|
+
properties=got_revisions,
|
|
1201
|
+
manifest=create_manifest_old(),
|
|
1202
|
+
source_manifest=create_manifest(
|
|
1203
|
+
gclient_output, options.patch_root))
|
|
1204
|
+
|
|
1205
|
+
|
|
1206
|
+
def print_debug_info():
|
|
1207
|
+
print("Debugging info:")
|
|
1208
|
+
debug_params = {
|
|
1209
|
+
'CURRENT_DIR': path.abspath(os.getcwd()),
|
|
1210
|
+
'THIS_DIR': THIS_DIR,
|
|
1211
|
+
'DEPOT_TOOLS_DIR': DEPOT_TOOLS_DIR,
|
|
1212
|
+
}
|
|
1213
|
+
for k, v in sorted(debug_params.items()):
|
|
1214
|
+
print("%s: %r" % (k, v))
|
|
1215
|
+
|
|
1216
|
+
|
|
1217
|
+
def main():
|
|
1218
|
+
# Get inputs.
|
|
1219
|
+
options, _ = parse_args()
|
|
1220
|
+
|
|
1221
|
+
# Check if this script should activate or not.
|
|
1222
|
+
active = True
|
|
1223
|
+
|
|
1224
|
+
# Print a helpful message to tell developers what's going on with this step.
|
|
1225
|
+
print_debug_info()
|
|
1226
|
+
|
|
1227
|
+
# Parse, manipulate, and print the gclient solutions.
|
|
1228
|
+
specs = {}
|
|
1229
|
+
exec(options.specs, specs)
|
|
1230
|
+
orig_solutions = specs.get('solutions', [])
|
|
1231
|
+
git_slns = modify_solutions(orig_solutions)
|
|
1232
|
+
|
|
1233
|
+
solutions_printer(git_slns)
|
|
1234
|
+
|
|
1235
|
+
try:
|
|
1236
|
+
# Dun dun dun, the main part of bot_update.
|
|
1237
|
+
# gn creates hardlinks during the build. By default, this makes
|
|
1238
|
+
# `git reset` overwrite the sources of the hardlinks, which causes
|
|
1239
|
+
# unnecessary rebuilds. (See crbug.com/330461#c13 for an explanation.)
|
|
1240
|
+
with git_config_if_not_set('core.trustctime', 'false'):
|
|
1241
|
+
revisions, step_text = prepare(options, git_slns, active)
|
|
1242
|
+
checkout(options, git_slns, specs, revisions, step_text)
|
|
1243
|
+
|
|
1244
|
+
except PatchFailed as e:
|
|
1245
|
+
# Return a specific non-zero exit code for patch failure (because it is
|
|
1246
|
+
# a failure), but make it different than other failures to distinguish
|
|
1247
|
+
# between infra failures (independent from patch author), and patch
|
|
1248
|
+
# failures (that patch author can fix). However, PatchFailure due to
|
|
1249
|
+
# download patch failure is still an infra problem.
|
|
1250
|
+
if e.code == 3:
|
|
1251
|
+
# Patch download problem.
|
|
1252
|
+
return 87
|
|
1253
|
+
# Genuine patch problem.
|
|
1254
|
+
return 88
|
|
1255
|
+
|
|
1256
|
+
|
|
1257
|
+
if __name__ == '__main__':
|
|
1258
|
+
sys.exit(main())
|