libv8 8.4.255.0
Sign up to get free protection for your applications and to get access to all the features.
- 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())
|