libv8 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 (639) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.gitmodules +3 -0
  4. data/.rspec +3 -0
  5. data/.travis.yml +45 -0
  6. data/CHANGELOG.md +111 -0
  7. data/Gemfile +4 -0
  8. data/README.md +152 -0
  9. data/Rakefile +125 -0
  10. data/appveyor.yml.disabled +36 -0
  11. data/ext/libv8/arch.rb +20 -0
  12. data/ext/libv8/builder.rb +106 -0
  13. data/ext/libv8/extconf.rb +7 -0
  14. data/ext/libv8/location.rb +89 -0
  15. data/ext/libv8/paths.rb +28 -0
  16. data/lib/libv8.rb +9 -0
  17. data/lib/libv8/version.rb +3 -0
  18. data/libv8.gemspec +30 -0
  19. data/scaleway.png +0 -0
  20. data/spec/location_spec.rb +69 -0
  21. data/spec/spec_helper.rb +4 -0
  22. data/thefrontside.png +0 -0
  23. data/vendor/depot_tools/.cipd_impl.ps1 +129 -0
  24. data/vendor/depot_tools/.gitattributes +55 -0
  25. data/vendor/depot_tools/.gitignore +92 -0
  26. data/vendor/depot_tools/.style.yapf +4 -0
  27. data/vendor/depot_tools/.vpython +55 -0
  28. data/vendor/depot_tools/.vpython3 +23 -0
  29. data/vendor/depot_tools/CROS_OWNERS +7 -0
  30. data/vendor/depot_tools/GOMA_OWNERS +9 -0
  31. data/vendor/depot_tools/LICENSE +27 -0
  32. data/vendor/depot_tools/LUCI_OWNERS +5 -0
  33. data/vendor/depot_tools/OWNERS +39 -0
  34. data/vendor/depot_tools/PRESUBMIT.py +150 -0
  35. data/vendor/depot_tools/README.gclient.md +67 -0
  36. data/vendor/depot_tools/README.git-cl.md +99 -0
  37. data/vendor/depot_tools/README.md +78 -0
  38. data/vendor/depot_tools/WATCHLISTS +26 -0
  39. data/vendor/depot_tools/auth.py +163 -0
  40. data/vendor/depot_tools/autoninja +36 -0
  41. data/vendor/depot_tools/autoninja.bat +33 -0
  42. data/vendor/depot_tools/autoninja.py +148 -0
  43. data/vendor/depot_tools/bb +12 -0
  44. data/vendor/depot_tools/bb.bat +7 -0
  45. data/vendor/depot_tools/bootstrap/README.md +155 -0
  46. data/vendor/depot_tools/bootstrap/bootstrap.py +356 -0
  47. data/vendor/depot_tools/bootstrap/git-bash.template.sh +12 -0
  48. data/vendor/depot_tools/bootstrap/git.template.bat +5 -0
  49. data/vendor/depot_tools/bootstrap/manifest.txt +27 -0
  50. data/vendor/depot_tools/bootstrap/manifest_bleeding_edge.txt +27 -0
  51. data/vendor/depot_tools/bootstrap/profile.d.python.sh +20 -0
  52. data/vendor/depot_tools/bootstrap/python27.bat +46 -0
  53. data/vendor/depot_tools/bootstrap/python3.bat +46 -0
  54. data/vendor/depot_tools/bootstrap/win_tools.bat +79 -0
  55. data/vendor/depot_tools/bootstrap_python3 +35 -0
  56. data/vendor/depot_tools/breakpad.py +12 -0
  57. data/vendor/depot_tools/cbuildbot +1 -0
  58. data/vendor/depot_tools/chrome_set_ver +1 -0
  59. data/vendor/depot_tools/cipd +247 -0
  60. data/vendor/depot_tools/cipd.bat +67 -0
  61. data/vendor/depot_tools/cipd_bin_setup.bat +6 -0
  62. data/vendor/depot_tools/cipd_bin_setup.sh +22 -0
  63. data/vendor/depot_tools/cipd_client_version +1 -0
  64. data/vendor/depot_tools/cipd_client_version.digests +22 -0
  65. data/vendor/depot_tools/cipd_manifest.txt +63 -0
  66. data/vendor/depot_tools/cipd_manifest.versions +438 -0
  67. data/vendor/depot_tools/cit +8 -0
  68. data/vendor/depot_tools/cit.bat +12 -0
  69. data/vendor/depot_tools/cit.py +167 -0
  70. data/vendor/depot_tools/clang-format +8 -0
  71. data/vendor/depot_tools/clang-format.bat +12 -0
  72. data/vendor/depot_tools/clang_format.py +79 -0
  73. data/vendor/depot_tools/clang_format_merge_driver +8 -0
  74. data/vendor/depot_tools/clang_format_merge_driver.bat +12 -0
  75. data/vendor/depot_tools/clang_format_merge_driver.py +69 -0
  76. data/vendor/depot_tools/codereview.settings +6 -0
  77. data/vendor/depot_tools/compile_single_file +8 -0
  78. data/vendor/depot_tools/compile_single_file.bat +11 -0
  79. data/vendor/depot_tools/compile_single_file.py +79 -0
  80. data/vendor/depot_tools/cpplint.bat +11 -0
  81. data/vendor/depot_tools/cpplint.py +6097 -0
  82. data/vendor/depot_tools/cpplint_chromium.py +50 -0
  83. data/vendor/depot_tools/cros +87 -0
  84. data/vendor/depot_tools/cros_sdk +1 -0
  85. data/vendor/depot_tools/crosjobs +13 -0
  86. data/vendor/depot_tools/detect_host_arch.py +55 -0
  87. data/vendor/depot_tools/dirmd +12 -0
  88. data/vendor/depot_tools/dirmd.bat +7 -0
  89. data/vendor/depot_tools/download_from_google_storage +8 -0
  90. data/vendor/depot_tools/download_from_google_storage.bat +12 -0
  91. data/vendor/depot_tools/download_from_google_storage.py +634 -0
  92. data/vendor/depot_tools/ensure_bootstrap +53 -0
  93. data/vendor/depot_tools/fetch +21 -0
  94. data/vendor/depot_tools/fetch.bat +28 -0
  95. data/vendor/depot_tools/fetch.py +319 -0
  96. data/vendor/depot_tools/fetch_configs/android.py +34 -0
  97. data/vendor/depot_tools/fetch_configs/android_internal.py +34 -0
  98. data/vendor/depot_tools/fetch_configs/breakpad.py +44 -0
  99. data/vendor/depot_tools/fetch_configs/chromium.py +66 -0
  100. data/vendor/depot_tools/fetch_configs/config_util.py +52 -0
  101. data/vendor/depot_tools/fetch_configs/crashpad.py +41 -0
  102. data/vendor/depot_tools/fetch_configs/dart.py +45 -0
  103. data/vendor/depot_tools/fetch_configs/depot_tools.py +44 -0
  104. data/vendor/depot_tools/fetch_configs/devtools-frontend.py +44 -0
  105. data/vendor/depot_tools/fetch_configs/goma_client.py +41 -0
  106. data/vendor/depot_tools/fetch_configs/gyp.py +41 -0
  107. data/vendor/depot_tools/fetch_configs/infra.py +40 -0
  108. data/vendor/depot_tools/fetch_configs/infra_internal.py +45 -0
  109. data/vendor/depot_tools/fetch_configs/inspector_protocol.py +40 -0
  110. data/vendor/depot_tools/fetch_configs/ios.py +34 -0
  111. data/vendor/depot_tools/fetch_configs/ios_internal.py +39 -0
  112. data/vendor/depot_tools/fetch_configs/nacl.py +48 -0
  113. data/vendor/depot_tools/fetch_configs/naclports.py +47 -0
  114. data/vendor/depot_tools/fetch_configs/node-ci.py +41 -0
  115. data/vendor/depot_tools/fetch_configs/pdfium.py +40 -0
  116. data/vendor/depot_tools/fetch_configs/skia.py +41 -0
  117. data/vendor/depot_tools/fetch_configs/skia_buildbot.py +41 -0
  118. data/vendor/depot_tools/fetch_configs/syzygy.py +41 -0
  119. data/vendor/depot_tools/fetch_configs/v8.py +44 -0
  120. data/vendor/depot_tools/fetch_configs/webrtc.py +52 -0
  121. data/vendor/depot_tools/fetch_configs/webrtc_android.py +34 -0
  122. data/vendor/depot_tools/fetch_configs/webrtc_ios.py +34 -0
  123. data/vendor/depot_tools/fix_encoding.py +385 -0
  124. data/vendor/depot_tools/gclient +38 -0
  125. data/vendor/depot_tools/gclient-new-workdir.py +124 -0
  126. data/vendor/depot_tools/gclient.bat +32 -0
  127. data/vendor/depot_tools/gclient.py +3198 -0
  128. data/vendor/depot_tools/gclient_completion.sh +76 -0
  129. data/vendor/depot_tools/gclient_eval.py +891 -0
  130. data/vendor/depot_tools/gclient_paths.py +152 -0
  131. data/vendor/depot_tools/gclient_scm.py +1615 -0
  132. data/vendor/depot_tools/gclient_utils.py +1280 -0
  133. data/vendor/depot_tools/gerrit_client.py +151 -0
  134. data/vendor/depot_tools/gerrit_util.py +996 -0
  135. data/vendor/depot_tools/git-cache +6 -0
  136. data/vendor/depot_tools/git-cl +6 -0
  137. data/vendor/depot_tools/git-crrev-parse +53 -0
  138. data/vendor/depot_tools/git-drover +6 -0
  139. data/vendor/depot_tools/git-find-releases +6 -0
  140. data/vendor/depot_tools/git-footers +6 -0
  141. data/vendor/depot_tools/git-freeze +8 -0
  142. data/vendor/depot_tools/git-gs +9 -0
  143. data/vendor/depot_tools/git-hyper-blame +6 -0
  144. data/vendor/depot_tools/git-map +6 -0
  145. data/vendor/depot_tools/git-map-branches +6 -0
  146. data/vendor/depot_tools/git-mark-merge-base +6 -0
  147. data/vendor/depot_tools/git-nav-downstream +6 -0
  148. data/vendor/depot_tools/git-nav-upstream +6 -0
  149. data/vendor/depot_tools/git-new-branch +6 -0
  150. data/vendor/depot_tools/git-number +6 -0
  151. data/vendor/depot_tools/git-rebase-update +6 -0
  152. data/vendor/depot_tools/git-rename-branch +6 -0
  153. data/vendor/depot_tools/git-reparent-branch +6 -0
  154. data/vendor/depot_tools/git-retry +8 -0
  155. data/vendor/depot_tools/git-runhooks +23 -0
  156. data/vendor/depot_tools/git-squash-branch +6 -0
  157. data/vendor/depot_tools/git-templates/description +3 -0
  158. data/vendor/depot_tools/git-templates/hooks/applypatch-msg +4 -0
  159. data/vendor/depot_tools/git-templates/hooks/post-applypatch +4 -0
  160. data/vendor/depot_tools/git-templates/hooks/post-checkout +4 -0
  161. data/vendor/depot_tools/git-templates/hooks/post-commit +4 -0
  162. data/vendor/depot_tools/git-templates/hooks/post-merge +4 -0
  163. data/vendor/depot_tools/git-templates/hooks/post-update +4 -0
  164. data/vendor/depot_tools/git-templates/hooks/pre-applypatch +4 -0
  165. data/vendor/depot_tools/git-templates/hooks/pre-auto-gc +4 -0
  166. data/vendor/depot_tools/git-templates/hooks/pre-commit +4 -0
  167. data/vendor/depot_tools/git-templates/hooks/pre-rebase +4 -0
  168. data/vendor/depot_tools/git-templates/hooks/prepare-commit-msg +4 -0
  169. data/vendor/depot_tools/git-templates/info/exclude +6 -0
  170. data/vendor/depot_tools/git-thaw +13 -0
  171. data/vendor/depot_tools/git-upstream-diff +9 -0
  172. data/vendor/depot_tools/git_cache.py +786 -0
  173. data/vendor/depot_tools/git_cl.py +5158 -0
  174. data/vendor/depot_tools/git_cl_completion.sh +48 -0
  175. data/vendor/depot_tools/git_common.py +1101 -0
  176. data/vendor/depot_tools/git_dates.py +62 -0
  177. data/vendor/depot_tools/git_drover.py +469 -0
  178. data/vendor/depot_tools/git_find_releases.py +67 -0
  179. data/vendor/depot_tools/git_footers.py +261 -0
  180. data/vendor/depot_tools/git_freezer.py +40 -0
  181. data/vendor/depot_tools/git_hyper_blame.py +391 -0
  182. data/vendor/depot_tools/git_map.py +166 -0
  183. data/vendor/depot_tools/git_map_branches.py +354 -0
  184. data/vendor/depot_tools/git_mark_merge_base.py +73 -0
  185. data/vendor/depot_tools/git_nav_downstream.py +69 -0
  186. data/vendor/depot_tools/git_new_branch.py +82 -0
  187. data/vendor/depot_tools/git_number.py +301 -0
  188. data/vendor/depot_tools/git_rebase_update.py +351 -0
  189. data/vendor/depot_tools/git_rename_branch.py +55 -0
  190. data/vendor/depot_tools/git_reparent_branch.py +101 -0
  191. data/vendor/depot_tools/git_retry.py +181 -0
  192. data/vendor/depot_tools/git_squash_branch.py +28 -0
  193. data/vendor/depot_tools/git_upstream_diff.py +64 -0
  194. data/vendor/depot_tools/gn +8 -0
  195. data/vendor/depot_tools/gn.bat +12 -0
  196. data/vendor/depot_tools/gn.py +78 -0
  197. data/vendor/depot_tools/goma_auth +12 -0
  198. data/vendor/depot_tools/goma_auth.bat +8 -0
  199. data/vendor/depot_tools/goma_ctl +12 -0
  200. data/vendor/depot_tools/goma_ctl.bat +8 -0
  201. data/vendor/depot_tools/gsutil.py +190 -0
  202. data/vendor/depot_tools/gsutil.py.bat +23 -0
  203. data/vendor/depot_tools/gsutil.vpython +120 -0
  204. data/vendor/depot_tools/infra/README.md +1 -0
  205. data/vendor/depot_tools/infra/config/OWNERS +7 -0
  206. data/vendor/depot_tools/infra/config/README.md +1 -0
  207. data/vendor/depot_tools/infra/config/recipes.cfg +26 -0
  208. data/vendor/depot_tools/led +12 -0
  209. data/vendor/depot_tools/led.bat +7 -0
  210. data/vendor/depot_tools/lockfile.py +116 -0
  211. data/vendor/depot_tools/luci-auth +13 -0
  212. data/vendor/depot_tools/luci-auth.bat +8 -0
  213. data/vendor/depot_tools/lucicfg +12 -0
  214. data/vendor/depot_tools/lucicfg.bat +7 -0
  215. data/vendor/depot_tools/mac_toolchain +12 -0
  216. data/vendor/depot_tools/man/html/depot_tools.html +934 -0
  217. data/vendor/depot_tools/man/html/depot_tools_tutorial.html +1593 -0
  218. data/vendor/depot_tools/man/html/git-cl.html +1033 -0
  219. data/vendor/depot_tools/man/html/git-drover.html +1048 -0
  220. data/vendor/depot_tools/man/html/git-footers.html +878 -0
  221. data/vendor/depot_tools/man/html/git-freeze.html +859 -0
  222. data/vendor/depot_tools/man/html/git-hyper-blame.html +878 -0
  223. data/vendor/depot_tools/man/html/git-map-branches.html +904 -0
  224. data/vendor/depot_tools/man/html/git-map.html +887 -0
  225. data/vendor/depot_tools/man/html/git-mark-merge-base.html +826 -0
  226. data/vendor/depot_tools/man/html/git-nav-downstream.html +844 -0
  227. data/vendor/depot_tools/man/html/git-nav-upstream.html +853 -0
  228. data/vendor/depot_tools/man/html/git-new-branch.html +932 -0
  229. data/vendor/depot_tools/man/html/git-rebase-update.html +961 -0
  230. data/vendor/depot_tools/man/html/git-rename-branch.html +794 -0
  231. data/vendor/depot_tools/man/html/git-reparent-branch.html +847 -0
  232. data/vendor/depot_tools/man/html/git-retry.html +858 -0
  233. data/vendor/depot_tools/man/html/git-squash-branch.html +881 -0
  234. data/vendor/depot_tools/man/html/git-thaw.html +794 -0
  235. data/vendor/depot_tools/man/html/git-upstream-diff.html +923 -0
  236. data/vendor/depot_tools/man/man1/git-cl.1 +198 -0
  237. data/vendor/depot_tools/man/man1/git-drover.1 +330 -0
  238. data/vendor/depot_tools/man/man1/git-footers.1 +144 -0
  239. data/vendor/depot_tools/man/man1/git-freeze.1 +113 -0
  240. data/vendor/depot_tools/man/man1/git-hyper-blame.1 +128 -0
  241. data/vendor/depot_tools/man/man1/git-map-branches.1 +210 -0
  242. data/vendor/depot_tools/man/man1/git-map.1 +179 -0
  243. data/vendor/depot_tools/man/man1/git-mark-merge-base.1 +69 -0
  244. data/vendor/depot_tools/man/man1/git-nav-downstream.1 +112 -0
  245. data/vendor/depot_tools/man/man1/git-nav-upstream.1 +122 -0
  246. data/vendor/depot_tools/man/man1/git-new-branch.1 +176 -0
  247. data/vendor/depot_tools/man/man1/git-rebase-update.1 +177 -0
  248. data/vendor/depot_tools/man/man1/git-rename-branch.1 +53 -0
  249. data/vendor/depot_tools/man/man1/git-reparent-branch.1 +93 -0
  250. data/vendor/depot_tools/man/man1/git-retry.1 +108 -0
  251. data/vendor/depot_tools/man/man1/git-squash-branch.1 +129 -0
  252. data/vendor/depot_tools/man/man1/git-thaw.1 +54 -0
  253. data/vendor/depot_tools/man/man1/git-upstream-diff.1 +153 -0
  254. data/vendor/depot_tools/man/man7/depot_tools.7 +139 -0
  255. data/vendor/depot_tools/man/man7/depot_tools_tutorial.7 +1061 -0
  256. data/vendor/depot_tools/man/push_to_gs.sh +4 -0
  257. data/vendor/depot_tools/man/src/.gitignore +5 -0
  258. data/vendor/depot_tools/man/src/_aliases.txt +5 -0
  259. data/vendor/depot_tools/man/src/_footer.txt +8 -0
  260. data/vendor/depot_tools/man/src/_git-cl_desc.helper.txt +1 -0
  261. data/vendor/depot_tools/man/src/_git-drover_desc.helper.txt +2 -0
  262. data/vendor/depot_tools/man/src/_git-footers_desc.helper.txt +1 -0
  263. data/vendor/depot_tools/man/src/_git-freeze_desc.helper.txt +1 -0
  264. data/vendor/depot_tools/man/src/_git-hyper-blame_desc.helper.txt +1 -0
  265. data/vendor/depot_tools/man/src/_git-map-branches_desc.helper.txt +4 -0
  266. data/vendor/depot_tools/man/src/_git-map_desc.helper.txt +3 -0
  267. data/vendor/depot_tools/man/src/_git-mark-merge-base_desc.helper.txt +1 -0
  268. data/vendor/depot_tools/man/src/_git-nav-downstream_desc.helper.txt +1 -0
  269. data/vendor/depot_tools/man/src/_git-nav-upstream_desc.helper.txt +1 -0
  270. data/vendor/depot_tools/man/src/_git-new-branch_desc.helper.txt +1 -0
  271. data/vendor/depot_tools/man/src/_git-rebase-update_desc.helper.txt +1 -0
  272. data/vendor/depot_tools/man/src/_git-rename-branch_desc.helper.txt +1 -0
  273. data/vendor/depot_tools/man/src/_git-reparent-branch_desc.helper.txt +1 -0
  274. data/vendor/depot_tools/man/src/_git-retry_desc.helper.txt +2 -0
  275. data/vendor/depot_tools/man/src/_git-squash-branch_desc.helper.txt +1 -0
  276. data/vendor/depot_tools/man/src/_git-thaw_desc.helper.txt +2 -0
  277. data/vendor/depot_tools/man/src/_git-upstream-diff_desc.helper.txt +1 -0
  278. data/vendor/depot_tools/man/src/_helper_prefix.txt +1 -0
  279. data/vendor/depot_tools/man/src/asciidoc-override.css +7 -0
  280. data/vendor/depot_tools/man/src/common_demo_functions.sh +84 -0
  281. data/vendor/depot_tools/man/src/demo_repo.sh +43 -0
  282. data/vendor/depot_tools/man/src/depot_tools.txt +28 -0
  283. data/vendor/depot_tools/man/src/depot_tools_tutorial.demo.walkthrough.sh +155 -0
  284. data/vendor/depot_tools/man/src/depot_tools_tutorial.txt +432 -0
  285. data/vendor/depot_tools/man/src/filter_demo_output.py +141 -0
  286. data/vendor/depot_tools/man/src/git-cl.txt +119 -0
  287. data/vendor/depot_tools/man/src/git-drover.demo.1.sh +22 -0
  288. data/vendor/depot_tools/man/src/git-drover.demo.2.sh +23 -0
  289. data/vendor/depot_tools/man/src/git-drover.demo.3.sh +27 -0
  290. data/vendor/depot_tools/man/src/git-drover.demo.4.sh +39 -0
  291. data/vendor/depot_tools/man/src/git-drover.demo.common.sh +19 -0
  292. data/vendor/depot_tools/man/src/git-drover.txt +102 -0
  293. data/vendor/depot_tools/man/src/git-footers.demo.1.sh +17 -0
  294. data/vendor/depot_tools/man/src/git-footers.txt +71 -0
  295. data/vendor/depot_tools/man/src/git-freeze.demo.1.sh +23 -0
  296. data/vendor/depot_tools/man/src/git-freeze.txt +54 -0
  297. data/vendor/depot_tools/man/src/git-hyper-blame.demo.1.sh +3 -0
  298. data/vendor/depot_tools/man/src/git-hyper-blame.demo.2.sh +4 -0
  299. data/vendor/depot_tools/man/src/git-hyper-blame.demo.common.sh +57 -0
  300. data/vendor/depot_tools/man/src/git-hyper-blame.txt +85 -0
  301. data/vendor/depot_tools/man/src/git-map-branches.demo.1.sh +8 -0
  302. data/vendor/depot_tools/man/src/git-map-branches.txt +64 -0
  303. data/vendor/depot_tools/man/src/git-map.demo.1.sh +3 -0
  304. data/vendor/depot_tools/man/src/git-map.txt +67 -0
  305. data/vendor/depot_tools/man/src/git-mark-merge-base.txt +46 -0
  306. data/vendor/depot_tools/man/src/git-nav-downstream.demo.1.sh +12 -0
  307. data/vendor/depot_tools/man/src/git-nav-downstream.txt +40 -0
  308. data/vendor/depot_tools/man/src/git-nav-upstream.demo.1.sh +12 -0
  309. data/vendor/depot_tools/man/src/git-nav-upstream.txt +39 -0
  310. data/vendor/depot_tools/man/src/git-new-branch.demo.1.sh +17 -0
  311. data/vendor/depot_tools/man/src/git-new-branch.txt +82 -0
  312. data/vendor/depot_tools/man/src/git-rebase-update.txt +141 -0
  313. data/vendor/depot_tools/man/src/git-rename-branch.txt +28 -0
  314. data/vendor/depot_tools/man/src/git-reparent-branch.txt +61 -0
  315. data/vendor/depot_tools/man/src/git-retry.txt +67 -0
  316. data/vendor/depot_tools/man/src/git-squash-branch.demo.1.sh +12 -0
  317. data/vendor/depot_tools/man/src/git-squash-branch.txt +59 -0
  318. data/vendor/depot_tools/man/src/git-thaw.txt +29 -0
  319. data/vendor/depot_tools/man/src/git-upstream-diff.txt +107 -0
  320. data/vendor/depot_tools/man/src/make_docs.sh +260 -0
  321. data/vendor/depot_tools/man/src/prep_demo_repo.sh +103 -0
  322. data/vendor/depot_tools/metrics.README.md +101 -0
  323. data/vendor/depot_tools/metrics.py +297 -0
  324. data/vendor/depot_tools/metrics_utils.py +293 -0
  325. data/vendor/depot_tools/my_activity.py +971 -0
  326. data/vendor/depot_tools/ninja +44 -0
  327. data/vendor/depot_tools/ninja-linux32 +0 -0
  328. data/vendor/depot_tools/ninja-linux64 +0 -0
  329. data/vendor/depot_tools/ninja-mac +0 -0
  330. data/vendor/depot_tools/ninja.exe +0 -0
  331. data/vendor/depot_tools/ninjalog.README.md +64 -0
  332. data/vendor/depot_tools/ninjalog_uploader.py +233 -0
  333. data/vendor/depot_tools/ninjalog_uploader_wrapper.py +125 -0
  334. data/vendor/depot_tools/owners.py +641 -0
  335. data/vendor/depot_tools/owners_finder.py +385 -0
  336. data/vendor/depot_tools/post_build_ninja_summary.py +350 -0
  337. data/vendor/depot_tools/presubmit_canned_checks.py +1655 -0
  338. data/vendor/depot_tools/presubmit_support.py +1923 -0
  339. data/vendor/depot_tools/profile.xml +8 -0
  340. data/vendor/depot_tools/prpc +13 -0
  341. data/vendor/depot_tools/prpc.bat +8 -0
  342. data/vendor/depot_tools/pylint +9 -0
  343. data/vendor/depot_tools/pylint-1.5 +78 -0
  344. data/vendor/depot_tools/pylint-1.6 +78 -0
  345. data/vendor/depot_tools/pylint-1.7 +78 -0
  346. data/vendor/depot_tools/pylint-1.8 +78 -0
  347. data/vendor/depot_tools/pylint-1.9 +78 -0
  348. data/vendor/depot_tools/pylint.bat +12 -0
  349. data/vendor/depot_tools/pylint_main.py +45 -0
  350. data/vendor/depot_tools/pylintrc +349 -0
  351. data/vendor/depot_tools/python-bin/python3 +7 -0
  352. data/vendor/depot_tools/python_runner.sh +60 -0
  353. data/vendor/depot_tools/rdb +12 -0
  354. data/vendor/depot_tools/rdb.bat +7 -0
  355. data/vendor/depot_tools/recipes/OWNERS +4 -0
  356. data/vendor/depot_tools/recipes/README.recipes.md +1079 -0
  357. data/vendor/depot_tools/recipes/recipe_modules/OWNERS +1 -0
  358. data/vendor/depot_tools/recipes/recipe_modules/bot_update/OWNERS +2 -0
  359. data/vendor/depot_tools/recipes/recipe_modules/bot_update/__init__.py +38 -0
  360. data/vendor/depot_tools/recipes/recipe_modules/bot_update/api.py +516 -0
  361. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic.json +117 -0
  362. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic_luci.json +117 -0
  363. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic_with_branch_heads.json +118 -0
  364. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/clobber.json +211 -0
  365. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/deprecated_got_revision_mapping.json +194 -0
  366. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/gerrit_no_rebase_patch_ref.json +211 -0
  367. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/gerrit_no_reset.json +211 -0
  368. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/input_commit_with_id_without_repo.json +210 -0
  369. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/multiple_patch_refs.json +214 -0
  370. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_apply_patch_on_gclient.json +265 -0
  371. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_cp_checkout_HEAD.json +65 -0
  372. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_cp_checkout_a_branch_head.json +65 -0
  373. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_cp_checkout_a_specific_commit.json +65 -0
  374. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_cp_checkout_master.json +65 -0
  375. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/refs.json +212 -0
  376. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/reset_root_solution_revision.json +210 -0
  377. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/resolve_chromium_fixed_version.json +117 -0
  378. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail.json +95 -0
  379. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail_patch.json +209 -0
  380. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail_patch_download.json +193 -0
  381. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_angle.json +265 -0
  382. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_branch_heads.json +261 -0
  383. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_feature_branch.json +261 -0
  384. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_v8_feature_branch.json +265 -0
  385. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_webrtc.json +265 -0
  386. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_v8.json +265 -0
  387. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_v8_head_by_default.json +265 -0
  388. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/unrecognized_commit_repo.json +8 -0
  389. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/with_tags.json +211 -0
  390. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.py +308 -0
  391. data/vendor/depot_tools/recipes/recipe_modules/bot_update/resources/__init__.py +0 -0
  392. data/vendor/depot_tools/recipes/recipe_modules/bot_update/resources/bot_update.py +1258 -0
  393. data/vendor/depot_tools/recipes/recipe_modules/bot_update/test_api.py +93 -0
  394. data/vendor/depot_tools/recipes/recipe_modules/bot_update/tests/do_not_retry_patch_failures_in_cq.py +42 -0
  395. data/vendor/depot_tools/recipes/recipe_modules/bot_update/tests/ensure_checkout.py +35 -0
  396. data/vendor/depot_tools/recipes/recipe_modules/cipd/__init__.py +9 -0
  397. data/vendor/depot_tools/recipes/recipe_modules/cipd/api.py +455 -0
  398. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/basic.json +403 -0
  399. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/basic_pkg.json +403 -0
  400. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/describe-failed.json +82 -0
  401. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/describe-many-instances.json +411 -0
  402. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/mac64.json +403 -0
  403. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_file.json +315 -0
  404. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_mode.json +313 -0
  405. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_verfile.json +313 -0
  406. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/win64.json +403 -0
  407. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.py +187 -0
  408. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/junk arch.json +5 -0
  409. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/junk bits.json +5 -0
  410. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_arm_32.json +12 -0
  411. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_arm_64.json +12 -0
  412. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_intel_32.json +12 -0
  413. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_intel_64.json +12 -0
  414. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_mips_64.json +12 -0
  415. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/mac_intel_64.json +12 -0
  416. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/win_intel_32.json +12 -0
  417. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/win_intel_64.json +12 -0
  418. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.py +59 -0
  419. data/vendor/depot_tools/recipes/recipe_modules/cipd/test_api.py +93 -0
  420. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/__init__.py +9 -0
  421. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/api.py +75 -0
  422. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/basic.json +83 -0
  423. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/basic_luci.json +83 -0
  424. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/win.json +83 -0
  425. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.py +55 -0
  426. data/vendor/depot_tools/recipes/recipe_modules/gclient/__init__.py +13 -0
  427. data/vendor/depot_tools/recipes/recipe_modules/gclient/api.py +428 -0
  428. data/vendor/depot_tools/recipes/recipe_modules/gclient/config.py +462 -0
  429. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/basic.json +238 -0
  430. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/revision.json +240 -0
  431. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/tryserver.json +238 -0
  432. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.py +95 -0
  433. data/vendor/depot_tools/recipes/recipe_modules/gclient/resources/diff_deps.py +16 -0
  434. data/vendor/depot_tools/recipes/recipe_modules/gclient/test_api.py +36 -0
  435. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/diff_deps.expected/basic.json +55 -0
  436. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/diff_deps.expected/dont have revision yet.json +84 -0
  437. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/diff_deps.expected/no change, exception.json +83 -0
  438. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/diff_deps.expected/windows.json +55 -0
  439. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/diff_deps.py +88 -0
  440. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/patch_project.py +92 -0
  441. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/sync_failure.py +24 -0
  442. data/vendor/depot_tools/recipes/recipe_modules/gerrit/__init__.py +8 -0
  443. data/vendor/depot_tools/recipes/recipe_modules/gerrit/api.py +178 -0
  444. data/vendor/depot_tools/recipes/recipe_modules/gerrit/examples/full.expected/basic.json +284 -0
  445. data/vendor/depot_tools/recipes/recipe_modules/gerrit/examples/full.py +73 -0
  446. data/vendor/depot_tools/recipes/recipe_modules/gerrit/test_api.py +53 -0
  447. data/vendor/depot_tools/recipes/recipe_modules/git/__init__.py +11 -0
  448. data/vendor/depot_tools/recipes/recipe_modules/git/api.py +405 -0
  449. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic.json +217 -0
  450. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_branch.json +217 -0
  451. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_file_name.json +219 -0
  452. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_hash.json +216 -0
  453. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_ref.json +217 -0
  454. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_submodule_update_force.json +218 -0
  455. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_tags.json +218 -0
  456. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/can_fail_build.json +164 -0
  457. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/cannot_fail_build.json +220 -0
  458. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/cat-file_test.json +239 -0
  459. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_delta.json +290 -0
  460. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_failed.json +220 -0
  461. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_with_bad_output.json +222 -0
  462. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_with_bad_output_fails_build.json +111 -0
  463. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/curl_trace_file.json +218 -0
  464. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/git-cache-checkout.json +265 -0
  465. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/platform_win.json +217 -0
  466. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/rebase_failed.json +221 -0
  467. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/remote_not_origin.json +219 -0
  468. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/set_got_revision.json +218 -0
  469. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.py +170 -0
  470. data/vendor/depot_tools/recipes/recipe_modules/git/resources/git_setup.py +52 -0
  471. data/vendor/depot_tools/recipes/recipe_modules/git/test_api.py +18 -0
  472. data/vendor/depot_tools/recipes/recipe_modules/git_cl/__init__.py +5 -0
  473. data/vendor/depot_tools/recipes/recipe_modules/git_cl/api.py +50 -0
  474. data/vendor/depot_tools/recipes/recipe_modules/git_cl/config.py +22 -0
  475. data/vendor/depot_tools/recipes/recipe_modules/git_cl/examples/full.expected/basic.json +105 -0
  476. data/vendor/depot_tools/recipes/recipe_modules/git_cl/examples/full.py +47 -0
  477. data/vendor/depot_tools/recipes/recipe_modules/gitiles/OWNERS +2 -0
  478. data/vendor/depot_tools/recipes/recipe_modules/gitiles/__init__.py +12 -0
  479. data/vendor/depot_tools/recipes/recipe_modules/gitiles/api.py +257 -0
  480. data/vendor/depot_tools/recipes/recipe_modules/gitiles/examples/full.expected/basic.json +596 -0
  481. data/vendor/depot_tools/recipes/recipe_modules/gitiles/examples/full.py +93 -0
  482. data/vendor/depot_tools/recipes/recipe_modules/gitiles/resources/gerrit_client.py +251 -0
  483. data/vendor/depot_tools/recipes/recipe_modules/gitiles/test_api.py +95 -0
  484. data/vendor/depot_tools/recipes/recipe_modules/gitiles/tests/parse_repo_url.expected/basic.json +5 -0
  485. data/vendor/depot_tools/recipes/recipe_modules/gitiles/tests/parse_repo_url.py +49 -0
  486. data/vendor/depot_tools/recipes/recipe_modules/gsutil/__init__.py +4 -0
  487. data/vendor/depot_tools/recipes/recipe_modules/gsutil/api.py +222 -0
  488. data/vendor/depot_tools/recipes/recipe_modules/gsutil/examples/full.expected/basic.json +247 -0
  489. data/vendor/depot_tools/recipes/recipe_modules/gsutil/examples/full.py +92 -0
  490. data/vendor/depot_tools/recipes/recipe_modules/gsutil/resources/gsutil_smart_retry.py +69 -0
  491. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/__init__.py +36 -0
  492. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/api.py +140 -0
  493. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/ancient_version.json +83 -0
  494. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/automatic_version.json +83 -0
  495. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/explicit_version.json +83 -0
  496. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/linux.json +21 -0
  497. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/mac.json +83 -0
  498. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/win.json +21 -0
  499. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.py +42 -0
  500. data/vendor/depot_tools/recipes/recipe_modules/presubmit/__init__.py +27 -0
  501. data/vendor/depot_tools/recipes/recipe_modules/presubmit/api.py +251 -0
  502. data/vendor/depot_tools/recipes/recipe_modules/presubmit/examples/full.expected/basic.json +27 -0
  503. data/vendor/depot_tools/recipes/recipe_modules/presubmit/examples/full.py +19 -0
  504. data/vendor/depot_tools/recipes/recipe_modules/presubmit/properties.proto +14 -0
  505. data/vendor/depot_tools/recipes/recipe_modules/presubmit/test_api.py +19 -0
  506. data/vendor/depot_tools/recipes/recipe_modules/presubmit/tests/execute.py +247 -0
  507. data/vendor/depot_tools/recipes/recipe_modules/presubmit/tests/prepare.py +49 -0
  508. data/vendor/depot_tools/recipes/recipe_modules/tryserver/__init__.py +18 -0
  509. data/vendor/depot_tools/recipes/recipe_modules/tryserver/api.py +264 -0
  510. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/basic_tags.json +57 -0
  511. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch.json +190 -0
  512. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch_and_target_ref.json +190 -0
  513. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch.json +21 -0
  514. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch_new.json +22 -0
  515. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.py +95 -0
  516. data/vendor/depot_tools/recipes/recipe_modules/tryserver/test_api.py +14 -0
  517. data/vendor/depot_tools/recipes/recipe_modules/tryserver/tests/gerrit_change_fetch_ref_timeout.py +29 -0
  518. data/vendor/depot_tools/recipes/recipe_modules/tryserver/tests/gerrit_change_owner.expected/basic.json +5 -0
  519. data/vendor/depot_tools/recipes/recipe_modules/tryserver/tests/gerrit_change_owner.py +22 -0
  520. data/vendor/depot_tools/recipes/recipe_modules/tryserver/tests/gerrit_change_target_ref.py +32 -0
  521. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/__init__.py +25 -0
  522. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/api.py +137 -0
  523. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/linux.json +21 -0
  524. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/mac.json +21 -0
  525. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/win.json +108 -0
  526. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.py +21 -0
  527. data/vendor/depot_tools/recipes/recipes.py +249 -0
  528. data/vendor/depot_tools/recipes/recipes/fetch_end_to_end_test.expected/basic.json +175 -0
  529. data/vendor/depot_tools/recipes/recipes/fetch_end_to_end_test.py +56 -0
  530. data/vendor/depot_tools/recipes/trigger_recipe_roller.txt +13 -0
  531. data/vendor/depot_tools/repo +1194 -0
  532. data/vendor/depot_tools/roll-dep +21 -0
  533. data/vendor/depot_tools/roll-dep.bat +21 -0
  534. data/vendor/depot_tools/roll_dep.py +282 -0
  535. data/vendor/depot_tools/scm.py +415 -0
  536. data/vendor/depot_tools/setup_color.py +130 -0
  537. data/vendor/depot_tools/split_cl.py +263 -0
  538. data/vendor/depot_tools/subcommand.py +261 -0
  539. data/vendor/depot_tools/subprocess2.py +258 -0
  540. data/vendor/depot_tools/third_party/__init__.py +5 -0
  541. data/vendor/depot_tools/third_party/colorama/LICENSE.txt +27 -0
  542. data/vendor/depot_tools/third_party/colorama/README.chromium +12 -0
  543. data/vendor/depot_tools/third_party/colorama/README.rst +346 -0
  544. data/vendor/depot_tools/third_party/colorama/__init__.py +6 -0
  545. data/vendor/depot_tools/third_party/colorama/ansi.py +102 -0
  546. data/vendor/depot_tools/third_party/colorama/ansitowin32.py +257 -0
  547. data/vendor/depot_tools/third_party/colorama/initialise.py +80 -0
  548. data/vendor/depot_tools/third_party/colorama/win32.py +152 -0
  549. data/vendor/depot_tools/third_party/colorama/winterm.py +169 -0
  550. data/vendor/depot_tools/third_party/coverage/AUTHORS.txt +43 -0
  551. data/vendor/depot_tools/third_party/coverage/PKG-INFO +41 -0
  552. data/vendor/depot_tools/third_party/coverage/README.chromium +13 -0
  553. data/vendor/depot_tools/third_party/coverage/__init__.py +120 -0
  554. data/vendor/depot_tools/third_party/coverage/__main__.py +4 -0
  555. data/vendor/depot_tools/third_party/coverage/annotate.py +101 -0
  556. data/vendor/depot_tools/third_party/coverage/backward.py +184 -0
  557. data/vendor/depot_tools/third_party/coverage/bytecode.py +75 -0
  558. data/vendor/depot_tools/third_party/coverage/cmdline.py +740 -0
  559. data/vendor/depot_tools/third_party/coverage/codeunit.py +145 -0
  560. data/vendor/depot_tools/third_party/coverage/collector.py +353 -0
  561. data/vendor/depot_tools/third_party/coverage/config.py +213 -0
  562. data/vendor/depot_tools/third_party/coverage/control.py +776 -0
  563. data/vendor/depot_tools/third_party/coverage/data.py +278 -0
  564. data/vendor/depot_tools/third_party/coverage/debug.py +54 -0
  565. data/vendor/depot_tools/third_party/coverage/execfile.py +171 -0
  566. data/vendor/depot_tools/third_party/coverage/files.py +309 -0
  567. data/vendor/depot_tools/third_party/coverage/fullcoverage/encodings.py +57 -0
  568. data/vendor/depot_tools/third_party/coverage/html.py +387 -0
  569. data/vendor/depot_tools/third_party/coverage/htmlfiles/coverage_html.js +376 -0
  570. data/vendor/depot_tools/third_party/coverage/htmlfiles/index.html +104 -0
  571. data/vendor/depot_tools/third_party/coverage/htmlfiles/jquery-1.4.3.min.js +166 -0
  572. data/vendor/depot_tools/third_party/coverage/htmlfiles/jquery.hotkeys.js +99 -0
  573. data/vendor/depot_tools/third_party/coverage/htmlfiles/jquery.isonscreen.js +53 -0
  574. data/vendor/depot_tools/third_party/coverage/htmlfiles/jquery.min.js +166 -0
  575. data/vendor/depot_tools/third_party/coverage/htmlfiles/jquery.tablesorter.min.js +2 -0
  576. data/vendor/depot_tools/third_party/coverage/htmlfiles/keybd_closed.png +0 -0
  577. data/vendor/depot_tools/third_party/coverage/htmlfiles/keybd_open.png +0 -0
  578. data/vendor/depot_tools/third_party/coverage/htmlfiles/pyfile.html +90 -0
  579. data/vendor/depot_tools/third_party/coverage/htmlfiles/style.css +300 -0
  580. data/vendor/depot_tools/third_party/coverage/misc.py +163 -0
  581. data/vendor/depot_tools/third_party/coverage/parser.py +666 -0
  582. data/vendor/depot_tools/third_party/coverage/phystokens.py +208 -0
  583. data/vendor/depot_tools/third_party/coverage/report.py +92 -0
  584. data/vendor/depot_tools/third_party/coverage/results.py +286 -0
  585. data/vendor/depot_tools/third_party/coverage/summary.py +86 -0
  586. data/vendor/depot_tools/third_party/coverage/templite.py +166 -0
  587. data/vendor/depot_tools/third_party/coverage/version.py +9 -0
  588. data/vendor/depot_tools/third_party/coverage/xmlreport.py +155 -0
  589. data/vendor/depot_tools/third_party/httplib2/LICENSE +1339 -0
  590. data/vendor/depot_tools/third_party/httplib2/README.chromium +15 -0
  591. data/vendor/depot_tools/third_party/httplib2/__init__.py +1780 -0
  592. data/vendor/depot_tools/third_party/httplib2/cacerts.txt +2196 -0
  593. data/vendor/depot_tools/third_party/httplib2/iri2uri.py +110 -0
  594. data/vendor/depot_tools/third_party/httplib2/socks.py +448 -0
  595. data/vendor/depot_tools/third_party/repo/COPYING +202 -0
  596. data/vendor/depot_tools/third_party/repo/README.chromium +4 -0
  597. data/vendor/depot_tools/third_party/repo/__init__.py +0 -0
  598. data/vendor/depot_tools/third_party/repo/progress.py +117 -0
  599. data/vendor/depot_tools/third_party/retry_decorator/LICENSE.google +30 -0
  600. data/vendor/depot_tools/third_party/retry_decorator/__init__.py +0 -0
  601. data/vendor/depot_tools/third_party/retry_decorator/decorators.py +45 -0
  602. data/vendor/depot_tools/third_party/schema/.editorconfig +15 -0
  603. data/vendor/depot_tools/third_party/schema/.gitignore +174 -0
  604. data/vendor/depot_tools/third_party/schema/.travis.yml +37 -0
  605. data/vendor/depot_tools/third_party/schema/LICENSE-MIT +19 -0
  606. data/vendor/depot_tools/third_party/schema/MANIFEST.in +1 -0
  607. data/vendor/depot_tools/third_party/schema/README.chromium +12 -0
  608. data/vendor/depot_tools/third_party/schema/README.rst +382 -0
  609. data/vendor/depot_tools/third_party/schema/__init__.py +1 -0
  610. data/vendor/depot_tools/third_party/schema/schema.py +338 -0
  611. data/vendor/depot_tools/third_party/schema/setup.cfg +5 -0
  612. data/vendor/depot_tools/third_party/schema/setup.py +30 -0
  613. data/vendor/depot_tools/third_party/schema/test_schema.py +556 -0
  614. data/vendor/depot_tools/third_party/schema/tox.ini +33 -0
  615. data/vendor/depot_tools/third_party/six/LICENSE.txt +18 -0
  616. data/vendor/depot_tools/third_party/six/README.chromium +10 -0
  617. data/vendor/depot_tools/third_party/six/__init__.py +762 -0
  618. data/vendor/depot_tools/update_depot_tools +138 -0
  619. data/vendor/depot_tools/update_depot_tools.bat +65 -0
  620. data/vendor/depot_tools/update_depot_tools_toggle.py +38 -0
  621. data/vendor/depot_tools/upload_metrics.py +26 -0
  622. data/vendor/depot_tools/upload_to_google_storage.py +306 -0
  623. data/vendor/depot_tools/vpython +42 -0
  624. data/vendor/depot_tools/vpython.bat +7 -0
  625. data/vendor/depot_tools/vpython3 +55 -0
  626. data/vendor/depot_tools/vpython3.bat +12 -0
  627. data/vendor/depot_tools/watchlists.py +141 -0
  628. data/vendor/depot_tools/weekly +54 -0
  629. data/vendor/depot_tools/win32imports.py +61 -0
  630. data/vendor/depot_tools/win_toolchain/OWNERS +2 -0
  631. data/vendor/depot_tools/win_toolchain/README.md +74 -0
  632. data/vendor/depot_tools/win_toolchain/get_toolchain_if_necessary.py +599 -0
  633. data/vendor/depot_tools/win_toolchain/package_from_installed.py +524 -0
  634. data/vendor/depot_tools/wtf +81 -0
  635. data/vendor/depot_tools/yapf +21 -0
  636. data/vendor/depot_tools/yapf.bat +12 -0
  637. data/vendor/depot_tools/zsh-goodies/README +6 -0
  638. data/vendor/depot_tools/zsh-goodies/_gclient +14 -0
  639. metadata +729 -0
@@ -0,0 +1,130 @@
1
+ #!/usr/bin/env python
2
+ # Copyright (c) 2016 The Chromium Authors. All rights reserved.
3
+ # Use of this source code is governed by a BSD-style license that can be
4
+ # found in the LICENSE file.
5
+
6
+ from __future__ import print_function
7
+
8
+ import ctypes
9
+ import os
10
+ import platform
11
+ import subprocess
12
+ import sys
13
+ from third_party import colorama
14
+
15
+ IS_TTY = None
16
+ OUT_TYPE = 'unknown'
17
+
18
+
19
+ def enable_native_ansi():
20
+ """Enables native ANSI sequences in console. Windows 10 only.
21
+
22
+ Returns whether successful.
23
+ """
24
+ kernel32 = ctypes.windll.kernel32
25
+ ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x04
26
+
27
+ out_handle = kernel32.GetStdHandle(subprocess.STD_OUTPUT_HANDLE)
28
+
29
+ # GetConsoleMode fails if the terminal isn't native.
30
+ mode = ctypes.wintypes.DWORD()
31
+ if kernel32.GetConsoleMode(out_handle, ctypes.byref(mode)) == 0:
32
+ return False
33
+
34
+ if not (mode.value & ENABLE_VIRTUAL_TERMINAL_PROCESSING):
35
+ if kernel32.SetConsoleMode(
36
+ out_handle, mode.value | ENABLE_VIRTUAL_TERMINAL_PROCESSING) == 0:
37
+ print(
38
+ 'kernel32.SetConsoleMode to enable ANSI sequences failed',
39
+ file=sys.stderr)
40
+ return False
41
+
42
+ return True
43
+
44
+
45
+ def init():
46
+ # should_wrap instructs colorama to wrap stdout/stderr with an ASNI colorcode
47
+ # interpreter that converts them to SetConsoleTextAttribute calls. This only
48
+ # should be True in cases where we're connected to cmd.exe's console. Setting
49
+ # this to True on non-windows systems has no effect.
50
+ should_wrap = False
51
+ global IS_TTY, OUT_TYPE
52
+ IS_TTY = sys.stdout.isatty()
53
+ if IS_TTY:
54
+ # Yay! We detected a console in the normal way. It doesn't really matter
55
+ # if it's windows or not, we win.
56
+ OUT_TYPE = 'console'
57
+ should_wrap = True
58
+ elif sys.platform.startswith('win'):
59
+ # assume this is some sort of file
60
+ OUT_TYPE = 'file (win)'
61
+
62
+ import msvcrt
63
+ h = msvcrt.get_osfhandle(sys.stdout.fileno())
64
+ # h is the win32 HANDLE for stdout.
65
+ ftype = ctypes.windll.kernel32.GetFileType(h)
66
+ if ftype == 2: # FILE_TYPE_CHAR
67
+ # This is a normal cmd console, but we'll only get here if we're running
68
+ # inside a `git command` which is actually git->bash->command. Not sure
69
+ # why isatty doesn't detect this case.
70
+ OUT_TYPE = 'console (cmd via msys)'
71
+ IS_TTY = True
72
+ should_wrap = True
73
+ elif ftype == 3: # FILE_TYPE_PIPE
74
+ OUT_TYPE = 'pipe (win)'
75
+ # This is some kind of pipe on windows. This could either be a real pipe
76
+ # or this could be msys using a pipe to emulate a pty. We use the same
77
+ # algorithm that msys-git uses to determine if it's connected to a pty or
78
+ # not.
79
+
80
+ # This function and the structures are defined in the MSDN documentation
81
+ # using the same names.
82
+ def NT_SUCCESS(status):
83
+ # The first two bits of status are the severity. The success
84
+ # severities are 0 and 1, and the !success severities are 2 and 3.
85
+ # Therefore since ctypes interprets the default restype of the call
86
+ # to be an 'C int' (which is guaranteed to be signed 32 bits), All
87
+ # success codes are positive, and all !success codes are negative.
88
+ return status >= 0
89
+
90
+ class UNICODE_STRING(ctypes.Structure):
91
+ _fields_ = [('Length', ctypes.c_ushort),
92
+ ('MaximumLength', ctypes.c_ushort),
93
+ ('Buffer', ctypes.c_wchar_p)]
94
+
95
+ class OBJECT_NAME_INFORMATION(ctypes.Structure):
96
+ _fields_ = [('Name', UNICODE_STRING),
97
+ ('NameBuffer', ctypes.c_wchar_p)]
98
+
99
+ buf = ctypes.create_string_buffer(1024)
100
+ # Ask NT what the name of the object our stdout HANDLE is. It would be
101
+ # possible to use GetFileInformationByHandleEx, but it's only available
102
+ # on Vista+. If you're reading this in 2017 or later, feel free to
103
+ # refactor this out.
104
+ #
105
+ # The '1' here is ObjectNameInformation
106
+ if NT_SUCCESS(ctypes.windll.ntdll.NtQueryObject(h, 1, buf, len(buf)-2,
107
+ None)):
108
+ out = OBJECT_NAME_INFORMATION.from_buffer(buf)
109
+ name = out.Name.Buffer.split('\\')[-1]
110
+ IS_TTY = name.startswith('msys-') and '-pty' in name
111
+ if IS_TTY:
112
+ OUT_TYPE = 'bash (msys)'
113
+ else:
114
+ # A normal file, or an unknown file type.
115
+ pass
116
+ else:
117
+ # This is non-windows, so we trust isatty.
118
+ OUT_TYPE = 'pipe or file'
119
+
120
+ # Enable native ANSI color codes on Windows 10.
121
+ if IS_TTY and platform.release() == '10':
122
+ if enable_native_ansi():
123
+ should_wrap = False
124
+
125
+ colorama.init(wrap=should_wrap)
126
+
127
+ if __name__ == '__main__':
128
+ init()
129
+ print('IS_TTY:', IS_TTY)
130
+ print('OUT_TYPE:', OUT_TYPE)
@@ -0,0 +1,263 @@
1
+ #!/usr/bin/env python
2
+ # Copyright 2017 The Chromium Authors. All rights reserved.
3
+ # Use of this source code is governed by a BSD-style license that can be
4
+ # found in the LICENSE file.
5
+
6
+ """Splits a branch into smaller branches and uploads CLs."""
7
+
8
+ from __future__ import print_function
9
+
10
+ import collections
11
+ import os
12
+ import re
13
+ import subprocess2
14
+ import sys
15
+ import tempfile
16
+
17
+ import gclient_utils
18
+ import git_footers
19
+ import owners
20
+ import owners_finder
21
+ import scm
22
+
23
+ import git_common as git
24
+
25
+
26
+ # If a call to `git cl split` will generate more than this number of CLs, the
27
+ # command will prompt the user to make sure they know what they're doing. Large
28
+ # numbers of CLs generated by `git cl split` have caused infrastructure issues
29
+ # in the past.
30
+ CL_SPLIT_FORCE_LIMIT = 10
31
+
32
+
33
+ def ReadFile(file_path):
34
+ """Returns the content of |file_path|."""
35
+ with open(file_path) as f:
36
+ content = f.read()
37
+ return content
38
+
39
+
40
+ def EnsureInGitRepository():
41
+ """Throws an exception if the current directory is not a git repository."""
42
+ git.run('rev-parse')
43
+
44
+
45
+ def CreateBranchForDirectory(prefix, directory, upstream):
46
+ """Creates a branch named |prefix| + "_" + |directory| + "_split".
47
+
48
+ Return false if the branch already exists. |upstream| is used as upstream for
49
+ the created branch.
50
+ """
51
+ existing_branches = set(git.branches(use_limit = False))
52
+ branch_name = prefix + '_' + directory + '_split'
53
+ if branch_name in existing_branches:
54
+ return False
55
+ git.run('checkout', '-t', upstream, '-b', branch_name)
56
+ return True
57
+
58
+
59
+ def FormatDescriptionOrComment(txt, directory):
60
+ """Replaces $directory with |directory| in |txt|."""
61
+ return txt.replace('$directory', '/' + directory)
62
+
63
+
64
+ def AddUploadedByGitClSplitToDescription(description):
65
+ """Adds a 'This CL was uploaded by git cl split.' line to |description|.
66
+
67
+ The line is added before footers, or at the end of |description| if it has no
68
+ footers.
69
+ """
70
+ split_footers = git_footers.split_footers(description)
71
+ lines = split_footers[0]
72
+ if not lines[-1] or lines[-1].isspace():
73
+ lines = lines + ['']
74
+ lines = lines + ['This CL was uploaded by git cl split.']
75
+ if split_footers[1]:
76
+ lines += [''] + split_footers[1]
77
+ return '\n'.join(lines)
78
+
79
+
80
+ def UploadCl(refactor_branch, refactor_branch_upstream, directory, files,
81
+ description, comment, reviewers, changelist, cmd_upload,
82
+ cq_dry_run, enable_auto_submit, repository_root):
83
+ """Uploads a CL with all changes to |files| in |refactor_branch|.
84
+
85
+ Args:
86
+ refactor_branch: Name of the branch that contains the changes to upload.
87
+ refactor_branch_upstream: Name of the upstream of |refactor_branch|.
88
+ directory: Path to the directory that contains the OWNERS file for which
89
+ to upload a CL.
90
+ files: List of AffectedFile instances to include in the uploaded CL.
91
+ description: Description of the uploaded CL.
92
+ comment: Comment to post on the uploaded CL.
93
+ reviewers: A set of reviewers for the CL.
94
+ changelist: The Changelist class.
95
+ cmd_upload: The function associated with the git cl upload command.
96
+ cq_dry_run: If CL uploads should also do a cq dry run.
97
+ enable_auto_submit: If CL uploads should also enable auto submit.
98
+ """
99
+ # Create a branch.
100
+ if not CreateBranchForDirectory(
101
+ refactor_branch, directory, refactor_branch_upstream):
102
+ print('Skipping ' + directory + ' for which a branch already exists.')
103
+ return
104
+
105
+ # Checkout all changes to files in |files|.
106
+ deleted_files = []
107
+ modified_files = []
108
+ for action, f in files:
109
+ abspath = os.path.abspath(os.path.join(repository_root, f))
110
+ if action == 'D':
111
+ deleted_files.append(abspath)
112
+ else:
113
+ modified_files.append(abspath)
114
+
115
+ if deleted_files:
116
+ git.run(*['rm'] + deleted_files)
117
+ if modified_files:
118
+ git.run(*['checkout', refactor_branch, '--'] + modified_files)
119
+
120
+ # Commit changes. The temporary file is created with delete=False so that it
121
+ # can be deleted manually after git has read it rather than automatically
122
+ # when it is closed.
123
+ with gclient_utils.temporary_file() as tmp_file:
124
+ gclient_utils.FileWrite(
125
+ tmp_file, FormatDescriptionOrComment(description, directory))
126
+ git.run('commit', '-F', tmp_file)
127
+
128
+ # Upload a CL.
129
+ upload_args = ['-f', '-r', ','.join(reviewers)]
130
+ if cq_dry_run:
131
+ upload_args.append('--cq-dry-run')
132
+ if not comment:
133
+ upload_args.append('--send-mail')
134
+ if enable_auto_submit:
135
+ upload_args.append('--enable-auto-submit')
136
+ print('Uploading CL for ' + directory + '.')
137
+ cmd_upload(upload_args)
138
+ if comment:
139
+ changelist().AddComment(FormatDescriptionOrComment(comment, directory),
140
+ publish=True)
141
+
142
+
143
+ def GetFilesSplitByOwners(owners_database, files):
144
+ """Returns a map of files split by OWNERS file.
145
+
146
+ Returns:
147
+ A map where keys are paths to directories containing an OWNERS file and
148
+ values are lists of files sharing an OWNERS file.
149
+ """
150
+ files_split_by_owners = collections.defaultdict(list)
151
+ for action, path in files:
152
+ enclosing_dir = owners_database.enclosing_dir_with_owners(path)
153
+ files_split_by_owners[enclosing_dir].append((action, path))
154
+ return files_split_by_owners
155
+
156
+
157
+ def PrintClInfo(cl_index, num_cls, directory, file_paths, description,
158
+ reviewers):
159
+ """Prints info about a CL.
160
+
161
+ Args:
162
+ cl_index: The index of this CL in the list of CLs to upload.
163
+ num_cls: The total number of CLs that will be uploaded.
164
+ directory: Path to the directory that contains the OWNERS file for which
165
+ to upload a CL.
166
+ file_paths: A list of files in this CL.
167
+ description: The CL description.
168
+ reviewers: A set of reviewers for this CL.
169
+ """
170
+ description_lines = FormatDescriptionOrComment(description,
171
+ directory).splitlines()
172
+ indented_description = '\n'.join([' ' + l for l in description_lines])
173
+
174
+ print('CL {}/{}'.format(cl_index, num_cls))
175
+ print('Path: {}'.format(directory))
176
+ print('Reviewers: {}'.format(', '.join(reviewers)))
177
+ print('\n' + indented_description + '\n')
178
+ print('\n'.join(file_paths))
179
+ print()
180
+
181
+
182
+ def SplitCl(description_file, comment_file, changelist, cmd_upload, dry_run,
183
+ cq_dry_run, enable_auto_submit, repository_root):
184
+ """"Splits a branch into smaller branches and uploads CLs.
185
+
186
+ Args:
187
+ description_file: File containing the description of uploaded CLs.
188
+ comment_file: File containing the comment of uploaded CLs.
189
+ changelist: The Changelist class.
190
+ cmd_upload: The function associated with the git cl upload command.
191
+ dry_run: Whether this is a dry run (no branches or CLs created).
192
+ cq_dry_run: If CL uploads should also do a cq dry run.
193
+ enable_auto_submit: If CL uploads should also enable auto submit.
194
+
195
+ Returns:
196
+ 0 in case of success. 1 in case of error.
197
+ """
198
+ description = AddUploadedByGitClSplitToDescription(ReadFile(description_file))
199
+ comment = ReadFile(comment_file) if comment_file else None
200
+
201
+ try:
202
+ EnsureInGitRepository()
203
+
204
+ cl = changelist()
205
+ upstream = cl.GetCommonAncestorWithUpstream()
206
+ files = [
207
+ (action.strip(), f)
208
+ for action, f in scm.GIT.CaptureStatus(repository_root, upstream)
209
+ ]
210
+
211
+ if not files:
212
+ print('Cannot split an empty CL.')
213
+ return 1
214
+
215
+ author = git.run('config', 'user.email').strip() or None
216
+ refactor_branch = git.current_branch()
217
+ assert refactor_branch, "Can't run from detached branch."
218
+ refactor_branch_upstream = git.upstream(refactor_branch)
219
+ assert refactor_branch_upstream, \
220
+ "Branch %s must have an upstream." % refactor_branch
221
+
222
+ owners_database = owners.Database(repository_root, open, os.path)
223
+ owners_database.load_data_needed_for([f for _, f in files])
224
+
225
+ files_split_by_owners = GetFilesSplitByOwners(owners_database, files)
226
+
227
+ num_cls = len(files_split_by_owners)
228
+ print('Will split current branch (' + refactor_branch + ') into ' +
229
+ str(num_cls) + ' CLs.\n')
230
+ if cq_dry_run and num_cls > CL_SPLIT_FORCE_LIMIT:
231
+ print(
232
+ 'This will generate "%r" CLs. This many CLs can potentially generate'
233
+ ' too much load on the build infrastructure. Please email'
234
+ ' infra-dev@chromium.org to ensure that this won\'t break anything.'
235
+ ' The infra team reserves the right to cancel your jobs if they are'
236
+ ' overloading the CQ.' % num_cls)
237
+ answer = gclient_utils.AskForData('Proceed? (y/n):')
238
+ if answer.lower() != 'y':
239
+ return 0
240
+
241
+ for cl_index, (directory, files) in \
242
+ enumerate(files_split_by_owners.items(), 1):
243
+ # Use '/' as a path separator in the branch name and the CL description
244
+ # and comment.
245
+ directory = directory.replace(os.path.sep, '/')
246
+ file_paths = [f for _, f in files]
247
+ reviewers = owners_database.reviewers_for(file_paths, author)
248
+
249
+ if dry_run:
250
+ PrintClInfo(cl_index, num_cls, directory, file_paths, description,
251
+ reviewers)
252
+ else:
253
+ UploadCl(refactor_branch, refactor_branch_upstream, directory, files,
254
+ description, comment, reviewers, changelist, cmd_upload,
255
+ cq_dry_run, enable_auto_submit, repository_root)
256
+
257
+ # Go back to the original branch.
258
+ git.run('checkout', refactor_branch)
259
+
260
+ except subprocess2.CalledProcessError as cpe:
261
+ sys.stderr.write(cpe.stderr)
262
+ return 1
263
+ return 0
@@ -0,0 +1,261 @@
1
+ # Copyright 2013 The Chromium Authors. All rights reserved.
2
+ # Use of this source code is governed by a BSD-style license that can be
3
+ # found in the LICENSE file.
4
+
5
+ """Manages subcommands in a script.
6
+
7
+ Each subcommand should look like this:
8
+ @usage('[pet name]')
9
+ def CMDpet(parser, args):
10
+ '''Prints a pet.
11
+
12
+ Many people likes pet. This command prints a pet for your pleasure.
13
+ '''
14
+ parser.add_option('--color', help='color of your pet')
15
+ options, args = parser.parse_args(args)
16
+ if len(args) != 1:
17
+ parser.error('A pet name is required')
18
+ pet = args[0]
19
+ if options.color:
20
+ print('Nice %s %d' % (options.color, pet))
21
+ else:
22
+ print('Nice %s' % pet)
23
+ return 0
24
+
25
+ Explanation:
26
+ - usage decorator alters the 'usage: %prog' line in the command's help.
27
+ - docstring is used to both short help line and long help line.
28
+ - parser can be augmented with arguments.
29
+ - return the exit code.
30
+ - Every function in the specified module with a name starting with 'CMD' will
31
+ be a subcommand.
32
+ - The module's docstring will be used in the default 'help' page.
33
+ - If a command has no docstring, it will not be listed in the 'help' page.
34
+ Useful to keep compatibility commands around or aliases.
35
+ - If a command is an alias to another one, it won't be documented. E.g.:
36
+ CMDoldname = CMDnewcmd
37
+ will result in oldname not being documented but supported and redirecting to
38
+ newcmd. Make it a real function that calls the old function if you want it
39
+ to be documented.
40
+ - CMDfoo_bar will be command 'foo-bar'.
41
+ """
42
+
43
+ import difflib
44
+ import sys
45
+ import textwrap
46
+
47
+
48
+ def usage(more):
49
+ """Adds a 'usage_more' property to a CMD function."""
50
+ def hook(fn):
51
+ fn.usage_more = more
52
+ return fn
53
+ return hook
54
+
55
+
56
+ def epilog(text):
57
+ """Adds an 'epilog' property to a CMD function.
58
+
59
+ It will be shown in the epilog. Usually useful for examples.
60
+ """
61
+ def hook(fn):
62
+ fn.epilog = text
63
+ return fn
64
+ return hook
65
+
66
+
67
+ def CMDhelp(parser, args):
68
+ """Prints list of commands or help for a specific command."""
69
+ # This is the default help implementation. It can be disabled or overridden if
70
+ # wanted.
71
+ if not any(i in ('-h', '--help') for i in args):
72
+ args = args + ['--help']
73
+ parser.parse_args(args)
74
+ # Never gets there.
75
+ assert False
76
+
77
+
78
+ def _get_color_module():
79
+ """Returns the colorama module if available.
80
+
81
+ If so, assumes colors are supported and return the module handle.
82
+ """
83
+ return sys.modules.get('colorama') or sys.modules.get('third_party.colorama')
84
+
85
+
86
+ def _function_to_name(name):
87
+ """Returns the name of a CMD function."""
88
+ return name[3:].replace('_', '-')
89
+
90
+
91
+ class CommandDispatcher(object):
92
+ def __init__(self, module):
93
+ """module is the name of the main python module where to look for commands.
94
+
95
+ The python builtin variable __name__ MUST be used for |module|. If the
96
+ script is executed in the form 'python script.py', __name__ == '__main__'
97
+ and sys.modules['script'] doesn't exist. On the other hand if it is unit
98
+ tested, __main__ will be the unit test's module so it has to reference to
99
+ itself with 'script'. __name__ always match the right value.
100
+ """
101
+ self.module = sys.modules[module]
102
+
103
+ def enumerate_commands(self):
104
+ """Returns a dict of command and their handling function.
105
+
106
+ The commands must be in the '__main__' modules. To import a command from a
107
+ submodule, use:
108
+ from mysubcommand import CMDfoo
109
+
110
+ Automatically adds 'help' if not already defined.
111
+
112
+ Normalizes '_' in the commands to '-'.
113
+
114
+ A command can be effectively disabled by defining a global variable to None,
115
+ e.g.:
116
+ CMDhelp = None
117
+ """
118
+ cmds = dict(
119
+ (_function_to_name(name), getattr(self.module, name))
120
+ for name in dir(self.module) if name.startswith('CMD'))
121
+ cmds.setdefault('help', CMDhelp)
122
+ return cmds
123
+
124
+ def find_nearest_command(self, name_asked):
125
+ """Retrieves the function to handle a command as supplied by the user.
126
+
127
+ It automatically tries to guess the _intended command_ by handling typos
128
+ and/or incomplete names.
129
+ """
130
+ commands = self.enumerate_commands()
131
+ name_to_dash = name_asked.replace('_', '-')
132
+ if name_to_dash in commands:
133
+ return commands[name_to_dash]
134
+
135
+ # An exact match was not found. Try to be smart and look if there's
136
+ # something similar.
137
+ commands_with_prefix = [c for c in commands if c.startswith(name_asked)]
138
+ if len(commands_with_prefix) == 1:
139
+ return commands[commands_with_prefix[0]]
140
+
141
+ # A #closeenough approximation of levenshtein distance.
142
+ def close_enough(a, b):
143
+ return difflib.SequenceMatcher(a=a, b=b).ratio()
144
+
145
+ hamming_commands = sorted(
146
+ ((close_enough(c, name_asked), c) for c in commands),
147
+ reverse=True)
148
+ if (hamming_commands[0][0] - hamming_commands[1][0]) < 0.3:
149
+ # Too ambiguous.
150
+ return
151
+
152
+ if hamming_commands[0][0] < 0.8:
153
+ # Not similar enough. Don't be a fool and run a random command.
154
+ return
155
+
156
+ return commands[hamming_commands[0][1]]
157
+
158
+ def _gen_commands_list(self):
159
+ """Generates the short list of supported commands."""
160
+ commands = self.enumerate_commands()
161
+ docs = sorted(
162
+ (cmd_name, self._create_command_summary(cmd_name, handler))
163
+ for cmd_name, handler in commands.items())
164
+ # Skip commands without a docstring.
165
+ docs = [i for i in docs if i[1]]
166
+ # Then calculate maximum length for alignment:
167
+ length = max(len(c) for c in commands)
168
+
169
+ # Look if color is supported.
170
+ colors = _get_color_module()
171
+ green = reset = ''
172
+ if colors:
173
+ green = colors.Fore.GREEN
174
+ reset = colors.Fore.RESET
175
+ return (
176
+ 'Commands are:\n' +
177
+ ''.join(
178
+ ' %s%-*s%s %s\n' % (green, length, cmd_name, reset, doc)
179
+ for cmd_name, doc in docs))
180
+
181
+ def _add_command_usage(self, parser, command):
182
+ """Modifies an OptionParser object with the function's documentation."""
183
+ cmd_name = _function_to_name(command.__name__)
184
+ if cmd_name == 'help':
185
+ cmd_name = '<command>'
186
+ # Use the module's docstring as the description for the 'help' command if
187
+ # available.
188
+ parser.description = (self.module.__doc__ or '').rstrip()
189
+ if parser.description:
190
+ parser.description += '\n\n'
191
+ parser.description += self._gen_commands_list()
192
+ # Do not touch epilog.
193
+ else:
194
+ # Use the command's docstring if available. For commands, unlike module
195
+ # docstring, realign.
196
+ lines = (command.__doc__ or '').rstrip().splitlines()
197
+ if lines[:1]:
198
+ rest = textwrap.dedent('\n'.join(lines[1:]))
199
+ parser.description = '\n'.join((lines[0], rest))
200
+ else:
201
+ parser.description = lines[0] if lines else ''
202
+ if parser.description:
203
+ parser.description += '\n'
204
+ parser.epilog = getattr(command, 'epilog', None)
205
+ if parser.epilog:
206
+ parser.epilog = '\n' + parser.epilog.strip() + '\n'
207
+
208
+ more = getattr(command, 'usage_more', '')
209
+ extra = '' if not more else ' ' + more
210
+ parser.set_usage('usage: %%prog %s [options]%s' % (cmd_name, extra))
211
+
212
+ @staticmethod
213
+ def _create_command_summary(cmd_name, command):
214
+ """Creates a oneliner summary from the command's docstring."""
215
+ if cmd_name != _function_to_name(command.__name__):
216
+ # Skip aliases. For example using at module level:
217
+ # CMDfoo = CMDbar
218
+ return ''
219
+ doc = command.__doc__ or ''
220
+ line = doc.split('\n', 1)[0].rstrip('.')
221
+ if not line:
222
+ return line
223
+ return (line[0].lower() + line[1:]).strip()
224
+
225
+ def execute(self, parser, args):
226
+ """Dispatches execution to the right command.
227
+
228
+ Fallbacks to 'help' if not disabled.
229
+ """
230
+ # Unconditionally disable format_description() and format_epilog().
231
+ # Technically, a formatter should be used but it's not worth (yet) the
232
+ # trouble.
233
+ parser.format_description = lambda _: parser.description or ''
234
+ parser.format_epilog = lambda _: parser.epilog or ''
235
+
236
+ if args:
237
+ if args[0] in ('-h', '--help') and len(args) > 1:
238
+ # Reverse the argument order so 'tool --help cmd' is rewritten to
239
+ # 'tool cmd --help'.
240
+ args = [args[1], args[0]] + args[2:]
241
+ command = self.find_nearest_command(args[0])
242
+ if command:
243
+ if command.__name__ == 'CMDhelp' and len(args) > 1:
244
+ # Reverse the argument order so 'tool help cmd' is rewritten to
245
+ # 'tool cmd --help'. Do it here since we want 'tool help cmd' to work
246
+ # too.
247
+ args = [args[1], '--help'] + args[2:]
248
+ command = self.find_nearest_command(args[0]) or command
249
+
250
+ # "fix" the usage and the description now that we know the subcommand.
251
+ self._add_command_usage(parser, command)
252
+ return command(parser, args[1:])
253
+
254
+ cmdhelp = self.enumerate_commands().get('help')
255
+ if cmdhelp:
256
+ # Not a known command. Default to help.
257
+ self._add_command_usage(parser, cmdhelp)
258
+ return cmdhelp(parser, args)
259
+
260
+ # Nothing can be done.
261
+ return 2