libv8 7.3.492.27.0 → 8.4.255.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +11 -14
- data/CHANGELOG.md +10 -0
- data/README.md +10 -11
- data/Rakefile +30 -36
- data/ext/libv8/builder.rb +1 -1
- data/lib/libv8/version.rb +1 -1
- data/libv8.gemspec +1 -3
- data/vendor/depot_tools/{cipd.ps1 → .cipd_impl.ps1} +0 -0
- data/vendor/depot_tools/.gitattributes +1 -1
- data/vendor/depot_tools/.gitignore +7 -2
- data/vendor/depot_tools/.style.yapf +3 -1
- data/vendor/depot_tools/.vpython +55 -0
- data/vendor/depot_tools/.vpython3 +23 -0
- data/vendor/depot_tools/CROS_OWNERS +3 -1
- data/vendor/depot_tools/GOMA_OWNERS +9 -0
- data/vendor/depot_tools/LUCI_OWNERS +5 -0
- data/vendor/depot_tools/OWNERS +21 -6
- data/vendor/depot_tools/PRESUBMIT.py +35 -18
- data/vendor/depot_tools/README.git-cl.md +0 -14
- data/vendor/depot_tools/README.md +1 -1
- data/vendor/depot_tools/WATCHLISTS +2 -2
- data/vendor/depot_tools/auth.py +60 -772
- data/vendor/depot_tools/autoninja +12 -6
- data/vendor/depot_tools/autoninja.bat +14 -6
- data/vendor/depot_tools/autoninja.py +64 -27
- data/vendor/depot_tools/bb +1 -1
- data/vendor/depot_tools/bootstrap/{win/README.md → README.md} +28 -14
- data/vendor/depot_tools/bootstrap/{win/win_tools.py → bootstrap.py} +60 -43
- data/vendor/depot_tools/bootstrap/{win/git-bash.template.sh → git-bash.template.sh} +1 -1
- data/vendor/depot_tools/bootstrap/{win/git.template.bat → git.template.bat} +0 -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/{win/profile.d.python.sh → profile.d.python.sh} +0 -0
- data/vendor/depot_tools/bootstrap/{win/python27.bleeding_edge.bat → python27.bat} +0 -0
- data/vendor/depot_tools/bootstrap/{win/python27.new.bat → python3.bat} +3 -3
- data/vendor/depot_tools/bootstrap/{win/win_tools.bat → win_tools.bat} +21 -16
- data/vendor/depot_tools/bootstrap_python3 +35 -0
- data/vendor/depot_tools/cbuildbot +1 -1
- data/vendor/depot_tools/chrome_set_ver +1 -1
- data/vendor/depot_tools/cipd +43 -39
- data/vendor/depot_tools/cipd.bat +2 -2
- data/vendor/depot_tools/cipd_client_version +1 -1
- data/vendor/depot_tools/cipd_client_version.digests +15 -14
- data/vendor/depot_tools/cipd_manifest.txt +31 -8
- data/vendor/depot_tools/cipd_manifest.versions +278 -158
- data/vendor/depot_tools/cit.py +9 -7
- data/vendor/depot_tools/clang_format.py +4 -1
- data/vendor/depot_tools/clang_format_merge_driver.py +10 -8
- data/vendor/depot_tools/compile_single_file.py +7 -2
- data/vendor/depot_tools/cpplint.py +51 -45
- data/vendor/depot_tools/cros +87 -0
- data/vendor/depot_tools/cros_sdk +1 -1
- data/vendor/depot_tools/crosjobs +13 -0
- data/vendor/depot_tools/detect_host_arch.py +0 -1
- data/vendor/depot_tools/dirmd +12 -0
- data/vendor/depot_tools/dirmd.bat +7 -0
- data/vendor/depot_tools/download_from_google_storage.py +47 -27
- data/vendor/depot_tools/ensure_bootstrap +14 -0
- data/vendor/depot_tools/fetch +14 -1
- data/vendor/depot_tools/fetch.bat +14 -1
- data/vendor/depot_tools/fetch.py +5 -7
- data/vendor/depot_tools/fetch_configs/chromium.py +6 -4
- data/vendor/depot_tools/fetch_configs/devtools-frontend.py +44 -0
- data/vendor/depot_tools/fetch_configs/ios_internal.py +10 -19
- data/vendor/depot_tools/fix_encoding.py +19 -5
- data/vendor/depot_tools/gclient +28 -12
- data/vendor/depot_tools/gclient-new-workdir.py +2 -0
- data/vendor/depot_tools/gclient.bat +18 -1
- data/vendor/depot_tools/gclient.py +160 -119
- data/vendor/depot_tools/gclient_eval.py +119 -107
- data/vendor/depot_tools/gclient_paths.py +67 -57
- data/vendor/depot_tools/gclient_scm.py +181 -159
- data/vendor/depot_tools/gclient_utils.py +177 -124
- data/vendor/depot_tools/gerrit_client.py +21 -13
- data/vendor/depot_tools/gerrit_util.py +188 -228
- data/vendor/depot_tools/git-cache +1 -1
- data/vendor/depot_tools/git-cl +1 -1
- data/vendor/depot_tools/git-drover +1 -1
- data/vendor/depot_tools/git-find-releases +1 -1
- data/vendor/depot_tools/git-footers +1 -1
- data/vendor/depot_tools/git-freeze +1 -1
- data/vendor/depot_tools/git-hyper-blame +1 -1
- data/vendor/depot_tools/git-map +1 -1
- data/vendor/depot_tools/git-map-branches +1 -1
- data/vendor/depot_tools/git-mark-merge-base +1 -1
- data/vendor/depot_tools/git-nav-downstream +1 -1
- data/vendor/depot_tools/git-new-branch +1 -1
- data/vendor/depot_tools/git-number +1 -1
- data/vendor/depot_tools/git-rebase-update +1 -1
- data/vendor/depot_tools/git-rename-branch +1 -1
- data/vendor/depot_tools/git-reparent-branch +1 -1
- data/vendor/depot_tools/git-retry +1 -1
- data/vendor/depot_tools/git-squash-branch +1 -1
- data/vendor/depot_tools/git-thaw +1 -1
- data/vendor/depot_tools/git-upstream-diff +1 -1
- data/vendor/depot_tools/git_cache.py +255 -360
- data/vendor/depot_tools/git_cl.py +1562 -2059
- data/vendor/depot_tools/git_cl_completion.sh +16 -2
- data/vendor/depot_tools/git_common.py +77 -32
- data/vendor/depot_tools/git_drover.py +17 -8
- data/vendor/depot_tools/git_find_releases.py +11 -9
- data/vendor/depot_tools/git_footers.py +13 -9
- data/vendor/depot_tools/git_freezer.py +3 -1
- data/vendor/depot_tools/git_hyper_blame.py +25 -32
- data/vendor/depot_tools/git_map.py +115 -93
- data/vendor/depot_tools/git_map_branches.py +11 -10
- data/vendor/depot_tools/git_mark_merge_base.py +8 -6
- data/vendor/depot_tools/git_nav_downstream.py +9 -6
- data/vendor/depot_tools/git_new_branch.py +39 -33
- data/vendor/depot_tools/git_number.py +28 -17
- data/vendor/depot_tools/git_rebase_update.py +50 -49
- data/vendor/depot_tools/git_rename_branch.py +2 -2
- data/vendor/depot_tools/git_reparent_branch.py +8 -6
- data/vendor/depot_tools/git_upstream_diff.py +4 -2
- data/vendor/depot_tools/gn.py +6 -4
- 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 +5 -2
- data/vendor/depot_tools/gsutil.py.bat +8 -0
- data/vendor/depot_tools/gsutil.vpython +3 -1
- data/vendor/depot_tools/infra/config/OWNERS +2 -2
- data/vendor/depot_tools/infra/config/recipes.cfg +3 -2
- data/vendor/depot_tools/led +1 -1
- data/vendor/depot_tools/lockfile.py +116 -0
- data/vendor/depot_tools/luci-auth +1 -1
- data/vendor/depot_tools/lucicfg +1 -1
- data/vendor/depot_tools/mac_toolchain +1 -1
- data/vendor/depot_tools/man/html/depot_tools.html +1 -1
- data/vendor/depot_tools/man/html/depot_tools_tutorial.html +31 -25
- data/vendor/depot_tools/man/html/git-cl.html +1 -1
- data/vendor/depot_tools/man/html/git-drover.html +18 -18
- data/vendor/depot_tools/man/html/git-footers.html +1 -1
- data/vendor/depot_tools/man/html/git-freeze.html +3 -3
- data/vendor/depot_tools/man/html/git-hyper-blame.html +1 -1
- data/vendor/depot_tools/man/html/git-map-branches.html +2 -2
- data/vendor/depot_tools/man/html/git-map.html +1 -1
- data/vendor/depot_tools/man/html/git-mark-merge-base.html +1 -1
- data/vendor/depot_tools/man/html/git-nav-downstream.html +3 -3
- data/vendor/depot_tools/man/html/git-nav-upstream.html +12 -6
- data/vendor/depot_tools/man/html/git-new-branch.html +1 -1
- data/vendor/depot_tools/man/html/git-rebase-update.html +20 -1
- data/vendor/depot_tools/man/html/git-rename-branch.html +1 -1
- data/vendor/depot_tools/man/html/git-reparent-branch.html +1 -1
- data/vendor/depot_tools/man/html/git-retry.html +1 -1
- data/vendor/depot_tools/man/html/git-squash-branch.html +1 -1
- data/vendor/depot_tools/man/html/git-thaw.html +1 -1
- data/vendor/depot_tools/man/html/git-upstream-diff.html +10 -6
- data/vendor/depot_tools/man/man1/git-cl.1 +4 -4
- data/vendor/depot_tools/man/man1/git-drover.1 +21 -21
- data/vendor/depot_tools/man/man1/git-footers.1 +4 -4
- data/vendor/depot_tools/man/man1/git-freeze.1 +6 -6
- data/vendor/depot_tools/man/man1/git-hyper-blame.1 +4 -4
- data/vendor/depot_tools/man/man1/git-map-branches.1 +4 -4
- data/vendor/depot_tools/man/man1/git-map.1 +4 -4
- data/vendor/depot_tools/man/man1/git-mark-merge-base.1 +4 -4
- data/vendor/depot_tools/man/man1/git-nav-downstream.1 +6 -6
- data/vendor/depot_tools/man/man1/git-nav-upstream.1 +15 -9
- data/vendor/depot_tools/man/man1/git-new-branch.1 +3 -3
- data/vendor/depot_tools/man/man1/git-rebase-update.1 +14 -4
- data/vendor/depot_tools/man/man1/git-rename-branch.1 +4 -4
- data/vendor/depot_tools/man/man1/git-reparent-branch.1 +4 -4
- data/vendor/depot_tools/man/man1/git-retry.1 +4 -4
- data/vendor/depot_tools/man/man1/git-squash-branch.1 +4 -4
- data/vendor/depot_tools/man/man1/git-thaw.1 +4 -4
- data/vendor/depot_tools/man/man1/git-upstream-diff.1 +7 -13
- data/vendor/depot_tools/man/man7/depot_tools.7 +4 -4
- data/vendor/depot_tools/man/man7/depot_tools_tutorial.7 +31 -25
- data/vendor/depot_tools/man/src/common_demo_functions.sh +2 -2
- data/vendor/depot_tools/man/src/depot_tools_tutorial.txt +3 -3
- data/vendor/depot_tools/man/src/filter_demo_output.py +4 -2
- data/vendor/depot_tools/man/src/git-new-branch.txt +2 -1
- data/vendor/depot_tools/man/src/git-rebase-update.txt +8 -1
- data/vendor/depot_tools/metrics.README.md +8 -5
- data/vendor/depot_tools/metrics.py +7 -6
- data/vendor/depot_tools/metrics_utils.py +4 -14
- data/vendor/depot_tools/my_activity.py +85 -251
- data/vendor/depot_tools/ninja +1 -0
- data/vendor/depot_tools/ninja-mac +0 -0
- data/vendor/depot_tools/ninjalog_uploader.py +146 -145
- data/vendor/depot_tools/ninjalog_uploader_wrapper.py +69 -60
- data/vendor/depot_tools/owners.py +156 -43
- data/vendor/depot_tools/owners_finder.py +28 -14
- data/vendor/depot_tools/post_build_ninja_summary.py +76 -48
- data/vendor/depot_tools/presubmit_canned_checks.py +293 -106
- data/vendor/depot_tools/presubmit_support.py +527 -333
- data/vendor/depot_tools/prpc +1 -1
- data/vendor/depot_tools/pylint +2 -12
- 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/{depot-tools-auth.bat → pylint.bat} +2 -2
- data/vendor/depot_tools/pylint_main.py +45 -0
- data/vendor/depot_tools/pylintrc +14 -1
- data/vendor/depot_tools/python-bin/python3 +7 -0
- data/vendor/depot_tools/python_runner.sh +13 -8
- data/vendor/depot_tools/rdb +12 -0
- data/vendor/depot_tools/rdb.bat +7 -0
- data/vendor/depot_tools/recipes/OWNERS +0 -1
- data/vendor/depot_tools/recipes/README.recipes.md +218 -151
- data/vendor/depot_tools/recipes/recipe_modules/OWNERS +1 -1
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/__init__.py +17 -16
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/api.py +127 -78
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic.json +19 -4
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic_luci.json +18 -3
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic_with_branch_heads.json +19 -4
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/clobber.json +29 -8
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/deprecated_got_revision_mapping.json +28 -10
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/gerrit_no_rebase_patch_ref.json +29 -8
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/gerrit_no_reset.json +29 -8
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/input_commit_with_id_without_repo.json +29 -8
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/multiple_patch_refs.json +29 -8
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_apply_patch_on_gclient.json +35 -10
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/{with_manifest_name.json → no_cp_checkout_HEAD.json} +25 -15
- 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 +29 -8
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/reset_root_solution_revision.json +29 -8
- 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 +17 -11
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail_patch.json +41 -10
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail_patch_download.json +24 -11
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_angle.json +35 -10
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_branch_heads.json +35 -10
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_feature_branch.json +38 -11
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_v8_feature_branch.json +36 -11
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_webrtc.json +35 -10
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_v8.json +35 -10
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_v8_head_by_default.json +35 -10
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/unrecognized_commit_repo.json +0 -5
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/with_tags.json +29 -8
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.py +95 -22
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/resources/bot_update.py +187 -114
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/test_api.py +2 -2
- 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 +1 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/__init__.py +0 -1
- data/vendor/depot_tools/recipes/recipe_modules/cipd/api.py +2 -2
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/basic.json +0 -1
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/basic_pkg.json +0 -1
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/describe-failed.json +2 -4
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/describe-many-instances.json +0 -1
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/mac64.json +0 -1
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_file.json +26 -6
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_mode.json +23 -5
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_verfile.json +23 -5
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/win64.json +0 -1
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/junk arch.json +0 -1
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/junk bits.json +0 -1
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_arm_32.json +0 -1
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_arm_64.json +0 -1
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_intel_32.json +0 -1
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_intel_64.json +0 -1
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_mips_64.json +0 -1
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/mac_intel_64.json +0 -1
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/win_intel_32.json +0 -1
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/win_intel_64.json +0 -1
- data/vendor/depot_tools/recipes/recipe_modules/cipd/test_api.py +1 -1
- data/vendor/depot_tools/recipes/recipe_modules/depot_tools/api.py +4 -1
- data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/basic.json +4 -2
- data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/basic_luci.json +3 -1
- data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/win.json +4 -2
- data/vendor/depot_tools/recipes/recipe_modules/gclient/__init__.py +2 -1
- data/vendor/depot_tools/recipes/recipe_modules/gclient/api.py +82 -13
- data/vendor/depot_tools/recipes/recipe_modules/gclient/config.py +23 -11
- data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/basic.json +3 -4
- data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/revision.json +3 -6
- data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/tryserver.json +3 -4
- data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.py +7 -7
- 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 +4 -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 +9 -21
- data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/sync_failure.py +24 -0
- data/vendor/depot_tools/recipes/recipe_modules/gerrit/api.py +2 -1
- data/vendor/depot_tools/recipes/recipe_modules/gerrit/examples/full.expected/basic.json +7 -12
- data/vendor/depot_tools/recipes/recipe_modules/git/__init__.py +0 -2
- data/vendor/depot_tools/recipes/recipe_modules/git/api.py +9 -17
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic.json +2 -8
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_branch.json +2 -8
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_file_name.json +2 -8
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_hash.json +2 -8
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_ref.json +2 -8
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_submodule_update_force.json +2 -8
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_tags.json +2 -8
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/can_fail_build.json +3 -13
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/cannot_fail_build.json +2 -8
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/cat-file_test.json +4 -12
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_delta.json +2 -10
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_failed.json +1 -7
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_with_bad_output.json +1 -7
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_with_bad_output_fails_build.json +0 -8
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/curl_trace_file.json +3 -10
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/git-cache-checkout.json +3 -11
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/platform_win.json +2 -8
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/rebase_failed.json +3 -13
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/remote_not_origin.json +2 -8
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/set_got_revision.json +2 -8
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.py +0 -5
- data/vendor/depot_tools/recipes/recipe_modules/git_cl/__init__.py +1 -1
- data/vendor/depot_tools/recipes/recipe_modules/git_cl/api.py +7 -13
- data/vendor/depot_tools/recipes/recipe_modules/git_cl/examples/full.expected/basic.json +21 -16
- data/vendor/depot_tools/recipes/recipe_modules/git_cl/examples/full.py +1 -2
- data/vendor/depot_tools/recipes/recipe_modules/gitiles/api.py +1 -1
- data/vendor/depot_tools/recipes/recipe_modules/gitiles/examples/full.expected/basic.json +0 -1
- data/vendor/depot_tools/recipes/recipe_modules/gitiles/resources/gerrit_client.py +2 -2
- data/vendor/depot_tools/recipes/recipe_modules/gitiles/tests/parse_repo_url.expected/basic.json +0 -1
- data/vendor/depot_tools/recipes/recipe_modules/gsutil/api.py +23 -8
- data/vendor/depot_tools/recipes/recipe_modules/gsutil/examples/full.expected/basic.json +52 -1
- data/vendor/depot_tools/recipes/recipe_modules/gsutil/examples/full.py +15 -0
- data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/__init__.py +1 -0
- data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/api.py +32 -8
- 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 +0 -1
- data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/mac.json +5 -4
- data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/win.json +0 -1
- data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.py +21 -2
- data/vendor/depot_tools/recipes/recipe_modules/presubmit/__init__.py +20 -0
- data/vendor/depot_tools/recipes/recipe_modules/presubmit/api.py +235 -3
- data/vendor/depot_tools/recipes/recipe_modules/presubmit/examples/full.expected/basic.json +13 -5
- data/vendor/depot_tools/recipes/recipe_modules/presubmit/examples/full.py +5 -1
- 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/api.py +33 -45
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/basic_tags.json +0 -1
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch.json +64 -21
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch_and_target_ref.json +64 -21
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch.json +1 -22
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch_new.json +1 -22
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.py +5 -32
- 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/examples/full.expected/linux.json +0 -1
- data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/mac.json +0 -1
- data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/win.json +2 -1
- data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.py +1 -6
- data/vendor/depot_tools/recipes/recipes.py +49 -28
- data/vendor/depot_tools/recipes/recipes/fetch_end_to_end_test.expected/basic.json +11 -6
- data/vendor/depot_tools/repo +698 -540
- data/vendor/depot_tools/roll-dep +14 -1
- data/vendor/depot_tools/roll-dep.bat +10 -1
- data/vendor/depot_tools/roll_dep.py +15 -10
- data/vendor/depot_tools/scm.py +95 -75
- data/vendor/depot_tools/setup_color.py +36 -2
- data/vendor/depot_tools/split_cl.py +44 -32
- data/vendor/depot_tools/subcommand.py +6 -6
- data/vendor/depot_tools/subprocess2.py +38 -322
- data/vendor/depot_tools/third_party/colorama/LICENSE.txt +0 -1
- data/vendor/depot_tools/third_party/colorama/README.chromium +4 -5
- data/vendor/depot_tools/third_party/colorama/README.rst +346 -0
- data/vendor/depot_tools/third_party/colorama/__init__.py +3 -4
- data/vendor/depot_tools/third_party/colorama/ansi.py +82 -30
- data/vendor/depot_tools/third_party/colorama/ansitowin32.py +105 -37
- data/vendor/depot_tools/third_party/colorama/initialise.py +39 -15
- data/vendor/depot_tools/third_party/colorama/win32.py +46 -28
- data/vendor/depot_tools/third_party/colorama/winterm.py +80 -31
- data/vendor/depot_tools/update_depot_tools +18 -8
- data/vendor/depot_tools/update_depot_tools.bat +19 -15
- data/vendor/depot_tools/upload_metrics.py +7 -6
- data/vendor/depot_tools/upload_to_google_storage.py +23 -16
- data/vendor/depot_tools/vpython +4 -4
- data/vendor/depot_tools/vpython.bat +1 -1
- data/vendor/depot_tools/vpython3 +55 -0
- data/vendor/depot_tools/vpython3.bat +12 -0
- data/vendor/depot_tools/watchlists.py +14 -11
- data/vendor/depot_tools/weekly +4 -2
- data/vendor/depot_tools/win32imports.py +61 -0
- data/vendor/depot_tools/win_toolchain/get_toolchain_if_necessary.py +49 -41
- data/vendor/depot_tools/win_toolchain/package_from_installed.py +142 -149
- data/vendor/depot_tools/wtf +5 -3
- data/vendor/depot_tools/yapf +5 -1
- metadata +68 -343
- data/vendor/depot_tools/README.testing +0 -23
- data/vendor/depot_tools/annotated_gclient.py +0 -89
- data/vendor/depot_tools/appengine_mapper.py +0 -23
- data/vendor/depot_tools/bootstrap/win/manifest.txt +0 -20
- data/vendor/depot_tools/bootstrap/win/manifest_bleeding_edge.txt +0 -20
- data/vendor/depot_tools/bootstrap/win/pylint.new.bat +0 -7
- data/vendor/depot_tools/buildbucket.py +0 -186
- data/vendor/depot_tools/checkout.py +0 -431
- data/vendor/depot_tools/cros +0 -1
- data/vendor/depot_tools/dart_format.py +0 -58
- data/vendor/depot_tools/depot-tools-auth +0 -8
- data/vendor/depot_tools/depot-tools-auth.py +0 -102
- data/vendor/depot_tools/my_reviews.py +0 -396
- data/vendor/depot_tools/patch.py +0 -548
- data/vendor/depot_tools/pylint.py +0 -30
- data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/buildbot.json +0 -239
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_luci.json +0 -222
- data/vendor/depot_tools/recipes/recipe_modules/infra_paths/__init__.py +0 -4
- data/vendor/depot_tools/recipes/recipe_modules/infra_paths/api.py +0 -29
- data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/basic.json +0 -15
- data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_buildbot_linux.json +0 -15
- data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_buildbot_mac.json +0 -15
- data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_buildbot_win.json +0 -15
- data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_generic_linux.json +0 -15
- data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_generic_mac.json +0 -15
- data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_generic_win.json +0 -15
- data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_kitchen_linux.json +0 -15
- data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_kitchen_mac.json +0 -15
- data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_kitchen_win.json +0 -15
- data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.py +0 -33
- data/vendor/depot_tools/recipes/recipe_modules/infra_paths/path_config.py +0 -66
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/set_failure_hash_with_no_steps.json +0 -11
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_git_patch.json +0 -45
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_git_patch_luci.json +0 -45
- data/vendor/depot_tools/rietveld.py +0 -779
- data/vendor/depot_tools/roll-dep-svn +0 -8
- data/vendor/depot_tools/roll-dep-svn.bat +0 -12
- data/vendor/depot_tools/roll_dep_svn.py +0 -430
- data/vendor/depot_tools/support/chromite_wrapper +0 -96
- data/vendor/depot_tools/third_party/boto/LICENSE +0 -18
- data/vendor/depot_tools/third_party/boto/README.chromium +0 -43
- data/vendor/depot_tools/third_party/boto/README.rst +0 -163
- data/vendor/depot_tools/third_party/boto/__init__.py +0 -793
- data/vendor/depot_tools/third_party/boto/auth.py +0 -682
- data/vendor/depot_tools/third_party/boto/auth_handler.py +0 -58
- data/vendor/depot_tools/third_party/boto/cacerts/__init__.py +0 -22
- data/vendor/depot_tools/third_party/boto/cacerts/cacerts.txt +0 -2183
- data/vendor/depot_tools/third_party/boto/compat.py +0 -28
- data/vendor/depot_tools/third_party/boto/connection.py +0 -1081
- data/vendor/depot_tools/third_party/boto/contrib/__init__.py +0 -22
- data/vendor/depot_tools/third_party/boto/contrib/ymlmessage.py +0 -52
- data/vendor/depot_tools/third_party/boto/core/README +0 -58
- data/vendor/depot_tools/third_party/boto/core/__init__.py +0 -23
- data/vendor/depot_tools/third_party/boto/core/auth.py +0 -78
- data/vendor/depot_tools/third_party/boto/core/credentials.py +0 -154
- data/vendor/depot_tools/third_party/boto/core/dictresponse.py +0 -178
- data/vendor/depot_tools/third_party/boto/core/service.py +0 -67
- data/vendor/depot_tools/third_party/boto/datapipeline/__init__.py +0 -0
- data/vendor/depot_tools/third_party/boto/datapipeline/exceptions.py +0 -42
- data/vendor/depot_tools/third_party/boto/datapipeline/layer1.py +0 -546
- data/vendor/depot_tools/third_party/boto/ecs/__init__.py +0 -90
- data/vendor/depot_tools/third_party/boto/ecs/item.py +0 -153
- data/vendor/depot_tools/third_party/boto/exception.py +0 -476
- data/vendor/depot_tools/third_party/boto/file/README +0 -49
- data/vendor/depot_tools/third_party/boto/file/__init__.py +0 -28
- data/vendor/depot_tools/third_party/boto/file/bucket.py +0 -112
- data/vendor/depot_tools/third_party/boto/file/connection.py +0 -33
- data/vendor/depot_tools/third_party/boto/file/key.py +0 -199
- data/vendor/depot_tools/third_party/boto/file/simpleresultset.py +0 -30
- data/vendor/depot_tools/third_party/boto/fps/__init__.py +0 -21
- data/vendor/depot_tools/third_party/boto/fps/connection.py +0 -369
- data/vendor/depot_tools/third_party/boto/fps/exception.py +0 -344
- data/vendor/depot_tools/third_party/boto/fps/response.py +0 -175
- data/vendor/depot_tools/third_party/boto/gs/__init__.py +0 -22
- data/vendor/depot_tools/third_party/boto/gs/acl.py +0 -304
- data/vendor/depot_tools/third_party/boto/gs/bucket.py +0 -870
- data/vendor/depot_tools/third_party/boto/gs/bucketlistresultset.py +0 -64
- data/vendor/depot_tools/third_party/boto/gs/connection.py +0 -103
- data/vendor/depot_tools/third_party/boto/gs/cors.py +0 -169
- data/vendor/depot_tools/third_party/boto/gs/key.py +0 -704
- data/vendor/depot_tools/third_party/boto/gs/resumable_upload_handler.py +0 -659
- data/vendor/depot_tools/third_party/boto/gs/user.py +0 -54
- data/vendor/depot_tools/third_party/boto/handler.py +0 -44
- data/vendor/depot_tools/third_party/boto/https_connection.py +0 -124
- data/vendor/depot_tools/third_party/boto/jsonresponse.py +0 -163
- data/vendor/depot_tools/third_party/boto/manage/__init__.py +0 -23
- data/vendor/depot_tools/third_party/boto/manage/cmdshell.py +0 -241
- data/vendor/depot_tools/third_party/boto/manage/propget.py +0 -64
- data/vendor/depot_tools/third_party/boto/manage/server.py +0 -556
- data/vendor/depot_tools/third_party/boto/manage/task.py +0 -175
- data/vendor/depot_tools/third_party/boto/manage/test_manage.py +0 -34
- data/vendor/depot_tools/third_party/boto/manage/volume.py +0 -420
- data/vendor/depot_tools/third_party/boto/mashups/__init__.py +0 -23
- data/vendor/depot_tools/third_party/boto/mashups/interactive.py +0 -97
- data/vendor/depot_tools/third_party/boto/mashups/iobject.py +0 -115
- data/vendor/depot_tools/third_party/boto/mashups/order.py +0 -211
- data/vendor/depot_tools/third_party/boto/mashups/server.py +0 -395
- data/vendor/depot_tools/third_party/boto/plugin.py +0 -90
- data/vendor/depot_tools/third_party/boto/provider.py +0 -337
- data/vendor/depot_tools/third_party/boto/pyami/__init__.py +0 -22
- data/vendor/depot_tools/third_party/boto/pyami/bootstrap.py +0 -134
- data/vendor/depot_tools/third_party/boto/pyami/config.py +0 -229
- data/vendor/depot_tools/third_party/boto/pyami/copybot.cfg +0 -60
- data/vendor/depot_tools/third_party/boto/pyami/copybot.py +0 -97
- data/vendor/depot_tools/third_party/boto/pyami/helloworld.py +0 -28
- data/vendor/depot_tools/third_party/boto/pyami/launch_ami.py +0 -178
- data/vendor/depot_tools/third_party/boto/pyami/scriptbase.py +0 -44
- data/vendor/depot_tools/third_party/boto/pyami/startup.py +0 -60
- data/vendor/depot_tools/third_party/boto/regioninfo.py +0 -63
- data/vendor/depot_tools/third_party/boto/resultset.py +0 -169
- data/vendor/depot_tools/third_party/boto/roboto/__init__.py +0 -1
- data/vendor/depot_tools/third_party/boto/roboto/awsqueryrequest.py +0 -504
- data/vendor/depot_tools/third_party/boto/roboto/awsqueryservice.py +0 -121
- data/vendor/depot_tools/third_party/boto/roboto/param.py +0 -147
- data/vendor/depot_tools/third_party/boto/s3/__init__.py +0 -84
- data/vendor/depot_tools/third_party/boto/s3/acl.py +0 -164
- data/vendor/depot_tools/third_party/boto/s3/bucket.py +0 -1634
- data/vendor/depot_tools/third_party/boto/s3/bucketlistresultset.py +0 -139
- data/vendor/depot_tools/third_party/boto/s3/bucketlogging.py +0 -83
- data/vendor/depot_tools/third_party/boto/s3/connection.py +0 -540
- data/vendor/depot_tools/third_party/boto/s3/cors.py +0 -210
- data/vendor/depot_tools/third_party/boto/s3/deletemarker.py +0 -55
- data/vendor/depot_tools/third_party/boto/s3/key.py +0 -1712
- data/vendor/depot_tools/third_party/boto/s3/keyfile.py +0 -134
- data/vendor/depot_tools/third_party/boto/s3/lifecycle.py +0 -231
- data/vendor/depot_tools/third_party/boto/s3/multidelete.py +0 -138
- data/vendor/depot_tools/third_party/boto/s3/multipart.py +0 -315
- data/vendor/depot_tools/third_party/boto/s3/prefix.py +0 -42
- data/vendor/depot_tools/third_party/boto/s3/resumable_download_handler.py +0 -339
- data/vendor/depot_tools/third_party/boto/s3/tagging.py +0 -71
- data/vendor/depot_tools/third_party/boto/s3/user.py +0 -49
- data/vendor/depot_tools/third_party/boto/s3/website.py +0 -237
- data/vendor/depot_tools/third_party/boto/services/__init__.py +0 -23
- data/vendor/depot_tools/third_party/boto/services/bs.py +0 -179
- data/vendor/depot_tools/third_party/boto/services/message.py +0 -58
- data/vendor/depot_tools/third_party/boto/services/result.py +0 -136
- data/vendor/depot_tools/third_party/boto/services/service.py +0 -161
- data/vendor/depot_tools/third_party/boto/services/servicedef.py +0 -91
- data/vendor/depot_tools/third_party/boto/services/sonofmmm.cfg +0 -43
- data/vendor/depot_tools/third_party/boto/services/sonofmmm.py +0 -81
- data/vendor/depot_tools/third_party/boto/services/submit.py +0 -88
- data/vendor/depot_tools/third_party/boto/ses/__init__.py +0 -54
- data/vendor/depot_tools/third_party/boto/ses/connection.py +0 -521
- data/vendor/depot_tools/third_party/boto/ses/exceptions.py +0 -77
- data/vendor/depot_tools/third_party/boto/storage_uri.py +0 -835
- data/vendor/depot_tools/third_party/boto/sts/__init__.py +0 -55
- data/vendor/depot_tools/third_party/boto/sts/connection.py +0 -207
- data/vendor/depot_tools/third_party/boto/sts/credentials.py +0 -215
- data/vendor/depot_tools/third_party/boto/utils.py +0 -927
- data/vendor/depot_tools/third_party/colorama/README.txt +0 -304
- data/vendor/depot_tools/third_party/fancy_urllib/README +0 -22
- data/vendor/depot_tools/third_party/fancy_urllib/__init__.py +0 -460
- data/vendor/depot_tools/third_party/logilab/README.chromium +0 -6
- data/vendor/depot_tools/third_party/logilab/__init__.py +0 -0
- data/vendor/depot_tools/third_party/logilab/astroid/LICENSE.txt +0 -340
- data/vendor/depot_tools/third_party/logilab/astroid/README.chromium +0 -11
- data/vendor/depot_tools/third_party/logilab/astroid/__init__.py +0 -136
- data/vendor/depot_tools/third_party/logilab/astroid/__pkginfo__.py +0 -42
- data/vendor/depot_tools/third_party/logilab/astroid/arguments.py +0 -233
- data/vendor/depot_tools/third_party/logilab/astroid/as_string.py +0 -548
- data/vendor/depot_tools/third_party/logilab/astroid/astpeephole.py +0 -86
- data/vendor/depot_tools/third_party/logilab/astroid/bases.py +0 -636
- data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_builtin_inference.py +0 -336
- data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_dateutil.py +0 -15
- data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_gi.py +0 -195
- data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_mechanize.py +0 -18
- data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_nose.py +0 -82
- data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_numpy.py +0 -62
- data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_pytest.py +0 -76
- data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_qt.py +0 -44
- data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_six.py +0 -288
- data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_ssl.py +0 -65
- data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_stdlib.py +0 -473
- data/vendor/depot_tools/third_party/logilab/astroid/builder.py +0 -263
- data/vendor/depot_tools/third_party/logilab/astroid/context.py +0 -81
- data/vendor/depot_tools/third_party/logilab/astroid/decorators.py +0 -75
- data/vendor/depot_tools/third_party/logilab/astroid/exceptions.py +0 -71
- data/vendor/depot_tools/third_party/logilab/astroid/inference.py +0 -359
- data/vendor/depot_tools/third_party/logilab/astroid/manager.py +0 -267
- data/vendor/depot_tools/third_party/logilab/astroid/mixins.py +0 -147
- data/vendor/depot_tools/third_party/logilab/astroid/modutils.py +0 -741
- data/vendor/depot_tools/third_party/logilab/astroid/node_classes.py +0 -1053
- data/vendor/depot_tools/third_party/logilab/astroid/nodes.py +0 -87
- data/vendor/depot_tools/third_party/logilab/astroid/objects.py +0 -186
- data/vendor/depot_tools/third_party/logilab/astroid/protocols.py +0 -470
- data/vendor/depot_tools/third_party/logilab/astroid/raw_building.py +0 -390
- data/vendor/depot_tools/third_party/logilab/astroid/rebuilder.py +0 -989
- data/vendor/depot_tools/third_party/logilab/astroid/scoped_nodes.py +0 -1716
- data/vendor/depot_tools/third_party/logilab/astroid/test_utils.py +0 -201
- data/vendor/depot_tools/third_party/logilab/astroid/transforms.py +0 -96
- data/vendor/depot_tools/third_party/logilab/astroid/util.py +0 -89
- data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/LICENSE +0 -19
- data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/README.chromium +0 -11
- data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/__init__.py +0 -20
- data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/cext.c +0 -1421
- data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/compat.py +0 -9
- data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/simple.py +0 -246
- data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/slots.py +0 -414
- data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/utils.py +0 -13
- data/vendor/depot_tools/third_party/logilab/wrapt/LICENSE +0 -24
- data/vendor/depot_tools/third_party/logilab/wrapt/README.chromium +0 -11
- data/vendor/depot_tools/third_party/logilab/wrapt/__init__.py +0 -19
- data/vendor/depot_tools/third_party/logilab/wrapt/_wrappers.c +0 -2729
- data/vendor/depot_tools/third_party/logilab/wrapt/arguments.py +0 -96
- data/vendor/depot_tools/third_party/logilab/wrapt/decorators.py +0 -512
- data/vendor/depot_tools/third_party/logilab/wrapt/importer.py +0 -228
- data/vendor/depot_tools/third_party/logilab/wrapt/wrappers.py +0 -901
- data/vendor/depot_tools/third_party/mock/LICENSE.txt +0 -26
- data/vendor/depot_tools/third_party/mock/README.chromium +0 -24
- data/vendor/depot_tools/third_party/mock/__init__.py +0 -2366
- data/vendor/depot_tools/third_party/oauth2client/LICENSE +0 -202
- data/vendor/depot_tools/third_party/oauth2client/MODIFICATIONS.diff +0 -66
- data/vendor/depot_tools/third_party/oauth2client/README.chromium +0 -15
- data/vendor/depot_tools/third_party/oauth2client/__init__.py +0 -5
- data/vendor/depot_tools/third_party/oauth2client/anyjson.py +0 -32
- data/vendor/depot_tools/third_party/oauth2client/appengine.py +0 -963
- data/vendor/depot_tools/third_party/oauth2client/client.py +0 -1363
- data/vendor/depot_tools/third_party/oauth2client/clientsecrets.py +0 -153
- data/vendor/depot_tools/third_party/oauth2client/crypt.py +0 -377
- data/vendor/depot_tools/third_party/oauth2client/django_orm.py +0 -134
- data/vendor/depot_tools/third_party/oauth2client/file.py +0 -124
- data/vendor/depot_tools/third_party/oauth2client/gce.py +0 -90
- data/vendor/depot_tools/third_party/oauth2client/keyring_storage.py +0 -109
- data/vendor/depot_tools/third_party/oauth2client/locked_file.py +0 -373
- data/vendor/depot_tools/third_party/oauth2client/multistore_file.py +0 -465
- data/vendor/depot_tools/third_party/oauth2client/old_run.py +0 -160
- data/vendor/depot_tools/third_party/oauth2client/tools.py +0 -243
- data/vendor/depot_tools/third_party/oauth2client/util.py +0 -196
- data/vendor/depot_tools/third_party/oauth2client/xsrfutil.py +0 -113
- data/vendor/depot_tools/third_party/protobuf26/README.chromium +0 -23
- data/vendor/depot_tools/third_party/protobuf26/__init__.py +0 -0
- data/vendor/depot_tools/third_party/protobuf26/compiler/__init__.py +0 -0
- data/vendor/depot_tools/third_party/protobuf26/compiler/plugin_pb2.py +0 -184
- data/vendor/depot_tools/third_party/protobuf26/descriptor.py +0 -849
- data/vendor/depot_tools/third_party/protobuf26/descriptor_database.py +0 -137
- data/vendor/depot_tools/third_party/protobuf26/descriptor_pb2.py +0 -1522
- data/vendor/depot_tools/third_party/protobuf26/descriptor_pool.py +0 -643
- data/vendor/depot_tools/third_party/protobuf26/internal/__init__.py +0 -0
- data/vendor/depot_tools/third_party/protobuf26/internal/api_implementation.py +0 -89
- data/vendor/depot_tools/third_party/protobuf26/internal/containers.py +0 -269
- data/vendor/depot_tools/third_party/protobuf26/internal/cpp_message.py +0 -663
- data/vendor/depot_tools/third_party/protobuf26/internal/decoder.py +0 -831
- data/vendor/depot_tools/third_party/protobuf26/internal/encoder.py +0 -788
- data/vendor/depot_tools/third_party/protobuf26/internal/enum_type_wrapper.py +0 -89
- data/vendor/depot_tools/third_party/protobuf26/internal/message_listener.py +0 -78
- data/vendor/depot_tools/third_party/protobuf26/internal/python_message.py +0 -1247
- data/vendor/depot_tools/third_party/protobuf26/internal/type_checkers.py +0 -328
- data/vendor/depot_tools/third_party/protobuf26/internal/wire_format.py +0 -268
- data/vendor/depot_tools/third_party/protobuf26/message.py +0 -284
- data/vendor/depot_tools/third_party/protobuf26/message_factory.py +0 -155
- data/vendor/depot_tools/third_party/protobuf26/reflection.py +0 -205
- data/vendor/depot_tools/third_party/protobuf26/service.py +0 -226
- data/vendor/depot_tools/third_party/protobuf26/service_reflection.py +0 -284
- data/vendor/depot_tools/third_party/protobuf26/symbol_database.py +0 -185
- data/vendor/depot_tools/third_party/protobuf26/text_encoding.py +0 -110
- data/vendor/depot_tools/third_party/protobuf26/text_format.py +0 -873
- data/vendor/depot_tools/third_party/pylint.py +0 -37
- data/vendor/depot_tools/third_party/pylint/LICENSE.txt +0 -340
- data/vendor/depot_tools/third_party/pylint/README.chromium +0 -30
- data/vendor/depot_tools/third_party/pylint/__init__.py +0 -46
- data/vendor/depot_tools/third_party/pylint/__main__.py +0 -3
- data/vendor/depot_tools/third_party/pylint/__pkginfo__.py +0 -80
- data/vendor/depot_tools/third_party/pylint/checkers/__init__.py +0 -123
- data/vendor/depot_tools/third_party/pylint/checkers/async.py +0 -82
- data/vendor/depot_tools/third_party/pylint/checkers/base.py +0 -2010
- data/vendor/depot_tools/third_party/pylint/checkers/classes.py +0 -1120
- data/vendor/depot_tools/third_party/pylint/checkers/design_analysis.py +0 -348
- data/vendor/depot_tools/third_party/pylint/checkers/exceptions.py +0 -369
- data/vendor/depot_tools/third_party/pylint/checkers/format.py +0 -993
- data/vendor/depot_tools/third_party/pylint/checkers/imports.py +0 -654
- data/vendor/depot_tools/third_party/pylint/checkers/logging.py +0 -258
- data/vendor/depot_tools/third_party/pylint/checkers/misc.py +0 -105
- data/vendor/depot_tools/third_party/pylint/checkers/newstyle.py +0 -169
- data/vendor/depot_tools/third_party/pylint/checkers/python3.py +0 -591
- data/vendor/depot_tools/third_party/pylint/checkers/raw_metrics.py +0 -129
- data/vendor/depot_tools/third_party/pylint/checkers/similar.py +0 -371
- data/vendor/depot_tools/third_party/pylint/checkers/spelling.py +0 -264
- data/vendor/depot_tools/third_party/pylint/checkers/stdlib.py +0 -280
- data/vendor/depot_tools/third_party/pylint/checkers/strings.py +0 -618
- data/vendor/depot_tools/third_party/pylint/checkers/typecheck.py +0 -974
- data/vendor/depot_tools/third_party/pylint/checkers/utils.py +0 -741
- data/vendor/depot_tools/third_party/pylint/checkers/variables.py +0 -1191
- data/vendor/depot_tools/third_party/pylint/config.py +0 -820
- data/vendor/depot_tools/third_party/pylint/epylint.py +0 -181
- data/vendor/depot_tools/third_party/pylint/extensions/__init__.py +0 -0
- data/vendor/depot_tools/third_party/pylint/extensions/check_docs.py +0 -311
- data/vendor/depot_tools/third_party/pylint/extensions/check_elif.py +0 -62
- data/vendor/depot_tools/third_party/pylint/graph.py +0 -179
- data/vendor/depot_tools/third_party/pylint/gui.py +0 -531
- data/vendor/depot_tools/third_party/pylint/interfaces.py +0 -102
- data/vendor/depot_tools/third_party/pylint/lint.py +0 -1381
- data/vendor/depot_tools/third_party/pylint/pyreverse/__init__.py +0 -5
- data/vendor/depot_tools/third_party/pylint/pyreverse/diadefslib.py +0 -230
- data/vendor/depot_tools/third_party/pylint/pyreverse/diagrams.py +0 -258
- data/vendor/depot_tools/third_party/pylint/pyreverse/inspector.py +0 -372
- data/vendor/depot_tools/third_party/pylint/pyreverse/main.py +0 -147
- data/vendor/depot_tools/third_party/pylint/pyreverse/utils.py +0 -210
- data/vendor/depot_tools/third_party/pylint/pyreverse/vcgutils.py +0 -198
- data/vendor/depot_tools/third_party/pylint/pyreverse/writer.py +0 -198
- data/vendor/depot_tools/third_party/pylint/reporters/__init__.py +0 -149
- data/vendor/depot_tools/third_party/pylint/reporters/guireporter.py +0 -27
- data/vendor/depot_tools/third_party/pylint/reporters/html.py +0 -108
- data/vendor/depot_tools/third_party/pylint/reporters/json.py +0 -64
- data/vendor/depot_tools/third_party/pylint/reporters/text.py +0 -237
- data/vendor/depot_tools/third_party/pylint/reporters/ureports/__init__.py +0 -106
- data/vendor/depot_tools/third_party/pylint/reporters/ureports/html_writer.py +0 -93
- data/vendor/depot_tools/third_party/pylint/reporters/ureports/nodes.py +0 -181
- data/vendor/depot_tools/third_party/pylint/reporters/ureports/text_writer.py +0 -99
- data/vendor/depot_tools/third_party/pylint/testutils.py +0 -414
- data/vendor/depot_tools/third_party/pylint/utils.py +0 -1148
- data/vendor/depot_tools/third_party/pymox/COPYING +0 -202
- data/vendor/depot_tools/third_party/pymox/MANIFEST.in +0 -5
- data/vendor/depot_tools/third_party/pymox/README +0 -56
- data/vendor/depot_tools/third_party/pymox/__init__.py +0 -0
- data/vendor/depot_tools/third_party/pymox/mox.py +0 -1643
- data/vendor/depot_tools/third_party/pymox/mox_test.py +0 -1708
- data/vendor/depot_tools/third_party/pymox/mox_test_helper.py +0 -76
- data/vendor/depot_tools/third_party/pymox/setup.py +0 -14
- data/vendor/depot_tools/third_party/pymox/stubout.py +0 -142
- data/vendor/depot_tools/third_party/pymox/stubout_test.py +0 -47
- data/vendor/depot_tools/third_party/pymox/stubout_testee.py +0 -2
- data/vendor/depot_tools/third_party/simplejson/LICENSE.txt +0 -19
- data/vendor/depot_tools/third_party/simplejson/PKG-INFO +0 -29
- data/vendor/depot_tools/third_party/simplejson/__init__.py +0 -437
- data/vendor/depot_tools/third_party/simplejson/decoder.py +0 -421
- data/vendor/depot_tools/third_party/simplejson/encoder.py +0 -501
- data/vendor/depot_tools/third_party/simplejson/ordered_dict.py +0 -119
- data/vendor/depot_tools/third_party/simplejson/scanner.py +0 -77
- data/vendor/depot_tools/third_party/simplejson/tool.py +0 -39
- data/vendor/depot_tools/third_party/upload.py +0 -2565
|
@@ -16,17 +16,19 @@ import logging
|
|
|
16
16
|
import optparse
|
|
17
17
|
import subcommand
|
|
18
18
|
import sys
|
|
19
|
-
import urllib
|
|
20
|
-
import urlparse
|
|
21
19
|
|
|
22
|
-
|
|
20
|
+
if sys.version_info.major == 2:
|
|
21
|
+
import urlparse
|
|
22
|
+
from urllib import quote_plus
|
|
23
|
+
else:
|
|
24
|
+
from urllib.parse import quote_plus
|
|
25
|
+
import urllib.parse as urlparse
|
|
26
|
+
|
|
23
27
|
import fix_encoding
|
|
24
28
|
import gerrit_util
|
|
25
29
|
import setup_color
|
|
26
30
|
|
|
27
31
|
__version__ = '0.1'
|
|
28
|
-
# Shortcut since it quickly becomes redundant.
|
|
29
|
-
Fore = colorama.Fore
|
|
30
32
|
|
|
31
33
|
|
|
32
34
|
def write_result(result, opt):
|
|
@@ -41,23 +43,27 @@ def CMDbranchinfo(parser, args):
|
|
|
41
43
|
|
|
42
44
|
(opt, args) = parser.parse_args(args)
|
|
43
45
|
host = urlparse.urlparse(opt.host).netloc
|
|
44
|
-
project =
|
|
45
|
-
branch =
|
|
46
|
+
project = quote_plus(opt.project)
|
|
47
|
+
branch = quote_plus(opt.branch)
|
|
46
48
|
result = gerrit_util.GetGerritBranch(host, project, branch)
|
|
47
49
|
logging.info(result)
|
|
48
50
|
write_result(result, opt)
|
|
49
51
|
|
|
52
|
+
|
|
50
53
|
@subcommand.usage('[args ...]')
|
|
51
54
|
def CMDbranch(parser, args):
|
|
52
55
|
parser.add_option('--branch', dest='branch', help='branch name')
|
|
53
56
|
parser.add_option('--commit', dest='commit', help='commit hash')
|
|
54
57
|
|
|
55
58
|
(opt, args) = parser.parse_args(args)
|
|
59
|
+
assert opt.project, "--project not defined"
|
|
60
|
+
assert opt.branch, "--branch not defined"
|
|
61
|
+
assert opt.commit, "--commit not defined"
|
|
56
62
|
|
|
57
|
-
project =
|
|
63
|
+
project = quote_plus(opt.project)
|
|
58
64
|
host = urlparse.urlparse(opt.host).netloc
|
|
59
|
-
branch =
|
|
60
|
-
commit =
|
|
65
|
+
branch = quote_plus(opt.branch)
|
|
66
|
+
commit = quote_plus(opt.commit)
|
|
61
67
|
result = gerrit_util.CreateGerritBranch(host, project, branch, commit)
|
|
62
68
|
logging.info(result)
|
|
63
69
|
write_result(result, opt)
|
|
@@ -94,6 +100,7 @@ def CMDabandon(parser, args):
|
|
|
94
100
|
parser.add_option('-m', '--message', default='', help='reason for abandoning')
|
|
95
101
|
|
|
96
102
|
(opt, args) = parser.parse_args(args)
|
|
103
|
+
assert opt.change, "-c not defined"
|
|
97
104
|
result = gerrit_util.AbandonChange(
|
|
98
105
|
urlparse.urlparse(opt.host).netloc,
|
|
99
106
|
opt.change, opt.message)
|
|
@@ -104,8 +111,7 @@ def CMDabandon(parser, args):
|
|
|
104
111
|
class OptionParser(optparse.OptionParser):
|
|
105
112
|
"""Creates the option parse and add --verbose support."""
|
|
106
113
|
def __init__(self, *args, **kwargs):
|
|
107
|
-
optparse.OptionParser.__init__(
|
|
108
|
-
self, *args, prog='git cl', version=__version__, **kwargs)
|
|
114
|
+
optparse.OptionParser.__init__(self, *args, version=__version__, **kwargs)
|
|
109
115
|
self.add_option(
|
|
110
116
|
'--verbose', action='count', default=0,
|
|
111
117
|
help='Use 2 times for more debugging info')
|
|
@@ -116,6 +122,8 @@ class OptionParser(optparse.OptionParser):
|
|
|
116
122
|
|
|
117
123
|
def parse_args(self, args=None, values=None):
|
|
118
124
|
options, args = optparse.OptionParser.parse_args(self, args, values)
|
|
125
|
+
# Host is always required
|
|
126
|
+
assert options.host, "--host not defined."
|
|
119
127
|
levels = [logging.WARNING, logging.INFO, logging.DEBUG]
|
|
120
128
|
logging.basicConfig(level=levels[min(options.verbose, len(levels) - 1)])
|
|
121
129
|
return options, args
|
|
@@ -124,7 +132,7 @@ class OptionParser(optparse.OptionParser):
|
|
|
124
132
|
def main(argv):
|
|
125
133
|
if sys.hexversion < 0x02060000:
|
|
126
134
|
print('\nYour python version %s is unsupported, please upgrade.\n'
|
|
127
|
-
%(sys.version.split(' ', 1)[0],),
|
|
135
|
+
% (sys.version.split(' ', 1)[0],),
|
|
128
136
|
file=sys.stderr)
|
|
129
137
|
return 2
|
|
130
138
|
dispatcher = subcommand.CommandDispatcher(__name__)
|
|
@@ -3,15 +3,17 @@
|
|
|
3
3
|
# found in the LICENSE file.
|
|
4
4
|
|
|
5
5
|
"""
|
|
6
|
-
Utilities for requesting information for a
|
|
6
|
+
Utilities for requesting information for a Gerrit server via HTTPS.
|
|
7
7
|
|
|
8
8
|
https://gerrit-review.googlesource.com/Documentation/rest-api.html
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
|
+
from __future__ import print_function
|
|
12
|
+
from __future__ import unicode_literals
|
|
13
|
+
|
|
11
14
|
import base64
|
|
12
15
|
import contextlib
|
|
13
|
-
import
|
|
14
|
-
import httplib # Still used for its constants.
|
|
16
|
+
import httplib2
|
|
15
17
|
import json
|
|
16
18
|
import logging
|
|
17
19
|
import netrc
|
|
@@ -23,9 +25,6 @@ import stat
|
|
|
23
25
|
import sys
|
|
24
26
|
import tempfile
|
|
25
27
|
import time
|
|
26
|
-
import urllib
|
|
27
|
-
import urlparse
|
|
28
|
-
from cStringIO import StringIO
|
|
29
28
|
from multiprocessing.pool import ThreadPool
|
|
30
29
|
|
|
31
30
|
import auth
|
|
@@ -33,30 +32,48 @@ import gclient_utils
|
|
|
33
32
|
import metrics
|
|
34
33
|
import metrics_utils
|
|
35
34
|
import subprocess2
|
|
36
|
-
from third_party import httplib2
|
|
37
35
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
# total tries, the sleep time between the first and last tries will be 94.5 sec.
|
|
41
|
-
# TODO(crbug.com/881860): Lower this when crbug.com/877717 is fixed.
|
|
42
|
-
TRY_LIMIT = 7
|
|
36
|
+
from third_party import six
|
|
37
|
+
from six.moves import urllib
|
|
43
38
|
|
|
39
|
+
if sys.version_info.major == 2:
|
|
40
|
+
import cookielib
|
|
41
|
+
from StringIO import StringIO
|
|
42
|
+
else:
|
|
43
|
+
import http.cookiejar as cookielib
|
|
44
|
+
from io import StringIO
|
|
44
45
|
|
|
45
|
-
|
|
46
|
+
LOGGER = logging.getLogger()
|
|
47
|
+
# With a starting sleep time of 10.0 seconds, x <= [1.8-2.2]x backoff, and five
|
|
48
|
+
# total tries, the sleep time between the first and last tries will be ~7 min.
|
|
49
|
+
TRY_LIMIT = 5
|
|
50
|
+
SLEEP_TIME = 10.0
|
|
51
|
+
MAX_BACKOFF = 2.2
|
|
52
|
+
MIN_BACKOFF = 1.8
|
|
53
|
+
|
|
54
|
+
# Controls the transport protocol used to communicate with Gerrit.
|
|
46
55
|
# This is parameterized primarily to enable GerritTestCase.
|
|
47
56
|
GERRIT_PROTOCOL = 'https'
|
|
48
57
|
|
|
49
58
|
|
|
59
|
+
def time_sleep(seconds):
|
|
60
|
+
# Use this so that it can be mocked in tests without interfering with python
|
|
61
|
+
# system machinery.
|
|
62
|
+
return time.sleep(seconds)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def time_time():
|
|
66
|
+
# Use this so that it can be mocked in tests without interfering with python
|
|
67
|
+
# system machinery.
|
|
68
|
+
return time.time()
|
|
69
|
+
|
|
70
|
+
|
|
50
71
|
class GerritError(Exception):
|
|
51
72
|
"""Exception class for errors commuicating with the gerrit-on-borg service."""
|
|
52
|
-
def __init__(self, http_status, *args, **kwargs):
|
|
73
|
+
def __init__(self, http_status, message, *args, **kwargs):
|
|
53
74
|
super(GerritError, self).__init__(*args, **kwargs)
|
|
54
75
|
self.http_status = http_status
|
|
55
|
-
self.message = '(%d) %s' % (self.http_status,
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
class GerritAuthenticationError(GerritError):
|
|
59
|
-
"""Exception class for authentication errors during Gerrit communication."""
|
|
76
|
+
self.message = '(%d) %s' % (self.http_status, message)
|
|
60
77
|
|
|
61
78
|
|
|
62
79
|
def _QueryString(params, first_param=None):
|
|
@@ -64,21 +81,11 @@ def _QueryString(params, first_param=None):
|
|
|
64
81
|
|
|
65
82
|
https://gerrit-review.googlesource.com/Documentation/rest-api-changes.html#list-changes
|
|
66
83
|
"""
|
|
67
|
-
q = [urllib.quote(first_param)] if first_param else []
|
|
84
|
+
q = [urllib.parse.quote(first_param)] if first_param else []
|
|
68
85
|
q.extend(['%s:%s' % (key, val) for key, val in params])
|
|
69
86
|
return '+'.join(q)
|
|
70
87
|
|
|
71
88
|
|
|
72
|
-
def GetConnectionObject(protocol=None):
|
|
73
|
-
if protocol is None:
|
|
74
|
-
protocol = GERRIT_PROTOCOL
|
|
75
|
-
if protocol in ('http', 'https'):
|
|
76
|
-
return httplib2.Http()
|
|
77
|
-
else:
|
|
78
|
-
raise RuntimeError(
|
|
79
|
-
"Don't know how to work with protocol '%s'" % protocol)
|
|
80
|
-
|
|
81
|
-
|
|
82
89
|
class Authenticator(object):
|
|
83
90
|
"""Base authenticator class for authenticator implementations to subclass."""
|
|
84
91
|
|
|
@@ -96,6 +103,8 @@ class Authenticator(object):
|
|
|
96
103
|
# which then must use it.
|
|
97
104
|
if LuciContextAuthenticator.is_luci():
|
|
98
105
|
return LuciContextAuthenticator()
|
|
106
|
+
# TODO(crbug.com/1059384): Automatically detect when running on cloudtop,
|
|
107
|
+
# and use CookiesAuthenticator instead.
|
|
99
108
|
if GceAuthenticator.is_gce():
|
|
100
109
|
return GceAuthenticator()
|
|
101
110
|
return CookiesAuthenticator()
|
|
@@ -141,15 +150,10 @@ class CookiesAuthenticator(Authenticator):
|
|
|
141
150
|
@classmethod
|
|
142
151
|
def get_new_password_message(cls, host):
|
|
143
152
|
if host is None:
|
|
144
|
-
return ('Git host for
|
|
153
|
+
return ('Git host for Gerrit upload is unknown. Check your remote '
|
|
145
154
|
'and the branch your branch is tracking. This tool assumes '
|
|
146
155
|
'that you are using a git server at *.googlesource.com.')
|
|
147
|
-
|
|
148
|
-
# Assume *.googlesource.com pattern.
|
|
149
|
-
parts = host.split('.')
|
|
150
|
-
if not parts[0].endswith('-review'):
|
|
151
|
-
parts[0] += '-review'
|
|
152
|
-
url = 'https://%s/new-password' % ('.'.join(parts))
|
|
156
|
+
url = cls.get_new_password_url(host)
|
|
153
157
|
return 'You can (re)generate your credentials by visiting %s' % url
|
|
154
158
|
|
|
155
159
|
@classmethod
|
|
@@ -166,10 +170,10 @@ class CookiesAuthenticator(Authenticator):
|
|
|
166
170
|
|
|
167
171
|
st = os.stat(path)
|
|
168
172
|
if st.st_mode & (stat.S_IRWXG | stat.S_IRWXO):
|
|
169
|
-
print
|
|
173
|
+
print(
|
|
170
174
|
'WARNING: netrc file %s cannot be used because its file '
|
|
171
175
|
'permissions are insecure. netrc file permissions should be '
|
|
172
|
-
'600.' % path)
|
|
176
|
+
'600.' % path, file=sys.stderr)
|
|
173
177
|
with open(path) as fd:
|
|
174
178
|
content = fd.read()
|
|
175
179
|
|
|
@@ -189,11 +193,11 @@ class CookiesAuthenticator(Authenticator):
|
|
|
189
193
|
try:
|
|
190
194
|
return netrc.netrc(path)
|
|
191
195
|
except IOError:
|
|
192
|
-
print
|
|
196
|
+
print('WARNING: Could not read netrc file %s' % path, file=sys.stderr)
|
|
193
197
|
return netrc.netrc(os.devnull)
|
|
194
198
|
except netrc.NetrcParseError as e:
|
|
195
|
-
print
|
|
196
|
-
|
|
199
|
+
print('ERROR: Cannot use netrc file %s due to a parsing error: %s' %
|
|
200
|
+
(path, e), file=sys.stderr)
|
|
197
201
|
return netrc.netrc(os.devnull)
|
|
198
202
|
|
|
199
203
|
@classmethod
|
|
@@ -201,10 +205,11 @@ class CookiesAuthenticator(Authenticator):
|
|
|
201
205
|
if os.getenv('GIT_COOKIES_PATH'):
|
|
202
206
|
return os.getenv('GIT_COOKIES_PATH')
|
|
203
207
|
try:
|
|
204
|
-
|
|
205
|
-
['git', 'config', '--path', 'http.cookiefile'])
|
|
208
|
+
path = subprocess2.check_output(
|
|
209
|
+
['git', 'config', '--path', 'http.cookiefile'])
|
|
210
|
+
return path.decode('utf-8', 'ignore').strip()
|
|
206
211
|
except subprocess2.CalledProcessError:
|
|
207
|
-
return os.path.
|
|
212
|
+
return os.path.expanduser(os.path.join('~', '.gitcookies'))
|
|
208
213
|
|
|
209
214
|
@classmethod
|
|
210
215
|
def _get_gitcookies(cls):
|
|
@@ -214,29 +219,28 @@ class CookiesAuthenticator(Authenticator):
|
|
|
214
219
|
return gitcookies
|
|
215
220
|
|
|
216
221
|
try:
|
|
217
|
-
f =
|
|
222
|
+
f = gclient_utils.FileRead(path, 'rb').splitlines()
|
|
218
223
|
except IOError:
|
|
219
224
|
return gitcookies
|
|
220
225
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
if
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
LOGGER.warning(exc)
|
|
226
|
+
for line in f:
|
|
227
|
+
try:
|
|
228
|
+
fields = line.strip().split('\t')
|
|
229
|
+
if line.strip().startswith('#') or len(fields) != 7:
|
|
230
|
+
continue
|
|
231
|
+
domain, xpath, key, value = fields[0], fields[2], fields[5], fields[6]
|
|
232
|
+
if xpath == '/' and key == 'o':
|
|
233
|
+
if value.startswith('git-'):
|
|
234
|
+
login, secret_token = value.split('=', 1)
|
|
235
|
+
gitcookies[domain] = (login, secret_token)
|
|
236
|
+
else:
|
|
237
|
+
gitcookies[domain] = ('', value)
|
|
238
|
+
except (IndexError, ValueError, TypeError) as exc:
|
|
239
|
+
LOGGER.warning(exc)
|
|
236
240
|
return gitcookies
|
|
237
241
|
|
|
238
242
|
def _get_auth_for_host(self, host):
|
|
239
|
-
for domain, creds in self.gitcookies.
|
|
243
|
+
for domain, creds in self.gitcookies.items():
|
|
240
244
|
if cookielib.domain_match(host, domain):
|
|
241
245
|
return (creds[0], None, creds[1])
|
|
242
246
|
return self.netrc.authenticators(host)
|
|
@@ -245,7 +249,8 @@ class CookiesAuthenticator(Authenticator):
|
|
|
245
249
|
a = self._get_auth_for_host(host)
|
|
246
250
|
if a:
|
|
247
251
|
if a[0]:
|
|
248
|
-
|
|
252
|
+
secret = base64.b64encode(('%s:%s' % (a[0], a[2])).encode('utf-8'))
|
|
253
|
+
return 'Basic %s' % secret.decode('utf-8')
|
|
249
254
|
else:
|
|
250
255
|
return 'Bearer %s' % a[2]
|
|
251
256
|
return None
|
|
@@ -292,23 +297,26 @@ class GceAuthenticator(Authenticator):
|
|
|
292
297
|
@classmethod
|
|
293
298
|
def _test_is_gce(cls):
|
|
294
299
|
# Based on https://cloud.google.com/compute/docs/metadata#runninggce
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
except (socket.error, httplib2.ServerNotFoundError,
|
|
298
|
-
httplib2.socks.HTTPError):
|
|
299
|
-
# Could not resolve URL.
|
|
300
|
+
resp, _ = cls._get(cls._INFO_URL)
|
|
301
|
+
if resp is None:
|
|
300
302
|
return False
|
|
301
303
|
return resp.get('metadata-flavor') == 'Google'
|
|
302
304
|
|
|
303
305
|
@staticmethod
|
|
304
306
|
def _get(url, **kwargs):
|
|
305
|
-
next_delay_sec = 1
|
|
306
|
-
for i in
|
|
307
|
-
p =
|
|
308
|
-
|
|
309
|
-
|
|
307
|
+
next_delay_sec = 1.0
|
|
308
|
+
for i in range(TRY_LIMIT):
|
|
309
|
+
p = urllib.parse.urlparse(url)
|
|
310
|
+
if p.scheme not in ('http', 'https'):
|
|
311
|
+
raise RuntimeError(
|
|
312
|
+
"Don't know how to work with protocol '%s'" % protocol)
|
|
313
|
+
try:
|
|
314
|
+
resp, contents = httplib2.Http().request(url, 'GET', **kwargs)
|
|
315
|
+
except (socket.error, httplib2.HttpLib2Error) as e:
|
|
316
|
+
LOGGER.debug('GET [%s] raised %s', url, e)
|
|
317
|
+
return None, None
|
|
310
318
|
LOGGER.debug('GET [%s] #%d/%d (%d)', url, i+1, TRY_LIMIT, resp.status)
|
|
311
|
-
if resp.status <
|
|
319
|
+
if resp.status < 500:
|
|
312
320
|
return (resp, contents)
|
|
313
321
|
|
|
314
322
|
# Retry server error status codes.
|
|
@@ -316,22 +324,21 @@ class GceAuthenticator(Authenticator):
|
|
|
316
324
|
if TRY_LIMIT - i > 1:
|
|
317
325
|
LOGGER.info('Will retry in %d seconds (%d more times)...',
|
|
318
326
|
next_delay_sec, TRY_LIMIT - i - 1)
|
|
319
|
-
|
|
320
|
-
next_delay_sec *=
|
|
321
|
-
|
|
327
|
+
time_sleep(next_delay_sec)
|
|
328
|
+
next_delay_sec *= random.uniform(MIN_BACKOFF, MAX_BACKOFF)
|
|
329
|
+
return None, None
|
|
322
330
|
|
|
323
331
|
@classmethod
|
|
324
332
|
def _get_token_dict(cls):
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
return cls._token_cache
|
|
333
|
+
# If cached token is valid for at least 25 seconds, return it.
|
|
334
|
+
if cls._token_cache and time_time() + 25 < cls._token_expiration:
|
|
335
|
+
return cls._token_cache
|
|
329
336
|
|
|
330
337
|
resp, contents = cls._get(cls._ACQUIRE_URL, headers=cls._ACQUIRE_HEADERS)
|
|
331
|
-
if resp.status !=
|
|
338
|
+
if resp is None or resp.status != 200:
|
|
332
339
|
return None
|
|
333
340
|
cls._token_cache = json.loads(contents)
|
|
334
|
-
cls._token_expiration = cls._token_cache['expires_in'] +
|
|
341
|
+
cls._token_expiration = cls._token_cache['expires_in'] + time_time()
|
|
335
342
|
return cls._token_cache
|
|
336
343
|
|
|
337
344
|
def get_auth_header(self, _host):
|
|
@@ -350,25 +357,25 @@ class LuciContextAuthenticator(Authenticator):
|
|
|
350
357
|
return auth.has_luci_context_local_auth()
|
|
351
358
|
|
|
352
359
|
def __init__(self):
|
|
353
|
-
self.
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
def _ensure_fresh(self):
|
|
357
|
-
if not self._access_token or self._access_token.needs_refresh():
|
|
358
|
-
self._access_token = auth.get_luci_context_access_token(
|
|
359
|
-
scopes=' '.join([auth.OAUTH_SCOPE_EMAIL, auth.OAUTH_SCOPE_GERRIT]))
|
|
360
|
+
self._authenticator = auth.Authenticator(
|
|
361
|
+
' '.join([auth.OAUTH_SCOPE_EMAIL, auth.OAUTH_SCOPE_GERRIT]))
|
|
360
362
|
|
|
361
363
|
def get_auth_header(self, _host):
|
|
362
|
-
self.
|
|
363
|
-
return 'Bearer %s' % self._access_token.token
|
|
364
|
+
return 'Bearer %s' % self._authenticator.get_access_token().token
|
|
364
365
|
|
|
365
366
|
|
|
366
367
|
def CreateHttpConn(host, path, reqtype='GET', headers=None, body=None):
|
|
367
|
-
"""Opens an
|
|
368
|
+
"""Opens an HTTPS connection to a Gerrit service, and sends a request."""
|
|
368
369
|
headers = headers or {}
|
|
369
370
|
bare_host = host.partition(':')[0]
|
|
370
371
|
|
|
371
|
-
a = Authenticator.get()
|
|
372
|
+
a = Authenticator.get()
|
|
373
|
+
# TODO(crbug.com/1059384): Automatically detect when running on cloudtop.
|
|
374
|
+
if isinstance(a, GceAuthenticator):
|
|
375
|
+
print('If you\'re on a cloudtop instance, export '
|
|
376
|
+
'SKIP_GCE_AUTH_FOR_GIT=1 in your env.')
|
|
377
|
+
|
|
378
|
+
a = a.get_auth_header(bare_host)
|
|
372
379
|
if a:
|
|
373
380
|
headers.setdefault('Authorization', a)
|
|
374
381
|
else:
|
|
@@ -381,22 +388,22 @@ def CreateHttpConn(host, path, reqtype='GET', headers=None, body=None):
|
|
|
381
388
|
url = '/a%s' % url
|
|
382
389
|
|
|
383
390
|
if body:
|
|
384
|
-
body = json.
|
|
391
|
+
body = json.dumps(body, sort_keys=True)
|
|
385
392
|
headers.setdefault('Content-Type', 'application/json')
|
|
386
393
|
if LOGGER.isEnabledFor(logging.DEBUG):
|
|
387
394
|
LOGGER.debug('%s %s://%s%s' % (reqtype, GERRIT_PROTOCOL, host, url))
|
|
388
|
-
for key, val in headers.
|
|
395
|
+
for key, val in headers.items():
|
|
389
396
|
if key == 'Authorization':
|
|
390
397
|
val = 'HIDDEN'
|
|
391
398
|
LOGGER.debug('%s: %s' % (key, val))
|
|
392
399
|
if body:
|
|
393
400
|
LOGGER.debug(body)
|
|
394
|
-
conn =
|
|
395
|
-
# HACK:
|
|
401
|
+
conn = httplib2.Http()
|
|
402
|
+
# HACK: httplib2.Http has no such attribute; we store req_host here for later
|
|
396
403
|
# use in ReadHttpResponse.
|
|
397
404
|
conn.req_host = host
|
|
398
405
|
conn.req_params = {
|
|
399
|
-
'uri':
|
|
406
|
+
'uri': urllib.parse.urljoin('%s://%s' % (GERRIT_PROTOCOL, host), url),
|
|
400
407
|
'method': reqtype,
|
|
401
408
|
'headers': headers,
|
|
402
409
|
'body': body,
|
|
@@ -405,7 +412,7 @@ def CreateHttpConn(host, path, reqtype='GET', headers=None, body=None):
|
|
|
405
412
|
|
|
406
413
|
|
|
407
414
|
def ReadHttpResponse(conn, accept_statuses=frozenset([200])):
|
|
408
|
-
"""Reads an
|
|
415
|
+
"""Reads an HTTP response from a connection into a string buffer.
|
|
409
416
|
|
|
410
417
|
Args:
|
|
411
418
|
conn: An Http object created by CreateHttpConn above.
|
|
@@ -413,10 +420,11 @@ def ReadHttpResponse(conn, accept_statuses=frozenset([200])):
|
|
|
413
420
|
Common additions include 204, 400, and 404.
|
|
414
421
|
Returns: A string buffer containing the connection's reply.
|
|
415
422
|
"""
|
|
416
|
-
sleep_time =
|
|
423
|
+
sleep_time = SLEEP_TIME
|
|
417
424
|
for idx in range(TRY_LIMIT):
|
|
418
425
|
before_response = time.time()
|
|
419
426
|
response, contents = conn.request(**conn.req_params)
|
|
427
|
+
contents = contents.decode('utf-8', 'replace')
|
|
420
428
|
|
|
421
429
|
response_time = time.time() - before_response
|
|
422
430
|
metrics.collector.add_repeated(
|
|
@@ -425,29 +433,22 @@ def ReadHttpResponse(conn, accept_statuses=frozenset([200])):
|
|
|
425
433
|
conn.req_params['uri'], conn.req_params['method'], response.status,
|
|
426
434
|
response_time))
|
|
427
435
|
|
|
428
|
-
#
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
'has credentials for %s' % host)
|
|
436
|
-
raise GerritAuthenticationError(response.status, reason)
|
|
437
|
-
|
|
438
|
-
# If response.status < 500 then the result is final; break retry loop.
|
|
439
|
-
# If the response is 404/409, it might be because of replication lag, so
|
|
440
|
-
# keep trying anyway.
|
|
441
|
-
if ((response.status < 500 and response.status not in [404, 409])
|
|
442
|
-
or response.status in accept_statuses):
|
|
436
|
+
# If response.status is an accepted status,
|
|
437
|
+
# or response.status < 500 then the result is final; break retry loop.
|
|
438
|
+
# If the response is 404/409 it might be because of replication lag,
|
|
439
|
+
# so keep trying anyway. If it is 429, it is generally ok to retry after
|
|
440
|
+
# a backoff.
|
|
441
|
+
if (response.status in accept_statuses
|
|
442
|
+
or response.status < 500 and response.status not in [404, 409, 429]):
|
|
443
443
|
LOGGER.debug('got response %d for %s %s', response.status,
|
|
444
444
|
conn.req_params['method'], conn.req_params['uri'])
|
|
445
445
|
# If 404 was in accept_statuses, then it's expected that the file might
|
|
446
|
-
# not exist, so don't return the gitiles error page because that's not
|
|
447
|
-
# "content" that was actually requested.
|
|
446
|
+
# not exist, so don't return the gitiles error page because that's not
|
|
447
|
+
# the "content" that was actually requested.
|
|
448
448
|
if response.status == 404:
|
|
449
449
|
contents = ''
|
|
450
450
|
break
|
|
451
|
+
|
|
451
452
|
# A status >=500 is assumed to be a possible transient error; retry.
|
|
452
453
|
http_version = 'HTTP/%s' % ('1.1' if response.version == 11 else '1.0')
|
|
453
454
|
LOGGER.warn('A transient error occurred while querying %s:\n'
|
|
@@ -456,30 +457,30 @@ def ReadHttpResponse(conn, accept_statuses=frozenset([200])):
|
|
|
456
457
|
conn.req_host, conn.req_params['method'],
|
|
457
458
|
conn.req_params['uri'],
|
|
458
459
|
http_version, http_version, response.status, response.reason)
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
# HACK: try different Gerrit mirror as a workaround for potentially
|
|
462
|
-
# out-of-date mirror hit through default routing.
|
|
463
|
-
if conn.req_host == 'chromium-review.googlesource.com':
|
|
464
|
-
conn.req_params['uri'] = _UseGerritMirror(
|
|
465
|
-
conn.req_params['uri'], 'chromium-review.googlesource.com')
|
|
466
|
-
# And don't increase sleep_time in this case, since we suspect we've
|
|
467
|
-
# just asked wrong git mirror before.
|
|
468
|
-
sleep_time /= 2.0
|
|
469
|
-
|
|
470
|
-
if TRY_LIMIT - idx > 1:
|
|
460
|
+
|
|
461
|
+
if idx < TRY_LIMIT - 1:
|
|
471
462
|
LOGGER.info('Will retry in %d seconds (%d more times)...',
|
|
472
463
|
sleep_time, TRY_LIMIT - idx - 1)
|
|
473
|
-
|
|
474
|
-
sleep_time
|
|
464
|
+
time_sleep(sleep_time)
|
|
465
|
+
sleep_time *= random.uniform(MIN_BACKOFF, MAX_BACKOFF)
|
|
475
466
|
# end of retries loop
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
467
|
+
|
|
468
|
+
if response.status in accept_statuses:
|
|
469
|
+
return StringIO(contents)
|
|
470
|
+
|
|
471
|
+
if response.status in (302, 401, 403):
|
|
472
|
+
www_authenticate = response.get('www-authenticate')
|
|
473
|
+
if not www_authenticate:
|
|
474
|
+
print('Your Gerrit credentials might be misconfigured.')
|
|
475
|
+
else:
|
|
476
|
+
auth_match = re.search('realm="([^"]+)"', www_authenticate, re.I)
|
|
477
|
+
host = auth_match.group(1) if auth_match else conn.req_host
|
|
478
|
+
print('Authentication failed. Please make sure your .gitcookies '
|
|
479
|
+
'file has credentials for %s.' % host)
|
|
480
|
+
print('Try:\n git cl creds-check')
|
|
481
|
+
|
|
482
|
+
reason = '%s: %s' % (response.reason, contents)
|
|
483
|
+
raise GerritError(response.status, reason)
|
|
483
484
|
|
|
484
485
|
|
|
485
486
|
def ReadHttpJsonResponse(conn, accept_statuses=frozenset([200])):
|
|
@@ -509,6 +510,7 @@ def QueryChanges(host, params, first_param=None, limit=None, o_params=None,
|
|
|
509
510
|
start: how many changes to skip (starting with the most recent)
|
|
510
511
|
o_params: A list of additional output specifiers, as documented here:
|
|
511
512
|
https://gerrit-review.googlesource.com/Documentation/rest-api-changes.html#list-changes
|
|
513
|
+
|
|
512
514
|
Returns:
|
|
513
515
|
A list of json-decoded query results.
|
|
514
516
|
"""
|
|
@@ -527,11 +529,11 @@ def QueryChanges(host, params, first_param=None, limit=None, o_params=None,
|
|
|
527
529
|
|
|
528
530
|
def GenerateAllChanges(host, params, first_param=None, limit=500,
|
|
529
531
|
o_params=None, start=None):
|
|
530
|
-
"""
|
|
531
|
-
|
|
532
|
+
"""Queries a gerrit-on-borg server for all the changes matching the query
|
|
533
|
+
terms.
|
|
532
534
|
|
|
533
535
|
WARNING: this is unreliable if a change matching the query is modified while
|
|
534
|
-
|
|
536
|
+
this function is being called.
|
|
535
537
|
|
|
536
538
|
A single query to gerrit-on-borg is limited on the number of results by the
|
|
537
539
|
limit parameter on the request (see QueryChanges) and the server maximum
|
|
@@ -547,6 +549,7 @@ def GenerateAllChanges(host, params, first_param=None, limit=500,
|
|
|
547
549
|
A generator object to the list of returned changes.
|
|
548
550
|
"""
|
|
549
551
|
already_returned = set()
|
|
552
|
+
|
|
550
553
|
def at_most_once(cls):
|
|
551
554
|
for cl in cls:
|
|
552
555
|
if cl['_number'] not in already_returned:
|
|
@@ -563,7 +566,7 @@ def GenerateAllChanges(host, params, first_param=None, limit=500,
|
|
|
563
566
|
# (say user posting comment), subsequent calls may overalp like this:
|
|
564
567
|
# > initial order ABCDEFGH
|
|
565
568
|
# query[0..3] => ABC
|
|
566
|
-
# > E
|
|
569
|
+
# > E gets updated. New order: EABCDFGH
|
|
567
570
|
# query[3..6] => CDF # C is a dup
|
|
568
571
|
# query[6..9] => GH # E is missed.
|
|
569
572
|
page = QueryChanges(host, params, first_param, limit, o_params,
|
|
@@ -594,7 +597,7 @@ def MultiQueryChanges(host, params, change_list, limit=None, o_params=None,
|
|
|
594
597
|
if not change_list:
|
|
595
598
|
raise RuntimeError(
|
|
596
599
|
"MultiQueryChanges requires a list of change numbers/id's")
|
|
597
|
-
q = ['q=%s' % '+OR+'.join([urllib.quote(str(x)) for x in change_list])]
|
|
600
|
+
q = ['q=%s' % '+OR+'.join([urllib.parse.quote(str(x)) for x in change_list])]
|
|
598
601
|
if params:
|
|
599
602
|
q.append(_QueryString(params))
|
|
600
603
|
if limit:
|
|
@@ -613,14 +616,15 @@ def MultiQueryChanges(host, params, change_list, limit=None, o_params=None,
|
|
|
613
616
|
|
|
614
617
|
|
|
615
618
|
def GetGerritFetchUrl(host):
|
|
616
|
-
"""Given a
|
|
619
|
+
"""Given a Gerrit host name returns URL of a Gerrit instance to fetch from."""
|
|
617
620
|
return '%s://%s/' % (GERRIT_PROTOCOL, host)
|
|
618
621
|
|
|
619
622
|
|
|
620
623
|
def GetCodeReviewTbrScore(host, project):
|
|
621
|
-
"""Given a
|
|
624
|
+
"""Given a Gerrit host name and project, return the Code-Review score for TBR.
|
|
622
625
|
"""
|
|
623
|
-
conn = CreateHttpConn(
|
|
626
|
+
conn = CreateHttpConn(
|
|
627
|
+
host, '/projects/%s' % urllib.parse.quote(project, ''))
|
|
624
628
|
project = ReadHttpJsonResponse(conn)
|
|
625
629
|
if ('labels' not in project
|
|
626
630
|
or 'Code-Review' not in project['labels']
|
|
@@ -630,23 +634,23 @@ def GetCodeReviewTbrScore(host, project):
|
|
|
630
634
|
|
|
631
635
|
|
|
632
636
|
def GetChangePageUrl(host, change_number):
|
|
633
|
-
"""Given a
|
|
637
|
+
"""Given a Gerrit host name and change number, returns change page URL."""
|
|
634
638
|
return '%s://%s/#/c/%d/' % (GERRIT_PROTOCOL, host, change_number)
|
|
635
639
|
|
|
636
640
|
|
|
637
641
|
def GetChangeUrl(host, change):
|
|
638
|
-
"""Given a
|
|
642
|
+
"""Given a Gerrit host name and change ID, returns a URL for the change."""
|
|
639
643
|
return '%s://%s/a/changes/%s' % (GERRIT_PROTOCOL, host, change)
|
|
640
644
|
|
|
641
645
|
|
|
642
646
|
def GetChange(host, change):
|
|
643
|
-
"""
|
|
647
|
+
"""Queries a Gerrit server for information about a single change."""
|
|
644
648
|
path = 'changes/%s' % change
|
|
645
649
|
return ReadHttpJsonResponse(CreateHttpConn(host, path))
|
|
646
650
|
|
|
647
651
|
|
|
648
652
|
def GetChangeDetail(host, change, o_params=None):
|
|
649
|
-
"""
|
|
653
|
+
"""Queries a Gerrit server for extended information about a single change."""
|
|
650
654
|
path = 'changes/%s/detail' % change
|
|
651
655
|
if o_params:
|
|
652
656
|
path += '?%s' % '&'.join(['o=%s' % p for p in o_params])
|
|
@@ -654,7 +658,7 @@ def GetChangeDetail(host, change, o_params=None):
|
|
|
654
658
|
|
|
655
659
|
|
|
656
660
|
def GetChangeCommit(host, change, revision='current'):
|
|
657
|
-
"""Query a
|
|
661
|
+
"""Query a Gerrit server for a revision associated with a change."""
|
|
658
662
|
path = 'changes/%s/revisions/%s/commit?links' % (change, revision)
|
|
659
663
|
return ReadHttpJsonResponse(CreateHttpConn(host, path))
|
|
660
664
|
|
|
@@ -665,12 +669,12 @@ def GetChangeCurrentRevision(host, change):
|
|
|
665
669
|
|
|
666
670
|
|
|
667
671
|
def GetChangeRevisions(host, change):
|
|
668
|
-
"""
|
|
672
|
+
"""Gets information about all revisions associated with a change."""
|
|
669
673
|
return QueryChanges(host, [], change, o_params=('ALL_REVISIONS',))
|
|
670
674
|
|
|
671
675
|
|
|
672
676
|
def GetChangeReview(host, change, revision=None):
|
|
673
|
-
"""
|
|
677
|
+
"""Gets the current review information for a change."""
|
|
674
678
|
if not revision:
|
|
675
679
|
jmsg = GetChangeRevisions(host, change)
|
|
676
680
|
if not jmsg:
|
|
@@ -689,13 +693,13 @@ def GetChangeComments(host, change):
|
|
|
689
693
|
|
|
690
694
|
|
|
691
695
|
def GetChangeRobotComments(host, change):
|
|
692
|
-
"""
|
|
696
|
+
"""Gets the line- and file-level robot comments on a change."""
|
|
693
697
|
path = 'changes/%s/robotcomments' % change
|
|
694
698
|
return ReadHttpJsonResponse(CreateHttpConn(host, path))
|
|
695
699
|
|
|
696
700
|
|
|
697
701
|
def AbandonChange(host, change, msg=''):
|
|
698
|
-
"""
|
|
702
|
+
"""Abandons a Gerrit change."""
|
|
699
703
|
path = 'changes/%s/abandon' % change
|
|
700
704
|
body = {'message': msg} if msg else {}
|
|
701
705
|
conn = CreateHttpConn(host, path, reqtype='POST', body=body)
|
|
@@ -703,7 +707,7 @@ def AbandonChange(host, change, msg=''):
|
|
|
703
707
|
|
|
704
708
|
|
|
705
709
|
def RestoreChange(host, change, msg=''):
|
|
706
|
-
"""
|
|
710
|
+
"""Restores a previously abandoned change."""
|
|
707
711
|
path = 'changes/%s/restore' % change
|
|
708
712
|
body = {'message': msg} if msg else {}
|
|
709
713
|
conn = CreateHttpConn(host, path, reqtype='POST', body=body)
|
|
@@ -711,7 +715,7 @@ def RestoreChange(host, change, msg=''):
|
|
|
711
715
|
|
|
712
716
|
|
|
713
717
|
def SubmitChange(host, change, wait_for_merge=True):
|
|
714
|
-
"""Submits a
|
|
718
|
+
"""Submits a Gerrit change via Gerrit."""
|
|
715
719
|
path = 'changes/%s/submit' % change
|
|
716
720
|
body = {'wait_for_merge': wait_for_merge}
|
|
717
721
|
conn = CreateHttpConn(host, path, reqtype='POST', body=body)
|
|
@@ -732,7 +736,7 @@ def HasPendingChangeEdit(host, change):
|
|
|
732
736
|
|
|
733
737
|
def DeletePendingChangeEdit(host, change):
|
|
734
738
|
conn = CreateHttpConn(host, 'changes/%s/edit' % change, reqtype='DELETE')
|
|
735
|
-
# On success,
|
|
739
|
+
# On success, Gerrit returns status 204; if the edit was already deleted it
|
|
736
740
|
# returns 404. Anything else is an error.
|
|
737
741
|
ReadHttpResponse(conn, accept_statuses=[204, 404])
|
|
738
742
|
|
|
@@ -753,13 +757,13 @@ def SetCommitMessage(host, change, description, notify='ALL'):
|
|
|
753
757
|
|
|
754
758
|
|
|
755
759
|
def GetReviewers(host, change):
|
|
756
|
-
"""
|
|
760
|
+
"""Gets information about all reviewers attached to a change."""
|
|
757
761
|
path = 'changes/%s/reviewers' % change
|
|
758
762
|
return ReadHttpJsonResponse(CreateHttpConn(host, path))
|
|
759
763
|
|
|
760
764
|
|
|
761
765
|
def GetReview(host, change, revision):
|
|
762
|
-
"""
|
|
766
|
+
"""Gets review information about a specific revision of a change."""
|
|
763
767
|
path = 'changes/%s/revisions/%s/review' % (change, revision)
|
|
764
768
|
return ReadHttpJsonResponse(CreateHttpConn(host, path))
|
|
765
769
|
|
|
@@ -786,7 +790,7 @@ def AddReviewers(host, change, reviewers=None, ccs=None, notify=True,
|
|
|
786
790
|
'reviewer': r,
|
|
787
791
|
'state': state,
|
|
788
792
|
'notify': 'NONE', # We handled `notify` argument above.
|
|
789
|
-
|
|
793
|
+
})
|
|
790
794
|
|
|
791
795
|
conn = CreateHttpConn(host, path, reqtype='POST', body=body)
|
|
792
796
|
# Gerrit will return 400 if one or more of the requested reviewers are
|
|
@@ -795,7 +799,7 @@ def AddReviewers(host, change, reviewers=None, ccs=None, notify=True,
|
|
|
795
799
|
resp = ReadHttpJsonResponse(conn, accept_statuses=accept_statuses)
|
|
796
800
|
|
|
797
801
|
errored = set()
|
|
798
|
-
for result in resp.get('reviewers', {}).
|
|
802
|
+
for result in resp.get('reviewers', {}).values():
|
|
799
803
|
r = result.get('input')
|
|
800
804
|
state = 'REVIEWER' if r in reviewers else 'CC'
|
|
801
805
|
if result.get('error'):
|
|
@@ -807,26 +811,8 @@ def AddReviewers(host, change, reviewers=None, ccs=None, notify=True,
|
|
|
807
811
|
ccs=(ccs-errored), notify=notify, accept_statuses=[200])
|
|
808
812
|
|
|
809
813
|
|
|
810
|
-
def RemoveReviewers(host, change, remove=None):
|
|
811
|
-
"""Remove reveiewers from a change."""
|
|
812
|
-
if not remove:
|
|
813
|
-
return
|
|
814
|
-
if isinstance(remove, basestring):
|
|
815
|
-
remove = (remove,)
|
|
816
|
-
for r in remove:
|
|
817
|
-
path = 'changes/%s/reviewers/%s' % (change, r)
|
|
818
|
-
conn = CreateHttpConn(host, path, reqtype='DELETE')
|
|
819
|
-
try:
|
|
820
|
-
ReadHttpResponse(conn, accept_statuses=[204])
|
|
821
|
-
except GerritError as e:
|
|
822
|
-
raise GerritError(
|
|
823
|
-
e.http_status,
|
|
824
|
-
'Received unexpected http status while deleting reviewer "%s" '
|
|
825
|
-
'from change %s' % (r, change))
|
|
826
|
-
|
|
827
|
-
|
|
828
814
|
def SetReview(host, change, msg=None, labels=None, notify=None, ready=None):
|
|
829
|
-
"""
|
|
815
|
+
"""Sets labels and/or adds a message to a code review."""
|
|
830
816
|
if not msg and not labels:
|
|
831
817
|
return
|
|
832
818
|
path = 'changes/%s/revisions/current/review' % change
|
|
@@ -842,7 +828,7 @@ def SetReview(host, change, msg=None, labels=None, notify=None, ready=None):
|
|
|
842
828
|
conn = CreateHttpConn(host, path, reqtype='POST', body=body)
|
|
843
829
|
response = ReadHttpJsonResponse(conn)
|
|
844
830
|
if labels:
|
|
845
|
-
for key, val in labels.
|
|
831
|
+
for key, val in labels.items():
|
|
846
832
|
if ('labels' not in response or key not in response['labels'] or
|
|
847
833
|
int(response['labels'][key] != int(val))):
|
|
848
834
|
raise GerritError(200, 'Unable to set "%s" label on change %s.' % (
|
|
@@ -851,7 +837,7 @@ def SetReview(host, change, msg=None, labels=None, notify=None, ready=None):
|
|
|
851
837
|
|
|
852
838
|
def ResetReviewLabels(host, change, label, value='0', message=None,
|
|
853
839
|
notify=None):
|
|
854
|
-
"""
|
|
840
|
+
"""Resets the value of a given label for all reviewers on a change."""
|
|
855
841
|
# This is tricky, because we want to work on the "current revision", but
|
|
856
842
|
# there's always the risk that "current revision" will change in between
|
|
857
843
|
# API calls. So, we check "current revision" at the beginning and end; if
|
|
@@ -867,7 +853,7 @@ def ResetReviewLabels(host, change, label, value='0', message=None,
|
|
|
867
853
|
'%s label set to %s programmatically.' % (label, value))
|
|
868
854
|
jmsg = GetReview(host, change, revision)
|
|
869
855
|
if not jmsg:
|
|
870
|
-
raise GerritError(200, 'Could not get review information for
|
|
856
|
+
raise GerritError(200, 'Could not get review information for revision %s '
|
|
871
857
|
'of change %s' % (revision, change))
|
|
872
858
|
for review in jmsg.get('labels', {}).get(label, {}).get('all', []):
|
|
873
859
|
if str(review.get('value', value)) != value:
|
|
@@ -896,12 +882,12 @@ def ResetReviewLabels(host, change, label, value='0', message=None,
|
|
|
896
882
|
|
|
897
883
|
|
|
898
884
|
def CreateGerritBranch(host, project, branch, commit):
|
|
899
|
-
"""
|
|
900
|
-
|
|
885
|
+
"""Creates a new branch from given project and commit
|
|
886
|
+
|
|
901
887
|
https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#create-branch
|
|
902
888
|
|
|
903
889
|
Returns:
|
|
904
|
-
A JSON with 'ref' key
|
|
890
|
+
A JSON object with 'ref' key.
|
|
905
891
|
"""
|
|
906
892
|
path = 'projects/%s/branches/%s' % (project, branch)
|
|
907
893
|
body = {'revision': commit}
|
|
@@ -913,12 +899,13 @@ def CreateGerritBranch(host, project, branch, commit):
|
|
|
913
899
|
|
|
914
900
|
|
|
915
901
|
def GetGerritBranch(host, project, branch):
|
|
916
|
-
"""
|
|
917
|
-
|
|
902
|
+
"""Gets a branch from given project and commit.
|
|
903
|
+
|
|
904
|
+
See:
|
|
918
905
|
https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#get-branch
|
|
919
906
|
|
|
920
907
|
Returns:
|
|
921
|
-
A JSON object with 'revision' key
|
|
908
|
+
A JSON object with 'revision' key.
|
|
922
909
|
"""
|
|
923
910
|
path = 'projects/%s/branches/%s' % (project, branch)
|
|
924
911
|
conn = CreateHttpConn(host, path, reqtype='GET')
|
|
@@ -935,7 +922,7 @@ def GetAccountDetails(host, account_id='self'):
|
|
|
935
922
|
whichever account user is authenticating as.
|
|
936
923
|
|
|
937
924
|
Documentation:
|
|
938
|
-
|
|
925
|
+
https://gerrit-review.googlesource.com/Documentation/rest-api-accounts.html#get-account
|
|
939
926
|
|
|
940
927
|
Returns None if account is not found (i.e., Gerrit returned 404).
|
|
941
928
|
"""
|
|
@@ -949,15 +936,17 @@ def ValidAccounts(host, accounts, max_threads=10):
|
|
|
949
936
|
Invalid accounts, either not existing or without unique match,
|
|
950
937
|
are not present as returned dictionary keys.
|
|
951
938
|
"""
|
|
952
|
-
assert not isinstance(accounts,
|
|
939
|
+
assert not isinstance(accounts, str), type(accounts)
|
|
953
940
|
accounts = list(set(accounts))
|
|
954
941
|
if not accounts:
|
|
955
942
|
return {}
|
|
943
|
+
|
|
956
944
|
def get_one(account):
|
|
957
945
|
try:
|
|
958
946
|
return account, GetAccountDetails(host, account)
|
|
959
947
|
except GerritError:
|
|
960
948
|
return None, None
|
|
949
|
+
|
|
961
950
|
valid = {}
|
|
962
951
|
with contextlib.closing(ThreadPool(min(max_threads, len(accounts)))) as pool:
|
|
963
952
|
for account, details in pool.map(get_one, accounts):
|
|
@@ -967,12 +956,11 @@ def ValidAccounts(host, accounts, max_threads=10):
|
|
|
967
956
|
|
|
968
957
|
|
|
969
958
|
def PercentEncodeForGitRef(original):
|
|
970
|
-
"""
|
|
959
|
+
"""Applies percent-encoding for strings sent to Gerrit via git ref metadata.
|
|
971
960
|
|
|
972
|
-
The encoding used is based on but stricter than URL encoding (Section 2.1
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
'PLUS SIGN' (U+002B).
|
|
961
|
+
The encoding used is based on but stricter than URL encoding (Section 2.1 of
|
|
962
|
+
RFC 3986). The only non-escaped characters are alphanumerics, and 'SPACE'
|
|
963
|
+
(U+0020) can be represented as 'LOW LINE' (U+005F) or 'PLUS SIGN' (U+002B).
|
|
976
964
|
|
|
977
965
|
For more information, see the Gerrit docs here:
|
|
978
966
|
|
|
@@ -981,7 +969,7 @@ def PercentEncodeForGitRef(original):
|
|
|
981
969
|
safe = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 '
|
|
982
970
|
encoded = ''.join(c if c in safe else '%%%02X' % ord(c) for c in original)
|
|
983
971
|
|
|
984
|
-
#
|
|
972
|
+
# Spaces are not allowed in git refs; gerrit will interpret either '_' or
|
|
985
973
|
# '+' (or '%20') as space. Use '_' since that has been supported the longest.
|
|
986
974
|
return encoded.replace(' ', '_')
|
|
987
975
|
|
|
@@ -1005,32 +993,4 @@ def ChangeIdentifier(project, change_number):
|
|
|
1005
993
|
comparing to specifying just change_number.
|
|
1006
994
|
"""
|
|
1007
995
|
assert int(change_number)
|
|
1008
|
-
return '%s~%s' % (urllib.quote(project,
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
# TODO(crbug/881860): remove this hack.
|
|
1012
|
-
_GERRIT_MIRROR_PREFIXES = ['us1', 'us2', 'us3', 'eu1']
|
|
1013
|
-
assert all(3 == len(p) for p in _GERRIT_MIRROR_PREFIXES)
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
def _UseGerritMirror(url, host):
|
|
1017
|
-
"""Returns new url which uses randomly selected mirror for a gerrit host.
|
|
1018
|
-
|
|
1019
|
-
url's host should be for a given host or a result of prior call to this
|
|
1020
|
-
function.
|
|
1021
|
-
|
|
1022
|
-
Assumes url has a single occurence of the host substring.
|
|
1023
|
-
"""
|
|
1024
|
-
assert host in url
|
|
1025
|
-
suffix = '-mirror-' + host
|
|
1026
|
-
prefixes = set(_GERRIT_MIRROR_PREFIXES)
|
|
1027
|
-
prefix_len = len(_GERRIT_MIRROR_PREFIXES[0])
|
|
1028
|
-
st = url.find(suffix)
|
|
1029
|
-
if st == -1:
|
|
1030
|
-
actual_host = host
|
|
1031
|
-
else:
|
|
1032
|
-
# Already uses some mirror.
|
|
1033
|
-
assert st >= prefix_len, (uri, host, st, prefix_len)
|
|
1034
|
-
prefixes.remove(url[st-prefix_len:st])
|
|
1035
|
-
actual_host = url[st-prefix_len:st+len(suffix)]
|
|
1036
|
-
return url.replace(actual_host, random.choice(list(prefixes)) + suffix)
|
|
996
|
+
return '%s~%s' % (urllib.parse.quote(project, ''), change_number)
|