libv8 7.8.279.23.0beta1 → 8.4.255.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (719) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +11 -14
  4. data/CHANGELOG.md +7 -1
  5. data/README.md +10 -11
  6. data/Rakefile +30 -36
  7. data/ext/libv8/builder.rb +2 -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 +3 -1
  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 +6 -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 +156 -118
  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 +180 -169
  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 +195 -281
  99. data/vendor/depot_tools/git_cl.py +1506 -2075
  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 +3 -1
  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 +5 -2
  178. data/vendor/depot_tools/metrics.py +4 -4
  179. data/vendor/depot_tools/metrics_utils.py +3 -3
  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 +57 -21
  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 +215 -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 -17
  208. data/vendor/depot_tools/recipes/recipe_modules/bot_update/api.py +65 -32
  209. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic.json +12 -4
  210. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic_luci.json +11 -3
  211. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic_with_branch_heads.json +12 -4
  212. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/clobber.json +22 -8
  213. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/deprecated_got_revision_mapping.json +27 -9
  214. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/gerrit_no_rebase_patch_ref.json +22 -8
  215. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/gerrit_no_reset.json +22 -8
  216. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/input_commit_with_id_without_repo.json +22 -8
  217. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/multiple_patch_refs.json +22 -8
  218. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_apply_patch_on_gclient.json +27 -9
  219. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_cp_checkout_HEAD.json +12 -4
  220. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_cp_checkout_a_branch_head.json +10 -4
  221. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_cp_checkout_a_specific_commit.json +12 -4
  222. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_cp_checkout_master.json +10 -4
  223. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/refs.json +22 -8
  224. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/reset_root_solution_revision.json +22 -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 +16 -10
  227. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail_patch.json +34 -10
  228. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail_patch_download.json +16 -10
  229. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_angle.json +27 -9
  230. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_branch_heads.json +27 -9
  231. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_feature_branch.json +27 -9
  232. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_v8_feature_branch.json +27 -9
  233. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_webrtc.json +27 -9
  234. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_v8.json +27 -9
  235. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_v8_head_by_default.json +27 -9
  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 +22 -8
  238. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.py +7 -23
  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 +21 -9
  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 +94 -74
  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 +22 -15
  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 +66 -345
  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/bot_update/examples/full.expected/with_manifest_name.json +0 -48
  405. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/buildbot.json +0 -239
  406. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_luci.json +0 -222
  407. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/__init__.py +0 -4
  408. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/api.py +0 -29
  409. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/basic.json +0 -15
  410. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_buildbot_linux.json +0 -15
  411. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_buildbot_mac.json +0 -15
  412. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_buildbot_win.json +0 -15
  413. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_generic_linux.json +0 -15
  414. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_generic_mac.json +0 -15
  415. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_generic_win.json +0 -15
  416. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_kitchen_linux.json +0 -15
  417. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_kitchen_mac.json +0 -15
  418. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_kitchen_win.json +0 -15
  419. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.py +0 -33
  420. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/path_config.py +0 -66
  421. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/set_failure_hash_with_no_steps.json +0 -11
  422. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_git_patch.json +0 -45
  423. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_git_patch_luci.json +0 -45
  424. data/vendor/depot_tools/rietveld.py +0 -779
  425. data/vendor/depot_tools/roll-dep-svn +0 -8
  426. data/vendor/depot_tools/roll-dep-svn.bat +0 -12
  427. data/vendor/depot_tools/roll_dep_svn.py +0 -430
  428. data/vendor/depot_tools/support/chromite_wrapper +0 -96
  429. data/vendor/depot_tools/third_party/boto/LICENSE +0 -18
  430. data/vendor/depot_tools/third_party/boto/README.chromium +0 -43
  431. data/vendor/depot_tools/third_party/boto/README.rst +0 -163
  432. data/vendor/depot_tools/third_party/boto/__init__.py +0 -793
  433. data/vendor/depot_tools/third_party/boto/auth.py +0 -682
  434. data/vendor/depot_tools/third_party/boto/auth_handler.py +0 -58
  435. data/vendor/depot_tools/third_party/boto/cacerts/__init__.py +0 -22
  436. data/vendor/depot_tools/third_party/boto/cacerts/cacerts.txt +0 -2183
  437. data/vendor/depot_tools/third_party/boto/compat.py +0 -28
  438. data/vendor/depot_tools/third_party/boto/connection.py +0 -1081
  439. data/vendor/depot_tools/third_party/boto/contrib/__init__.py +0 -22
  440. data/vendor/depot_tools/third_party/boto/contrib/ymlmessage.py +0 -52
  441. data/vendor/depot_tools/third_party/boto/core/README +0 -58
  442. data/vendor/depot_tools/third_party/boto/core/__init__.py +0 -23
  443. data/vendor/depot_tools/third_party/boto/core/auth.py +0 -78
  444. data/vendor/depot_tools/third_party/boto/core/credentials.py +0 -154
  445. data/vendor/depot_tools/third_party/boto/core/dictresponse.py +0 -178
  446. data/vendor/depot_tools/third_party/boto/core/service.py +0 -67
  447. data/vendor/depot_tools/third_party/boto/datapipeline/__init__.py +0 -0
  448. data/vendor/depot_tools/third_party/boto/datapipeline/exceptions.py +0 -42
  449. data/vendor/depot_tools/third_party/boto/datapipeline/layer1.py +0 -546
  450. data/vendor/depot_tools/third_party/boto/ecs/__init__.py +0 -90
  451. data/vendor/depot_tools/third_party/boto/ecs/item.py +0 -153
  452. data/vendor/depot_tools/third_party/boto/exception.py +0 -476
  453. data/vendor/depot_tools/third_party/boto/file/README +0 -49
  454. data/vendor/depot_tools/third_party/boto/file/__init__.py +0 -28
  455. data/vendor/depot_tools/third_party/boto/file/bucket.py +0 -112
  456. data/vendor/depot_tools/third_party/boto/file/connection.py +0 -33
  457. data/vendor/depot_tools/third_party/boto/file/key.py +0 -199
  458. data/vendor/depot_tools/third_party/boto/file/simpleresultset.py +0 -30
  459. data/vendor/depot_tools/third_party/boto/fps/__init__.py +0 -21
  460. data/vendor/depot_tools/third_party/boto/fps/connection.py +0 -369
  461. data/vendor/depot_tools/third_party/boto/fps/exception.py +0 -344
  462. data/vendor/depot_tools/third_party/boto/fps/response.py +0 -175
  463. data/vendor/depot_tools/third_party/boto/gs/__init__.py +0 -22
  464. data/vendor/depot_tools/third_party/boto/gs/acl.py +0 -304
  465. data/vendor/depot_tools/third_party/boto/gs/bucket.py +0 -870
  466. data/vendor/depot_tools/third_party/boto/gs/bucketlistresultset.py +0 -64
  467. data/vendor/depot_tools/third_party/boto/gs/connection.py +0 -103
  468. data/vendor/depot_tools/third_party/boto/gs/cors.py +0 -169
  469. data/vendor/depot_tools/third_party/boto/gs/key.py +0 -704
  470. data/vendor/depot_tools/third_party/boto/gs/resumable_upload_handler.py +0 -659
  471. data/vendor/depot_tools/third_party/boto/gs/user.py +0 -54
  472. data/vendor/depot_tools/third_party/boto/handler.py +0 -44
  473. data/vendor/depot_tools/third_party/boto/https_connection.py +0 -124
  474. data/vendor/depot_tools/third_party/boto/jsonresponse.py +0 -163
  475. data/vendor/depot_tools/third_party/boto/manage/__init__.py +0 -23
  476. data/vendor/depot_tools/third_party/boto/manage/cmdshell.py +0 -241
  477. data/vendor/depot_tools/third_party/boto/manage/propget.py +0 -64
  478. data/vendor/depot_tools/third_party/boto/manage/server.py +0 -556
  479. data/vendor/depot_tools/third_party/boto/manage/task.py +0 -175
  480. data/vendor/depot_tools/third_party/boto/manage/test_manage.py +0 -34
  481. data/vendor/depot_tools/third_party/boto/manage/volume.py +0 -420
  482. data/vendor/depot_tools/third_party/boto/mashups/__init__.py +0 -23
  483. data/vendor/depot_tools/third_party/boto/mashups/interactive.py +0 -97
  484. data/vendor/depot_tools/third_party/boto/mashups/iobject.py +0 -115
  485. data/vendor/depot_tools/third_party/boto/mashups/order.py +0 -211
  486. data/vendor/depot_tools/third_party/boto/mashups/server.py +0 -395
  487. data/vendor/depot_tools/third_party/boto/plugin.py +0 -90
  488. data/vendor/depot_tools/third_party/boto/provider.py +0 -337
  489. data/vendor/depot_tools/third_party/boto/pyami/__init__.py +0 -22
  490. data/vendor/depot_tools/third_party/boto/pyami/bootstrap.py +0 -134
  491. data/vendor/depot_tools/third_party/boto/pyami/config.py +0 -229
  492. data/vendor/depot_tools/third_party/boto/pyami/copybot.cfg +0 -60
  493. data/vendor/depot_tools/third_party/boto/pyami/copybot.py +0 -97
  494. data/vendor/depot_tools/third_party/boto/pyami/helloworld.py +0 -28
  495. data/vendor/depot_tools/third_party/boto/pyami/launch_ami.py +0 -178
  496. data/vendor/depot_tools/third_party/boto/pyami/scriptbase.py +0 -44
  497. data/vendor/depot_tools/third_party/boto/pyami/startup.py +0 -60
  498. data/vendor/depot_tools/third_party/boto/regioninfo.py +0 -63
  499. data/vendor/depot_tools/third_party/boto/resultset.py +0 -169
  500. data/vendor/depot_tools/third_party/boto/roboto/__init__.py +0 -1
  501. data/vendor/depot_tools/third_party/boto/roboto/awsqueryrequest.py +0 -504
  502. data/vendor/depot_tools/third_party/boto/roboto/awsqueryservice.py +0 -121
  503. data/vendor/depot_tools/third_party/boto/roboto/param.py +0 -147
  504. data/vendor/depot_tools/third_party/boto/s3/__init__.py +0 -84
  505. data/vendor/depot_tools/third_party/boto/s3/acl.py +0 -164
  506. data/vendor/depot_tools/third_party/boto/s3/bucket.py +0 -1634
  507. data/vendor/depot_tools/third_party/boto/s3/bucketlistresultset.py +0 -139
  508. data/vendor/depot_tools/third_party/boto/s3/bucketlogging.py +0 -83
  509. data/vendor/depot_tools/third_party/boto/s3/connection.py +0 -540
  510. data/vendor/depot_tools/third_party/boto/s3/cors.py +0 -210
  511. data/vendor/depot_tools/third_party/boto/s3/deletemarker.py +0 -55
  512. data/vendor/depot_tools/third_party/boto/s3/key.py +0 -1712
  513. data/vendor/depot_tools/third_party/boto/s3/keyfile.py +0 -134
  514. data/vendor/depot_tools/third_party/boto/s3/lifecycle.py +0 -231
  515. data/vendor/depot_tools/third_party/boto/s3/multidelete.py +0 -138
  516. data/vendor/depot_tools/third_party/boto/s3/multipart.py +0 -315
  517. data/vendor/depot_tools/third_party/boto/s3/prefix.py +0 -42
  518. data/vendor/depot_tools/third_party/boto/s3/resumable_download_handler.py +0 -339
  519. data/vendor/depot_tools/third_party/boto/s3/tagging.py +0 -71
  520. data/vendor/depot_tools/third_party/boto/s3/user.py +0 -49
  521. data/vendor/depot_tools/third_party/boto/s3/website.py +0 -237
  522. data/vendor/depot_tools/third_party/boto/services/__init__.py +0 -23
  523. data/vendor/depot_tools/third_party/boto/services/bs.py +0 -179
  524. data/vendor/depot_tools/third_party/boto/services/message.py +0 -58
  525. data/vendor/depot_tools/third_party/boto/services/result.py +0 -136
  526. data/vendor/depot_tools/third_party/boto/services/service.py +0 -161
  527. data/vendor/depot_tools/third_party/boto/services/servicedef.py +0 -91
  528. data/vendor/depot_tools/third_party/boto/services/sonofmmm.cfg +0 -43
  529. data/vendor/depot_tools/third_party/boto/services/sonofmmm.py +0 -81
  530. data/vendor/depot_tools/third_party/boto/services/submit.py +0 -88
  531. data/vendor/depot_tools/third_party/boto/ses/__init__.py +0 -54
  532. data/vendor/depot_tools/third_party/boto/ses/connection.py +0 -521
  533. data/vendor/depot_tools/third_party/boto/ses/exceptions.py +0 -77
  534. data/vendor/depot_tools/third_party/boto/storage_uri.py +0 -835
  535. data/vendor/depot_tools/third_party/boto/sts/__init__.py +0 -55
  536. data/vendor/depot_tools/third_party/boto/sts/connection.py +0 -207
  537. data/vendor/depot_tools/third_party/boto/sts/credentials.py +0 -215
  538. data/vendor/depot_tools/third_party/boto/utils.py +0 -927
  539. data/vendor/depot_tools/third_party/colorama/README.txt +0 -304
  540. data/vendor/depot_tools/third_party/fancy_urllib/README +0 -22
  541. data/vendor/depot_tools/third_party/fancy_urllib/__init__.py +0 -460
  542. data/vendor/depot_tools/third_party/logilab/README.chromium +0 -6
  543. data/vendor/depot_tools/third_party/logilab/__init__.py +0 -0
  544. data/vendor/depot_tools/third_party/logilab/astroid/LICENSE.txt +0 -340
  545. data/vendor/depot_tools/third_party/logilab/astroid/README.chromium +0 -11
  546. data/vendor/depot_tools/third_party/logilab/astroid/__init__.py +0 -136
  547. data/vendor/depot_tools/third_party/logilab/astroid/__pkginfo__.py +0 -42
  548. data/vendor/depot_tools/third_party/logilab/astroid/arguments.py +0 -233
  549. data/vendor/depot_tools/third_party/logilab/astroid/as_string.py +0 -548
  550. data/vendor/depot_tools/third_party/logilab/astroid/astpeephole.py +0 -86
  551. data/vendor/depot_tools/third_party/logilab/astroid/bases.py +0 -636
  552. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_builtin_inference.py +0 -336
  553. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_dateutil.py +0 -15
  554. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_gi.py +0 -195
  555. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_mechanize.py +0 -18
  556. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_nose.py +0 -82
  557. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_numpy.py +0 -62
  558. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_pytest.py +0 -76
  559. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_qt.py +0 -44
  560. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_six.py +0 -288
  561. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_ssl.py +0 -65
  562. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_stdlib.py +0 -473
  563. data/vendor/depot_tools/third_party/logilab/astroid/builder.py +0 -263
  564. data/vendor/depot_tools/third_party/logilab/astroid/context.py +0 -81
  565. data/vendor/depot_tools/third_party/logilab/astroid/decorators.py +0 -75
  566. data/vendor/depot_tools/third_party/logilab/astroid/exceptions.py +0 -71
  567. data/vendor/depot_tools/third_party/logilab/astroid/inference.py +0 -359
  568. data/vendor/depot_tools/third_party/logilab/astroid/manager.py +0 -267
  569. data/vendor/depot_tools/third_party/logilab/astroid/mixins.py +0 -147
  570. data/vendor/depot_tools/third_party/logilab/astroid/modutils.py +0 -741
  571. data/vendor/depot_tools/third_party/logilab/astroid/node_classes.py +0 -1053
  572. data/vendor/depot_tools/third_party/logilab/astroid/nodes.py +0 -87
  573. data/vendor/depot_tools/third_party/logilab/astroid/objects.py +0 -186
  574. data/vendor/depot_tools/third_party/logilab/astroid/protocols.py +0 -470
  575. data/vendor/depot_tools/third_party/logilab/astroid/raw_building.py +0 -390
  576. data/vendor/depot_tools/third_party/logilab/astroid/rebuilder.py +0 -989
  577. data/vendor/depot_tools/third_party/logilab/astroid/scoped_nodes.py +0 -1716
  578. data/vendor/depot_tools/third_party/logilab/astroid/test_utils.py +0 -201
  579. data/vendor/depot_tools/third_party/logilab/astroid/transforms.py +0 -96
  580. data/vendor/depot_tools/third_party/logilab/astroid/util.py +0 -89
  581. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/LICENSE +0 -19
  582. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/README.chromium +0 -11
  583. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/__init__.py +0 -20
  584. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/cext.c +0 -1421
  585. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/compat.py +0 -9
  586. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/simple.py +0 -246
  587. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/slots.py +0 -414
  588. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/utils.py +0 -13
  589. data/vendor/depot_tools/third_party/logilab/wrapt/LICENSE +0 -24
  590. data/vendor/depot_tools/third_party/logilab/wrapt/README.chromium +0 -11
  591. data/vendor/depot_tools/third_party/logilab/wrapt/__init__.py +0 -19
  592. data/vendor/depot_tools/third_party/logilab/wrapt/_wrappers.c +0 -2729
  593. data/vendor/depot_tools/third_party/logilab/wrapt/arguments.py +0 -96
  594. data/vendor/depot_tools/third_party/logilab/wrapt/decorators.py +0 -512
  595. data/vendor/depot_tools/third_party/logilab/wrapt/importer.py +0 -228
  596. data/vendor/depot_tools/third_party/logilab/wrapt/wrappers.py +0 -901
  597. data/vendor/depot_tools/third_party/mock/LICENSE.txt +0 -26
  598. data/vendor/depot_tools/third_party/mock/README.chromium +0 -24
  599. data/vendor/depot_tools/third_party/mock/__init__.py +0 -2366
  600. data/vendor/depot_tools/third_party/oauth2client/LICENSE +0 -202
  601. data/vendor/depot_tools/third_party/oauth2client/MODIFICATIONS.diff +0 -66
  602. data/vendor/depot_tools/third_party/oauth2client/README.chromium +0 -15
  603. data/vendor/depot_tools/third_party/oauth2client/__init__.py +0 -5
  604. data/vendor/depot_tools/third_party/oauth2client/anyjson.py +0 -32
  605. data/vendor/depot_tools/third_party/oauth2client/appengine.py +0 -963
  606. data/vendor/depot_tools/third_party/oauth2client/client.py +0 -1363
  607. data/vendor/depot_tools/third_party/oauth2client/clientsecrets.py +0 -153
  608. data/vendor/depot_tools/third_party/oauth2client/crypt.py +0 -377
  609. data/vendor/depot_tools/third_party/oauth2client/django_orm.py +0 -134
  610. data/vendor/depot_tools/third_party/oauth2client/file.py +0 -124
  611. data/vendor/depot_tools/third_party/oauth2client/gce.py +0 -90
  612. data/vendor/depot_tools/third_party/oauth2client/keyring_storage.py +0 -109
  613. data/vendor/depot_tools/third_party/oauth2client/locked_file.py +0 -373
  614. data/vendor/depot_tools/third_party/oauth2client/multistore_file.py +0 -465
  615. data/vendor/depot_tools/third_party/oauth2client/old_run.py +0 -160
  616. data/vendor/depot_tools/third_party/oauth2client/tools.py +0 -243
  617. data/vendor/depot_tools/third_party/oauth2client/util.py +0 -196
  618. data/vendor/depot_tools/third_party/oauth2client/xsrfutil.py +0 -113
  619. data/vendor/depot_tools/third_party/protobuf26/README.chromium +0 -23
  620. data/vendor/depot_tools/third_party/protobuf26/__init__.py +0 -0
  621. data/vendor/depot_tools/third_party/protobuf26/compiler/__init__.py +0 -0
  622. data/vendor/depot_tools/third_party/protobuf26/compiler/plugin_pb2.py +0 -184
  623. data/vendor/depot_tools/third_party/protobuf26/descriptor.py +0 -849
  624. data/vendor/depot_tools/third_party/protobuf26/descriptor_database.py +0 -137
  625. data/vendor/depot_tools/third_party/protobuf26/descriptor_pb2.py +0 -1522
  626. data/vendor/depot_tools/third_party/protobuf26/descriptor_pool.py +0 -643
  627. data/vendor/depot_tools/third_party/protobuf26/internal/__init__.py +0 -0
  628. data/vendor/depot_tools/third_party/protobuf26/internal/api_implementation.py +0 -89
  629. data/vendor/depot_tools/third_party/protobuf26/internal/containers.py +0 -269
  630. data/vendor/depot_tools/third_party/protobuf26/internal/cpp_message.py +0 -663
  631. data/vendor/depot_tools/third_party/protobuf26/internal/decoder.py +0 -831
  632. data/vendor/depot_tools/third_party/protobuf26/internal/encoder.py +0 -788
  633. data/vendor/depot_tools/third_party/protobuf26/internal/enum_type_wrapper.py +0 -89
  634. data/vendor/depot_tools/third_party/protobuf26/internal/message_listener.py +0 -78
  635. data/vendor/depot_tools/third_party/protobuf26/internal/python_message.py +0 -1247
  636. data/vendor/depot_tools/third_party/protobuf26/internal/type_checkers.py +0 -328
  637. data/vendor/depot_tools/third_party/protobuf26/internal/wire_format.py +0 -268
  638. data/vendor/depot_tools/third_party/protobuf26/message.py +0 -284
  639. data/vendor/depot_tools/third_party/protobuf26/message_factory.py +0 -155
  640. data/vendor/depot_tools/third_party/protobuf26/reflection.py +0 -205
  641. data/vendor/depot_tools/third_party/protobuf26/service.py +0 -226
  642. data/vendor/depot_tools/third_party/protobuf26/service_reflection.py +0 -284
  643. data/vendor/depot_tools/third_party/protobuf26/symbol_database.py +0 -185
  644. data/vendor/depot_tools/third_party/protobuf26/text_encoding.py +0 -110
  645. data/vendor/depot_tools/third_party/protobuf26/text_format.py +0 -873
  646. data/vendor/depot_tools/third_party/pylint.py +0 -37
  647. data/vendor/depot_tools/third_party/pylint/LICENSE.txt +0 -340
  648. data/vendor/depot_tools/third_party/pylint/README.chromium +0 -30
  649. data/vendor/depot_tools/third_party/pylint/__init__.py +0 -46
  650. data/vendor/depot_tools/third_party/pylint/__main__.py +0 -3
  651. data/vendor/depot_tools/third_party/pylint/__pkginfo__.py +0 -80
  652. data/vendor/depot_tools/third_party/pylint/checkers/__init__.py +0 -123
  653. data/vendor/depot_tools/third_party/pylint/checkers/async.py +0 -82
  654. data/vendor/depot_tools/third_party/pylint/checkers/base.py +0 -2010
  655. data/vendor/depot_tools/third_party/pylint/checkers/classes.py +0 -1120
  656. data/vendor/depot_tools/third_party/pylint/checkers/design_analysis.py +0 -348
  657. data/vendor/depot_tools/third_party/pylint/checkers/exceptions.py +0 -369
  658. data/vendor/depot_tools/third_party/pylint/checkers/format.py +0 -993
  659. data/vendor/depot_tools/third_party/pylint/checkers/imports.py +0 -654
  660. data/vendor/depot_tools/third_party/pylint/checkers/logging.py +0 -258
  661. data/vendor/depot_tools/third_party/pylint/checkers/misc.py +0 -105
  662. data/vendor/depot_tools/third_party/pylint/checkers/newstyle.py +0 -169
  663. data/vendor/depot_tools/third_party/pylint/checkers/python3.py +0 -591
  664. data/vendor/depot_tools/third_party/pylint/checkers/raw_metrics.py +0 -129
  665. data/vendor/depot_tools/third_party/pylint/checkers/similar.py +0 -371
  666. data/vendor/depot_tools/third_party/pylint/checkers/spelling.py +0 -264
  667. data/vendor/depot_tools/third_party/pylint/checkers/stdlib.py +0 -280
  668. data/vendor/depot_tools/third_party/pylint/checkers/strings.py +0 -618
  669. data/vendor/depot_tools/third_party/pylint/checkers/typecheck.py +0 -974
  670. data/vendor/depot_tools/third_party/pylint/checkers/utils.py +0 -741
  671. data/vendor/depot_tools/third_party/pylint/checkers/variables.py +0 -1191
  672. data/vendor/depot_tools/third_party/pylint/config.py +0 -820
  673. data/vendor/depot_tools/third_party/pylint/epylint.py +0 -181
  674. data/vendor/depot_tools/third_party/pylint/extensions/__init__.py +0 -0
  675. data/vendor/depot_tools/third_party/pylint/extensions/check_docs.py +0 -311
  676. data/vendor/depot_tools/third_party/pylint/extensions/check_elif.py +0 -62
  677. data/vendor/depot_tools/third_party/pylint/graph.py +0 -179
  678. data/vendor/depot_tools/third_party/pylint/gui.py +0 -531
  679. data/vendor/depot_tools/third_party/pylint/interfaces.py +0 -102
  680. data/vendor/depot_tools/third_party/pylint/lint.py +0 -1381
  681. data/vendor/depot_tools/third_party/pylint/pyreverse/__init__.py +0 -5
  682. data/vendor/depot_tools/third_party/pylint/pyreverse/diadefslib.py +0 -230
  683. data/vendor/depot_tools/third_party/pylint/pyreverse/diagrams.py +0 -258
  684. data/vendor/depot_tools/third_party/pylint/pyreverse/inspector.py +0 -372
  685. data/vendor/depot_tools/third_party/pylint/pyreverse/main.py +0 -147
  686. data/vendor/depot_tools/third_party/pylint/pyreverse/utils.py +0 -210
  687. data/vendor/depot_tools/third_party/pylint/pyreverse/vcgutils.py +0 -198
  688. data/vendor/depot_tools/third_party/pylint/pyreverse/writer.py +0 -198
  689. data/vendor/depot_tools/third_party/pylint/reporters/__init__.py +0 -149
  690. data/vendor/depot_tools/third_party/pylint/reporters/guireporter.py +0 -27
  691. data/vendor/depot_tools/third_party/pylint/reporters/html.py +0 -108
  692. data/vendor/depot_tools/third_party/pylint/reporters/json.py +0 -64
  693. data/vendor/depot_tools/third_party/pylint/reporters/text.py +0 -237
  694. data/vendor/depot_tools/third_party/pylint/reporters/ureports/__init__.py +0 -106
  695. data/vendor/depot_tools/third_party/pylint/reporters/ureports/html_writer.py +0 -93
  696. data/vendor/depot_tools/third_party/pylint/reporters/ureports/nodes.py +0 -181
  697. data/vendor/depot_tools/third_party/pylint/reporters/ureports/text_writer.py +0 -99
  698. data/vendor/depot_tools/third_party/pylint/testutils.py +0 -414
  699. data/vendor/depot_tools/third_party/pylint/utils.py +0 -1148
  700. data/vendor/depot_tools/third_party/pymox/COPYING +0 -202
  701. data/vendor/depot_tools/third_party/pymox/MANIFEST.in +0 -5
  702. data/vendor/depot_tools/third_party/pymox/README +0 -56
  703. data/vendor/depot_tools/third_party/pymox/__init__.py +0 -0
  704. data/vendor/depot_tools/third_party/pymox/mox.py +0 -1643
  705. data/vendor/depot_tools/third_party/pymox/mox_test.py +0 -1708
  706. data/vendor/depot_tools/third_party/pymox/mox_test_helper.py +0 -76
  707. data/vendor/depot_tools/third_party/pymox/setup.py +0 -14
  708. data/vendor/depot_tools/third_party/pymox/stubout.py +0 -142
  709. data/vendor/depot_tools/third_party/pymox/stubout_test.py +0 -47
  710. data/vendor/depot_tools/third_party/pymox/stubout_testee.py +0 -2
  711. data/vendor/depot_tools/third_party/simplejson/LICENSE.txt +0 -19
  712. data/vendor/depot_tools/third_party/simplejson/PKG-INFO +0 -29
  713. data/vendor/depot_tools/third_party/simplejson/__init__.py +0 -437
  714. data/vendor/depot_tools/third_party/simplejson/decoder.py +0 -421
  715. data/vendor/depot_tools/third_party/simplejson/encoder.py +0 -501
  716. data/vendor/depot_tools/third_party/simplejson/ordered_dict.py +0 -119
  717. data/vendor/depot_tools/third_party/simplejson/scanner.py +0 -77
  718. data/vendor/depot_tools/third_party/simplejson/tool.py +0 -39
  719. data/vendor/depot_tools/third_party/upload.py +0 -2565
@@ -17,7 +17,14 @@
17
17
  "--revision",
18
18
  "depot_tools@HEAD"
19
19
  ],
20
- "env_prefixes": {
20
+ "env": {
21
+ "GIT_HTTP_LOW_SPEED_LIMIT": "102400",
22
+ "GIT_HTTP_LOW_SPEED_TIME": "300"
23
+ },
24
+ "env_suffixes": {
25
+ "DEPOT_TOOLS_UPDATE": [
26
+ "0"
27
+ ],
21
28
  "PATH": [
22
29
  "RECIPE_REPO[depot_tools]"
23
30
  ]
@@ -64,7 +71,7 @@
64
71
  },
65
72
  {
66
73
  "cmd": [
67
- "python",
74
+ "vpython",
68
75
  "-u",
69
76
  "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
70
77
  "--json-output",
@@ -74,7 +81,6 @@
74
81
  ],
75
82
  "infra_step": true,
76
83
  "name": "listdir fetch_configs",
77
- "stdout": "/path/to/tmp/",
78
84
  "~followup_annotations": [
79
85
  "@@@STEP_LOG_LINE@listdir@[START_DIR]/depot_tools/fetch_configs/depot_tools.py@@@",
80
86
  "@@@STEP_LOG_LINE@listdir@[START_DIR]/depot_tools/fetch_configs/infra.py@@@",
@@ -102,7 +108,7 @@
102
108
  },
103
109
  {
104
110
  "cmd": [
105
- "python",
111
+ "vpython",
106
112
  "-u",
107
113
  "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
108
114
  "--json-output",
@@ -143,7 +149,7 @@
143
149
  },
144
150
  {
145
151
  "cmd": [
146
- "python",
152
+ "vpython",
147
153
  "-u",
148
154
  "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
149
155
  "--json-output",
@@ -164,7 +170,6 @@
164
170
  "name": "cleanup (2)"
165
171
  },
166
172
  {
167
- "jsonResult": null,
168
173
  "name": "$result"
169
174
  }
170
175
  ]
@@ -1,14 +1,7 @@
1
1
  #!/usr/bin/env python
2
-
3
- # repo default configuration
2
+ # -*- coding:utf-8 -*-
4
3
  #
5
- import os
6
- REPO_URL = os.environ.get('REPO_URL', None)
7
- if not REPO_URL:
8
- REPO_URL = 'https://chromium.googlesource.com/external/repo'
9
- REPO_REV = 'stable'
10
-
11
- # Copyright (C) 2008 Google Inc.
4
+ # Copyright (C) 2008 The Android Open Source Project
12
5
  #
13
6
  # Licensed under the Apache License, Version 2.0 (the "License");
14
7
  # you may not use this file except in compliance with the License.
@@ -22,11 +15,128 @@ REPO_REV = 'stable'
22
15
  # See the License for the specific language governing permissions and
23
16
  # limitations under the License.
24
17
 
18
+ """Repo launcher.
19
+
20
+ This is a standalone tool that people may copy to anywhere in their system.
21
+ It is used to get an initial repo client checkout, and after that it runs the
22
+ copy of repo in the checkout.
23
+ """
24
+
25
+ from __future__ import print_function
26
+
27
+ import datetime
28
+ import os
29
+ import platform
30
+ import shlex
31
+ import subprocess
32
+ import sys
33
+
34
+
35
+ # Keep basic logic in sync with repo_trace.py.
36
+ class Trace(object):
37
+ """Trace helper logic."""
38
+
39
+ REPO_TRACE = 'REPO_TRACE'
40
+
41
+ def __init__(self):
42
+ self.set(os.environ.get(self.REPO_TRACE) == '1')
43
+
44
+ def set(self, value):
45
+ self.enabled = bool(value)
46
+
47
+ def print(self, *args, **kwargs):
48
+ if self.enabled:
49
+ print(*args, **kwargs)
50
+
51
+
52
+ trace = Trace()
53
+
54
+
55
+ def exec_command(cmd):
56
+ """Execute |cmd| or return None on failure."""
57
+ trace.print(':', ' '.join(cmd))
58
+ try:
59
+ if platform.system() == 'Windows':
60
+ ret = subprocess.call(cmd)
61
+ sys.exit(ret)
62
+ else:
63
+ os.execvp(cmd[0], cmd)
64
+ except Exception:
65
+ pass
66
+
67
+
68
+ def check_python_version():
69
+ """Make sure the active Python version is recent enough."""
70
+ def reexec(prog):
71
+ exec_command([prog] + sys.argv)
72
+
73
+ MIN_PYTHON_VERSION = (3, 6)
74
+
75
+ ver = sys.version_info
76
+ major = ver.major
77
+ minor = ver.minor
78
+
79
+ # Abort on very old Python 2 versions.
80
+ if (major, minor) < (2, 7):
81
+ print('repo: error: Your Python version is too old. '
82
+ 'Please use Python {}.{} or newer instead.'.format(
83
+ *MIN_PYTHON_VERSION), file=sys.stderr)
84
+ sys.exit(1)
85
+
86
+ # Try to re-exec the version specific Python 3 if needed.
87
+ if (major, minor) < MIN_PYTHON_VERSION:
88
+ # Python makes releases ~once a year, so try our min version +10 to help
89
+ # bridge the gap. This is the fallback anyways so perf isn't critical.
90
+ min_major, min_minor = MIN_PYTHON_VERSION
91
+ for inc in range(0, 10):
92
+ reexec('python{}.{}'.format(min_major, min_minor + inc))
93
+
94
+ # Try the generic Python 3 wrapper, but only if it's new enough. We don't
95
+ # want to go from (still supported) Python 2.7 to (unsupported) Python 3.5.
96
+ try:
97
+ proc = subprocess.Popen(
98
+ ['python3', '-c', 'import sys; '
99
+ 'print(sys.version_info.major, sys.version_info.minor)'],
100
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE)
101
+ (output, _) = proc.communicate()
102
+ python3_ver = tuple(int(x) for x in output.decode('utf-8').split())
103
+ except (OSError, subprocess.CalledProcessError):
104
+ python3_ver = None
105
+
106
+ # The python3 version looks like it's new enough, so give it a try.
107
+ if python3_ver and python3_ver >= MIN_PYTHON_VERSION:
108
+ reexec('python3')
109
+
110
+ # We're still here, so diagnose things for the user.
111
+ if major < 3:
112
+ print('repo: warning: Python 2 is no longer supported; '
113
+ 'Please upgrade to Python {}.{}+.'.format(*MIN_PYTHON_VERSION),
114
+ file=sys.stderr)
115
+ else:
116
+ print('repo: error: Python 3 version is too old; '
117
+ 'Please use Python {}.{} or newer.'.format(*MIN_PYTHON_VERSION),
118
+ file=sys.stderr)
119
+ sys.exit(1)
120
+
121
+
122
+ if __name__ == '__main__':
123
+ check_python_version()
124
+
125
+
126
+ # repo default configuration
127
+ #
128
+ REPO_URL = os.environ.get('REPO_URL', None)
129
+ if not REPO_URL:
130
+ REPO_URL = 'https://chromium.googlesource.com/external/repo'
131
+ REPO_REV = os.environ.get('REPO_REV')
132
+ if not REPO_REV:
133
+ REPO_REV = 'stable'
134
+
25
135
  # increment this whenever we make important changes to this script
26
- VERSION = (1, 25)
136
+ VERSION = (2, 8)
27
137
 
28
138
  # increment this if the MAINTAINER_KEYS block is modified
29
- KEYRING_VERSION = (1, 5)
139
+ KEYRING_VERSION = (2, 3)
30
140
 
31
141
  # Each individual key entry is created by using:
32
142
  # gpg --armor --export keyid
@@ -34,7 +144,6 @@ MAINTAINER_KEYS = """
34
144
 
35
145
  Repo Maintainer <repo@android.kernel.org>
36
146
  -----BEGIN PGP PUBLIC KEY BLOCK-----
37
- Version: GnuPG v1.4.2.2 (GNU/Linux)
38
147
 
39
148
  mQGiBEj3ugERBACrLJh/ZPyVSKeClMuznFIrsQ+hpNnmJGw1a9GXKYKk8qHPhAZf
40
149
  WKtrBqAVMNRLhL85oSlekRz98u41H5si5zcuv+IXJDF5MJYcB8f22wAy15lUqPWi
@@ -70,189 +179,63 @@ p3v5ILwfC7hVx4jHSnOgZ65L9s8EQdVr1ckN9243yta7rNgwfcqb60ILMFF1BRk/
70
179
  5xGrFy8tfAaeBMIQ17gvFSp/suc9DYO0ICK2BISzq+F+ZiAKsjMYOBNdH/h0zobQ
71
180
  HTHs37+/QLMomGEGKZMWi0dShU2J5mNRQu3Hhxl3hHDVbt5CeJBb26aQcQrFz69W
72
181
  zE3GNvmJosh6leayjtI9P2A6iEkEGBECAAkFAkj3uiACGwwACgkQFlMNXpIPXGWp
73
- TACbBS+Up3RpfYVfd63c1cDdlru13pQAn3NQy/SN858MkxN+zym86UBgOad2
74
- =CMiZ
75
- -----END PGP PUBLIC KEY BLOCK-----
76
-
77
- Conley Owens <cco3@android.com>
78
- -----BEGIN PGP PUBLIC KEY BLOCK-----
79
- Version: GnuPG v1.4.11 (GNU/Linux)
80
-
81
- mQENBFHRvc8BCADFg45Xx/y6QDC+T7Y/gGc7vx0ww7qfOwIKlAZ9xG3qKunMxo+S
82
- hPCnzEl3cq+6I1Ww/ndop/HB3N3toPXRCoN8Vs4/Hc7by+SnaLFnacrm+tV5/OgT
83
- V37Lzt8lhay1Kl+YfpFwHYYpIEBLFV9knyfRXS/428W2qhdzYfvB15/AasRmwmor
84
- py4NIzSs8UD/SPr1ihqNCdZM76+MQyN5HMYXW/ALZXUFG0pwluHFA7hrfPG74i8C
85
- zMiP7qvMWIl/r/jtzHioH1dRKgbod+LZsrDJ8mBaqsZaDmNJMhss9g76XvfMyLra
86
- 9DI9/iFuBpGzeqBv0hwOGQspLRrEoyTeR6n1ABEBAAG0H0NvbmxleSBPd2VucyA8
87
- Y2NvM0BhbmRyb2lkLmNvbT6JATgEEwECACIFAlHRvc8CGwMGCwkIBwMCBhUIAgkK
88
- CwQWAgMBAh4BAheAAAoJEGe35EhpKzgsP6AIAJKJmNtn4l7hkYHKHFSo3egb6RjQ
89
- zEIP3MFTcu8HFX1kF1ZFbrp7xqurLaE53kEkKuAAvjJDAgI8mcZHP1JyplubqjQA
90
- xvv84gK+OGP3Xk+QK1ZjUQSbjOpjEiSZpRhWcHci3dgOUH4blJfByHw25hlgHowd
91
- a/2PrNKZVcJ92YienaxxGjcXEUcd0uYEG2+rwllQigFcnMFDhr9B71MfalRHjFKE
92
- fmdoypqLrri61YBc59P88Rw2/WUpTQjgNubSqa3A2+CKdaRyaRw+2fdF4TdR0h8W
93
- zbg+lbaPtJHsV+3mJC7fq26MiJDRJa5ZztpMn8su20gbLgi2ShBOaHAYDDi5AQ0E
94
- UdG9zwEIAMoOBq+QLNozAhxOOl5GL3StTStGRgPRXINfmViTsihrqGCWBBUfXlUE
95
- OytC0mYcrDUQev/8ToVoyqw+iGSwDkcSXkrEUCKFtHV/GECWtk1keyHgR10YKI1R
96
- mquSXoubWGqPeG1PAI74XWaRx8UrL8uCXUtmD8Q5J7mDjKR5NpxaXrwlA0bKsf2E
97
- Gp9tu1kKauuToZhWHMRMqYSOGikQJwWSFYKT1KdNcOXLQF6+bfoJ6sjVYdwfmNQL
98
- Ixn8QVhoTDedcqClSWB17VDEFDFa7MmqXZz2qtM3X1R/MUMHqPtegQzBGNhRdnI2
99
- V45+1Nnx/uuCxDbeI4RbHzujnxDiq70AEQEAAYkBHwQYAQIACQUCUdG9zwIbDAAK
100
- CRBnt+RIaSs4LNVeB/0Y2pZ8I7gAAcEM0Xw8drr4omg2fUoK1J33ozlA/RxeA/lJ
101
- I3KnyCDTpXuIeBKPGkdL8uMATC9Z8DnBBajRlftNDVZS3Hz4G09G9QpMojvJkFJV
102
- By+01Flw/X+eeN8NpqSuLV4W+AjEO8at/VvgKr1AFvBRdZ7GkpI1o6DgPe7ZqX+1
103
- dzQZt3e13W0rVBb/bUgx9iSLoeWP3aq/k+/GRGOR+S6F6BBSl0SQ2EF2+dIywb1x
104
- JuinEP+AwLAUZ1Bsx9ISC0Agpk2VeHXPL3FGhroEmoMvBzO0kTFGyoeT7PR/BfKv
105
- +H/g3HsL2LOB9uoIm8/5p2TTU5ttYCXMHhQZ81AY
106
- =AUp4
107
- -----END PGP PUBLIC KEY BLOCK-----
108
-
109
- Stefan Zager <szager@chromium.org>
110
- -----BEGIN PGP PUBLIC KEY BLOCK-----
111
- Version: GnuPG v1.4.11 (GNU/Linux)
112
-
113
- mQINBFIJOcgBEADwZIq4GRGoO1RJFKlrtVK501cwT5H+Acbizc9N5RxTkFmqxDjb
114
- 9ApUaPW6S1b8+nrzE9P1Ri5erfzipuStfaZ/Wl3mP1JjKulibddmgnPOEbAJ673k
115
- Vj85RUO4rt2oZAHnZN3D3gFJzVY8JVlZ47Enj9fTqzcW78FVsPCpIT9P2LpTLWeE
116
- jX9Cjxeimy6VvyJstIcDLYhlpUN5UWen79L4LFAkHf3luLuU4W3p9NriqUsy5UG2
117
- 8vO6QdhKrCr5wsjDFFeVnpMtjlSeZJAWH+XhFFibMX1xP5R9BTuJfzw3kOVKvcE0
118
- e9ClxgoulepXPv2xnDkqO3pG2gQVzl8LA+Aol8/IXfa7KP5FBkxK/g1cDuDtXRk4
119
- YLpLaLYeeKEhhOHLpsKYkK2DXTIcN+56UnTLGolummpZnCM8UUSZxQgbkFgk4YJL
120
- Elip0hgLZzqEl5h9vjmnQp89AZIHKcgNmzn+szLTOR9x24joaLyQ534x8OSC8lmu
121
- tJv2tQjDOVGWVwvY4gOTpyxCWMwur6WOiMk/TPWdiVRFWAGrAHwf0/CTBEqNhosh
122
- sVXfPeMADBA0PorDbJ6kwcOkLUTGf8CT7OG1R9TuKPEmSjK7BYu/pT4DXitaRCiv
123
- uPVlwbVFpLFr0/jwaKJVMLUjL5MaYwzjJqI2c4RdROZhpMhkn4LvCMmFSQARAQAB
124
- tCJTdGVmYW4gWmFnZXIgPHN6YWdlckBjaHJvbWl1bS5vcmc+iQI4BBMBAgAiBQJS
125
- CTnIAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRDcuoHPGCdZNU0UD/9y
126
- 0zwwOJH2UGPAzZ0YVzr7p0HtKedoxuFvPkdQxlBIaUOueMzFRmNQu3GI9irAu3MQ
127
- Jkip8/gi7dnLVmJyS/zWARBaRGwSVd1++87XDjw8n7l181p7394X0Agq/heri599
128
- YheHXkxXKVMPqByWNEPHu4eDbxeJTaDIjcKC2pzKQkm6HbWgW4wA9gCh1TRki8FP
129
- LMv1Fu/dr13STCR9P2evsTRZ+ZSJhTSboHNHeEAJGiGZQAsN94oht7647lYj+AyR
130
- ThzyHDMXXiDr8jPJIkyRilY+y82bCOatOfPoCkce3VI+LRUGJ19hJY01m4RRneIE
131
- 55l7fXR3zggcsONjV5b+oLcGQPGgX9w64BJ7khT7Wb9+kuyrdJBIBzJsaACFEbri
132
- pPi02FS/HahYpLC3J66REAeNyofgVXau6WQsHrHMGsBTL9aAr0nrCrkF4Nyyc2Jd
133
- do6nYuljuUhORqbEECmmBM2eBtkL6Ac92D6WMBIwBOC5tCNHO2YFIvi8Y8EuE8sc
134
- 1zB5U5Ai4SIu2icRAhzAhCRaUq02cMWuELKH6Vuh9nzgEefFWty6vPbKEyZLu19D
135
- B80aqP1cTN88FjtKQ/eTF29TUB6AefUeBS17e2e3WUMy4nc8tduuOFYfiHP40ScP
136
- wOoatwfzpiTIPGbocUEPL+pS0O/Xy8SINxFMCud3zA==
137
- =Vd2S
138
- -----END PGP PUBLIC KEY BLOCK-----
139
-
140
- David James <davidjames@google.com>
141
- -----BEGIN PGP PUBLIC KEY BLOCK-----
142
- Version: GnuPG v1
143
-
144
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- XRAytpjxTIHTtMWp1c7vpi1BMiKF0XRSa8iizbVgZIk6i/jftK8tverRvOzQhUEK
158
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- R7oWoVIL70qhCr4hdJ4yVtqajkUr5jk+IV9L2pny6zt3+3e/132O6yzQ/1NJ1vj9
167
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- TB2LcbFheTu6Q/sxDSC5slovFSgyDp8wNkDf88+fxV38LC00IeWz7a9EGPzLzA+D
181
- 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
- 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
- a7HWaB7f0eXg5M5GTr7KP6TTGwY/500cI4fDme6bih/jXDS4vV53b1HHgvzQFXw/
184
- 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
- 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
- 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
- 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
- 4cAccd41XU/GmIs9zKkbORWubhfFndc7AXnPUU2otjqMQq0f+QCQrHPdyARf2QCm
189
- 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
190
- IM4=
191
- =6VNc
192
- -----END PGP PUBLIC KEY BLOCK-----
193
-
194
- Mike Frysinger <vapier@chromium.org>
195
- -----BEGIN PGP PUBLIC KEY BLOCK-----
196
- Version: GnuPG v1
197
-
198
- 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
- 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
- 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
- K9Uh3hrfsCKyaL9tJ0sJUl9uc+Yf2FENSCXaL670ymwC7KqJf/nShA4QjDSQlVZq
202
- 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
- xOr3/Pph7nvfIoK0yr3rgBvR/be6aP7wyd6+E/KFszbhrpyZfZsFRGn9LyUqVm3T
204
- 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
- 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
- gfohjqPnDGL15ztyedP3iGgb/7usPFI+k3cHgiMfvmqD2F+iJ7h69sSb2nn8dx8P
207
- EiycPnOc8mBDiTAH8eq6T6P29G9mqYr/wyC3Xj66+1WOApXmQS2I6P4qKOdnJdNF
208
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- zc5fmj8UfjD5F/Qab2s/UqqmX/fBL+8uaLNIqSo2929GjhvA6pQeo5EKieD1JVfc
219
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- pwBTNUTf9u1wyfm5VUXpW541oVmqAWWHTZh2HVeBW6F1YtsqItZXcNjt6HTL1Qou
228
- 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
- n9Sf5d2wH3L2SI53vhMouSB1UmhPhwNq7sFeTvYJ1juqmVdN+eQj5OxSvhOceAE8
230
- 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
- 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
- 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
233
- =i88c
182
+ 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
213
+ cZ7aFsJF4PtcDrfdejyAxbtsSHI=
214
+ =82Tj
234
215
  -----END PGP PUBLIC KEY BLOCK-----
235
216
  """
236
217
 
237
218
  GIT = 'git' # our git command
219
+ # NB: The version of git that the repo launcher requires may be much older than
220
+ # the version of git that the main repo source tree requires. Keeping this at
221
+ # an older version also makes it easier for users to upgrade/rollback as needed.
222
+ #
223
+ # git-1.7 is in (EOL) Ubuntu Precise.
238
224
  MIN_GIT_VERSION = (1, 7, 2) # minimum supported git version
239
225
  repodir = '.repo' # name of repo's private directory
240
226
  S_repo = 'repo' # special repo repository
241
227
  S_manifests = 'manifests' # special manifest repository
242
228
  REPO_MAIN = S_repo + '/main.py' # main script
243
- MIN_PYTHON_VERSION = (2, 7) # minimum supported python version
244
229
  GITC_CONFIG_FILE = '/gitc/.config'
245
230
  GITC_FS_ROOT_DIR = '/gitc/manifest-rw/'
246
231
 
247
232
 
233
+ import collections
248
234
  import errno
249
235
  import optparse
250
- import platform
251
236
  import re
252
237
  import shutil
253
238
  import stat
254
- import subprocess
255
- import sys
256
239
 
257
240
  if sys.version_info[0] == 3:
258
241
  import urllib.request
@@ -265,113 +248,175 @@ else:
265
248
  urllib.error = urllib2
266
249
 
267
250
 
268
- def _print(*objects, **kwargs):
269
- sep = kwargs.get('sep', ' ')
270
- end = kwargs.get('end', '\n')
271
- out = kwargs.get('file', sys.stdout)
272
- out.write(sep.join(objects) + end)
251
+ home_dot_repo = os.path.expanduser('~/.repoconfig')
252
+ gpg_dir = os.path.join(home_dot_repo, 'gnupg')
273
253
 
274
254
 
275
- # Python version check
276
- ver = sys.version_info
277
- if (ver[0], ver[1]) < MIN_PYTHON_VERSION:
278
- _print('error: Python version {} unsupported.\n'
279
- 'Please use Python {}.{} instead.'.format(
280
- sys.version.split(' ')[0],
281
- MIN_PYTHON_VERSION[0],
282
- MIN_PYTHON_VERSION[1],
283
- ), file=sys.stderr)
284
- sys.exit(1)
255
+ def GetParser(gitc_init=False):
256
+ """Setup the CLI parser."""
257
+ if gitc_init:
258
+ usage = 'repo gitc-init -u url -c client [options]'
259
+ else:
260
+ usage = 'repo init -u url [options]'
261
+
262
+ parser = optparse.OptionParser(usage=usage)
263
+
264
+ # Logging.
265
+ group = parser.add_option_group('Logging options')
266
+ group.add_option('-v', '--verbose',
267
+ dest='output_mode', action='store_true',
268
+ help='show all output')
269
+ group.add_option('-q', '--quiet',
270
+ dest='output_mode', action='store_false',
271
+ help='only show errors')
272
+
273
+ # Manifest.
274
+ group = parser.add_option_group('Manifest options')
275
+ group.add_option('-u', '--manifest-url',
276
+ help='manifest repository location', metavar='URL')
277
+ group.add_option('-b', '--manifest-branch',
278
+ help='manifest branch or revision', metavar='REVISION')
279
+ group.add_option('-m', '--manifest-name',
280
+ help='initial manifest file', metavar='NAME.xml')
281
+ cbr_opts = ['--current-branch']
282
+ # The gitc-init subcommand allocates -c itself, but a lot of init users
283
+ # want -c, so try to satisfy both as best we can.
284
+ if not gitc_init:
285
+ cbr_opts += ['-c']
286
+ group.add_option(*cbr_opts,
287
+ dest='current_branch_only', action='store_true',
288
+ help='fetch only current manifest branch from server')
289
+ group.add_option('--mirror', action='store_true',
290
+ help='create a replica of the remote repositories '
291
+ 'rather than a client working directory')
292
+ group.add_option('--reference',
293
+ help='location of mirror directory', metavar='DIR')
294
+ group.add_option('--dissociate', action='store_true',
295
+ help='dissociate from reference mirrors after clone')
296
+ group.add_option('--depth', type='int', default=None,
297
+ help='create a shallow clone with given depth; '
298
+ 'see git clone')
299
+ group.add_option('--partial-clone', action='store_true',
300
+ help='perform partial clone (https://git-scm.com/'
301
+ 'docs/gitrepository-layout#_code_partialclone_code)')
302
+ group.add_option('--clone-filter', action='store', default='blob:none',
303
+ help='filter for use with --partial-clone '
304
+ '[default: %default]')
305
+ group.add_option('--worktree', action='store_true',
306
+ help=optparse.SUPPRESS_HELP)
307
+ group.add_option('--archive', action='store_true',
308
+ help='checkout an archive instead of a git repository for '
309
+ 'each project. See git archive.')
310
+ group.add_option('--submodules', action='store_true',
311
+ help='sync any submodules associated with the manifest repo')
312
+ group.add_option('-g', '--groups', default='default',
313
+ help='restrict manifest projects to ones with specified '
314
+ 'group(s) [default|all|G1,G2,G3|G4,-G5,-G6]',
315
+ metavar='GROUP')
316
+ group.add_option('-p', '--platform', default='auto',
317
+ help='restrict manifest projects to ones with a specified '
318
+ 'platform group [auto|all|none|linux|darwin|...]',
319
+ metavar='PLATFORM')
320
+ group.add_option('--clone-bundle', action='store_true',
321
+ help='enable use of /clone.bundle on HTTP/HTTPS (default if not --partial-clone)')
322
+ group.add_option('--no-clone-bundle',
323
+ dest='clone_bundle', action='store_false',
324
+ help='disable use of /clone.bundle on HTTP/HTTPS (default if --partial-clone)')
325
+ group.add_option('--no-tags',
326
+ dest='tags', default=True, action='store_false',
327
+ help="don't fetch tags in the manifest")
328
+
329
+ # Tool.
330
+ group = parser.add_option_group('repo Version options')
331
+ group.add_option('--repo-url', metavar='URL',
332
+ help='repo repository location ($REPO_URL)')
333
+ group.add_option('--repo-rev', metavar='REV',
334
+ help='repo branch or revision ($REPO_REV)')
335
+ group.add_option('--repo-branch', dest='repo_rev',
336
+ help=optparse.SUPPRESS_HELP)
337
+ group.add_option('--no-repo-verify',
338
+ dest='repo_verify', default=True, action='store_false',
339
+ help='do not verify repo source code')
340
+
341
+ # Other.
342
+ group = parser.add_option_group('Other options')
343
+ group.add_option('--config-name',
344
+ action='store_true', default=False,
345
+ help='Always prompt for name/e-mail')
346
+
347
+ # gitc-init specific settings.
348
+ if gitc_init:
349
+ group = parser.add_option_group('GITC options')
350
+ group.add_option('-f', '--manifest-file',
351
+ help='Optional manifest file to use for this GITC client.')
352
+ group.add_option('-c', '--gitc-client',
353
+ help='Name of the gitc_client instance to create or modify.')
354
+
355
+ return parser
356
+
357
+
358
+ # This is a poor replacement for subprocess.run until we require Python 3.6+.
359
+ RunResult = collections.namedtuple(
360
+ 'RunResult', ('returncode', 'stdout', 'stderr'))
285
361
 
286
- home_dot_repo = os.path.expanduser('~/.repoconfig')
287
- gpg_dir = os.path.join(home_dot_repo, 'gnupg')
288
362
 
289
- extra_args = []
290
- init_optparse = optparse.OptionParser(usage="repo init -u url [options]")
291
-
292
- # Logging
293
- group = init_optparse.add_option_group('Logging options')
294
- group.add_option('-q', '--quiet',
295
- dest="quiet", action="store_true", default=False,
296
- help="be quiet")
297
-
298
- # Manifest
299
- group = init_optparse.add_option_group('Manifest options')
300
- group.add_option('-u', '--manifest-url',
301
- dest='manifest_url',
302
- help='manifest repository location', metavar='URL')
303
- group.add_option('-b', '--manifest-branch',
304
- dest='manifest_branch',
305
- help='manifest branch or revision', metavar='REVISION')
306
- group.add_option('-m', '--manifest-name',
307
- dest='manifest_name',
308
- help='initial manifest file', metavar='NAME.xml')
309
- group.add_option('--current-branch',
310
- dest='current_branch_only', action='store_true',
311
- help='fetch only current manifest branch from server')
312
- group.add_option('--mirror',
313
- dest='mirror', action='store_true',
314
- help='create a replica of the remote repositories '
315
- 'rather than a client working directory')
316
- group.add_option('--reference',
317
- dest='reference',
318
- help='location of mirror directory', metavar='DIR')
319
- group.add_option('--depth', type='int', default=None,
320
- dest='depth',
321
- help='create a shallow clone with given depth; see git clone')
322
- group.add_option('--archive',
323
- dest='archive', action='store_true',
324
- help='checkout an archive instead of a git repository for '
325
- 'each project. See git archive.')
326
- group.add_option('--submodules',
327
- dest='submodules', action='store_true',
328
- help='sync any submodules associated with the manifest repo')
329
- group.add_option('-g', '--groups',
330
- dest='groups', default='default',
331
- help='restrict manifest projects to ones with specified '
332
- 'group(s) [default|all|G1,G2,G3|G4,-G5,-G6]',
333
- metavar='GROUP')
334
- group.add_option('-p', '--platform',
335
- dest='platform', default="auto",
336
- help='restrict manifest projects to ones with a specified '
337
- 'platform group [auto|all|none|linux|darwin|...]',
338
- metavar='PLATFORM')
339
- group.add_option('--no-clone-bundle',
340
- dest='no_clone_bundle', action='store_true',
341
- help='disable use of /clone.bundle on HTTP/HTTPS')
342
- group.add_option('--no-tags',
343
- dest='no_tags', action='store_true',
344
- help="don't fetch tags in the manifest")
345
-
346
-
347
- # Tool
348
- group = init_optparse.add_option_group('repo Version options')
349
- group.add_option('--repo-url',
350
- dest='repo_url',
351
- help='repo repository location', metavar='URL')
352
- group.add_option('--repo-branch',
353
- dest='repo_branch',
354
- help='repo branch or revision', metavar='REVISION')
355
- group.add_option('--no-repo-verify',
356
- dest='no_repo_verify', action='store_true',
357
- help='do not verify repo source code')
358
-
359
- # Other
360
- group = init_optparse.add_option_group('Other options')
361
- group.add_option('--config-name',
362
- dest='config_name', action="store_true", default=False,
363
- help='Always prompt for name/e-mail')
364
-
365
-
366
- def _GitcInitOptions(init_optparse_arg):
367
- init_optparse_arg.set_usage("repo gitc-init -u url -c client [options]")
368
- g = init_optparse_arg.add_option_group('GITC options')
369
- g.add_option('-f', '--manifest-file',
370
- dest='manifest_file',
371
- help='Optional manifest file to use for this GITC client.')
372
- g.add_option('-c', '--gitc-client',
373
- dest='gitc_client',
374
- help='The name of the gitc_client instance to create or modify.')
363
+ class RunError(Exception):
364
+ """Error when running a command failed."""
365
+
366
+
367
+ def run_command(cmd, **kwargs):
368
+ """Run |cmd| and return its output."""
369
+ check = kwargs.pop('check', False)
370
+ if kwargs.pop('capture_output', False):
371
+ kwargs.setdefault('stdout', subprocess.PIPE)
372
+ kwargs.setdefault('stderr', subprocess.PIPE)
373
+ cmd_input = kwargs.pop('input', None)
374
+
375
+ def decode(output):
376
+ """Decode |output| to text."""
377
+ if output is None:
378
+ return output
379
+ try:
380
+ return output.decode('utf-8')
381
+ except UnicodeError:
382
+ print('repo: warning: Invalid UTF-8 output:\ncmd: %r\n%r' % (cmd, output),
383
+ file=sys.stderr)
384
+ # TODO(vapier): Once we require Python 3, use 'backslashreplace'.
385
+ return output.decode('utf-8', 'replace')
386
+
387
+ # Run & package the results.
388
+ proc = subprocess.Popen(cmd, **kwargs)
389
+ (stdout, stderr) = proc.communicate(input=cmd_input)
390
+ dbg = ': ' + ' '.join(cmd)
391
+ if cmd_input is not None:
392
+ dbg += ' 0<|'
393
+ if stdout == subprocess.PIPE:
394
+ dbg += ' 1>|'
395
+ if stderr == subprocess.PIPE:
396
+ dbg += ' 2>|'
397
+ elif stderr == subprocess.STDOUT:
398
+ dbg += ' 2>&1'
399
+ trace.print(dbg)
400
+ ret = RunResult(proc.returncode, decode(stdout), decode(stderr))
401
+
402
+ # If things failed, print useful debugging output.
403
+ if check and ret.returncode:
404
+ print('repo: error: "%s" failed with exit status %s' %
405
+ (cmd[0], ret.returncode), file=sys.stderr)
406
+ print(' cwd: %s\n cmd: %r' %
407
+ (kwargs.get('cwd', os.getcwd()), cmd), file=sys.stderr)
408
+
409
+ def _print_output(name, output):
410
+ if output:
411
+ print(' %s:\n >> %s' % (name, '\n >> '.join(output.splitlines())),
412
+ file=sys.stderr)
413
+
414
+ _print_output('stdout', ret.stdout)
415
+ _print_output('stderr', ret.stderr)
416
+ raise RunError(ret)
417
+
418
+ return ret
419
+
375
420
 
376
421
  _gitc_manifest_dir = None
377
422
 
@@ -420,44 +465,63 @@ class CloneFailure(Exception):
420
465
  """
421
466
 
422
467
 
468
+ def check_repo_verify(repo_verify, quiet=False):
469
+ """Check the --repo-verify state."""
470
+ if not repo_verify:
471
+ print('repo: warning: verification of repo code has been disabled;\n'
472
+ 'repo will not be able to verify the integrity of itself.\n',
473
+ file=sys.stderr)
474
+ return False
475
+
476
+ if NeedSetupGnuPG():
477
+ return SetupGnuPG(quiet)
478
+
479
+ return True
480
+
481
+
482
+ def check_repo_rev(dst, rev, repo_verify=True, quiet=False):
483
+ """Check that |rev| is valid."""
484
+ do_verify = check_repo_verify(repo_verify, quiet=quiet)
485
+ remote_ref, local_rev = resolve_repo_rev(dst, rev)
486
+ if not quiet and not remote_ref.startswith('refs/heads/'):
487
+ print('warning: repo is not tracking a remote branch, so it will not '
488
+ 'receive updates', file=sys.stderr)
489
+ if do_verify:
490
+ rev = verify_rev(dst, remote_ref, local_rev, quiet)
491
+ else:
492
+ rev = local_rev
493
+ return (remote_ref, rev)
494
+
495
+
423
496
  def _Init(args, gitc_init=False):
424
497
  """Installs repo by cloning it over the network.
425
498
  """
426
- if gitc_init:
427
- _GitcInitOptions(init_optparse)
428
- opt, args = init_optparse.parse_args(args)
499
+ parser = GetParser(gitc_init=gitc_init)
500
+ opt, args = parser.parse_args(args)
429
501
  if args:
430
- init_optparse.print_usage()
502
+ parser.print_usage()
431
503
  sys.exit(1)
504
+ opt.quiet = opt.output_mode is False
505
+ opt.verbose = opt.output_mode is True
432
506
 
433
- url = opt.repo_url
434
- if not url:
435
- url = REPO_URL
436
- extra_args.append('--repo-url=%s' % url)
507
+ if opt.clone_bundle is None:
508
+ opt.clone_bundle = False if opt.partial_clone else True
437
509
 
438
- branch = opt.repo_branch
439
- if not branch:
440
- branch = REPO_REV
441
- extra_args.append('--repo-branch=%s' % branch)
442
-
443
- if branch.startswith('refs/heads/'):
444
- branch = branch[len('refs/heads/'):]
445
- if branch.startswith('refs/'):
446
- _print("fatal: invalid branch name '%s'" % branch, file=sys.stderr)
447
- raise CloneFailure()
510
+ url = opt.repo_url or REPO_URL
511
+ rev = opt.repo_rev or REPO_REV
448
512
 
449
513
  try:
450
514
  if gitc_init:
451
515
  gitc_manifest_dir = get_gitc_manifest_dir()
452
516
  if not gitc_manifest_dir:
453
- _print('fatal: GITC filesystem is not available. Exiting...',
454
- file=sys.stderr)
517
+ print('fatal: GITC filesystem is not available. Exiting...',
518
+ file=sys.stderr)
455
519
  sys.exit(1)
456
520
  gitc_client = opt.gitc_client
457
521
  if not gitc_client:
458
522
  gitc_client = gitc_parse_clientdir(os.getcwd())
459
523
  if not gitc_client:
460
- _print('fatal: GITC client (-c) is required.', file=sys.stderr)
524
+ print('fatal: GITC client (-c) is required.', file=sys.stderr)
461
525
  sys.exit(1)
462
526
  client_dir = os.path.join(gitc_manifest_dir, gitc_client)
463
527
  if not os.path.exists(client_dir):
@@ -470,8 +534,8 @@ def _Init(args, gitc_init=False):
470
534
  os.mkdir(repodir)
471
535
  except OSError as e:
472
536
  if e.errno != errno.EEXIST:
473
- _print('fatal: cannot make %s directory: %s'
474
- % (repodir, e.strerror), file=sys.stderr)
537
+ print('fatal: cannot make %s directory: %s'
538
+ % (repodir, e.strerror), file=sys.stderr)
475
539
  # Don't raise CloneFailure; that would delete the
476
540
  # name. Instead exit immediately.
477
541
  #
@@ -479,73 +543,115 @@ def _Init(args, gitc_init=False):
479
543
 
480
544
  _CheckGitVersion()
481
545
  try:
482
- if NeedSetupGnuPG():
483
- can_verify = SetupGnuPG(opt.quiet)
484
- else:
485
- can_verify = True
486
-
546
+ if not opt.quiet:
547
+ print('Downloading Repo source from', url)
487
548
  dst = os.path.abspath(os.path.join(repodir, S_repo))
488
- _Clone(url, dst, opt.quiet, not opt.no_clone_bundle)
549
+ _Clone(url, dst, opt.clone_bundle, opt.quiet, opt.verbose)
489
550
 
490
- if not os.path.isfile('%s/repo' % dst):
491
- _print("warning: '%s' does not look like a git-repo repository, is "
492
- "REPO_URL set correctly?" % url, file=sys.stderr)
551
+ remote_ref, rev = check_repo_rev(dst, rev, opt.repo_verify, quiet=opt.quiet)
552
+ _Checkout(dst, remote_ref, rev, opt.quiet)
493
553
 
494
- if can_verify and not opt.no_repo_verify:
495
- rev = _Verify(dst, branch, opt.quiet)
496
- else:
497
- rev = 'refs/remotes/origin/%s^0' % branch
554
+ if not os.path.isfile(os.path.join(dst, 'repo')):
555
+ print("warning: '%s' does not look like a git-repo repository, is "
556
+ "REPO_URL set correctly?" % url, file=sys.stderr)
498
557
 
499
- _Checkout(dst, branch, rev, opt.quiet)
500
558
  except CloneFailure:
501
559
  if opt.quiet:
502
- _print('fatal: repo init failed; run without --quiet to see why',
503
- file=sys.stderr)
560
+ print('fatal: repo init failed; run without --quiet to see why',
561
+ file=sys.stderr)
504
562
  raise
505
563
 
506
564
 
507
- def ParseGitVersion(ver_str):
565
+ def run_git(*args, **kwargs):
566
+ """Run git and return execution details."""
567
+ kwargs.setdefault('capture_output', True)
568
+ kwargs.setdefault('check', True)
569
+ try:
570
+ return run_command([GIT] + list(args), **kwargs)
571
+ except OSError as e:
572
+ print(file=sys.stderr)
573
+ print('repo: error: "%s" is not available' % GIT, file=sys.stderr)
574
+ print('repo: error: %s' % e, file=sys.stderr)
575
+ print(file=sys.stderr)
576
+ print('Please make sure %s is installed and in your path.' % GIT,
577
+ file=sys.stderr)
578
+ sys.exit(1)
579
+ except RunError:
580
+ raise CloneFailure()
581
+
582
+
583
+ # The git version info broken down into components for easy analysis.
584
+ # Similar to Python's sys.version_info.
585
+ GitVersion = collections.namedtuple(
586
+ 'GitVersion', ('major', 'minor', 'micro', 'full'))
587
+
588
+
589
+ def ParseGitVersion(ver_str=None):
590
+ if ver_str is None:
591
+ # Load the version ourselves.
592
+ ver_str = run_git('--version').stdout
593
+
508
594
  if not ver_str.startswith('git version '):
509
595
  return None
510
596
 
511
- num_ver_str = ver_str[len('git version '):].strip().split('-')[0]
597
+ full_version = ver_str[len('git version '):].strip()
598
+ num_ver_str = full_version.split('-')[0]
512
599
  to_tuple = []
513
600
  for num_str in num_ver_str.split('.')[:3]:
514
601
  if num_str.isdigit():
515
602
  to_tuple.append(int(num_str))
516
603
  else:
517
604
  to_tuple.append(0)
518
- return tuple(to_tuple)
605
+ to_tuple.append(full_version)
606
+ return GitVersion(*to_tuple)
519
607
 
520
608
 
521
609
  def _CheckGitVersion():
522
- cmd = [GIT, '--version']
523
- try:
524
- proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
525
- except OSError as e:
526
- _print(file=sys.stderr)
527
- _print("fatal: '%s' is not available" % GIT, file=sys.stderr)
528
- _print('fatal: %s' % e, file=sys.stderr)
529
- _print(file=sys.stderr)
530
- _print('Please make sure %s is installed and in your path.' % GIT,
531
- file=sys.stderr)
532
- raise CloneFailure()
533
-
534
- ver_str = proc.stdout.read().strip()
535
- proc.stdout.close()
536
- proc.wait()
537
-
538
- ver_act = ParseGitVersion(ver_str)
610
+ ver_act = ParseGitVersion()
539
611
  if ver_act is None:
540
- _print('error: "%s" unsupported' % ver_str, file=sys.stderr)
612
+ print('fatal: unable to detect git version', file=sys.stderr)
541
613
  raise CloneFailure()
542
614
 
543
615
  if ver_act < MIN_GIT_VERSION:
544
616
  need = '.'.join(map(str, MIN_GIT_VERSION))
545
- _print('fatal: git %s or later required' % need, file=sys.stderr)
617
+ print('fatal: git %s or later required; found %s' % (need, ver_act.full),
618
+ file=sys.stderr)
546
619
  raise CloneFailure()
547
620
 
548
621
 
622
+ def SetGitTrace2ParentSid(env=None):
623
+ """Set up GIT_TRACE2_PARENT_SID for git tracing."""
624
+ # We roughly follow the format git itself uses in trace2/tr2_sid.c.
625
+ # (1) Be unique (2) be valid filename (3) be fixed length.
626
+ #
627
+ # Since we always export this variable, we try to avoid more expensive calls.
628
+ # e.g. We don't attempt hostname lookups or hashing the results.
629
+ if env is None:
630
+ env = os.environ
631
+
632
+ KEY = 'GIT_TRACE2_PARENT_SID'
633
+
634
+ now = datetime.datetime.utcnow()
635
+ value = 'repo-%s-P%08x' % (now.strftime('%Y%m%dT%H%M%SZ'), os.getpid())
636
+
637
+ # If it's already set, then append ourselves.
638
+ if KEY in env:
639
+ value = env[KEY] + '/' + value
640
+
641
+ _setenv(KEY, value, env=env)
642
+
643
+
644
+ def _setenv(key, value, env=None):
645
+ """Set |key| in the OS environment |env| to |value|."""
646
+ if env is None:
647
+ env = os.environ
648
+ # Environment handling across systems is messy.
649
+ try:
650
+ env[key] = value
651
+ except UnicodeEncodeError:
652
+ env[key] = value.encode()
653
+
654
+
549
655
  def NeedSetupGnuPG():
550
656
  if not os.path.isdir(home_dot_repo):
551
657
  return True
@@ -569,56 +675,66 @@ def SetupGnuPG(quiet):
569
675
  os.mkdir(home_dot_repo)
570
676
  except OSError as e:
571
677
  if e.errno != errno.EEXIST:
572
- _print('fatal: cannot make %s directory: %s'
573
- % (home_dot_repo, e.strerror), file=sys.stderr)
678
+ print('fatal: cannot make %s directory: %s'
679
+ % (home_dot_repo, e.strerror), file=sys.stderr)
574
680
  sys.exit(1)
575
681
 
576
682
  try:
577
683
  os.mkdir(gpg_dir, stat.S_IRWXU)
578
684
  except OSError as e:
579
685
  if e.errno != errno.EEXIST:
580
- _print('fatal: cannot make %s directory: %s' % (gpg_dir, e.strerror),
581
- file=sys.stderr)
686
+ print('fatal: cannot make %s directory: %s' % (gpg_dir, e.strerror),
687
+ file=sys.stderr)
582
688
  sys.exit(1)
583
689
 
584
- env = os.environ.copy()
585
- try:
586
- env['GNUPGHOME'] = gpg_dir
587
- except UnicodeEncodeError:
588
- env['GNUPGHOME'] = gpg_dir.encode()
589
-
590
- cmd = ['gpg', '--import']
690
+ if not quiet:
691
+ print('repo: Updating release signing keys to keyset ver %s' %
692
+ ('.'.join(str(x) for x in KEYRING_VERSION),))
693
+ # NB: We use --homedir (and cwd below) because some environments (Windows) do
694
+ # not correctly handle full native paths. We avoid the issue by changing to
695
+ # the right dir with cwd=gpg_dir before executing gpg, and then telling gpg to
696
+ # use the cwd (.) as its homedir which leaves the path resolution logic to it.
697
+ cmd = ['gpg', '--homedir', '.', '--import']
591
698
  try:
592
- proc = subprocess.Popen(cmd,
593
- env=env,
594
- stdin=subprocess.PIPE)
595
- except OSError as e:
699
+ # gpg can be pretty chatty. Always capture the output and if something goes
700
+ # wrong, the builtin check failure will dump stdout & stderr for debugging.
701
+ run_command(cmd, stdin=subprocess.PIPE, capture_output=True,
702
+ cwd=gpg_dir, check=True,
703
+ input=MAINTAINER_KEYS.encode('utf-8'))
704
+ except OSError:
596
705
  if not quiet:
597
- _print('warning: gpg (GnuPG) is not available.', file=sys.stderr)
598
- _print('warning: Installing it is strongly encouraged.', file=sys.stderr)
599
- _print(file=sys.stderr)
706
+ print('warning: gpg (GnuPG) is not available.', file=sys.stderr)
707
+ print('warning: Installing it is strongly encouraged.', file=sys.stderr)
708
+ print(file=sys.stderr)
600
709
  return False
601
710
 
602
- proc.stdin.write(MAINTAINER_KEYS)
603
- proc.stdin.close()
604
-
605
- if proc.wait() != 0:
606
- _print('fatal: registering repo maintainer keys failed', file=sys.stderr)
607
- sys.exit(1)
608
- _print()
609
-
610
- fd = open(os.path.join(home_dot_repo, 'keyring-version'), 'w')
611
- fd.write('.'.join(map(str, KEYRING_VERSION)) + '\n')
612
- fd.close()
711
+ with open(os.path.join(home_dot_repo, 'keyring-version'), 'w') as fd:
712
+ fd.write('.'.join(map(str, KEYRING_VERSION)) + '\n')
613
713
  return True
614
714
 
615
715
 
616
- def _SetConfig(local, name, value):
716
+ def _SetConfig(cwd, name, value):
617
717
  """Set a git configuration option to the specified value.
618
718
  """
619
- cmd = [GIT, 'config', name, value]
620
- if subprocess.Popen(cmd, cwd=local).wait() != 0:
621
- raise CloneFailure()
719
+ run_git('config', name, value, cwd=cwd)
720
+
721
+
722
+ def _GetRepoConfig(name):
723
+ """Read a repo configuration option."""
724
+ config = os.path.join(home_dot_repo, 'config')
725
+ if not os.path.exists(config):
726
+ return None
727
+
728
+ cmd = ['config', '--file', config, '--get', name]
729
+ ret = run_git(*cmd, check=False)
730
+ if ret.returncode == 0:
731
+ return ret.stdout
732
+ elif ret.returncode == 1:
733
+ return None
734
+ else:
735
+ print('repo: error: git %s failed:\n%s' % (' '.join(cmd), ret.stderr),
736
+ file=sys.stderr)
737
+ raise RunError()
622
738
 
623
739
 
624
740
  def _InitHttp():
@@ -632,7 +748,7 @@ def _InitHttp():
632
748
  p = n.hosts[host]
633
749
  mgr.add_password(p[1], 'http://%s/' % host, p[0], p[2])
634
750
  mgr.add_password(p[1], 'https://%s/' % host, p[0], p[2])
635
- except: # pylint: disable=bare-except
751
+ except Exception:
636
752
  pass
637
753
  handlers.append(urllib.request.HTTPBasicAuthHandler(mgr))
638
754
  handlers.append(urllib.request.HTTPDigestAuthHandler(mgr))
@@ -646,38 +762,29 @@ def _InitHttp():
646
762
  urllib.request.install_opener(urllib.request.build_opener(*handlers))
647
763
 
648
764
 
649
- def _Fetch(url, local, src, quiet):
650
- if not quiet:
651
- _print('Get %s' % url, file=sys.stderr)
652
-
653
- cmd = [GIT, 'fetch']
654
- if quiet:
765
+ def _Fetch(url, cwd, src, quiet, verbose):
766
+ cmd = ['fetch']
767
+ if not verbose:
655
768
  cmd.append('--quiet')
769
+ err = None
770
+ if not quiet and sys.stdout.isatty():
771
+ cmd.append('--progress')
772
+ elif not verbose:
656
773
  err = subprocess.PIPE
657
- else:
658
- err = None
659
774
  cmd.append(src)
660
775
  cmd.append('+refs/heads/*:refs/remotes/origin/*')
661
- cmd.append('refs/tags/*:refs/tags/*')
662
-
663
- proc = subprocess.Popen(cmd, cwd=local, stderr=err)
664
- if err:
665
- proc.stderr.read()
666
- proc.stderr.close()
667
- if proc.wait() != 0:
668
- raise CloneFailure()
776
+ cmd.append('+refs/tags/*:refs/tags/*')
777
+ run_git(*cmd, stderr=err, capture_output=False, cwd=cwd)
669
778
 
670
779
 
671
- def _DownloadBundle(url, local, quiet):
780
+ def _DownloadBundle(url, cwd, quiet, verbose):
672
781
  if not url.endswith('/'):
673
782
  url += '/'
674
783
  url += 'clone.bundle'
675
784
 
676
- proc = subprocess.Popen(
677
- [GIT, 'config', '--get-regexp', 'url.*.insteadof'],
678
- cwd=local,
679
- stdout=subprocess.PIPE)
680
- for line in proc.stdout:
785
+ ret = run_git('config', '--get-regexp', 'url.*.insteadof', cwd=cwd,
786
+ check=False)
787
+ for line in ret.stdout.splitlines():
681
788
  m = re.compile(r'^url\.(.*)\.insteadof (.*)$').match(line)
682
789
  if m:
683
790
  new_url = m.group(1)
@@ -685,32 +792,30 @@ def _DownloadBundle(url, local, quiet):
685
792
  if url.startswith(old_url):
686
793
  url = new_url + url[len(old_url):]
687
794
  break
688
- proc.stdout.close()
689
- proc.wait()
690
795
 
691
796
  if not url.startswith('http:') and not url.startswith('https:'):
692
797
  return False
693
798
 
694
- dest = open(os.path.join(local, '.git', 'clone.bundle'), 'w+b')
799
+ dest = open(os.path.join(cwd, '.git', 'clone.bundle'), 'w+b')
695
800
  try:
696
801
  try:
697
802
  r = urllib.request.urlopen(url)
698
803
  except urllib.error.HTTPError as e:
699
804
  if e.code in [401, 403, 404, 501]:
700
805
  return False
701
- _print('fatal: Cannot get %s' % url, file=sys.stderr)
702
- _print('fatal: HTTP error %s' % e.code, file=sys.stderr)
806
+ print('fatal: Cannot get %s' % url, file=sys.stderr)
807
+ print('fatal: HTTP error %s' % e.code, file=sys.stderr)
703
808
  raise CloneFailure()
704
809
  except urllib.error.URLError as e:
705
- _print('fatal: Cannot get %s' % url, file=sys.stderr)
706
- _print('fatal: error %s' % e.reason, file=sys.stderr)
810
+ print('fatal: Cannot get %s' % url, file=sys.stderr)
811
+ print('fatal: error %s' % e.reason, file=sys.stderr)
707
812
  raise CloneFailure()
708
813
  try:
709
- if not quiet:
710
- _print('Get %s' % url, file=sys.stderr)
814
+ if verbose:
815
+ print('Downloading clone bundle %s' % url, file=sys.stderr)
711
816
  while True:
712
817
  buf = r.read(8192)
713
- if buf == '':
818
+ if not buf:
714
819
  return True
715
820
  dest.write(buf)
716
821
  finally:
@@ -719,124 +824,139 @@ def _DownloadBundle(url, local, quiet):
719
824
  dest.close()
720
825
 
721
826
 
722
- def _ImportBundle(local):
723
- path = os.path.join(local, '.git', 'clone.bundle')
827
+ def _ImportBundle(cwd):
828
+ path = os.path.join(cwd, '.git', 'clone.bundle')
724
829
  try:
725
- _Fetch(local, local, path, True)
830
+ _Fetch(cwd, cwd, path, True, False)
726
831
  finally:
727
832
  os.remove(path)
728
833
 
729
834
 
730
- def _Clone(url, local, quiet, clone_bundle):
835
+ def _Clone(url, cwd, clone_bundle, quiet, verbose):
731
836
  """Clones a git repository to a new subdirectory of repodir
732
837
  """
733
- try:
734
- os.mkdir(local)
735
- except OSError as e:
736
- _print('fatal: cannot make %s directory: %s' % (local, e.strerror),
737
- file=sys.stderr)
738
- raise CloneFailure()
838
+ if verbose:
839
+ print('Cloning git repository', url)
739
840
 
740
- cmd = [GIT, 'init', '--quiet']
741
841
  try:
742
- proc = subprocess.Popen(cmd, cwd=local)
842
+ os.mkdir(cwd)
743
843
  except OSError as e:
744
- _print(file=sys.stderr)
745
- _print("fatal: '%s' is not available" % GIT, file=sys.stderr)
746
- _print('fatal: %s' % e, file=sys.stderr)
747
- _print(file=sys.stderr)
748
- _print('Please make sure %s is installed and in your path.' % GIT,
749
- file=sys.stderr)
750
- raise CloneFailure()
751
- if proc.wait() != 0:
752
- _print('fatal: could not create %s' % local, file=sys.stderr)
844
+ print('fatal: cannot make %s directory: %s' % (cwd, e.strerror),
845
+ file=sys.stderr)
753
846
  raise CloneFailure()
754
847
 
848
+ run_git('init', '--quiet', cwd=cwd)
849
+
755
850
  _InitHttp()
756
- _SetConfig(local, 'remote.origin.url', url)
757
- _SetConfig(local,
851
+ _SetConfig(cwd, 'remote.origin.url', url)
852
+ _SetConfig(cwd,
758
853
  'remote.origin.fetch',
759
854
  '+refs/heads/*:refs/remotes/origin/*')
760
- if clone_bundle and _DownloadBundle(url, local, quiet):
761
- _ImportBundle(local)
762
- _Fetch(url, local, 'origin', quiet)
855
+ if clone_bundle and _DownloadBundle(url, cwd, quiet, verbose):
856
+ _ImportBundle(cwd)
857
+ _Fetch(url, cwd, 'origin', quiet, verbose)
763
858
 
764
859
 
765
- def _Verify(cwd, branch, quiet):
766
- """Verify the branch has been signed by a tag.
860
+ def resolve_repo_rev(cwd, committish):
861
+ """Figure out what REPO_REV represents.
862
+
863
+ We support:
864
+ * refs/heads/xxx: Branch.
865
+ * refs/tags/xxx: Tag.
866
+ * xxx: Branch or tag or commit.
867
+
868
+ Args:
869
+ cwd: The git checkout to run in.
870
+ committish: The REPO_REV argument to resolve.
871
+
872
+ Returns:
873
+ A tuple of (remote ref, commit) as makes sense for the committish.
874
+ For branches, this will look like ('refs/heads/stable', <revision>).
875
+ For tags, this will look like ('refs/tags/v1.0', <revision>).
876
+ For commits, this will be (<revision>, <revision>).
767
877
  """
768
- cmd = [GIT, 'describe', 'origin/%s' % branch]
769
- proc = subprocess.Popen(cmd,
770
- stdout=subprocess.PIPE,
771
- stderr=subprocess.PIPE,
772
- cwd=cwd)
773
- cur = proc.stdout.read().strip()
774
- proc.stdout.close()
775
-
776
- proc.stderr.read()
777
- proc.stderr.close()
778
-
779
- if proc.wait() != 0 or not cur:
780
- _print(file=sys.stderr)
781
- _print("fatal: branch '%s' has not been signed" % branch, file=sys.stderr)
782
- raise CloneFailure()
878
+ def resolve(committish):
879
+ ret = run_git('rev-parse', '--verify', '%s^{commit}' % (committish,),
880
+ cwd=cwd, check=False)
881
+ return None if ret.returncode else ret.stdout.strip()
882
+
883
+ # An explicit branch.
884
+ if committish.startswith('refs/heads/'):
885
+ remote_ref = committish
886
+ committish = committish[len('refs/heads/'):]
887
+ rev = resolve('refs/remotes/origin/%s' % committish)
888
+ if rev is None:
889
+ print('repo: error: unknown branch "%s"' % (committish,),
890
+ file=sys.stderr)
891
+ raise CloneFailure()
892
+ return (remote_ref, rev)
893
+
894
+ # An explicit tag.
895
+ if committish.startswith('refs/tags/'):
896
+ remote_ref = committish
897
+ committish = committish[len('refs/tags/'):]
898
+ rev = resolve(remote_ref)
899
+ if rev is None:
900
+ print('repo: error: unknown tag "%s"' % (committish,),
901
+ file=sys.stderr)
902
+ raise CloneFailure()
903
+ return (remote_ref, rev)
904
+
905
+ # See if it's a short branch name.
906
+ rev = resolve('refs/remotes/origin/%s' % committish)
907
+ if rev:
908
+ return ('refs/heads/%s' % (committish,), rev)
909
+
910
+ # See if it's a tag.
911
+ rev = resolve('refs/tags/%s' % committish)
912
+ if rev:
913
+ return ('refs/tags/%s' % (committish,), rev)
914
+
915
+ # See if it's a commit.
916
+ rev = resolve(committish)
917
+ if rev and rev.lower().startswith(committish.lower()):
918
+ return (rev, rev)
919
+
920
+ # Give up!
921
+ print('repo: error: unable to resolve "%s"' % (committish,), file=sys.stderr)
922
+ raise CloneFailure()
923
+
924
+
925
+ def verify_rev(cwd, remote_ref, rev, quiet):
926
+ """Verify the commit has been signed by a tag."""
927
+ ret = run_git('describe', rev, cwd=cwd)
928
+ cur = ret.stdout.strip()
783
929
 
784
930
  m = re.compile(r'^(.*)-[0-9]{1,}-g[0-9a-f]{1,}$').match(cur)
785
931
  if m:
786
932
  cur = m.group(1)
787
933
  if not quiet:
788
- _print(file=sys.stderr)
789
- _print("info: Ignoring branch '%s'; using tagged release '%s'"
790
- % (branch, cur), file=sys.stderr)
791
- _print(file=sys.stderr)
934
+ print(file=sys.stderr)
935
+ print("warning: '%s' is not signed; falling back to signed release '%s'"
936
+ % (remote_ref, cur), file=sys.stderr)
937
+ print(file=sys.stderr)
792
938
 
793
939
  env = os.environ.copy()
794
- try:
795
- env['GNUPGHOME'] = gpg_dir
796
- except UnicodeEncodeError:
797
- env['GNUPGHOME'] = gpg_dir.encode()
798
-
799
- cmd = [GIT, 'tag', '-v', cur]
800
- proc = subprocess.Popen(cmd,
801
- stdout=subprocess.PIPE,
802
- stderr=subprocess.PIPE,
803
- cwd=cwd,
804
- env=env)
805
- out = proc.stdout.read()
806
- proc.stdout.close()
807
-
808
- err = proc.stderr.read()
809
- proc.stderr.close()
810
-
811
- if proc.wait() != 0:
812
- _print(file=sys.stderr)
813
- _print(out, file=sys.stderr)
814
- _print(err, file=sys.stderr)
815
- _print(file=sys.stderr)
816
- raise CloneFailure()
940
+ _setenv('GNUPGHOME', gpg_dir, env)
941
+ run_git('tag', '-v', cur, cwd=cwd, env=env)
817
942
  return '%s^0' % cur
818
943
 
819
944
 
820
- def _Checkout(cwd, branch, rev, quiet):
945
+ def _Checkout(cwd, remote_ref, rev, quiet):
821
946
  """Checkout an upstream branch into the repository and track it.
822
947
  """
823
- cmd = [GIT, 'update-ref', 'refs/heads/default', rev]
824
- if subprocess.Popen(cmd, cwd=cwd).wait() != 0:
825
- raise CloneFailure()
948
+ run_git('update-ref', 'refs/heads/default', rev, cwd=cwd)
826
949
 
827
950
  _SetConfig(cwd, 'branch.default.remote', 'origin')
828
- _SetConfig(cwd, 'branch.default.merge', 'refs/heads/%s' % branch)
951
+ _SetConfig(cwd, 'branch.default.merge', remote_ref)
829
952
 
830
- cmd = [GIT, 'symbolic-ref', 'HEAD', 'refs/heads/default']
831
- if subprocess.Popen(cmd, cwd=cwd).wait() != 0:
832
- raise CloneFailure()
953
+ run_git('symbolic-ref', 'HEAD', 'refs/heads/default', cwd=cwd)
833
954
 
834
- cmd = [GIT, 'read-tree', '--reset', '-u']
955
+ cmd = ['read-tree', '--reset', '-u']
835
956
  if not quiet:
836
957
  cmd.append('-v')
837
958
  cmd.append('HEAD')
838
- if subprocess.Popen(cmd, cwd=cwd).wait() != 0:
839
- raise CloneFailure()
959
+ run_git(*cmd, cwd=cwd)
840
960
 
841
961
 
842
962
  def _FindRepo():
@@ -859,6 +979,26 @@ def _FindRepo():
859
979
 
860
980
  class _Options(object):
861
981
  help = False
982
+ version = False
983
+
984
+
985
+ def _ExpandAlias(name):
986
+ """Look up user registered aliases."""
987
+ # We don't resolve aliases for existing subcommands. This matches git.
988
+ if name in {'gitc-init', 'help', 'init'}:
989
+ return name, []
990
+
991
+ alias = _GetRepoConfig('alias.%s' % (name,))
992
+ if alias is None:
993
+ return name, []
994
+
995
+ args = alias.strip().split(' ', 1)
996
+ name = args[0]
997
+ if len(args) == 2:
998
+ args = shlex.split(args[1])
999
+ else:
1000
+ args = []
1001
+ return name, args
862
1002
 
863
1003
 
864
1004
  def _ParseArguments(args):
@@ -870,7 +1010,10 @@ def _ParseArguments(args):
870
1010
  a = args[i]
871
1011
  if a == '-h' or a == '--help':
872
1012
  opt.help = True
873
-
1013
+ elif a == '--version':
1014
+ opt.version = True
1015
+ elif a == '--trace':
1016
+ trace.set(True)
874
1017
  elif not a.startswith('-'):
875
1018
  cmd = a
876
1019
  arg = args[i + 1:]
@@ -883,7 +1026,7 @@ def _Usage():
883
1026
  if get_gitc_manifest_dir():
884
1027
  gitc_usage = " gitc-init Initialize a GITC Client.\n"
885
1028
 
886
- _print(
1029
+ print(
887
1030
  """usage: repo COMMAND [ARGS]
888
1031
 
889
1032
  repo is not yet installed. Use "repo init" to install it here.
@@ -895,37 +1038,52 @@ The most commonly used repo commands are:
895
1038
  """ help Display detailed help on a command
896
1039
 
897
1040
  For access to the full online help, install repo ("repo init").
898
- """, file=sys.stderr)
899
- sys.exit(1)
1041
+ """)
1042
+ sys.exit(0)
900
1043
 
901
1044
 
902
1045
  def _Help(args):
903
1046
  if args:
904
- if args[0] == 'init':
905
- init_optparse.print_help()
906
- sys.exit(0)
907
- elif args[0] == 'gitc-init':
908
- _GitcInitOptions(init_optparse)
909
- init_optparse.print_help()
1047
+ if args[0] in {'init', 'gitc-init'}:
1048
+ parser = GetParser(gitc_init=args[0] == 'gitc-init')
1049
+ parser.print_help()
910
1050
  sys.exit(0)
911
1051
  else:
912
- _print("error: '%s' is not a bootstrap command.\n"
913
- ' For access to online help, install repo ("repo init").'
914
- % args[0], file=sys.stderr)
1052
+ print("error: '%s' is not a bootstrap command.\n"
1053
+ ' For access to online help, install repo ("repo init").'
1054
+ % args[0], file=sys.stderr)
915
1055
  else:
916
1056
  _Usage()
917
1057
  sys.exit(1)
918
1058
 
919
1059
 
1060
+ def _Version():
1061
+ """Show version information."""
1062
+ print('<repo not installed>')
1063
+ print('repo launcher version %s' % ('.'.join(str(x) for x in VERSION),))
1064
+ print(' (from %s)' % (__file__,))
1065
+ print('git %s' % (ParseGitVersion().full,))
1066
+ print('Python %s' % sys.version)
1067
+ uname = platform.uname()
1068
+ if sys.version_info.major < 3:
1069
+ # Python 3 returns a named tuple, but Python 2 is simpler.
1070
+ print(uname)
1071
+ else:
1072
+ print('OS %s %s (%s)' % (uname.system, uname.release, uname.version))
1073
+ print('CPU %s (%s)' %
1074
+ (uname.machine, uname.processor if uname.processor else 'unknown'))
1075
+ sys.exit(0)
1076
+
1077
+
920
1078
  def _NotInstalled():
921
- _print('error: repo is not installed. Use "repo init" to install it here.',
922
- file=sys.stderr)
1079
+ print('error: repo is not installed. Use "repo init" to install it here.',
1080
+ file=sys.stderr)
923
1081
  sys.exit(1)
924
1082
 
925
1083
 
926
1084
  def _NoCommands(cmd):
927
- _print("""error: command '%s' requires repo to be installed first.
928
- Use "repo init" to install it here.""" % cmd, file=sys.stderr)
1085
+ print("""error: command '%s' requires repo to be installed first.
1086
+ Use "repo init" to install it here.""" % cmd, file=sys.stderr)
929
1087
  sys.exit(1)
930
1088
 
931
1089
 
@@ -949,26 +1107,26 @@ def _SetDefaultsTo(gitdir):
949
1107
  global REPO_REV
950
1108
 
951
1109
  REPO_URL = gitdir
952
- proc = subprocess.Popen([GIT,
953
- '--git-dir=%s' % gitdir,
954
- 'symbolic-ref',
955
- 'HEAD'],
956
- stdout=subprocess.PIPE,
957
- stderr=subprocess.PIPE)
958
- REPO_REV = proc.stdout.read().strip()
959
- proc.stdout.close()
960
-
961
- proc.stderr.read()
962
- proc.stderr.close()
963
-
964
- if proc.wait() != 0:
965
- _print('fatal: %s has no current branch' % gitdir, file=sys.stderr)
966
- sys.exit(1)
1110
+ ret = run_git('--git-dir=%s' % gitdir, 'symbolic-ref', 'HEAD', check=False)
1111
+ if ret.returncode:
1112
+ # If we're not tracking a branch (bisect/etc...), then fall back to commit.
1113
+ print('repo: warning: %s has no current branch; using HEAD' % gitdir,
1114
+ file=sys.stderr)
1115
+ try:
1116
+ ret = run_git('rev-parse', 'HEAD', cwd=gitdir)
1117
+ except CloneFailure:
1118
+ print('fatal: %s has invalid HEAD' % gitdir, file=sys.stderr)
1119
+ sys.exit(1)
1120
+
1121
+ REPO_REV = ret.stdout.strip()
967
1122
 
968
1123
 
969
1124
  def main(orig_args):
970
1125
  cmd, opt, args = _ParseArguments(orig_args)
971
1126
 
1127
+ # We run this early as we run some git commands ourselves.
1128
+ SetGitTrace2ParentSid()
1129
+
972
1130
  repo_main, rel_repo_dir = None, None
973
1131
  # Don't use the local repo copy, make sure to switch to the gitc client first.
974
1132
  if cmd != 'gitc-init':
@@ -979,16 +1137,23 @@ def main(orig_args):
979
1137
 
980
1138
  cwd = os.getcwd()
981
1139
  if get_gitc_manifest_dir() and cwd.startswith(get_gitc_manifest_dir()):
982
- _print('error: repo cannot be used in the GITC local manifest directory.'
983
- '\nIf you want to work on this GITC client please rerun this '
984
- 'command from the corresponding client under /gitc/',
985
- file=sys.stderr)
1140
+ print('error: repo cannot be used in the GITC local manifest directory.'
1141
+ '\nIf you want to work on this GITC client please rerun this '
1142
+ 'command from the corresponding client under /gitc/',
1143
+ file=sys.stderr)
986
1144
  sys.exit(1)
987
1145
  if not repo_main:
1146
+ # Only expand aliases here since we'll be parsing the CLI ourselves.
1147
+ # If we had repo_main, alias expansion would happen in main.py.
1148
+ cmd, alias_args = _ExpandAlias(cmd)
1149
+ args = alias_args + args
1150
+
988
1151
  if opt.help:
989
1152
  _Usage()
990
1153
  if cmd == 'help':
991
1154
  _Help(args)
1155
+ if opt.version or cmd == 'version':
1156
+ _Version()
992
1157
  if not cmd:
993
1158
  _NotInstalled()
994
1159
  if cmd == 'init' or cmd == 'gitc-init':
@@ -998,8 +1163,8 @@ def main(orig_args):
998
1163
  _Init(args, gitc_init=(cmd == 'gitc-init'))
999
1164
  except CloneFailure:
1000
1165
  path = os.path.join(repodir, S_repo)
1001
- _print("fatal: cloning the git-repo repository failed, will remove "
1002
- "'%s' " % path, file=sys.stderr)
1166
+ print("fatal: cloning the git-repo repository failed, will remove "
1167
+ "'%s' " % path, file=sys.stderr)
1003
1168
  shutil.rmtree(path, ignore_errors=True)
1004
1169
  sys.exit(1)
1005
1170
  repo_main, rel_repo_dir = _FindRepo()
@@ -1009,6 +1174,10 @@ def main(orig_args):
1009
1174
  if my_main:
1010
1175
  repo_main = my_main
1011
1176
 
1177
+ if not repo_main:
1178
+ print("fatal: unable to find repo entry point", file=sys.stderr)
1179
+ sys.exit(1)
1180
+
1012
1181
  ver_str = '.'.join(map(str, VERSION))
1013
1182
  me = [sys.executable, repo_main,
1014
1183
  '--repo-dir=%s' % rel_repo_dir,
@@ -1016,21 +1185,10 @@ def main(orig_args):
1016
1185
  '--wrapper-path=%s' % wrapper_path,
1017
1186
  '--']
1018
1187
  me.extend(orig_args)
1019
- me.extend(extra_args)
1020
- try:
1021
- if platform.system() == "Windows":
1022
- sys.exit(subprocess.call(me))
1023
- else:
1024
- os.execv(sys.executable, me)
1025
- except OSError as e:
1026
- _print("fatal: unable to start %s" % repo_main, file=sys.stderr)
1027
- _print("fatal: %s" % e, file=sys.stderr)
1028
- sys.exit(148)
1188
+ exec_command(me)
1189
+ print("fatal: unable to start %s" % repo_main, file=sys.stderr)
1190
+ sys.exit(148)
1029
1191
 
1030
1192
 
1031
1193
  if __name__ == '__main__':
1032
- if ver[0] == 3:
1033
- _print('warning: Python 3 support is currently experimental. YMMV.\n'
1034
- 'Please use Python 2.7 instead.',
1035
- file=sys.stderr)
1036
1194
  main(sys.argv[1:])