libv8 8.4.255.0

Sign up to get free protection for your applications and to get access to all the features.
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,1280 @@
1
+ # Copyright (c) 2012 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
+ """Generic utils."""
6
+
7
+ from __future__ import print_function
8
+
9
+ import codecs
10
+ import collections
11
+ import contextlib
12
+ import datetime
13
+ import functools
14
+ import io
15
+ import logging
16
+ import operator
17
+ import os
18
+ import pipes
19
+ import platform
20
+ import re
21
+ import stat
22
+ import subprocess
23
+ import sys
24
+ import tempfile
25
+ import threading
26
+ import time
27
+ import subprocess2
28
+
29
+ if sys.version_info.major == 2:
30
+ from cStringIO import StringIO
31
+ import collections as collections_abc
32
+ import Queue as queue
33
+ import urlparse
34
+ else:
35
+ from collections import abc as collections_abc
36
+ from io import StringIO
37
+ import queue
38
+ import urllib.parse as urlparse
39
+
40
+
41
+ RETRY_MAX = 3
42
+ RETRY_INITIAL_SLEEP = 0.5
43
+ START = datetime.datetime.now()
44
+
45
+
46
+ _WARNINGS = []
47
+
48
+
49
+ # These repos are known to cause OOM errors on 32-bit platforms, due the the
50
+ # very large objects they contain. It is not safe to use threaded index-pack
51
+ # when cloning/fetching them.
52
+ THREADED_INDEX_PACK_BLOCKLIST = [
53
+ 'https://chromium.googlesource.com/chromium/reference_builds/chrome_win.git'
54
+ ]
55
+
56
+ """To support rethrowing exceptions with tracebacks on both Py2 and 3."""
57
+ if sys.version_info.major == 2:
58
+ # We have to use exec to avoid a SyntaxError in Python 3.
59
+ exec("def reraise(typ, value, tb=None):\n raise typ, value, tb\n")
60
+ else:
61
+ def reraise(typ, value, tb=None):
62
+ if value is None:
63
+ value = typ()
64
+ if value.__traceback__ is not tb:
65
+ raise value.with_traceback(tb)
66
+ raise value
67
+
68
+
69
+ class Error(Exception):
70
+ """gclient exception class."""
71
+ def __init__(self, msg, *args, **kwargs):
72
+ index = getattr(threading.currentThread(), 'index', 0)
73
+ if index:
74
+ msg = '\n'.join('%d> %s' % (index, l) for l in msg.splitlines())
75
+ super(Error, self).__init__(msg, *args, **kwargs)
76
+
77
+
78
+ def Elapsed(until=None):
79
+ if until is None:
80
+ until = datetime.datetime.now()
81
+ return str(until - START).partition('.')[0]
82
+
83
+
84
+ def PrintWarnings():
85
+ """Prints any accumulated warnings."""
86
+ if _WARNINGS:
87
+ print('\n\nWarnings:', file=sys.stderr)
88
+ for warning in _WARNINGS:
89
+ print(warning, file=sys.stderr)
90
+
91
+
92
+ def AddWarning(msg):
93
+ """Adds the given warning message to the list of accumulated warnings."""
94
+ _WARNINGS.append(msg)
95
+
96
+
97
+ def SplitUrlRevision(url):
98
+ """Splits url and returns a two-tuple: url, rev"""
99
+ if url.startswith('ssh:'):
100
+ # Make sure ssh://user-name@example.com/~/test.git@stable works
101
+ regex = r'(ssh://(?:[-.\w]+@)?[-\w:\.]+/[-~\w\./]+)(?:@(.+))?'
102
+ components = re.search(regex, url).groups()
103
+ else:
104
+ components = url.rsplit('@', 1)
105
+ if re.match(r'^\w+\@', url) and '@' not in components[0]:
106
+ components = [url]
107
+
108
+ if len(components) == 1:
109
+ components += [None]
110
+ return tuple(components)
111
+
112
+
113
+ def IsGitSha(revision):
114
+ """Returns true if the given string is a valid hex-encoded sha"""
115
+ return re.match('^[a-fA-F0-9]{6,40}$', revision) is not None
116
+
117
+
118
+ def IsFullGitSha(revision):
119
+ """Returns true if the given string is a valid hex-encoded full sha"""
120
+ return re.match('^[a-fA-F0-9]{40}$', revision) is not None
121
+
122
+
123
+ def IsDateRevision(revision):
124
+ """Returns true if the given revision is of the form "{ ... }"."""
125
+ return bool(revision and re.match(r'^\{.+\}$', str(revision)))
126
+
127
+
128
+ def MakeDateRevision(date):
129
+ """Returns a revision representing the latest revision before the given
130
+ date."""
131
+ return "{" + date + "}"
132
+
133
+
134
+ def SyntaxErrorToError(filename, e):
135
+ """Raises a gclient_utils.Error exception with the human readable message"""
136
+ try:
137
+ # Try to construct a human readable error message
138
+ if filename:
139
+ error_message = 'There is a syntax error in %s\n' % filename
140
+ else:
141
+ error_message = 'There is a syntax error\n'
142
+ error_message += 'Line #%s, character %s: "%s"' % (
143
+ e.lineno, e.offset, re.sub(r'[\r\n]*$', '', e.text))
144
+ except:
145
+ # Something went wrong, re-raise the original exception
146
+ raise e
147
+ else:
148
+ raise Error(error_message)
149
+
150
+
151
+ class PrintableObject(object):
152
+ def __str__(self):
153
+ output = ''
154
+ for i in dir(self):
155
+ if i.startswith('__'):
156
+ continue
157
+ output += '%s = %s\n' % (i, str(getattr(self, i, '')))
158
+ return output
159
+
160
+
161
+ def AskForData(message):
162
+ # Use this so that it can be mocked in tests on Python 2 and 3.
163
+ try:
164
+ if sys.version_info.major == 2:
165
+ return raw_input(message)
166
+ return input(message)
167
+ except KeyboardInterrupt:
168
+ # Hide the exception.
169
+ sys.exit(1)
170
+
171
+
172
+ def FileRead(filename, mode='rbU'):
173
+ # Always decodes output to a Unicode string.
174
+ # On Python 3 newlines are converted to '\n' by default and 'U' is deprecated.
175
+ if mode == 'rbU' and sys.version_info.major == 3:
176
+ mode = 'rb'
177
+ with open(filename, mode=mode) as f:
178
+ s = f.read()
179
+ if isinstance(s, bytes):
180
+ return s.decode('utf-8', 'replace')
181
+ return s
182
+
183
+
184
+ def FileWrite(filename, content, mode='w', encoding='utf-8'):
185
+ with codecs.open(filename, mode=mode, encoding=encoding) as f:
186
+ f.write(content)
187
+
188
+
189
+ @contextlib.contextmanager
190
+ def temporary_directory(**kwargs):
191
+ tdir = tempfile.mkdtemp(**kwargs)
192
+ try:
193
+ yield tdir
194
+ finally:
195
+ if tdir:
196
+ rmtree(tdir)
197
+
198
+
199
+ @contextlib.contextmanager
200
+ def temporary_file():
201
+ """Creates a temporary file.
202
+
203
+ On Windows, a file must be closed before it can be opened again. This function
204
+ allows to write something like:
205
+
206
+ with gclient_utils.temporary_file() as tmp:
207
+ gclient_utils.FileWrite(tmp, foo)
208
+ useful_stuff(tmp)
209
+
210
+ Instead of something like:
211
+
212
+ with tempfile.NamedTemporaryFile(delete=False) as tmp:
213
+ tmp.write(foo)
214
+ tmp.close()
215
+ try:
216
+ useful_stuff(tmp)
217
+ finally:
218
+ os.remove(tmp.name)
219
+ """
220
+ handle, name = tempfile.mkstemp()
221
+ os.close(handle)
222
+ try:
223
+ yield name
224
+ finally:
225
+ os.remove(name)
226
+
227
+
228
+ def safe_rename(old, new):
229
+ """Renames a file reliably.
230
+
231
+ Sometimes os.rename does not work because a dying git process keeps a handle
232
+ on it for a few seconds. An exception is then thrown, which make the program
233
+ give up what it was doing and remove what was deleted.
234
+ The only solution is to catch the exception and try again until it works.
235
+ """
236
+ # roughly 10s
237
+ retries = 100
238
+ for i in range(retries):
239
+ try:
240
+ os.rename(old, new)
241
+ break
242
+ except OSError:
243
+ if i == (retries - 1):
244
+ # Give up.
245
+ raise
246
+ # retry
247
+ logging.debug("Renaming failed from %s to %s. Retrying ..." % (old, new))
248
+ time.sleep(0.1)
249
+
250
+
251
+ def rm_file_or_tree(path):
252
+ if os.path.isfile(path) or os.path.islink(path):
253
+ os.remove(path)
254
+ else:
255
+ rmtree(path)
256
+
257
+
258
+ def rmtree(path):
259
+ """shutil.rmtree() on steroids.
260
+
261
+ Recursively removes a directory, even if it's marked read-only.
262
+
263
+ shutil.rmtree() doesn't work on Windows if any of the files or directories
264
+ are read-only. We need to be able to force the files to be writable (i.e.,
265
+ deletable) as we traverse the tree.
266
+
267
+ Even with all this, Windows still sometimes fails to delete a file, citing
268
+ a permission error (maybe something to do with antivirus scans or disk
269
+ indexing). The best suggestion any of the user forums had was to wait a
270
+ bit and try again, so we do that too. It's hand-waving, but sometimes it
271
+ works. :/
272
+
273
+ On POSIX systems, things are a little bit simpler. The modes of the files
274
+ to be deleted doesn't matter, only the modes of the directories containing
275
+ them are significant. As the directory tree is traversed, each directory
276
+ has its mode set appropriately before descending into it. This should
277
+ result in the entire tree being removed, with the possible exception of
278
+ *path itself, because nothing attempts to change the mode of its parent.
279
+ Doing so would be hazardous, as it's not a directory slated for removal.
280
+ In the ordinary case, this is not a problem: for our purposes, the user
281
+ will never lack write permission on *path's parent.
282
+ """
283
+ if not os.path.exists(path):
284
+ return
285
+
286
+ if os.path.islink(path) or not os.path.isdir(path):
287
+ raise Error('Called rmtree(%s) in non-directory' % path)
288
+
289
+ if sys.platform == 'win32':
290
+ # Give up and use cmd.exe's rd command.
291
+ path = os.path.normcase(path)
292
+ for _ in range(3):
293
+ exitcode = subprocess.call(['cmd.exe', '/c', 'rd', '/q', '/s', path])
294
+ if exitcode == 0:
295
+ return
296
+ else:
297
+ print('rd exited with code %d' % exitcode, file=sys.stderr)
298
+ time.sleep(3)
299
+ raise Exception('Failed to remove path %s' % path)
300
+
301
+ # On POSIX systems, we need the x-bit set on the directory to access it,
302
+ # the r-bit to see its contents, and the w-bit to remove files from it.
303
+ # The actual modes of the files within the directory is irrelevant.
304
+ os.chmod(path, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR)
305
+
306
+ def remove(func, subpath):
307
+ func(subpath)
308
+
309
+ for fn in os.listdir(path):
310
+ # If fullpath is a symbolic link that points to a directory, isdir will
311
+ # be True, but we don't want to descend into that as a directory, we just
312
+ # want to remove the link. Check islink and treat links as ordinary files
313
+ # would be treated regardless of what they reference.
314
+ fullpath = os.path.join(path, fn)
315
+ if os.path.islink(fullpath) or not os.path.isdir(fullpath):
316
+ remove(os.remove, fullpath)
317
+ else:
318
+ # Recurse.
319
+ rmtree(fullpath)
320
+
321
+ remove(os.rmdir, path)
322
+
323
+
324
+ def safe_makedirs(tree):
325
+ """Creates the directory in a safe manner.
326
+
327
+ Because multiple threads can create these directories concurrently, trap the
328
+ exception and pass on.
329
+ """
330
+ count = 0
331
+ while not os.path.exists(tree):
332
+ count += 1
333
+ try:
334
+ os.makedirs(tree)
335
+ except OSError as e:
336
+ # 17 POSIX, 183 Windows
337
+ if e.errno not in (17, 183):
338
+ raise
339
+ if count > 40:
340
+ # Give up.
341
+ raise
342
+
343
+
344
+ def CommandToStr(args):
345
+ """Converts an arg list into a shell escaped string."""
346
+ return ' '.join(pipes.quote(arg) for arg in args)
347
+
348
+
349
+ class Wrapper(object):
350
+ """Wraps an object, acting as a transparent proxy for all properties by
351
+ default.
352
+ """
353
+ def __init__(self, wrapped):
354
+ self._wrapped = wrapped
355
+
356
+ def __getattr__(self, name):
357
+ return getattr(self._wrapped, name)
358
+
359
+
360
+ class AutoFlush(Wrapper):
361
+ """Creates a file object clone to automatically flush after N seconds."""
362
+ def __init__(self, wrapped, delay):
363
+ super(AutoFlush, self).__init__(wrapped)
364
+ if not hasattr(self, 'lock'):
365
+ self.lock = threading.Lock()
366
+ self.__last_flushed_at = time.time()
367
+ self.delay = delay
368
+
369
+ @property
370
+ def autoflush(self):
371
+ return self
372
+
373
+ def write(self, out, *args, **kwargs):
374
+ self._wrapped.write(out, *args, **kwargs)
375
+ should_flush = False
376
+ self.lock.acquire()
377
+ try:
378
+ if self.delay and (time.time() - self.__last_flushed_at) > self.delay:
379
+ should_flush = True
380
+ self.__last_flushed_at = time.time()
381
+ finally:
382
+ self.lock.release()
383
+ if should_flush:
384
+ self.flush()
385
+
386
+
387
+ class Annotated(Wrapper):
388
+ """Creates a file object clone to automatically prepends every line in worker
389
+ threads with a NN> prefix.
390
+ """
391
+ def __init__(self, wrapped, include_zero=False):
392
+ super(Annotated, self).__init__(wrapped)
393
+ if not hasattr(self, 'lock'):
394
+ self.lock = threading.Lock()
395
+ self.__output_buffers = {}
396
+ self.__include_zero = include_zero
397
+ self._wrapped_write = getattr(self._wrapped, 'buffer', self._wrapped).write
398
+
399
+ @property
400
+ def annotated(self):
401
+ return self
402
+
403
+ def write(self, out):
404
+ # Store as bytes to ensure Unicode characters get output correctly.
405
+ if not isinstance(out, bytes):
406
+ out = out.encode('utf-8')
407
+
408
+ index = getattr(threading.currentThread(), 'index', 0)
409
+ if not index and not self.__include_zero:
410
+ # Unindexed threads aren't buffered.
411
+ return self._wrapped_write(out)
412
+
413
+ self.lock.acquire()
414
+ try:
415
+ # Use a dummy array to hold the string so the code can be lockless.
416
+ # Strings are immutable, requiring to keep a lock for the whole dictionary
417
+ # otherwise. Using an array is faster than using a dummy object.
418
+ if not index in self.__output_buffers:
419
+ obj = self.__output_buffers[index] = [b'']
420
+ else:
421
+ obj = self.__output_buffers[index]
422
+ finally:
423
+ self.lock.release()
424
+
425
+ # Continue lockless.
426
+ obj[0] += out
427
+ while True:
428
+ cr_loc = obj[0].find(b'\r')
429
+ lf_loc = obj[0].find(b'\n')
430
+ if cr_loc == lf_loc == -1:
431
+ break
432
+ elif cr_loc == -1 or (lf_loc >= 0 and lf_loc < cr_loc):
433
+ line, remaining = obj[0].split(b'\n', 1)
434
+ if line:
435
+ self._wrapped_write(b'%d>%s\n' % (index, line))
436
+ elif lf_loc == -1 or (cr_loc >= 0 and cr_loc < lf_loc):
437
+ line, remaining = obj[0].split(b'\r', 1)
438
+ if line:
439
+ self._wrapped_write(b'%d>%s\r' % (index, line))
440
+ obj[0] = remaining
441
+
442
+ def flush(self):
443
+ """Flush buffered output."""
444
+ orphans = []
445
+ self.lock.acquire()
446
+ try:
447
+ # Detect threads no longer existing.
448
+ indexes = (getattr(t, 'index', None) for t in threading.enumerate())
449
+ indexes = filter(None, indexes)
450
+ for index in self.__output_buffers:
451
+ if not index in indexes:
452
+ orphans.append((index, self.__output_buffers[index][0]))
453
+ for orphan in orphans:
454
+ del self.__output_buffers[orphan[0]]
455
+ finally:
456
+ self.lock.release()
457
+
458
+ # Don't keep the lock while writing. Will append \n when it shouldn't.
459
+ for orphan in orphans:
460
+ if orphan[1]:
461
+ self._wrapped_write(b'%d>%s\n' % (orphan[0], orphan[1]))
462
+ return self._wrapped.flush()
463
+
464
+
465
+ def MakeFileAutoFlush(fileobj, delay=10):
466
+ autoflush = getattr(fileobj, 'autoflush', None)
467
+ if autoflush:
468
+ autoflush.delay = delay
469
+ return fileobj
470
+ return AutoFlush(fileobj, delay)
471
+
472
+
473
+ def MakeFileAnnotated(fileobj, include_zero=False):
474
+ if getattr(fileobj, 'annotated', None):
475
+ return fileobj
476
+ return Annotated(fileobj, include_zero)
477
+
478
+
479
+ GCLIENT_CHILDREN = []
480
+ GCLIENT_CHILDREN_LOCK = threading.Lock()
481
+
482
+
483
+ class GClientChildren(object):
484
+ @staticmethod
485
+ def add(popen_obj):
486
+ with GCLIENT_CHILDREN_LOCK:
487
+ GCLIENT_CHILDREN.append(popen_obj)
488
+
489
+ @staticmethod
490
+ def remove(popen_obj):
491
+ with GCLIENT_CHILDREN_LOCK:
492
+ GCLIENT_CHILDREN.remove(popen_obj)
493
+
494
+ @staticmethod
495
+ def _attemptToKillChildren():
496
+ global GCLIENT_CHILDREN
497
+ with GCLIENT_CHILDREN_LOCK:
498
+ zombies = [c for c in GCLIENT_CHILDREN if c.poll() is None]
499
+
500
+ for zombie in zombies:
501
+ try:
502
+ zombie.kill()
503
+ except OSError:
504
+ pass
505
+
506
+ with GCLIENT_CHILDREN_LOCK:
507
+ GCLIENT_CHILDREN = [k for k in GCLIENT_CHILDREN if k.poll() is not None]
508
+
509
+ @staticmethod
510
+ def _areZombies():
511
+ with GCLIENT_CHILDREN_LOCK:
512
+ return bool(GCLIENT_CHILDREN)
513
+
514
+ @staticmethod
515
+ def KillAllRemainingChildren():
516
+ GClientChildren._attemptToKillChildren()
517
+
518
+ if GClientChildren._areZombies():
519
+ time.sleep(0.5)
520
+ GClientChildren._attemptToKillChildren()
521
+
522
+ with GCLIENT_CHILDREN_LOCK:
523
+ if GCLIENT_CHILDREN:
524
+ print('Could not kill the following subprocesses:', file=sys.stderr)
525
+ for zombie in GCLIENT_CHILDREN:
526
+ print(' ', zombie.pid, file=sys.stderr)
527
+
528
+
529
+ def CheckCallAndFilter(args, print_stdout=False, filter_fn=None,
530
+ show_header=False, always_show_header=False, retry=False,
531
+ **kwargs):
532
+ """Runs a command and calls back a filter function if needed.
533
+
534
+ Accepts all subprocess2.Popen() parameters plus:
535
+ print_stdout: If True, the command's stdout is forwarded to stdout.
536
+ filter_fn: A function taking a single string argument called with each line
537
+ of the subprocess2's output. Each line has the trailing newline
538
+ character trimmed.
539
+ show_header: Whether to display a header before the command output.
540
+ always_show_header: Show header even when the command produced no output.
541
+ retry: If the process exits non-zero, sleep for a brief interval and try
542
+ again, up to RETRY_MAX times.
543
+
544
+ stderr is always redirected to stdout.
545
+
546
+ Returns the output of the command as a binary string.
547
+ """
548
+ def show_header_if_necessary(needs_header, attempt):
549
+ """Show the header at most once."""
550
+ if not needs_header[0]:
551
+ return
552
+
553
+ needs_header[0] = False
554
+ # Automatically generated header. We only prepend a newline if
555
+ # always_show_header is false, since it usually indicates there's an
556
+ # external progress display, and it's better not to clobber it in that case.
557
+ header = '' if always_show_header else '\n'
558
+ header += '________ running \'%s\' in \'%s\'' % (
559
+ ' '.join(args), kwargs.get('cwd', '.'))
560
+ if attempt:
561
+ header += ' attempt %s / %s' % (attempt + 1, RETRY_MAX + 1)
562
+ header += '\n'
563
+
564
+ if print_stdout:
565
+ stdout_write = getattr(sys.stdout, 'buffer', sys.stdout).write
566
+ stdout_write(header.encode())
567
+ if filter_fn:
568
+ filter_fn(header)
569
+
570
+ def filter_line(command_output, line_start):
571
+ """Extract the last line from command output and filter it."""
572
+ if not filter_fn or line_start is None:
573
+ return
574
+ command_output.seek(line_start)
575
+ filter_fn(command_output.read().decode('utf-8'))
576
+
577
+ # Initialize stdout writer if needed. On Python 3, sys.stdout does not accept
578
+ # byte inputs and sys.stdout.buffer must be used instead.
579
+ if print_stdout:
580
+ sys.stdout.flush()
581
+ stdout_write = getattr(sys.stdout, 'buffer', sys.stdout).write
582
+ else:
583
+ stdout_write = lambda _: None
584
+
585
+ sleep_interval = RETRY_INITIAL_SLEEP
586
+ run_cwd = kwargs.get('cwd', os.getcwd())
587
+ for attempt in range(RETRY_MAX + 1):
588
+ kid = subprocess2.Popen(
589
+ args, bufsize=0, stdout=subprocess2.PIPE, stderr=subprocess2.STDOUT,
590
+ **kwargs)
591
+
592
+ GClientChildren.add(kid)
593
+
594
+ # Store the output of the command regardless of the value of print_stdout or
595
+ # filter_fn.
596
+ command_output = io.BytesIO()
597
+
598
+ # Passed as a list for "by ref" semantics.
599
+ needs_header = [show_header]
600
+ if always_show_header:
601
+ show_header_if_necessary(needs_header, attempt)
602
+
603
+ # Also, we need to forward stdout to prevent weird re-ordering of output.
604
+ # This has to be done on a per byte basis to make sure it is not buffered:
605
+ # normally buffering is done for each line, but if the process requests
606
+ # input, no end-of-line character is output after the prompt and it would
607
+ # not show up.
608
+ try:
609
+ line_start = None
610
+ while True:
611
+ in_byte = kid.stdout.read(1)
612
+ is_newline = in_byte in (b'\n', b'\r')
613
+ if not in_byte:
614
+ break
615
+
616
+ show_header_if_necessary(needs_header, attempt)
617
+
618
+ if is_newline:
619
+ filter_line(command_output, line_start)
620
+ line_start = None
621
+ elif line_start is None:
622
+ line_start = command_output.tell()
623
+
624
+ stdout_write(in_byte)
625
+ command_output.write(in_byte)
626
+
627
+ # Flush the rest of buffered output.
628
+ sys.stdout.flush()
629
+ if line_start is not None:
630
+ filter_line(command_output, line_start)
631
+
632
+ rv = kid.wait()
633
+ kid.stdout.close()
634
+
635
+ # Don't put this in a 'finally,' since the child may still run if we get
636
+ # an exception.
637
+ GClientChildren.remove(kid)
638
+
639
+ except KeyboardInterrupt:
640
+ print('Failed while running "%s"' % ' '.join(args), file=sys.stderr)
641
+ raise
642
+
643
+ if rv == 0:
644
+ return command_output.getvalue()
645
+
646
+ if not retry:
647
+ break
648
+
649
+ print("WARNING: subprocess '%s' in %s failed; will retry after a short "
650
+ 'nap...' % (' '.join('"%s"' % x for x in args), run_cwd))
651
+ time.sleep(sleep_interval)
652
+ sleep_interval *= 2
653
+
654
+ raise subprocess2.CalledProcessError(
655
+ rv, args, kwargs.get('cwd', None), None, None)
656
+
657
+
658
+ class GitFilter(object):
659
+ """A filter_fn implementation for quieting down git output messages.
660
+
661
+ Allows a custom function to skip certain lines (predicate), and will throttle
662
+ the output of percentage completed lines to only output every X seconds.
663
+ """
664
+ PERCENT_RE = re.compile('(.*) ([0-9]{1,3})% .*')
665
+
666
+ def __init__(self, time_throttle=0, predicate=None, out_fh=None):
667
+ """
668
+ Args:
669
+ time_throttle (int): GitFilter will throttle 'noisy' output (such as the
670
+ XX% complete messages) to only be printed at least |time_throttle|
671
+ seconds apart.
672
+ predicate (f(line)): An optional function which is invoked for every line.
673
+ The line will be skipped if predicate(line) returns False.
674
+ out_fh: File handle to write output to.
675
+ """
676
+ self.first_line = True
677
+ self.last_time = 0
678
+ self.time_throttle = time_throttle
679
+ self.predicate = predicate
680
+ self.out_fh = out_fh or sys.stdout
681
+ self.progress_prefix = None
682
+
683
+ def __call__(self, line):
684
+ # git uses an escape sequence to clear the line; elide it.
685
+ esc = line.find(chr(0o33))
686
+ if esc > -1:
687
+ line = line[:esc]
688
+ if self.predicate and not self.predicate(line):
689
+ return
690
+ now = time.time()
691
+ match = self.PERCENT_RE.match(line)
692
+ if match:
693
+ if match.group(1) != self.progress_prefix:
694
+ self.progress_prefix = match.group(1)
695
+ elif now - self.last_time < self.time_throttle:
696
+ return
697
+ self.last_time = now
698
+ if not self.first_line:
699
+ self.out_fh.write('[%s] ' % Elapsed())
700
+ self.first_line = False
701
+ print(line, file=self.out_fh)
702
+
703
+
704
+ def FindFileUpwards(filename, path=None):
705
+ """Search upwards from the a directory (default: current) to find a file.
706
+
707
+ Returns nearest upper-level directory with the passed in file.
708
+ """
709
+ if not path:
710
+ path = os.getcwd()
711
+ path = os.path.realpath(path)
712
+ while True:
713
+ file_path = os.path.join(path, filename)
714
+ if os.path.exists(file_path):
715
+ return path
716
+ (new_path, _) = os.path.split(path)
717
+ if new_path == path:
718
+ return None
719
+ path = new_path
720
+
721
+
722
+ def GetMacWinOrLinux():
723
+ """Returns 'mac', 'win', or 'linux', matching the current platform."""
724
+ if sys.platform.startswith(('cygwin', 'win')):
725
+ return 'win'
726
+ elif sys.platform.startswith('linux'):
727
+ return 'linux'
728
+ elif sys.platform == 'darwin':
729
+ return 'mac'
730
+ raise Error('Unknown platform: ' + sys.platform)
731
+
732
+
733
+ def GetGClientRootAndEntries(path=None):
734
+ """Returns the gclient root and the dict of entries."""
735
+ config_file = '.gclient_entries'
736
+ root = FindFileUpwards(config_file, path)
737
+ if not root:
738
+ print("Can't find %s" % config_file)
739
+ return None
740
+ config_path = os.path.join(root, config_file)
741
+ env = {}
742
+ with open(config_path) as config:
743
+ exec(config.read(), env)
744
+ config_dir = os.path.dirname(config_path)
745
+ return config_dir, env['entries']
746
+
747
+
748
+ def lockedmethod(method):
749
+ """Method decorator that holds self.lock for the duration of the call."""
750
+ def inner(self, *args, **kwargs):
751
+ try:
752
+ try:
753
+ self.lock.acquire()
754
+ except KeyboardInterrupt:
755
+ print('Was deadlocked', file=sys.stderr)
756
+ raise
757
+ return method(self, *args, **kwargs)
758
+ finally:
759
+ self.lock.release()
760
+ return inner
761
+
762
+
763
+ class WorkItem(object):
764
+ """One work item."""
765
+ # On cygwin, creating a lock throwing randomly when nearing ~100 locks.
766
+ # As a workaround, use a single lock. Yep you read it right. Single lock for
767
+ # all the 100 objects.
768
+ lock = threading.Lock()
769
+
770
+ def __init__(self, name):
771
+ # A unique string representing this work item.
772
+ self._name = name
773
+ self.outbuf = StringIO()
774
+ self.start = self.finish = None
775
+ self.resources = [] # List of resources this work item requires.
776
+
777
+ def run(self, work_queue):
778
+ """work_queue is passed as keyword argument so it should be
779
+ the last parameters of the function when you override it."""
780
+ pass
781
+
782
+ @property
783
+ def name(self):
784
+ return self._name
785
+
786
+
787
+ class ExecutionQueue(object):
788
+ """Runs a set of WorkItem that have interdependencies and were WorkItem are
789
+ added as they are processed.
790
+
791
+ This class manages that all the required dependencies are run
792
+ before running each one.
793
+
794
+ Methods of this class are thread safe.
795
+ """
796
+ def __init__(self, jobs, progress, ignore_requirements, verbose=False):
797
+ """jobs specifies the number of concurrent tasks to allow. progress is a
798
+ Progress instance."""
799
+ # Set when a thread is done or a new item is enqueued.
800
+ self.ready_cond = threading.Condition()
801
+ # Maximum number of concurrent tasks.
802
+ self.jobs = jobs
803
+ # List of WorkItem, for gclient, these are Dependency instances.
804
+ self.queued = []
805
+ # List of strings representing each Dependency.name that was run.
806
+ self.ran = []
807
+ # List of items currently running.
808
+ self.running = []
809
+ # Exceptions thrown if any.
810
+ self.exceptions = queue.Queue()
811
+ # Progress status
812
+ self.progress = progress
813
+ if self.progress:
814
+ self.progress.update(0)
815
+
816
+ self.ignore_requirements = ignore_requirements
817
+ self.verbose = verbose
818
+ self.last_join = None
819
+ self.last_subproc_output = None
820
+
821
+ def enqueue(self, d):
822
+ """Enqueue one Dependency to be executed later once its requirements are
823
+ satisfied.
824
+ """
825
+ assert isinstance(d, WorkItem)
826
+ self.ready_cond.acquire()
827
+ try:
828
+ self.queued.append(d)
829
+ total = len(self.queued) + len(self.ran) + len(self.running)
830
+ if self.jobs == 1:
831
+ total += 1
832
+ logging.debug('enqueued(%s)' % d.name)
833
+ if self.progress:
834
+ self.progress._total = total
835
+ self.progress.update(0)
836
+ self.ready_cond.notifyAll()
837
+ finally:
838
+ self.ready_cond.release()
839
+
840
+ def out_cb(self, _):
841
+ self.last_subproc_output = datetime.datetime.now()
842
+ return True
843
+
844
+ @staticmethod
845
+ def format_task_output(task, comment=''):
846
+ if comment:
847
+ comment = ' (%s)' % comment
848
+ if task.start and task.finish:
849
+ elapsed = ' (Elapsed: %s)' % (
850
+ str(task.finish - task.start).partition('.')[0])
851
+ else:
852
+ elapsed = ''
853
+ return """
854
+ %s%s%s
855
+ ----------------------------------------
856
+ %s
857
+ ----------------------------------------""" % (
858
+ task.name, comment, elapsed, task.outbuf.getvalue().strip())
859
+
860
+ def _is_conflict(self, job):
861
+ """Checks to see if a job will conflict with another running job."""
862
+ for running_job in self.running:
863
+ for used_resource in running_job.item.resources:
864
+ logging.debug('Checking resource %s' % used_resource)
865
+ if used_resource in job.resources:
866
+ return True
867
+ return False
868
+
869
+ def flush(self, *args, **kwargs):
870
+ """Runs all enqueued items until all are executed."""
871
+ kwargs['work_queue'] = self
872
+ self.last_subproc_output = self.last_join = datetime.datetime.now()
873
+ self.ready_cond.acquire()
874
+ try:
875
+ while True:
876
+ # Check for task to run first, then wait.
877
+ while True:
878
+ if not self.exceptions.empty():
879
+ # Systematically flush the queue when an exception logged.
880
+ self.queued = []
881
+ self._flush_terminated_threads()
882
+ if (not self.queued and not self.running or
883
+ self.jobs == len(self.running)):
884
+ logging.debug('No more worker threads or can\'t queue anything.')
885
+ break
886
+
887
+ # Check for new tasks to start.
888
+ for i in range(len(self.queued)):
889
+ # Verify its requirements.
890
+ if (self.ignore_requirements or
891
+ not (set(self.queued[i].requirements) - set(self.ran))):
892
+ if not self._is_conflict(self.queued[i]):
893
+ # Start one work item: all its requirements are satisfied.
894
+ self._run_one_task(self.queued.pop(i), args, kwargs)
895
+ break
896
+ else:
897
+ # Couldn't find an item that could run. Break out the outher loop.
898
+ break
899
+
900
+ if not self.queued and not self.running:
901
+ # We're done.
902
+ break
903
+ # We need to poll here otherwise Ctrl-C isn't processed.
904
+ try:
905
+ self.ready_cond.wait(10)
906
+ # If we haven't printed to terminal for a while, but we have received
907
+ # spew from a suprocess, let the user know we're still progressing.
908
+ now = datetime.datetime.now()
909
+ if (now - self.last_join > datetime.timedelta(seconds=60) and
910
+ self.last_subproc_output > self.last_join):
911
+ if self.progress:
912
+ print('')
913
+ sys.stdout.flush()
914
+ elapsed = Elapsed()
915
+ print('[%s] Still working on:' % elapsed)
916
+ sys.stdout.flush()
917
+ for task in self.running:
918
+ print('[%s] %s' % (elapsed, task.item.name))
919
+ sys.stdout.flush()
920
+ except KeyboardInterrupt:
921
+ # Help debugging by printing some information:
922
+ print(
923
+ ('\nAllowed parallel jobs: %d\n# queued: %d\nRan: %s\n'
924
+ 'Running: %d') % (self.jobs, len(self.queued), ', '.join(
925
+ self.ran), len(self.running)),
926
+ file=sys.stderr)
927
+ for i in self.queued:
928
+ print(
929
+ '%s (not started): %s' % (i.name, ', '.join(i.requirements)),
930
+ file=sys.stderr)
931
+ for i in self.running:
932
+ print(
933
+ self.format_task_output(i.item, 'interrupted'), file=sys.stderr)
934
+ raise
935
+ # Something happened: self.enqueue() or a thread terminated. Loop again.
936
+ finally:
937
+ self.ready_cond.release()
938
+
939
+ assert not self.running, 'Now guaranteed to be single-threaded'
940
+ if not self.exceptions.empty():
941
+ if self.progress:
942
+ print('')
943
+ # To get back the stack location correctly, the raise a, b, c form must be
944
+ # used, passing a tuple as the first argument doesn't work.
945
+ e, task = self.exceptions.get()
946
+ print(self.format_task_output(task.item, 'ERROR'), file=sys.stderr)
947
+ reraise(e[0], e[1], e[2])
948
+ elif self.progress:
949
+ self.progress.end()
950
+
951
+ def _flush_terminated_threads(self):
952
+ """Flush threads that have terminated."""
953
+ running = self.running
954
+ self.running = []
955
+ for t in running:
956
+ if t.is_alive():
957
+ self.running.append(t)
958
+ else:
959
+ t.join()
960
+ self.last_join = datetime.datetime.now()
961
+ sys.stdout.flush()
962
+ if self.verbose:
963
+ print(self.format_task_output(t.item))
964
+ if self.progress:
965
+ self.progress.update(1, t.item.name)
966
+ if t.item.name in self.ran:
967
+ raise Error(
968
+ 'gclient is confused, "%s" is already in "%s"' % (
969
+ t.item.name, ', '.join(self.ran)))
970
+ if not t.item.name in self.ran:
971
+ self.ran.append(t.item.name)
972
+
973
+ def _run_one_task(self, task_item, args, kwargs):
974
+ if self.jobs > 1:
975
+ # Start the thread.
976
+ index = len(self.ran) + len(self.running) + 1
977
+ new_thread = self._Worker(task_item, index, args, kwargs)
978
+ self.running.append(new_thread)
979
+ new_thread.start()
980
+ else:
981
+ # Run the 'thread' inside the main thread. Don't try to catch any
982
+ # exception.
983
+ try:
984
+ task_item.start = datetime.datetime.now()
985
+ print('[%s] Started.' % Elapsed(task_item.start), file=task_item.outbuf)
986
+ task_item.run(*args, **kwargs)
987
+ task_item.finish = datetime.datetime.now()
988
+ print(
989
+ '[%s] Finished.' % Elapsed(task_item.finish), file=task_item.outbuf)
990
+ self.ran.append(task_item.name)
991
+ if self.verbose:
992
+ if self.progress:
993
+ print('')
994
+ print(self.format_task_output(task_item))
995
+ if self.progress:
996
+ self.progress.update(1, ', '.join(t.item.name for t in self.running))
997
+ except KeyboardInterrupt:
998
+ print(
999
+ self.format_task_output(task_item, 'interrupted'), file=sys.stderr)
1000
+ raise
1001
+ except Exception:
1002
+ print(self.format_task_output(task_item, 'ERROR'), file=sys.stderr)
1003
+ raise
1004
+
1005
+
1006
+ class _Worker(threading.Thread):
1007
+ """One thread to execute one WorkItem."""
1008
+ def __init__(self, item, index, args, kwargs):
1009
+ threading.Thread.__init__(self, name=item.name or 'Worker')
1010
+ logging.info('_Worker(%s) reqs:%s' % (item.name, item.requirements))
1011
+ self.item = item
1012
+ self.index = index
1013
+ self.args = args
1014
+ self.kwargs = kwargs
1015
+ self.daemon = True
1016
+
1017
+ def run(self):
1018
+ """Runs in its own thread."""
1019
+ logging.debug('_Worker.run(%s)' % self.item.name)
1020
+ work_queue = self.kwargs['work_queue']
1021
+ try:
1022
+ self.item.start = datetime.datetime.now()
1023
+ print('[%s] Started.' % Elapsed(self.item.start), file=self.item.outbuf)
1024
+ self.item.run(*self.args, **self.kwargs)
1025
+ self.item.finish = datetime.datetime.now()
1026
+ print(
1027
+ '[%s] Finished.' % Elapsed(self.item.finish), file=self.item.outbuf)
1028
+ except KeyboardInterrupt:
1029
+ logging.info('Caught KeyboardInterrupt in thread %s', self.item.name)
1030
+ logging.info(str(sys.exc_info()))
1031
+ work_queue.exceptions.put((sys.exc_info(), self))
1032
+ raise
1033
+ except Exception:
1034
+ # Catch exception location.
1035
+ logging.info('Caught exception in thread %s', self.item.name)
1036
+ logging.info(str(sys.exc_info()))
1037
+ work_queue.exceptions.put((sys.exc_info(), self))
1038
+ finally:
1039
+ logging.info('_Worker.run(%s) done', self.item.name)
1040
+ work_queue.ready_cond.acquire()
1041
+ try:
1042
+ work_queue.ready_cond.notifyAll()
1043
+ finally:
1044
+ work_queue.ready_cond.release()
1045
+
1046
+
1047
+ def GetEditor(git_editor=None):
1048
+ """Returns the most plausible editor to use.
1049
+
1050
+ In order of preference:
1051
+ - GIT_EDITOR environment variable
1052
+ - core.editor git configuration variable (if supplied by git-cl)
1053
+ - VISUAL environment variable
1054
+ - EDITOR environment variable
1055
+ - vi (non-Windows) or notepad (Windows)
1056
+
1057
+ In the case of git-cl, this matches git's behaviour, except that it does not
1058
+ include dumb terminal detection.
1059
+ """
1060
+ editor = os.environ.get('GIT_EDITOR') or git_editor
1061
+ if not editor:
1062
+ editor = os.environ.get('VISUAL')
1063
+ if not editor:
1064
+ editor = os.environ.get('EDITOR')
1065
+ if not editor:
1066
+ if sys.platform.startswith('win'):
1067
+ editor = 'notepad'
1068
+ else:
1069
+ editor = 'vi'
1070
+ return editor
1071
+
1072
+
1073
+ def RunEditor(content, git, git_editor=None):
1074
+ """Opens up the default editor in the system to get the CL description."""
1075
+ file_handle, filename = tempfile.mkstemp(text=True, prefix='cl_description')
1076
+ # Make sure CRLF is handled properly by requiring none.
1077
+ if '\r' in content:
1078
+ print(
1079
+ '!! Please remove \\r from your change description !!', file=sys.stderr)
1080
+ fileobj = os.fdopen(file_handle, 'w')
1081
+ # Still remove \r if present.
1082
+ content = re.sub('\r?\n', '\n', content)
1083
+ # Some editors complain when the file doesn't end in \n.
1084
+ if not content.endswith('\n'):
1085
+ content += '\n'
1086
+ fileobj.write(content)
1087
+ fileobj.close()
1088
+
1089
+ try:
1090
+ editor = GetEditor(git_editor=git_editor)
1091
+ if not editor:
1092
+ return None
1093
+ cmd = '%s %s' % (editor, filename)
1094
+ if sys.platform == 'win32' and os.environ.get('TERM') == 'msys':
1095
+ # Msysgit requires the usage of 'env' to be present.
1096
+ cmd = 'env ' + cmd
1097
+ try:
1098
+ # shell=True to allow the shell to handle all forms of quotes in
1099
+ # $EDITOR.
1100
+ subprocess2.check_call(cmd, shell=True)
1101
+ except subprocess2.CalledProcessError:
1102
+ return None
1103
+ return FileRead(filename)
1104
+ finally:
1105
+ os.remove(filename)
1106
+
1107
+
1108
+ def UpgradeToHttps(url):
1109
+ """Upgrades random urls to https://.
1110
+
1111
+ Do not touch unknown urls like ssh:// or git://.
1112
+ Do not touch http:// urls with a port number,
1113
+ Fixes invalid GAE url.
1114
+ """
1115
+ if not url:
1116
+ return url
1117
+ if not re.match(r'[a-z\-]+\://.*', url):
1118
+ # Make sure it is a valid uri. Otherwise, urlparse() will consider it a
1119
+ # relative url and will use http:///foo. Note that it defaults to http://
1120
+ # for compatibility with naked url like "localhost:8080".
1121
+ url = 'http://%s' % url
1122
+ parsed = list(urlparse.urlparse(url))
1123
+ # Do not automatically upgrade http to https if a port number is provided.
1124
+ if parsed[0] == 'http' and not re.match(r'^.+?\:\d+$', parsed[1]):
1125
+ parsed[0] = 'https'
1126
+ return urlparse.urlunparse(parsed)
1127
+
1128
+
1129
+ def ParseCodereviewSettingsContent(content):
1130
+ """Process a codereview.settings file properly."""
1131
+ lines = (l for l in content.splitlines() if not l.strip().startswith("#"))
1132
+ try:
1133
+ keyvals = dict([x.strip() for x in l.split(':', 1)] for l in lines if l)
1134
+ except ValueError:
1135
+ raise Error(
1136
+ 'Failed to process settings, please fix. Content:\n\n%s' % content)
1137
+ def fix_url(key):
1138
+ if keyvals.get(key):
1139
+ keyvals[key] = UpgradeToHttps(keyvals[key])
1140
+ fix_url('CODE_REVIEW_SERVER')
1141
+ fix_url('VIEW_VC')
1142
+ return keyvals
1143
+
1144
+
1145
+ def NumLocalCpus():
1146
+ """Returns the number of processors.
1147
+
1148
+ multiprocessing.cpu_count() is permitted to raise NotImplementedError, and
1149
+ is known to do this on some Windows systems and OSX 10.6. If we can't get the
1150
+ CPU count, we will fall back to '1'.
1151
+ """
1152
+ # Surround the entire thing in try/except; no failure here should stop gclient
1153
+ # from working.
1154
+ try:
1155
+ # Use multiprocessing to get CPU count. This may raise
1156
+ # NotImplementedError.
1157
+ try:
1158
+ import multiprocessing
1159
+ return multiprocessing.cpu_count()
1160
+ except NotImplementedError: # pylint: disable=bare-except
1161
+ # (UNIX) Query 'os.sysconf'.
1162
+ # pylint: disable=no-member
1163
+ if hasattr(os, 'sysconf') and 'SC_NPROCESSORS_ONLN' in os.sysconf_names:
1164
+ return int(os.sysconf('SC_NPROCESSORS_ONLN'))
1165
+
1166
+ # (Windows) Query 'NUMBER_OF_PROCESSORS' environment variable.
1167
+ if 'NUMBER_OF_PROCESSORS' in os.environ:
1168
+ return int(os.environ['NUMBER_OF_PROCESSORS'])
1169
+ except Exception as e:
1170
+ logging.exception("Exception raised while probing CPU count: %s", e)
1171
+
1172
+ logging.debug('Failed to get CPU count. Defaulting to 1.')
1173
+ return 1
1174
+
1175
+
1176
+ def DefaultDeltaBaseCacheLimit():
1177
+ """Return a reasonable default for the git config core.deltaBaseCacheLimit.
1178
+
1179
+ The primary constraint is the address space of virtual memory. The cache
1180
+ size limit is per-thread, and 32-bit systems can hit OOM errors if this
1181
+ parameter is set too high.
1182
+ """
1183
+ if platform.architecture()[0].startswith('64'):
1184
+ return '2g'
1185
+ else:
1186
+ return '512m'
1187
+
1188
+
1189
+ def DefaultIndexPackConfig(url=''):
1190
+ """Return reasonable default values for configuring git-index-pack.
1191
+
1192
+ Experiments suggest that higher values for pack.threads don't improve
1193
+ performance."""
1194
+ cache_limit = DefaultDeltaBaseCacheLimit()
1195
+ result = ['-c', 'core.deltaBaseCacheLimit=%s' % cache_limit]
1196
+ if url in THREADED_INDEX_PACK_BLOCKLIST:
1197
+ result.extend(['-c', 'pack.threads=1'])
1198
+ return result
1199
+
1200
+
1201
+ def FindExecutable(executable):
1202
+ """This mimics the "which" utility."""
1203
+ path_folders = os.environ.get('PATH').split(os.pathsep)
1204
+
1205
+ for path_folder in path_folders:
1206
+ target = os.path.join(path_folder, executable)
1207
+ # Just in case we have some ~/blah paths.
1208
+ target = os.path.abspath(os.path.expanduser(target))
1209
+ if os.path.isfile(target) and os.access(target, os.X_OK):
1210
+ return target
1211
+ if sys.platform.startswith('win'):
1212
+ for suffix in ('.bat', '.cmd', '.exe'):
1213
+ alt_target = target + suffix
1214
+ if os.path.isfile(alt_target) and os.access(alt_target, os.X_OK):
1215
+ return alt_target
1216
+ return None
1217
+
1218
+
1219
+ def freeze(obj):
1220
+ """Takes a generic object ``obj``, and returns an immutable version of it.
1221
+
1222
+ Supported types:
1223
+ * dict / OrderedDict -> FrozenDict
1224
+ * list -> tuple
1225
+ * set -> frozenset
1226
+ * any object with a working __hash__ implementation (assumes that hashable
1227
+ means immutable)
1228
+
1229
+ Will raise TypeError if you pass an object which is not hashable.
1230
+ """
1231
+ if isinstance(obj, collections_abc.Mapping):
1232
+ return FrozenDict((freeze(k), freeze(v)) for k, v in obj.items())
1233
+ elif isinstance(obj, (list, tuple)):
1234
+ return tuple(freeze(i) for i in obj)
1235
+ elif isinstance(obj, set):
1236
+ return frozenset(freeze(i) for i in obj)
1237
+ else:
1238
+ hash(obj)
1239
+ return obj
1240
+
1241
+
1242
+ class FrozenDict(collections_abc.Mapping):
1243
+ """An immutable OrderedDict.
1244
+
1245
+ Modified From: http://stackoverflow.com/a/2704866
1246
+ """
1247
+ def __init__(self, *args, **kwargs):
1248
+ self._d = collections.OrderedDict(*args, **kwargs)
1249
+
1250
+ # Calculate the hash immediately so that we know all the items are
1251
+ # hashable too.
1252
+ self._hash = functools.reduce(
1253
+ operator.xor, (hash(i) for i in enumerate(self._d.items())), 0)
1254
+
1255
+ def __eq__(self, other):
1256
+ if not isinstance(other, collections_abc.Mapping):
1257
+ return NotImplemented
1258
+ if self is other:
1259
+ return True
1260
+ if len(self) != len(other):
1261
+ return False
1262
+ for k, v in self.items():
1263
+ if k not in other or other[k] != v:
1264
+ return False
1265
+ return True
1266
+
1267
+ def __iter__(self):
1268
+ return iter(self._d)
1269
+
1270
+ def __len__(self):
1271
+ return len(self._d)
1272
+
1273
+ def __getitem__(self, key):
1274
+ return self._d[key]
1275
+
1276
+ def __hash__(self):
1277
+ return self._hash
1278
+
1279
+ def __repr__(self):
1280
+ return 'FrozenDict(%r)' % (self._d.items(),)