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.
Files changed (718) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +11 -14
  4. data/CHANGELOG.md +10 -0
  5. data/README.md +10 -11
  6. data/Rakefile +30 -36
  7. data/ext/libv8/builder.rb +1 -1
  8. data/lib/libv8/version.rb +1 -1
  9. data/libv8.gemspec +1 -3
  10. data/vendor/depot_tools/{cipd.ps1 → .cipd_impl.ps1} +0 -0
  11. data/vendor/depot_tools/.gitattributes +1 -1
  12. data/vendor/depot_tools/.gitignore +7 -2
  13. data/vendor/depot_tools/.style.yapf +3 -1
  14. data/vendor/depot_tools/.vpython +55 -0
  15. data/vendor/depot_tools/.vpython3 +23 -0
  16. data/vendor/depot_tools/CROS_OWNERS +3 -1
  17. data/vendor/depot_tools/GOMA_OWNERS +9 -0
  18. data/vendor/depot_tools/LUCI_OWNERS +5 -0
  19. data/vendor/depot_tools/OWNERS +21 -6
  20. data/vendor/depot_tools/PRESUBMIT.py +35 -18
  21. data/vendor/depot_tools/README.git-cl.md +0 -14
  22. data/vendor/depot_tools/README.md +1 -1
  23. data/vendor/depot_tools/WATCHLISTS +2 -2
  24. data/vendor/depot_tools/auth.py +60 -772
  25. data/vendor/depot_tools/autoninja +12 -6
  26. data/vendor/depot_tools/autoninja.bat +14 -6
  27. data/vendor/depot_tools/autoninja.py +64 -27
  28. data/vendor/depot_tools/bb +1 -1
  29. data/vendor/depot_tools/bootstrap/{win/README.md → README.md} +28 -14
  30. data/vendor/depot_tools/bootstrap/{win/win_tools.py → bootstrap.py} +60 -43
  31. data/vendor/depot_tools/bootstrap/{win/git-bash.template.sh → git-bash.template.sh} +1 -1
  32. data/vendor/depot_tools/bootstrap/{win/git.template.bat → git.template.bat} +0 -0
  33. data/vendor/depot_tools/bootstrap/manifest.txt +27 -0
  34. data/vendor/depot_tools/bootstrap/manifest_bleeding_edge.txt +27 -0
  35. data/vendor/depot_tools/bootstrap/{win/profile.d.python.sh → profile.d.python.sh} +0 -0
  36. data/vendor/depot_tools/bootstrap/{win/python27.bleeding_edge.bat → python27.bat} +0 -0
  37. data/vendor/depot_tools/bootstrap/{win/python27.new.bat → python3.bat} +3 -3
  38. data/vendor/depot_tools/bootstrap/{win/win_tools.bat → win_tools.bat} +21 -16
  39. data/vendor/depot_tools/bootstrap_python3 +35 -0
  40. data/vendor/depot_tools/cbuildbot +1 -1
  41. data/vendor/depot_tools/chrome_set_ver +1 -1
  42. data/vendor/depot_tools/cipd +43 -39
  43. data/vendor/depot_tools/cipd.bat +2 -2
  44. data/vendor/depot_tools/cipd_client_version +1 -1
  45. data/vendor/depot_tools/cipd_client_version.digests +15 -14
  46. data/vendor/depot_tools/cipd_manifest.txt +31 -8
  47. data/vendor/depot_tools/cipd_manifest.versions +278 -158
  48. data/vendor/depot_tools/cit.py +9 -7
  49. data/vendor/depot_tools/clang_format.py +4 -1
  50. data/vendor/depot_tools/clang_format_merge_driver.py +10 -8
  51. data/vendor/depot_tools/compile_single_file.py +7 -2
  52. data/vendor/depot_tools/cpplint.py +51 -45
  53. data/vendor/depot_tools/cros +87 -0
  54. data/vendor/depot_tools/cros_sdk +1 -1
  55. data/vendor/depot_tools/crosjobs +13 -0
  56. data/vendor/depot_tools/detect_host_arch.py +0 -1
  57. data/vendor/depot_tools/dirmd +12 -0
  58. data/vendor/depot_tools/dirmd.bat +7 -0
  59. data/vendor/depot_tools/download_from_google_storage.py +47 -27
  60. data/vendor/depot_tools/ensure_bootstrap +14 -0
  61. data/vendor/depot_tools/fetch +14 -1
  62. data/vendor/depot_tools/fetch.bat +14 -1
  63. data/vendor/depot_tools/fetch.py +5 -7
  64. data/vendor/depot_tools/fetch_configs/chromium.py +6 -4
  65. data/vendor/depot_tools/fetch_configs/devtools-frontend.py +44 -0
  66. data/vendor/depot_tools/fetch_configs/ios_internal.py +10 -19
  67. data/vendor/depot_tools/fix_encoding.py +19 -5
  68. data/vendor/depot_tools/gclient +28 -12
  69. data/vendor/depot_tools/gclient-new-workdir.py +2 -0
  70. data/vendor/depot_tools/gclient.bat +18 -1
  71. data/vendor/depot_tools/gclient.py +160 -119
  72. data/vendor/depot_tools/gclient_eval.py +119 -107
  73. data/vendor/depot_tools/gclient_paths.py +67 -57
  74. data/vendor/depot_tools/gclient_scm.py +181 -159
  75. data/vendor/depot_tools/gclient_utils.py +177 -124
  76. data/vendor/depot_tools/gerrit_client.py +21 -13
  77. data/vendor/depot_tools/gerrit_util.py +188 -228
  78. data/vendor/depot_tools/git-cache +1 -1
  79. data/vendor/depot_tools/git-cl +1 -1
  80. data/vendor/depot_tools/git-drover +1 -1
  81. data/vendor/depot_tools/git-find-releases +1 -1
  82. data/vendor/depot_tools/git-footers +1 -1
  83. data/vendor/depot_tools/git-freeze +1 -1
  84. data/vendor/depot_tools/git-hyper-blame +1 -1
  85. data/vendor/depot_tools/git-map +1 -1
  86. data/vendor/depot_tools/git-map-branches +1 -1
  87. data/vendor/depot_tools/git-mark-merge-base +1 -1
  88. data/vendor/depot_tools/git-nav-downstream +1 -1
  89. data/vendor/depot_tools/git-new-branch +1 -1
  90. data/vendor/depot_tools/git-number +1 -1
  91. data/vendor/depot_tools/git-rebase-update +1 -1
  92. data/vendor/depot_tools/git-rename-branch +1 -1
  93. data/vendor/depot_tools/git-reparent-branch +1 -1
  94. data/vendor/depot_tools/git-retry +1 -1
  95. data/vendor/depot_tools/git-squash-branch +1 -1
  96. data/vendor/depot_tools/git-thaw +1 -1
  97. data/vendor/depot_tools/git-upstream-diff +1 -1
  98. data/vendor/depot_tools/git_cache.py +255 -360
  99. data/vendor/depot_tools/git_cl.py +1562 -2059
  100. data/vendor/depot_tools/git_cl_completion.sh +16 -2
  101. data/vendor/depot_tools/git_common.py +77 -32
  102. data/vendor/depot_tools/git_drover.py +17 -8
  103. data/vendor/depot_tools/git_find_releases.py +11 -9
  104. data/vendor/depot_tools/git_footers.py +13 -9
  105. data/vendor/depot_tools/git_freezer.py +3 -1
  106. data/vendor/depot_tools/git_hyper_blame.py +25 -32
  107. data/vendor/depot_tools/git_map.py +115 -93
  108. data/vendor/depot_tools/git_map_branches.py +11 -10
  109. data/vendor/depot_tools/git_mark_merge_base.py +8 -6
  110. data/vendor/depot_tools/git_nav_downstream.py +9 -6
  111. data/vendor/depot_tools/git_new_branch.py +39 -33
  112. data/vendor/depot_tools/git_number.py +28 -17
  113. data/vendor/depot_tools/git_rebase_update.py +50 -49
  114. data/vendor/depot_tools/git_rename_branch.py +2 -2
  115. data/vendor/depot_tools/git_reparent_branch.py +8 -6
  116. data/vendor/depot_tools/git_upstream_diff.py +4 -2
  117. data/vendor/depot_tools/gn.py +6 -4
  118. data/vendor/depot_tools/goma_auth +12 -0
  119. data/vendor/depot_tools/goma_auth.bat +8 -0
  120. data/vendor/depot_tools/goma_ctl +12 -0
  121. data/vendor/depot_tools/goma_ctl.bat +8 -0
  122. data/vendor/depot_tools/gsutil.py +5 -2
  123. data/vendor/depot_tools/gsutil.py.bat +8 -0
  124. data/vendor/depot_tools/gsutil.vpython +3 -1
  125. data/vendor/depot_tools/infra/config/OWNERS +2 -2
  126. data/vendor/depot_tools/infra/config/recipes.cfg +3 -2
  127. data/vendor/depot_tools/led +1 -1
  128. data/vendor/depot_tools/lockfile.py +116 -0
  129. data/vendor/depot_tools/luci-auth +1 -1
  130. data/vendor/depot_tools/lucicfg +1 -1
  131. data/vendor/depot_tools/mac_toolchain +1 -1
  132. data/vendor/depot_tools/man/html/depot_tools.html +1 -1
  133. data/vendor/depot_tools/man/html/depot_tools_tutorial.html +31 -25
  134. data/vendor/depot_tools/man/html/git-cl.html +1 -1
  135. data/vendor/depot_tools/man/html/git-drover.html +18 -18
  136. data/vendor/depot_tools/man/html/git-footers.html +1 -1
  137. data/vendor/depot_tools/man/html/git-freeze.html +3 -3
  138. data/vendor/depot_tools/man/html/git-hyper-blame.html +1 -1
  139. data/vendor/depot_tools/man/html/git-map-branches.html +2 -2
  140. data/vendor/depot_tools/man/html/git-map.html +1 -1
  141. data/vendor/depot_tools/man/html/git-mark-merge-base.html +1 -1
  142. data/vendor/depot_tools/man/html/git-nav-downstream.html +3 -3
  143. data/vendor/depot_tools/man/html/git-nav-upstream.html +12 -6
  144. data/vendor/depot_tools/man/html/git-new-branch.html +1 -1
  145. data/vendor/depot_tools/man/html/git-rebase-update.html +20 -1
  146. data/vendor/depot_tools/man/html/git-rename-branch.html +1 -1
  147. data/vendor/depot_tools/man/html/git-reparent-branch.html +1 -1
  148. data/vendor/depot_tools/man/html/git-retry.html +1 -1
  149. data/vendor/depot_tools/man/html/git-squash-branch.html +1 -1
  150. data/vendor/depot_tools/man/html/git-thaw.html +1 -1
  151. data/vendor/depot_tools/man/html/git-upstream-diff.html +10 -6
  152. data/vendor/depot_tools/man/man1/git-cl.1 +4 -4
  153. data/vendor/depot_tools/man/man1/git-drover.1 +21 -21
  154. data/vendor/depot_tools/man/man1/git-footers.1 +4 -4
  155. data/vendor/depot_tools/man/man1/git-freeze.1 +6 -6
  156. data/vendor/depot_tools/man/man1/git-hyper-blame.1 +4 -4
  157. data/vendor/depot_tools/man/man1/git-map-branches.1 +4 -4
  158. data/vendor/depot_tools/man/man1/git-map.1 +4 -4
  159. data/vendor/depot_tools/man/man1/git-mark-merge-base.1 +4 -4
  160. data/vendor/depot_tools/man/man1/git-nav-downstream.1 +6 -6
  161. data/vendor/depot_tools/man/man1/git-nav-upstream.1 +15 -9
  162. data/vendor/depot_tools/man/man1/git-new-branch.1 +3 -3
  163. data/vendor/depot_tools/man/man1/git-rebase-update.1 +14 -4
  164. data/vendor/depot_tools/man/man1/git-rename-branch.1 +4 -4
  165. data/vendor/depot_tools/man/man1/git-reparent-branch.1 +4 -4
  166. data/vendor/depot_tools/man/man1/git-retry.1 +4 -4
  167. data/vendor/depot_tools/man/man1/git-squash-branch.1 +4 -4
  168. data/vendor/depot_tools/man/man1/git-thaw.1 +4 -4
  169. data/vendor/depot_tools/man/man1/git-upstream-diff.1 +7 -13
  170. data/vendor/depot_tools/man/man7/depot_tools.7 +4 -4
  171. data/vendor/depot_tools/man/man7/depot_tools_tutorial.7 +31 -25
  172. data/vendor/depot_tools/man/src/common_demo_functions.sh +2 -2
  173. data/vendor/depot_tools/man/src/depot_tools_tutorial.txt +3 -3
  174. data/vendor/depot_tools/man/src/filter_demo_output.py +4 -2
  175. data/vendor/depot_tools/man/src/git-new-branch.txt +2 -1
  176. data/vendor/depot_tools/man/src/git-rebase-update.txt +8 -1
  177. data/vendor/depot_tools/metrics.README.md +8 -5
  178. data/vendor/depot_tools/metrics.py +7 -6
  179. data/vendor/depot_tools/metrics_utils.py +4 -14
  180. data/vendor/depot_tools/my_activity.py +85 -251
  181. data/vendor/depot_tools/ninja +1 -0
  182. data/vendor/depot_tools/ninja-mac +0 -0
  183. data/vendor/depot_tools/ninjalog_uploader.py +146 -145
  184. data/vendor/depot_tools/ninjalog_uploader_wrapper.py +69 -60
  185. data/vendor/depot_tools/owners.py +156 -43
  186. data/vendor/depot_tools/owners_finder.py +28 -14
  187. data/vendor/depot_tools/post_build_ninja_summary.py +76 -48
  188. data/vendor/depot_tools/presubmit_canned_checks.py +293 -106
  189. data/vendor/depot_tools/presubmit_support.py +527 -333
  190. data/vendor/depot_tools/prpc +1 -1
  191. data/vendor/depot_tools/pylint +2 -12
  192. data/vendor/depot_tools/pylint-1.5 +78 -0
  193. data/vendor/depot_tools/pylint-1.6 +78 -0
  194. data/vendor/depot_tools/pylint-1.7 +78 -0
  195. data/vendor/depot_tools/pylint-1.8 +78 -0
  196. data/vendor/depot_tools/pylint-1.9 +78 -0
  197. data/vendor/depot_tools/{depot-tools-auth.bat → pylint.bat} +2 -2
  198. data/vendor/depot_tools/pylint_main.py +45 -0
  199. data/vendor/depot_tools/pylintrc +14 -1
  200. data/vendor/depot_tools/python-bin/python3 +7 -0
  201. data/vendor/depot_tools/python_runner.sh +13 -8
  202. data/vendor/depot_tools/rdb +12 -0
  203. data/vendor/depot_tools/rdb.bat +7 -0
  204. data/vendor/depot_tools/recipes/OWNERS +0 -1
  205. data/vendor/depot_tools/recipes/README.recipes.md +218 -151
  206. data/vendor/depot_tools/recipes/recipe_modules/OWNERS +1 -1
  207. data/vendor/depot_tools/recipes/recipe_modules/bot_update/__init__.py +17 -16
  208. data/vendor/depot_tools/recipes/recipe_modules/bot_update/api.py +127 -78
  209. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic.json +19 -4
  210. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic_luci.json +18 -3
  211. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic_with_branch_heads.json +19 -4
  212. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/clobber.json +29 -8
  213. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/deprecated_got_revision_mapping.json +28 -10
  214. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/gerrit_no_rebase_patch_ref.json +29 -8
  215. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/gerrit_no_reset.json +29 -8
  216. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/input_commit_with_id_without_repo.json +29 -8
  217. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/multiple_patch_refs.json +29 -8
  218. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_apply_patch_on_gclient.json +35 -10
  219. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/{with_manifest_name.json → no_cp_checkout_HEAD.json} +25 -15
  220. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_cp_checkout_a_branch_head.json +65 -0
  221. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_cp_checkout_a_specific_commit.json +65 -0
  222. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_cp_checkout_master.json +65 -0
  223. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/refs.json +29 -8
  224. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/reset_root_solution_revision.json +29 -8
  225. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/resolve_chromium_fixed_version.json +117 -0
  226. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail.json +17 -11
  227. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail_patch.json +41 -10
  228. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail_patch_download.json +24 -11
  229. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_angle.json +35 -10
  230. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_branch_heads.json +35 -10
  231. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_feature_branch.json +38 -11
  232. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_v8_feature_branch.json +36 -11
  233. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_webrtc.json +35 -10
  234. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_v8.json +35 -10
  235. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_v8_head_by_default.json +35 -10
  236. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/unrecognized_commit_repo.json +0 -5
  237. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/with_tags.json +29 -8
  238. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.py +95 -22
  239. data/vendor/depot_tools/recipes/recipe_modules/bot_update/resources/bot_update.py +187 -114
  240. data/vendor/depot_tools/recipes/recipe_modules/bot_update/test_api.py +2 -2
  241. data/vendor/depot_tools/recipes/recipe_modules/bot_update/tests/do_not_retry_patch_failures_in_cq.py +42 -0
  242. data/vendor/depot_tools/recipes/recipe_modules/bot_update/tests/ensure_checkout.py +1 -0
  243. data/vendor/depot_tools/recipes/recipe_modules/cipd/__init__.py +0 -1
  244. data/vendor/depot_tools/recipes/recipe_modules/cipd/api.py +2 -2
  245. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/basic.json +0 -1
  246. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/basic_pkg.json +0 -1
  247. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/describe-failed.json +2 -4
  248. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/describe-many-instances.json +0 -1
  249. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/mac64.json +0 -1
  250. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_file.json +26 -6
  251. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_mode.json +23 -5
  252. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_verfile.json +23 -5
  253. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/win64.json +0 -1
  254. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/junk arch.json +0 -1
  255. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/junk bits.json +0 -1
  256. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_arm_32.json +0 -1
  257. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_arm_64.json +0 -1
  258. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_intel_32.json +0 -1
  259. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_intel_64.json +0 -1
  260. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_mips_64.json +0 -1
  261. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/mac_intel_64.json +0 -1
  262. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/win_intel_32.json +0 -1
  263. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/win_intel_64.json +0 -1
  264. data/vendor/depot_tools/recipes/recipe_modules/cipd/test_api.py +1 -1
  265. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/api.py +4 -1
  266. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/basic.json +4 -2
  267. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/basic_luci.json +3 -1
  268. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/win.json +4 -2
  269. data/vendor/depot_tools/recipes/recipe_modules/gclient/__init__.py +2 -1
  270. data/vendor/depot_tools/recipes/recipe_modules/gclient/api.py +82 -13
  271. data/vendor/depot_tools/recipes/recipe_modules/gclient/config.py +23 -11
  272. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/basic.json +3 -4
  273. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/revision.json +3 -6
  274. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/tryserver.json +3 -4
  275. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.py +7 -7
  276. data/vendor/depot_tools/recipes/recipe_modules/gclient/resources/diff_deps.py +16 -0
  277. data/vendor/depot_tools/recipes/recipe_modules/gclient/test_api.py +4 -0
  278. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/diff_deps.expected/basic.json +55 -0
  279. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/diff_deps.expected/dont have revision yet.json +84 -0
  280. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/diff_deps.expected/no change, exception.json +83 -0
  281. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/diff_deps.expected/windows.json +55 -0
  282. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/diff_deps.py +88 -0
  283. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/patch_project.py +9 -21
  284. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/sync_failure.py +24 -0
  285. data/vendor/depot_tools/recipes/recipe_modules/gerrit/api.py +2 -1
  286. data/vendor/depot_tools/recipes/recipe_modules/gerrit/examples/full.expected/basic.json +7 -12
  287. data/vendor/depot_tools/recipes/recipe_modules/git/__init__.py +0 -2
  288. data/vendor/depot_tools/recipes/recipe_modules/git/api.py +9 -17
  289. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic.json +2 -8
  290. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_branch.json +2 -8
  291. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_file_name.json +2 -8
  292. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_hash.json +2 -8
  293. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_ref.json +2 -8
  294. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_submodule_update_force.json +2 -8
  295. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_tags.json +2 -8
  296. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/can_fail_build.json +3 -13
  297. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/cannot_fail_build.json +2 -8
  298. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/cat-file_test.json +4 -12
  299. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_delta.json +2 -10
  300. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_failed.json +1 -7
  301. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_with_bad_output.json +1 -7
  302. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_with_bad_output_fails_build.json +0 -8
  303. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/curl_trace_file.json +3 -10
  304. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/git-cache-checkout.json +3 -11
  305. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/platform_win.json +2 -8
  306. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/rebase_failed.json +3 -13
  307. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/remote_not_origin.json +2 -8
  308. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/set_got_revision.json +2 -8
  309. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.py +0 -5
  310. data/vendor/depot_tools/recipes/recipe_modules/git_cl/__init__.py +1 -1
  311. data/vendor/depot_tools/recipes/recipe_modules/git_cl/api.py +7 -13
  312. data/vendor/depot_tools/recipes/recipe_modules/git_cl/examples/full.expected/basic.json +21 -16
  313. data/vendor/depot_tools/recipes/recipe_modules/git_cl/examples/full.py +1 -2
  314. data/vendor/depot_tools/recipes/recipe_modules/gitiles/api.py +1 -1
  315. data/vendor/depot_tools/recipes/recipe_modules/gitiles/examples/full.expected/basic.json +0 -1
  316. data/vendor/depot_tools/recipes/recipe_modules/gitiles/resources/gerrit_client.py +2 -2
  317. data/vendor/depot_tools/recipes/recipe_modules/gitiles/tests/parse_repo_url.expected/basic.json +0 -1
  318. data/vendor/depot_tools/recipes/recipe_modules/gsutil/api.py +23 -8
  319. data/vendor/depot_tools/recipes/recipe_modules/gsutil/examples/full.expected/basic.json +52 -1
  320. data/vendor/depot_tools/recipes/recipe_modules/gsutil/examples/full.py +15 -0
  321. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/__init__.py +1 -0
  322. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/api.py +32 -8
  323. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/ancient_version.json +83 -0
  324. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/automatic_version.json +83 -0
  325. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/explicit_version.json +83 -0
  326. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/linux.json +0 -1
  327. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/mac.json +5 -4
  328. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/win.json +0 -1
  329. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.py +21 -2
  330. data/vendor/depot_tools/recipes/recipe_modules/presubmit/__init__.py +20 -0
  331. data/vendor/depot_tools/recipes/recipe_modules/presubmit/api.py +235 -3
  332. data/vendor/depot_tools/recipes/recipe_modules/presubmit/examples/full.expected/basic.json +13 -5
  333. data/vendor/depot_tools/recipes/recipe_modules/presubmit/examples/full.py +5 -1
  334. data/vendor/depot_tools/recipes/recipe_modules/presubmit/properties.proto +14 -0
  335. data/vendor/depot_tools/recipes/recipe_modules/presubmit/test_api.py +19 -0
  336. data/vendor/depot_tools/recipes/recipe_modules/presubmit/tests/execute.py +247 -0
  337. data/vendor/depot_tools/recipes/recipe_modules/presubmit/tests/prepare.py +49 -0
  338. data/vendor/depot_tools/recipes/recipe_modules/tryserver/api.py +33 -45
  339. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/basic_tags.json +0 -1
  340. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch.json +64 -21
  341. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch_and_target_ref.json +64 -21
  342. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch.json +1 -22
  343. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch_new.json +1 -22
  344. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.py +5 -32
  345. data/vendor/depot_tools/recipes/recipe_modules/tryserver/tests/gerrit_change_fetch_ref_timeout.py +29 -0
  346. data/vendor/depot_tools/recipes/recipe_modules/tryserver/tests/gerrit_change_owner.expected/basic.json +5 -0
  347. data/vendor/depot_tools/recipes/recipe_modules/tryserver/tests/gerrit_change_owner.py +22 -0
  348. data/vendor/depot_tools/recipes/recipe_modules/tryserver/tests/gerrit_change_target_ref.py +32 -0
  349. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/linux.json +0 -1
  350. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/mac.json +0 -1
  351. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/win.json +2 -1
  352. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.py +1 -6
  353. data/vendor/depot_tools/recipes/recipes.py +49 -28
  354. data/vendor/depot_tools/recipes/recipes/fetch_end_to_end_test.expected/basic.json +11 -6
  355. data/vendor/depot_tools/repo +698 -540
  356. data/vendor/depot_tools/roll-dep +14 -1
  357. data/vendor/depot_tools/roll-dep.bat +10 -1
  358. data/vendor/depot_tools/roll_dep.py +15 -10
  359. data/vendor/depot_tools/scm.py +95 -75
  360. data/vendor/depot_tools/setup_color.py +36 -2
  361. data/vendor/depot_tools/split_cl.py +44 -32
  362. data/vendor/depot_tools/subcommand.py +6 -6
  363. data/vendor/depot_tools/subprocess2.py +38 -322
  364. data/vendor/depot_tools/third_party/colorama/LICENSE.txt +0 -1
  365. data/vendor/depot_tools/third_party/colorama/README.chromium +4 -5
  366. data/vendor/depot_tools/third_party/colorama/README.rst +346 -0
  367. data/vendor/depot_tools/third_party/colorama/__init__.py +3 -4
  368. data/vendor/depot_tools/third_party/colorama/ansi.py +82 -30
  369. data/vendor/depot_tools/third_party/colorama/ansitowin32.py +105 -37
  370. data/vendor/depot_tools/third_party/colorama/initialise.py +39 -15
  371. data/vendor/depot_tools/third_party/colorama/win32.py +46 -28
  372. data/vendor/depot_tools/third_party/colorama/winterm.py +80 -31
  373. data/vendor/depot_tools/update_depot_tools +18 -8
  374. data/vendor/depot_tools/update_depot_tools.bat +19 -15
  375. data/vendor/depot_tools/upload_metrics.py +7 -6
  376. data/vendor/depot_tools/upload_to_google_storage.py +23 -16
  377. data/vendor/depot_tools/vpython +4 -4
  378. data/vendor/depot_tools/vpython.bat +1 -1
  379. data/vendor/depot_tools/vpython3 +55 -0
  380. data/vendor/depot_tools/vpython3.bat +12 -0
  381. data/vendor/depot_tools/watchlists.py +14 -11
  382. data/vendor/depot_tools/weekly +4 -2
  383. data/vendor/depot_tools/win32imports.py +61 -0
  384. data/vendor/depot_tools/win_toolchain/get_toolchain_if_necessary.py +49 -41
  385. data/vendor/depot_tools/win_toolchain/package_from_installed.py +142 -149
  386. data/vendor/depot_tools/wtf +5 -3
  387. data/vendor/depot_tools/yapf +5 -1
  388. metadata +68 -343
  389. data/vendor/depot_tools/README.testing +0 -23
  390. data/vendor/depot_tools/annotated_gclient.py +0 -89
  391. data/vendor/depot_tools/appengine_mapper.py +0 -23
  392. data/vendor/depot_tools/bootstrap/win/manifest.txt +0 -20
  393. data/vendor/depot_tools/bootstrap/win/manifest_bleeding_edge.txt +0 -20
  394. data/vendor/depot_tools/bootstrap/win/pylint.new.bat +0 -7
  395. data/vendor/depot_tools/buildbucket.py +0 -186
  396. data/vendor/depot_tools/checkout.py +0 -431
  397. data/vendor/depot_tools/cros +0 -1
  398. data/vendor/depot_tools/dart_format.py +0 -58
  399. data/vendor/depot_tools/depot-tools-auth +0 -8
  400. data/vendor/depot_tools/depot-tools-auth.py +0 -102
  401. data/vendor/depot_tools/my_reviews.py +0 -396
  402. data/vendor/depot_tools/patch.py +0 -548
  403. data/vendor/depot_tools/pylint.py +0 -30
  404. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/buildbot.json +0 -239
  405. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_luci.json +0 -222
  406. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/__init__.py +0 -4
  407. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/api.py +0 -29
  408. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/basic.json +0 -15
  409. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_buildbot_linux.json +0 -15
  410. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_buildbot_mac.json +0 -15
  411. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_buildbot_win.json +0 -15
  412. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_generic_linux.json +0 -15
  413. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_generic_mac.json +0 -15
  414. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_generic_win.json +0 -15
  415. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_kitchen_linux.json +0 -15
  416. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_kitchen_mac.json +0 -15
  417. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_kitchen_win.json +0 -15
  418. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.py +0 -33
  419. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/path_config.py +0 -66
  420. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/set_failure_hash_with_no_steps.json +0 -11
  421. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_git_patch.json +0 -45
  422. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_git_patch_luci.json +0 -45
  423. data/vendor/depot_tools/rietveld.py +0 -779
  424. data/vendor/depot_tools/roll-dep-svn +0 -8
  425. data/vendor/depot_tools/roll-dep-svn.bat +0 -12
  426. data/vendor/depot_tools/roll_dep_svn.py +0 -430
  427. data/vendor/depot_tools/support/chromite_wrapper +0 -96
  428. data/vendor/depot_tools/third_party/boto/LICENSE +0 -18
  429. data/vendor/depot_tools/third_party/boto/README.chromium +0 -43
  430. data/vendor/depot_tools/third_party/boto/README.rst +0 -163
  431. data/vendor/depot_tools/third_party/boto/__init__.py +0 -793
  432. data/vendor/depot_tools/third_party/boto/auth.py +0 -682
  433. data/vendor/depot_tools/third_party/boto/auth_handler.py +0 -58
  434. data/vendor/depot_tools/third_party/boto/cacerts/__init__.py +0 -22
  435. data/vendor/depot_tools/third_party/boto/cacerts/cacerts.txt +0 -2183
  436. data/vendor/depot_tools/third_party/boto/compat.py +0 -28
  437. data/vendor/depot_tools/third_party/boto/connection.py +0 -1081
  438. data/vendor/depot_tools/third_party/boto/contrib/__init__.py +0 -22
  439. data/vendor/depot_tools/third_party/boto/contrib/ymlmessage.py +0 -52
  440. data/vendor/depot_tools/third_party/boto/core/README +0 -58
  441. data/vendor/depot_tools/third_party/boto/core/__init__.py +0 -23
  442. data/vendor/depot_tools/third_party/boto/core/auth.py +0 -78
  443. data/vendor/depot_tools/third_party/boto/core/credentials.py +0 -154
  444. data/vendor/depot_tools/third_party/boto/core/dictresponse.py +0 -178
  445. data/vendor/depot_tools/third_party/boto/core/service.py +0 -67
  446. data/vendor/depot_tools/third_party/boto/datapipeline/__init__.py +0 -0
  447. data/vendor/depot_tools/third_party/boto/datapipeline/exceptions.py +0 -42
  448. data/vendor/depot_tools/third_party/boto/datapipeline/layer1.py +0 -546
  449. data/vendor/depot_tools/third_party/boto/ecs/__init__.py +0 -90
  450. data/vendor/depot_tools/third_party/boto/ecs/item.py +0 -153
  451. data/vendor/depot_tools/third_party/boto/exception.py +0 -476
  452. data/vendor/depot_tools/third_party/boto/file/README +0 -49
  453. data/vendor/depot_tools/third_party/boto/file/__init__.py +0 -28
  454. data/vendor/depot_tools/third_party/boto/file/bucket.py +0 -112
  455. data/vendor/depot_tools/third_party/boto/file/connection.py +0 -33
  456. data/vendor/depot_tools/third_party/boto/file/key.py +0 -199
  457. data/vendor/depot_tools/third_party/boto/file/simpleresultset.py +0 -30
  458. data/vendor/depot_tools/third_party/boto/fps/__init__.py +0 -21
  459. data/vendor/depot_tools/third_party/boto/fps/connection.py +0 -369
  460. data/vendor/depot_tools/third_party/boto/fps/exception.py +0 -344
  461. data/vendor/depot_tools/third_party/boto/fps/response.py +0 -175
  462. data/vendor/depot_tools/third_party/boto/gs/__init__.py +0 -22
  463. data/vendor/depot_tools/third_party/boto/gs/acl.py +0 -304
  464. data/vendor/depot_tools/third_party/boto/gs/bucket.py +0 -870
  465. data/vendor/depot_tools/third_party/boto/gs/bucketlistresultset.py +0 -64
  466. data/vendor/depot_tools/third_party/boto/gs/connection.py +0 -103
  467. data/vendor/depot_tools/third_party/boto/gs/cors.py +0 -169
  468. data/vendor/depot_tools/third_party/boto/gs/key.py +0 -704
  469. data/vendor/depot_tools/third_party/boto/gs/resumable_upload_handler.py +0 -659
  470. data/vendor/depot_tools/third_party/boto/gs/user.py +0 -54
  471. data/vendor/depot_tools/third_party/boto/handler.py +0 -44
  472. data/vendor/depot_tools/third_party/boto/https_connection.py +0 -124
  473. data/vendor/depot_tools/third_party/boto/jsonresponse.py +0 -163
  474. data/vendor/depot_tools/third_party/boto/manage/__init__.py +0 -23
  475. data/vendor/depot_tools/third_party/boto/manage/cmdshell.py +0 -241
  476. data/vendor/depot_tools/third_party/boto/manage/propget.py +0 -64
  477. data/vendor/depot_tools/third_party/boto/manage/server.py +0 -556
  478. data/vendor/depot_tools/third_party/boto/manage/task.py +0 -175
  479. data/vendor/depot_tools/third_party/boto/manage/test_manage.py +0 -34
  480. data/vendor/depot_tools/third_party/boto/manage/volume.py +0 -420
  481. data/vendor/depot_tools/third_party/boto/mashups/__init__.py +0 -23
  482. data/vendor/depot_tools/third_party/boto/mashups/interactive.py +0 -97
  483. data/vendor/depot_tools/third_party/boto/mashups/iobject.py +0 -115
  484. data/vendor/depot_tools/third_party/boto/mashups/order.py +0 -211
  485. data/vendor/depot_tools/third_party/boto/mashups/server.py +0 -395
  486. data/vendor/depot_tools/third_party/boto/plugin.py +0 -90
  487. data/vendor/depot_tools/third_party/boto/provider.py +0 -337
  488. data/vendor/depot_tools/third_party/boto/pyami/__init__.py +0 -22
  489. data/vendor/depot_tools/third_party/boto/pyami/bootstrap.py +0 -134
  490. data/vendor/depot_tools/third_party/boto/pyami/config.py +0 -229
  491. data/vendor/depot_tools/third_party/boto/pyami/copybot.cfg +0 -60
  492. data/vendor/depot_tools/third_party/boto/pyami/copybot.py +0 -97
  493. data/vendor/depot_tools/third_party/boto/pyami/helloworld.py +0 -28
  494. data/vendor/depot_tools/third_party/boto/pyami/launch_ami.py +0 -178
  495. data/vendor/depot_tools/third_party/boto/pyami/scriptbase.py +0 -44
  496. data/vendor/depot_tools/third_party/boto/pyami/startup.py +0 -60
  497. data/vendor/depot_tools/third_party/boto/regioninfo.py +0 -63
  498. data/vendor/depot_tools/third_party/boto/resultset.py +0 -169
  499. data/vendor/depot_tools/third_party/boto/roboto/__init__.py +0 -1
  500. data/vendor/depot_tools/third_party/boto/roboto/awsqueryrequest.py +0 -504
  501. data/vendor/depot_tools/third_party/boto/roboto/awsqueryservice.py +0 -121
  502. data/vendor/depot_tools/third_party/boto/roboto/param.py +0 -147
  503. data/vendor/depot_tools/third_party/boto/s3/__init__.py +0 -84
  504. data/vendor/depot_tools/third_party/boto/s3/acl.py +0 -164
  505. data/vendor/depot_tools/third_party/boto/s3/bucket.py +0 -1634
  506. data/vendor/depot_tools/third_party/boto/s3/bucketlistresultset.py +0 -139
  507. data/vendor/depot_tools/third_party/boto/s3/bucketlogging.py +0 -83
  508. data/vendor/depot_tools/third_party/boto/s3/connection.py +0 -540
  509. data/vendor/depot_tools/third_party/boto/s3/cors.py +0 -210
  510. data/vendor/depot_tools/third_party/boto/s3/deletemarker.py +0 -55
  511. data/vendor/depot_tools/third_party/boto/s3/key.py +0 -1712
  512. data/vendor/depot_tools/third_party/boto/s3/keyfile.py +0 -134
  513. data/vendor/depot_tools/third_party/boto/s3/lifecycle.py +0 -231
  514. data/vendor/depot_tools/third_party/boto/s3/multidelete.py +0 -138
  515. data/vendor/depot_tools/third_party/boto/s3/multipart.py +0 -315
  516. data/vendor/depot_tools/third_party/boto/s3/prefix.py +0 -42
  517. data/vendor/depot_tools/third_party/boto/s3/resumable_download_handler.py +0 -339
  518. data/vendor/depot_tools/third_party/boto/s3/tagging.py +0 -71
  519. data/vendor/depot_tools/third_party/boto/s3/user.py +0 -49
  520. data/vendor/depot_tools/third_party/boto/s3/website.py +0 -237
  521. data/vendor/depot_tools/third_party/boto/services/__init__.py +0 -23
  522. data/vendor/depot_tools/third_party/boto/services/bs.py +0 -179
  523. data/vendor/depot_tools/third_party/boto/services/message.py +0 -58
  524. data/vendor/depot_tools/third_party/boto/services/result.py +0 -136
  525. data/vendor/depot_tools/third_party/boto/services/service.py +0 -161
  526. data/vendor/depot_tools/third_party/boto/services/servicedef.py +0 -91
  527. data/vendor/depot_tools/third_party/boto/services/sonofmmm.cfg +0 -43
  528. data/vendor/depot_tools/third_party/boto/services/sonofmmm.py +0 -81
  529. data/vendor/depot_tools/third_party/boto/services/submit.py +0 -88
  530. data/vendor/depot_tools/third_party/boto/ses/__init__.py +0 -54
  531. data/vendor/depot_tools/third_party/boto/ses/connection.py +0 -521
  532. data/vendor/depot_tools/third_party/boto/ses/exceptions.py +0 -77
  533. data/vendor/depot_tools/third_party/boto/storage_uri.py +0 -835
  534. data/vendor/depot_tools/third_party/boto/sts/__init__.py +0 -55
  535. data/vendor/depot_tools/third_party/boto/sts/connection.py +0 -207
  536. data/vendor/depot_tools/third_party/boto/sts/credentials.py +0 -215
  537. data/vendor/depot_tools/third_party/boto/utils.py +0 -927
  538. data/vendor/depot_tools/third_party/colorama/README.txt +0 -304
  539. data/vendor/depot_tools/third_party/fancy_urllib/README +0 -22
  540. data/vendor/depot_tools/third_party/fancy_urllib/__init__.py +0 -460
  541. data/vendor/depot_tools/third_party/logilab/README.chromium +0 -6
  542. data/vendor/depot_tools/third_party/logilab/__init__.py +0 -0
  543. data/vendor/depot_tools/third_party/logilab/astroid/LICENSE.txt +0 -340
  544. data/vendor/depot_tools/third_party/logilab/astroid/README.chromium +0 -11
  545. data/vendor/depot_tools/third_party/logilab/astroid/__init__.py +0 -136
  546. data/vendor/depot_tools/third_party/logilab/astroid/__pkginfo__.py +0 -42
  547. data/vendor/depot_tools/third_party/logilab/astroid/arguments.py +0 -233
  548. data/vendor/depot_tools/third_party/logilab/astroid/as_string.py +0 -548
  549. data/vendor/depot_tools/third_party/logilab/astroid/astpeephole.py +0 -86
  550. data/vendor/depot_tools/third_party/logilab/astroid/bases.py +0 -636
  551. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_builtin_inference.py +0 -336
  552. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_dateutil.py +0 -15
  553. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_gi.py +0 -195
  554. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_mechanize.py +0 -18
  555. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_nose.py +0 -82
  556. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_numpy.py +0 -62
  557. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_pytest.py +0 -76
  558. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_qt.py +0 -44
  559. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_six.py +0 -288
  560. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_ssl.py +0 -65
  561. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_stdlib.py +0 -473
  562. data/vendor/depot_tools/third_party/logilab/astroid/builder.py +0 -263
  563. data/vendor/depot_tools/third_party/logilab/astroid/context.py +0 -81
  564. data/vendor/depot_tools/third_party/logilab/astroid/decorators.py +0 -75
  565. data/vendor/depot_tools/third_party/logilab/astroid/exceptions.py +0 -71
  566. data/vendor/depot_tools/third_party/logilab/astroid/inference.py +0 -359
  567. data/vendor/depot_tools/third_party/logilab/astroid/manager.py +0 -267
  568. data/vendor/depot_tools/third_party/logilab/astroid/mixins.py +0 -147
  569. data/vendor/depot_tools/third_party/logilab/astroid/modutils.py +0 -741
  570. data/vendor/depot_tools/third_party/logilab/astroid/node_classes.py +0 -1053
  571. data/vendor/depot_tools/third_party/logilab/astroid/nodes.py +0 -87
  572. data/vendor/depot_tools/third_party/logilab/astroid/objects.py +0 -186
  573. data/vendor/depot_tools/third_party/logilab/astroid/protocols.py +0 -470
  574. data/vendor/depot_tools/third_party/logilab/astroid/raw_building.py +0 -390
  575. data/vendor/depot_tools/third_party/logilab/astroid/rebuilder.py +0 -989
  576. data/vendor/depot_tools/third_party/logilab/astroid/scoped_nodes.py +0 -1716
  577. data/vendor/depot_tools/third_party/logilab/astroid/test_utils.py +0 -201
  578. data/vendor/depot_tools/third_party/logilab/astroid/transforms.py +0 -96
  579. data/vendor/depot_tools/third_party/logilab/astroid/util.py +0 -89
  580. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/LICENSE +0 -19
  581. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/README.chromium +0 -11
  582. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/__init__.py +0 -20
  583. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/cext.c +0 -1421
  584. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/compat.py +0 -9
  585. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/simple.py +0 -246
  586. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/slots.py +0 -414
  587. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/utils.py +0 -13
  588. data/vendor/depot_tools/third_party/logilab/wrapt/LICENSE +0 -24
  589. data/vendor/depot_tools/third_party/logilab/wrapt/README.chromium +0 -11
  590. data/vendor/depot_tools/third_party/logilab/wrapt/__init__.py +0 -19
  591. data/vendor/depot_tools/third_party/logilab/wrapt/_wrappers.c +0 -2729
  592. data/vendor/depot_tools/third_party/logilab/wrapt/arguments.py +0 -96
  593. data/vendor/depot_tools/third_party/logilab/wrapt/decorators.py +0 -512
  594. data/vendor/depot_tools/third_party/logilab/wrapt/importer.py +0 -228
  595. data/vendor/depot_tools/third_party/logilab/wrapt/wrappers.py +0 -901
  596. data/vendor/depot_tools/third_party/mock/LICENSE.txt +0 -26
  597. data/vendor/depot_tools/third_party/mock/README.chromium +0 -24
  598. data/vendor/depot_tools/third_party/mock/__init__.py +0 -2366
  599. data/vendor/depot_tools/third_party/oauth2client/LICENSE +0 -202
  600. data/vendor/depot_tools/third_party/oauth2client/MODIFICATIONS.diff +0 -66
  601. data/vendor/depot_tools/third_party/oauth2client/README.chromium +0 -15
  602. data/vendor/depot_tools/third_party/oauth2client/__init__.py +0 -5
  603. data/vendor/depot_tools/third_party/oauth2client/anyjson.py +0 -32
  604. data/vendor/depot_tools/third_party/oauth2client/appengine.py +0 -963
  605. data/vendor/depot_tools/third_party/oauth2client/client.py +0 -1363
  606. data/vendor/depot_tools/third_party/oauth2client/clientsecrets.py +0 -153
  607. data/vendor/depot_tools/third_party/oauth2client/crypt.py +0 -377
  608. data/vendor/depot_tools/third_party/oauth2client/django_orm.py +0 -134
  609. data/vendor/depot_tools/third_party/oauth2client/file.py +0 -124
  610. data/vendor/depot_tools/third_party/oauth2client/gce.py +0 -90
  611. data/vendor/depot_tools/third_party/oauth2client/keyring_storage.py +0 -109
  612. data/vendor/depot_tools/third_party/oauth2client/locked_file.py +0 -373
  613. data/vendor/depot_tools/third_party/oauth2client/multistore_file.py +0 -465
  614. data/vendor/depot_tools/third_party/oauth2client/old_run.py +0 -160
  615. data/vendor/depot_tools/third_party/oauth2client/tools.py +0 -243
  616. data/vendor/depot_tools/third_party/oauth2client/util.py +0 -196
  617. data/vendor/depot_tools/third_party/oauth2client/xsrfutil.py +0 -113
  618. data/vendor/depot_tools/third_party/protobuf26/README.chromium +0 -23
  619. data/vendor/depot_tools/third_party/protobuf26/__init__.py +0 -0
  620. data/vendor/depot_tools/third_party/protobuf26/compiler/__init__.py +0 -0
  621. data/vendor/depot_tools/third_party/protobuf26/compiler/plugin_pb2.py +0 -184
  622. data/vendor/depot_tools/third_party/protobuf26/descriptor.py +0 -849
  623. data/vendor/depot_tools/third_party/protobuf26/descriptor_database.py +0 -137
  624. data/vendor/depot_tools/third_party/protobuf26/descriptor_pb2.py +0 -1522
  625. data/vendor/depot_tools/third_party/protobuf26/descriptor_pool.py +0 -643
  626. data/vendor/depot_tools/third_party/protobuf26/internal/__init__.py +0 -0
  627. data/vendor/depot_tools/third_party/protobuf26/internal/api_implementation.py +0 -89
  628. data/vendor/depot_tools/third_party/protobuf26/internal/containers.py +0 -269
  629. data/vendor/depot_tools/third_party/protobuf26/internal/cpp_message.py +0 -663
  630. data/vendor/depot_tools/third_party/protobuf26/internal/decoder.py +0 -831
  631. data/vendor/depot_tools/third_party/protobuf26/internal/encoder.py +0 -788
  632. data/vendor/depot_tools/third_party/protobuf26/internal/enum_type_wrapper.py +0 -89
  633. data/vendor/depot_tools/third_party/protobuf26/internal/message_listener.py +0 -78
  634. data/vendor/depot_tools/third_party/protobuf26/internal/python_message.py +0 -1247
  635. data/vendor/depot_tools/third_party/protobuf26/internal/type_checkers.py +0 -328
  636. data/vendor/depot_tools/third_party/protobuf26/internal/wire_format.py +0 -268
  637. data/vendor/depot_tools/third_party/protobuf26/message.py +0 -284
  638. data/vendor/depot_tools/third_party/protobuf26/message_factory.py +0 -155
  639. data/vendor/depot_tools/third_party/protobuf26/reflection.py +0 -205
  640. data/vendor/depot_tools/third_party/protobuf26/service.py +0 -226
  641. data/vendor/depot_tools/third_party/protobuf26/service_reflection.py +0 -284
  642. data/vendor/depot_tools/third_party/protobuf26/symbol_database.py +0 -185
  643. data/vendor/depot_tools/third_party/protobuf26/text_encoding.py +0 -110
  644. data/vendor/depot_tools/third_party/protobuf26/text_format.py +0 -873
  645. data/vendor/depot_tools/third_party/pylint.py +0 -37
  646. data/vendor/depot_tools/third_party/pylint/LICENSE.txt +0 -340
  647. data/vendor/depot_tools/third_party/pylint/README.chromium +0 -30
  648. data/vendor/depot_tools/third_party/pylint/__init__.py +0 -46
  649. data/vendor/depot_tools/third_party/pylint/__main__.py +0 -3
  650. data/vendor/depot_tools/third_party/pylint/__pkginfo__.py +0 -80
  651. data/vendor/depot_tools/third_party/pylint/checkers/__init__.py +0 -123
  652. data/vendor/depot_tools/third_party/pylint/checkers/async.py +0 -82
  653. data/vendor/depot_tools/third_party/pylint/checkers/base.py +0 -2010
  654. data/vendor/depot_tools/third_party/pylint/checkers/classes.py +0 -1120
  655. data/vendor/depot_tools/third_party/pylint/checkers/design_analysis.py +0 -348
  656. data/vendor/depot_tools/third_party/pylint/checkers/exceptions.py +0 -369
  657. data/vendor/depot_tools/third_party/pylint/checkers/format.py +0 -993
  658. data/vendor/depot_tools/third_party/pylint/checkers/imports.py +0 -654
  659. data/vendor/depot_tools/third_party/pylint/checkers/logging.py +0 -258
  660. data/vendor/depot_tools/third_party/pylint/checkers/misc.py +0 -105
  661. data/vendor/depot_tools/third_party/pylint/checkers/newstyle.py +0 -169
  662. data/vendor/depot_tools/third_party/pylint/checkers/python3.py +0 -591
  663. data/vendor/depot_tools/third_party/pylint/checkers/raw_metrics.py +0 -129
  664. data/vendor/depot_tools/third_party/pylint/checkers/similar.py +0 -371
  665. data/vendor/depot_tools/third_party/pylint/checkers/spelling.py +0 -264
  666. data/vendor/depot_tools/third_party/pylint/checkers/stdlib.py +0 -280
  667. data/vendor/depot_tools/third_party/pylint/checkers/strings.py +0 -618
  668. data/vendor/depot_tools/third_party/pylint/checkers/typecheck.py +0 -974
  669. data/vendor/depot_tools/third_party/pylint/checkers/utils.py +0 -741
  670. data/vendor/depot_tools/third_party/pylint/checkers/variables.py +0 -1191
  671. data/vendor/depot_tools/third_party/pylint/config.py +0 -820
  672. data/vendor/depot_tools/third_party/pylint/epylint.py +0 -181
  673. data/vendor/depot_tools/third_party/pylint/extensions/__init__.py +0 -0
  674. data/vendor/depot_tools/third_party/pylint/extensions/check_docs.py +0 -311
  675. data/vendor/depot_tools/third_party/pylint/extensions/check_elif.py +0 -62
  676. data/vendor/depot_tools/third_party/pylint/graph.py +0 -179
  677. data/vendor/depot_tools/third_party/pylint/gui.py +0 -531
  678. data/vendor/depot_tools/third_party/pylint/interfaces.py +0 -102
  679. data/vendor/depot_tools/third_party/pylint/lint.py +0 -1381
  680. data/vendor/depot_tools/third_party/pylint/pyreverse/__init__.py +0 -5
  681. data/vendor/depot_tools/third_party/pylint/pyreverse/diadefslib.py +0 -230
  682. data/vendor/depot_tools/third_party/pylint/pyreverse/diagrams.py +0 -258
  683. data/vendor/depot_tools/third_party/pylint/pyreverse/inspector.py +0 -372
  684. data/vendor/depot_tools/third_party/pylint/pyreverse/main.py +0 -147
  685. data/vendor/depot_tools/third_party/pylint/pyreverse/utils.py +0 -210
  686. data/vendor/depot_tools/third_party/pylint/pyreverse/vcgutils.py +0 -198
  687. data/vendor/depot_tools/third_party/pylint/pyreverse/writer.py +0 -198
  688. data/vendor/depot_tools/third_party/pylint/reporters/__init__.py +0 -149
  689. data/vendor/depot_tools/third_party/pylint/reporters/guireporter.py +0 -27
  690. data/vendor/depot_tools/third_party/pylint/reporters/html.py +0 -108
  691. data/vendor/depot_tools/third_party/pylint/reporters/json.py +0 -64
  692. data/vendor/depot_tools/third_party/pylint/reporters/text.py +0 -237
  693. data/vendor/depot_tools/third_party/pylint/reporters/ureports/__init__.py +0 -106
  694. data/vendor/depot_tools/third_party/pylint/reporters/ureports/html_writer.py +0 -93
  695. data/vendor/depot_tools/third_party/pylint/reporters/ureports/nodes.py +0 -181
  696. data/vendor/depot_tools/third_party/pylint/reporters/ureports/text_writer.py +0 -99
  697. data/vendor/depot_tools/third_party/pylint/testutils.py +0 -414
  698. data/vendor/depot_tools/third_party/pylint/utils.py +0 -1148
  699. data/vendor/depot_tools/third_party/pymox/COPYING +0 -202
  700. data/vendor/depot_tools/third_party/pymox/MANIFEST.in +0 -5
  701. data/vendor/depot_tools/third_party/pymox/README +0 -56
  702. data/vendor/depot_tools/third_party/pymox/__init__.py +0 -0
  703. data/vendor/depot_tools/third_party/pymox/mox.py +0 -1643
  704. data/vendor/depot_tools/third_party/pymox/mox_test.py +0 -1708
  705. data/vendor/depot_tools/third_party/pymox/mox_test_helper.py +0 -76
  706. data/vendor/depot_tools/third_party/pymox/setup.py +0 -14
  707. data/vendor/depot_tools/third_party/pymox/stubout.py +0 -142
  708. data/vendor/depot_tools/third_party/pymox/stubout_test.py +0 -47
  709. data/vendor/depot_tools/third_party/pymox/stubout_testee.py +0 -2
  710. data/vendor/depot_tools/third_party/simplejson/LICENSE.txt +0 -19
  711. data/vendor/depot_tools/third_party/simplejson/PKG-INFO +0 -29
  712. data/vendor/depot_tools/third_party/simplejson/__init__.py +0 -437
  713. data/vendor/depot_tools/third_party/simplejson/decoder.py +0 -421
  714. data/vendor/depot_tools/third_party/simplejson/encoder.py +0 -501
  715. data/vendor/depot_tools/third_party/simplejson/ordered_dict.py +0 -119
  716. data/vendor/depot_tools/third_party/simplejson/scanner.py +0 -77
  717. data/vendor/depot_tools/third_party/simplejson/tool.py +0 -39
  718. 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
- from third_party import colorama
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 = urllib.quote_plus(opt.project)
45
- branch = urllib.quote_plus(opt.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 = urllib.quote_plus(opt.project)
63
+ project = quote_plus(opt.project)
58
64
  host = urlparse.urlparse(opt.host).netloc
59
- branch = urllib.quote_plus(opt.branch)
60
- commit = urllib.quote_plus(opt.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 gerrit server via https.
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 cookielib
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
- LOGGER = logging.getLogger()
39
- # With a starting sleep time of 1.5 seconds, 2^n exponential backoff, and seven
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
- # Controls the transport protocol used to communicate with gerrit.
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, self.message)
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 gerrit upload is unknown. Check your remote '
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
- assert not host.startswith('http')
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 >> sys.stderr, (
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 >> sys.stderr, 'WARNING: Could not read netrc file %s' % path
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 >> sys.stderr, ('ERROR: Cannot use netrc file %s due to a '
196
- 'parsing error: %s' % (path, e))
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
- return subprocess2.check_output(
205
- ['git', 'config', '--path', 'http.cookiefile']).strip()
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.join(os.environ['HOME'], '.gitcookies')
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 = open(path, 'rb')
222
+ f = gclient_utils.FileRead(path, 'rb').splitlines()
218
223
  except IOError:
219
224
  return gitcookies
220
225
 
221
- with f:
222
- for line in f:
223
- try:
224
- fields = line.strip().split('\t')
225
- if line.strip().startswith('#') or len(fields) != 7:
226
- continue
227
- domain, xpath, key, value = fields[0], fields[2], fields[5], fields[6]
228
- if xpath == '/' and key == 'o':
229
- if value.startswith('git-'):
230
- login, secret_token = value.split('=', 1)
231
- gitcookies[domain] = (login, secret_token)
232
- else:
233
- gitcookies[domain] = ('', value)
234
- except (IndexError, ValueError, TypeError) as exc:
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.iteritems():
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
- return 'Basic %s' % (base64.b64encode('%s:%s' % (a[0], a[2])))
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
- try:
296
- resp, _ = cls._get(cls._INFO_URL)
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 xrange(TRY_LIMIT):
307
- p = urlparse.urlparse(url)
308
- c = GetConnectionObject(protocol=p.scheme)
309
- resp, contents = c.request(url, 'GET', **kwargs)
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 < httplib.INTERNAL_SERVER_ERROR:
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
- time.sleep(next_delay_sec)
320
- next_delay_sec *= 2
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
- if cls._token_cache:
326
- # If it expires within 25 seconds, refresh.
327
- if cls._token_expiration < time.time() - 25:
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 != httplib.OK:
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'] + time.time()
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._access_token = None
354
- self._ensure_fresh()
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._ensure_fresh()
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 https connection to a gerrit service, and sends a request."""
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().get_auth_header(bare_host)
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.JSONEncoder().encode(body)
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.iteritems():
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 = GetConnectionObject()
395
- # HACK: httplib.Http has no such attribute; we store req_host here for later
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': urlparse.urljoin('%s://%s' % (GERRIT_PROTOCOL, host), url),
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 http response from a connection into a string buffer.
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 = 1.5
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
- # Check if this is an authentication issue.
429
- www_authenticate = response.get('www-authenticate')
430
- if (response.status in (httplib.UNAUTHORIZED, httplib.FOUND) and
431
- www_authenticate):
432
- auth_match = re.search('realm="([^"]+)"', www_authenticate, re.I)
433
- host = auth_match.group(1) if auth_match else conn.req_host
434
- reason = ('Authentication failed. Please make sure your .gitcookies file '
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 the
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
- if response.status == 404:
460
- # TODO(crbug/881860): remove this hack.
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
- time.sleep(sleep_time)
474
- sleep_time = sleep_time * 2
464
+ time_sleep(sleep_time)
465
+ sleep_time *= random.uniform(MIN_BACKOFF, MAX_BACKOFF)
475
466
  # end of retries loop
476
- if response.status not in accept_statuses:
477
- if response.status in (401, 403):
478
- print('Your Gerrit credentials might be misconfigured. Try: \n'
479
- ' git cl creds-check')
480
- reason = '%s: %s' % (response.reason, contents)
481
- raise GerritError(response.status, reason)
482
- return StringIO(contents)
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
- Queries a gerrit-on-borg server for all the changes matching the query terms.
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
- this function is being called.
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 get's updated. New order: EABCDFGH
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 gerrit host name returns URL of a gerrit instance to fetch from."""
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 gerrit host name and project, return the Code-Review score for TBR.
624
+ """Given a Gerrit host name and project, return the Code-Review score for TBR.
622
625
  """
623
- conn = CreateHttpConn(host, '/projects/%s' % urllib.quote(project, safe=''))
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 gerrit host name and change number, return change page url."""
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 gerrit host name and change id, return an url for the change."""
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
- """Query a gerrit server for information about a single change."""
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
- """Query a gerrit server for extended information about a single change."""
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 gerrit server for a revision associated with a change."""
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
- """Get information about all revisions associated with a change."""
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
- """Get the current review information for a change."""
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
- """Get the line- and file-level robot comments on a change."""
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
- """Abandon a gerrit change."""
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
- """Restore a previously abandoned change."""
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 gerrit change via Gerrit."""
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, gerrit returns status 204; if the edit was already deleted it
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
- """Get information about all reviewers attached to a change."""
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
- """Get review information about a specific revision of a change."""
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', {}).itervalues():
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
- """Set labels and/or add a message to a code review."""
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.iteritems():
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
- """Reset the value of a given label for all reviewers on a change."""
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 revison %s '
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
- Create a new branch from given project and commit
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
- Get a branch from given project and commit
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
- https://gerrit-review.googlesource.com/Documentation/rest-api-accounts.html#get-account
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, basestring), type(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
- """Apply percent-encoding for strings sent to gerrit via git ref metadata.
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
- of RFC 3986). The only non-escaped characters are alphanumerics, and
974
- 'SPACE' (U+0020) can be represented as 'LOW LINE' (U+005F) or
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
- # spaces are not allowed in git refs; gerrit will interpret either '_' or
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, safe=''), change_number)
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)