libv8 7.3.492.27.1 → 8.4.255.0

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