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,1258 @@
1
+ #!/usr/bin/env python
2
+ # Copyright 2014 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
+ # TODO(hinoka): Use logging.
7
+
8
+ from __future__ import print_function
9
+
10
+ import cStringIO
11
+ import codecs
12
+ from contextlib import contextmanager
13
+ import copy
14
+ import ctypes
15
+ from datetime import datetime
16
+ import json
17
+ import optparse
18
+ import os
19
+ import pprint
20
+ import random
21
+ import re
22
+ import subprocess
23
+ import sys
24
+ import tempfile
25
+ import threading
26
+ import time
27
+ import urllib2
28
+ import urlparse
29
+ import uuid
30
+
31
+ import os.path as path
32
+
33
+ # How many bytes at a time to read from pipes.
34
+ BUF_SIZE = 256
35
+
36
+ # How many seconds of no stdout activity before process is considered stale. Can
37
+ # be overridden via environmnet variable `STALE_PROCESS_DURATION`. If set to 0,
38
+ # process won't be terminated.
39
+ STALE_PROCESS_DURATION = 1200
40
+
41
+ # Define a bunch of directory paths.
42
+ # Relative to this script's filesystem path.
43
+ THIS_DIR = path.dirname(path.abspath(__file__))
44
+
45
+ DEPOT_TOOLS_DIR = path.abspath(path.join(THIS_DIR, '..', '..', '..', '..'))
46
+
47
+ CHROMIUM_GIT_HOST = 'https://chromium.googlesource.com'
48
+ CHROMIUM_SRC_URL = CHROMIUM_GIT_HOST + '/chromium/src.git'
49
+
50
+ BRANCH_HEADS_REFSPEC = '+refs/branch-heads/*'
51
+ TAGS_REFSPEC = '+refs/tags/*'
52
+
53
+ # Regular expression to match sha1 git revision.
54
+ COMMIT_HASH_RE = re.compile(r'[0-9a-f]{5,40}', re.IGNORECASE)
55
+
56
+ # Regular expression that matches a single commit footer line.
57
+ COMMIT_FOOTER_ENTRY_RE = re.compile(r'([^:]+):\s*(.*)')
58
+
59
+ # Footer metadata keys for regular and gsubtreed mirrored commit positions.
60
+ COMMIT_POSITION_FOOTER_KEY = 'Cr-Commit-Position'
61
+ COMMIT_ORIGINAL_POSITION_FOOTER_KEY = 'Cr-Original-Commit-Position'
62
+
63
+ # Regular expression to parse gclient's revinfo entries.
64
+ REVINFO_RE = re.compile(r'^([^:]+):\s+([^@]+)@(.+)$')
65
+
66
+ # Copied from scripts/recipes/chromium.py.
67
+ GOT_REVISION_MAPPINGS = {
68
+ CHROMIUM_SRC_URL: {
69
+ 'got_revision': 'src/',
70
+ 'got_nacl_revision': 'src/native_client/',
71
+ 'got_swarm_client_revision': 'src/tools/swarm_client/',
72
+ 'got_swarming_client_revision': 'src/tools/swarming_client/',
73
+ 'got_v8_revision': 'src/v8/',
74
+ 'got_webkit_revision': 'src/third_party/WebKit/',
75
+ 'got_webrtc_revision': 'src/third_party/webrtc/',
76
+ }
77
+ }
78
+
79
+
80
+ GCLIENT_TEMPLATE = """solutions = %(solutions)s
81
+
82
+ cache_dir = r%(cache_dir)s
83
+ %(target_os)s
84
+ %(target_os_only)s
85
+ %(target_cpu)s
86
+ """
87
+
88
+
89
+ GIT_CACHE_PATH = path.join(DEPOT_TOOLS_DIR, 'git_cache.py')
90
+ GCLIENT_PATH = path.join(DEPOT_TOOLS_DIR, 'gclient.py')
91
+
92
+ class SubprocessFailed(Exception):
93
+ def __init__(self, message, code, output):
94
+ Exception.__init__(self, message)
95
+ self.code = code
96
+ self.output = output
97
+
98
+
99
+ class PatchFailed(SubprocessFailed):
100
+ pass
101
+
102
+
103
+ class GclientSyncFailed(SubprocessFailed):
104
+ pass
105
+
106
+
107
+ class InvalidDiff(Exception):
108
+ pass
109
+
110
+
111
+ RETRY = object()
112
+ OK = object()
113
+ FAIL = object()
114
+
115
+
116
+ class ProcessObservers(object):
117
+ """ProcessObservers allows monitoring of child process."""
118
+
119
+ def poke(self):
120
+ """poke is called when child process sent `BUF_SIZE` data to stdout."""
121
+ pass
122
+
123
+ def cancel(self):
124
+ """cancel is called once proc exists successfully."""
125
+ pass
126
+
127
+
128
+ class PsPrinter(ProcessObservers):
129
+ def __init__(self, interval=300):
130
+ self.interval = interval
131
+ self.active = sys.platform.startswith('linux2')
132
+ self.thread = None
133
+
134
+ def print_pstree(self):
135
+ """Debugging function used to print "ps auxwwf" for stuck processes."""
136
+ # Add new line for cleaner output
137
+ print()
138
+ subprocess.call(['ps', 'auxwwf'])
139
+
140
+ # Restart timer, we want to continue printing until the process is
141
+ # terminated.
142
+ self.poke()
143
+
144
+ def poke(self):
145
+ if self.active:
146
+ self.cancel()
147
+ self.thread = threading.Timer(self.interval, self.print_pstree)
148
+ self.thread.start()
149
+
150
+ def cancel(self):
151
+ if self.active and self.thread is not None:
152
+ self.thread.cancel()
153
+ self.thread = None
154
+
155
+
156
+ class StaleProcess(ProcessObservers):
157
+ '''StaleProcess terminates process if there is no poke call in `interval`. '''
158
+
159
+ def __init__(self, interval, proc):
160
+ self.interval = interval
161
+ self.proc = proc
162
+ self.thread = None
163
+
164
+ def _terminate_process(self):
165
+ print('Terminating stale process...')
166
+ self.proc.terminate()
167
+
168
+ def poke(self):
169
+ self.cancel()
170
+ if self.interval > 0:
171
+ self.thread = threading.Timer(self.interval, self._terminate_process)
172
+ self.thread.start()
173
+
174
+ def cancel(self):
175
+ if self.thread is not None:
176
+ self.thread.cancel()
177
+ self.thread = None
178
+
179
+
180
+ def call(*args, **kwargs): # pragma: no cover
181
+ """Interactive subprocess call."""
182
+ kwargs['stdout'] = subprocess.PIPE
183
+ kwargs['stderr'] = subprocess.STDOUT
184
+ kwargs.setdefault('bufsize', BUF_SIZE)
185
+ cwd = kwargs.get('cwd', os.getcwd())
186
+ stdin_data = kwargs.pop('stdin_data', None)
187
+ if stdin_data:
188
+ kwargs['stdin'] = subprocess.PIPE
189
+ out = cStringIO.StringIO()
190
+ new_env = kwargs.get('env', {})
191
+ env = os.environ.copy()
192
+ env.update(new_env)
193
+ kwargs['env'] = env
194
+
195
+ if new_env:
196
+ print('===Injecting Environment Variables===')
197
+ for k, v in sorted(new_env.items()):
198
+ print('%s: %s' % (k, v))
199
+ print('%s ===Running %s ===' % (datetime.now(), ' '.join(args),))
200
+ print('In directory: %s' % cwd)
201
+ start_time = time.time()
202
+ proc = subprocess.Popen(args, **kwargs)
203
+ if stdin_data:
204
+ proc.stdin.write(stdin_data)
205
+ proc.stdin.close()
206
+ stale_process_duration = env.get('STALE_PROCESS_DURATION',
207
+ STALE_PROCESS_DURATION)
208
+ observers = [PsPrinter(), StaleProcess(int(stale_process_duration), proc)]
209
+ # This is here because passing 'sys.stdout' into stdout for proc will
210
+ # produce out of order output.
211
+ hanging_cr = False
212
+ while True:
213
+ for observer in observers:
214
+ observer.poke()
215
+ buf = proc.stdout.read(BUF_SIZE)
216
+ if not buf:
217
+ break
218
+ if hanging_cr:
219
+ buf = '\r' + buf
220
+ hanging_cr = buf.endswith('\r')
221
+ if hanging_cr:
222
+ buf = buf[:-1]
223
+ buf = buf.replace('\r\n', '\n').replace('\r', '\n')
224
+ sys.stdout.write(buf)
225
+ out.write(buf)
226
+ if hanging_cr:
227
+ sys.stdout.write('\n')
228
+ out.write('\n')
229
+ for observer in observers:
230
+ observer.cancel()
231
+
232
+ code = proc.wait()
233
+ elapsed_time = ((time.time() - start_time) / 60.0)
234
+ outval = out.getvalue()
235
+ if code:
236
+ print('%s ===Failed in %.1f mins of %s ===' %
237
+ (datetime.now(), elapsed_time, ' '.join(args)))
238
+ print()
239
+ raise SubprocessFailed('%s failed with code %d in %s.' %
240
+ (' '.join(args), code, cwd),
241
+ code, outval)
242
+
243
+ print('%s ===Succeeded in %.1f mins of %s ===' %
244
+ (datetime.now(), elapsed_time, ' '.join(args)))
245
+ print()
246
+ return outval
247
+
248
+
249
+ def git(*args, **kwargs): # pragma: no cover
250
+ """Wrapper around call specifically for Git commands."""
251
+ if args and args[0] == 'cache':
252
+ # Rewrite "git cache" calls into "python git_cache.py".
253
+ cmd = (sys.executable, '-u', GIT_CACHE_PATH) + args[1:]
254
+ else:
255
+ git_executable = 'git'
256
+ # On windows, subprocess doesn't fuzzy-match 'git' to 'git.bat', so we
257
+ # have to do it explicitly. This is better than passing shell=True.
258
+ if sys.platform.startswith('win'):
259
+ git_executable += '.bat'
260
+ cmd = (git_executable,) + args
261
+ return call(*cmd, **kwargs)
262
+
263
+
264
+ def get_gclient_spec(solutions, target_os, target_os_only, target_cpu,
265
+ git_cache_dir):
266
+ return GCLIENT_TEMPLATE % {
267
+ 'solutions': pprint.pformat(solutions, indent=4),
268
+ 'cache_dir': '"%s"' % git_cache_dir,
269
+ 'target_os': ('\ntarget_os=%s' % target_os) if target_os else '',
270
+ 'target_os_only': '\ntarget_os_only=%s' % target_os_only,
271
+ 'target_cpu': ('\ntarget_cpu=%s' % target_cpu) if target_cpu else ''
272
+ }
273
+
274
+
275
+ def solutions_printer(solutions):
276
+ """Prints gclient solution to stdout."""
277
+ print('Gclient Solutions')
278
+ print('=================')
279
+ for solution in solutions:
280
+ name = solution.get('name')
281
+ url = solution.get('url')
282
+ print('%s (%s)' % (name, url))
283
+ if solution.get('deps_file'):
284
+ print(' Dependencies file is %s' % solution['deps_file'])
285
+ if 'managed' in solution:
286
+ print(' Managed mode is %s' % ('ON' if solution['managed'] else 'OFF'))
287
+ custom_vars = solution.get('custom_vars')
288
+ if custom_vars:
289
+ print(' Custom Variables:')
290
+ for var_name, var_value in sorted(custom_vars.items()):
291
+ print(' %s = %s' % (var_name, var_value))
292
+ custom_deps = solution.get('custom_deps')
293
+ if 'custom_deps' in solution:
294
+ print(' Custom Dependencies:')
295
+ for deps_name, deps_value in sorted(custom_deps.items()):
296
+ if deps_value:
297
+ print(' %s -> %s' % (deps_name, deps_value))
298
+ else:
299
+ print(' %s: Ignore' % deps_name)
300
+ for k, v in solution.items():
301
+ # Print out all the keys we don't know about.
302
+ if k in ['name', 'url', 'deps_file', 'custom_vars', 'custom_deps',
303
+ 'managed']:
304
+ continue
305
+ print(' %s is %s' % (k, v))
306
+ print()
307
+
308
+
309
+ def modify_solutions(input_solutions):
310
+ """Modifies urls in solutions to point at Git repos.
311
+
312
+ returns: new solution dictionary
313
+ """
314
+ assert input_solutions
315
+ solutions = copy.deepcopy(input_solutions)
316
+ for solution in solutions:
317
+ original_url = solution['url']
318
+ parsed_url = urlparse.urlparse(original_url)
319
+ parsed_path = parsed_url.path
320
+
321
+ solution['managed'] = False
322
+ # We don't want gclient to be using a safesync URL. Instead it should
323
+ # using the lkgr/lkcr branch/tags.
324
+ if 'safesync_url' in solution:
325
+ print('Removing safesync url %s from %s' % (solution['safesync_url'],
326
+ parsed_path))
327
+ del solution['safesync_url']
328
+
329
+ return solutions
330
+
331
+
332
+ def remove(target, cleanup_dir):
333
+ """Remove a target by moving it into cleanup_dir."""
334
+ if not path.exists(cleanup_dir):
335
+ os.makedirs(cleanup_dir)
336
+ dest = path.join(cleanup_dir, '%s_%s' % (
337
+ path.basename(target), uuid.uuid4().hex))
338
+ print('Marking for removal %s => %s' % (target, dest))
339
+ try:
340
+ os.rename(target, dest)
341
+ except Exception as e:
342
+ print('Error renaming %s to %s: %s' % (target, dest, str(e)))
343
+ raise
344
+
345
+
346
+ def ensure_no_checkout(dir_names, cleanup_dir):
347
+ """Ensure that there is no undesired checkout under build/."""
348
+ build_dir = os.getcwd()
349
+ has_checkout = any(path.exists(path.join(build_dir, dir_name, '.git'))
350
+ for dir_name in dir_names)
351
+ if has_checkout:
352
+ for filename in os.listdir(build_dir):
353
+ deletion_target = path.join(build_dir, filename)
354
+ print('.git detected in checkout, deleting %s...' % deletion_target,)
355
+ remove(deletion_target, cleanup_dir)
356
+ print('done')
357
+
358
+
359
+ def call_gclient(*args, **kwargs):
360
+ """Run the "gclient.py" tool with the supplied arguments.
361
+
362
+ Args:
363
+ args: command-line arguments to pass to gclient.
364
+ kwargs: keyword arguments to pass to call.
365
+ """
366
+ cmd = [sys.executable, '-u', GCLIENT_PATH]
367
+ cmd.extend(args)
368
+ # Disable metrics collection on bots, since it's not supported anyway.
369
+ kwargs.setdefault('env', {})['DEPOT_TOOLS_METRICS'] = '0'
370
+ return call(*cmd, **kwargs)
371
+
372
+
373
+ def gclient_configure(solutions, target_os, target_os_only, target_cpu,
374
+ git_cache_dir):
375
+ """Should do the same thing as gclient --spec='...'."""
376
+ with codecs.open('.gclient', mode='w', encoding='utf-8') as f:
377
+ f.write(get_gclient_spec(
378
+ solutions, target_os, target_os_only, target_cpu, git_cache_dir))
379
+
380
+
381
+ @contextmanager
382
+ def git_config_if_not_set(key, value):
383
+ """Set git config for key equal to value if key was not set.
384
+
385
+ If key was not set, unset it once we're done."""
386
+ should_unset = True
387
+ try:
388
+ git('config', '--global', key)
389
+ should_unset = False
390
+ except SubprocessFailed as e:
391
+ git('config', '--global', key, value)
392
+ try:
393
+ yield
394
+ finally:
395
+ if should_unset:
396
+ git('config', '--global', '--unset', key)
397
+
398
+
399
+ def gclient_sync(
400
+ with_branch_heads, with_tags, revisions, break_repo_locks,
401
+ disable_syntax_validation, patch_refs, gerrit_reset,
402
+ gerrit_rebase_patch_ref):
403
+ # We just need to allocate a filename.
404
+ fd, gclient_output_file = tempfile.mkstemp(suffix='.json')
405
+ os.close(fd)
406
+
407
+ args = ['sync', '--verbose', '--reset', '--force',
408
+ '--ignore_locks', '--output-json', gclient_output_file,
409
+ '--nohooks', '--noprehooks', '--delete_unversioned_trees']
410
+ if with_branch_heads:
411
+ args += ['--with_branch_heads']
412
+ if with_tags:
413
+ args += ['--with_tags']
414
+ if break_repo_locks:
415
+ args += ['--break_repo_locks']
416
+ if disable_syntax_validation:
417
+ args += ['--disable-syntax-validation']
418
+ for name, revision in sorted(revisions.items()):
419
+ if revision.upper() == 'HEAD':
420
+ revision = 'origin/master'
421
+ args.extend(['--revision', '%s@%s' % (name, revision)])
422
+
423
+ if patch_refs:
424
+ for patch_ref in patch_refs:
425
+ args.extend(['--patch-ref', patch_ref])
426
+ if not gerrit_reset:
427
+ args.append('--no-reset-patch-ref')
428
+ if not gerrit_rebase_patch_ref:
429
+ args.append('--no-rebase-patch-ref')
430
+
431
+ try:
432
+ call_gclient(*args)
433
+ except SubprocessFailed as e:
434
+ # If gclient sync is handling patching, parse the output for a patch error
435
+ # message.
436
+ if 'Failed to apply patch.' in e.output:
437
+ raise PatchFailed(e.message, e.code, e.output)
438
+ # Throw a GclientSyncFailed exception so we can catch this independently.
439
+ raise GclientSyncFailed(e.message, e.code, e.output)
440
+ else:
441
+ with open(gclient_output_file) as f:
442
+ return json.load(f)
443
+ finally:
444
+ os.remove(gclient_output_file)
445
+
446
+
447
+ def gclient_revinfo():
448
+ return call_gclient('revinfo', '-a') or ''
449
+
450
+
451
+ def normalize_git_url(url):
452
+ """Normalize a git url to be consistent.
453
+
454
+ This recognizes urls to the googlesoruce.com domain. It ensures that
455
+ the url:
456
+ * Do not end in .git
457
+ * Do not contain /a/ in their path.
458
+ """
459
+ try:
460
+ p = urlparse.urlparse(url)
461
+ except Exception:
462
+ # Not a url, just return it back.
463
+ return url
464
+ if not p.netloc.endswith('.googlesource.com'):
465
+ # Not a googlesource.com URL, can't normalize this, just return as is.
466
+ return url
467
+ upath = p.path
468
+ if upath.startswith('/a'):
469
+ upath = upath[len('/a'):]
470
+ if upath.endswith('.git'):
471
+ upath = upath[:-len('.git')]
472
+ return 'https://%s%s' % (p.netloc, upath)
473
+
474
+
475
+ # TODO(hinoka): Remove this once all downstream recipes stop using this format.
476
+ def create_manifest_old():
477
+ manifest = {}
478
+ output = gclient_revinfo()
479
+ for line in output.strip().splitlines():
480
+ match = REVINFO_RE.match(line.strip())
481
+ if match:
482
+ manifest[match.group(1)] = {
483
+ 'repository': match.group(2),
484
+ 'revision': match.group(3),
485
+ }
486
+ else:
487
+ print("WARNING: Couldn't match revinfo line:\n%s" % line)
488
+ return manifest
489
+
490
+
491
+ # TODO(hinoka): Include patch revision.
492
+ def create_manifest(gclient_output, patch_root):
493
+ """Return the JSONPB equivalent of the source manifest proto.
494
+
495
+ The source manifest proto is defined here:
496
+ https://chromium.googlesource.com/infra/luci/recipes-py/+/master/recipe_engine/source_manifest.proto
497
+
498
+ This is based off of:
499
+ * The gclient_output (from calling gclient.py --output-json) which contains
500
+ the directory -> repo:revision mapping.
501
+ * Gerrit Patch info which contains info about patched revisions.
502
+
503
+ We normalize the URLs using the normalize_git_url function.
504
+ """
505
+ manifest = {
506
+ 'version': 0, # Currently the only valid version is 0.
507
+ }
508
+ dirs = {}
509
+ if patch_root:
510
+ patch_root = patch_root.strip('/') # Normalize directory names.
511
+ for directory, info in gclient_output.get('solutions', {}).items():
512
+ directory = directory.strip('/') # Normalize the directory name.
513
+ # The format of the url is "https://repo.url/blah.git@abcdefabcdef" or
514
+ # just "https://repo.url/blah.git"
515
+ url = info.get('url') or ''
516
+ repo, _, url_revision = url.partition('@')
517
+ repo = normalize_git_url(repo)
518
+ # There are two places to get the revision from, we do it in this order:
519
+ # 1. In the "revision" field
520
+ # 2. At the end of the URL, after @
521
+ revision = info.get('revision') or url_revision
522
+ if repo and revision:
523
+ dirs[directory] = {
524
+ 'git_checkout': {
525
+ 'repo_url': repo,
526
+ 'revision': revision,
527
+ }
528
+ }
529
+
530
+ manifest['directories'] = dirs
531
+ return manifest
532
+
533
+
534
+ def get_commit_message_footer_map(message):
535
+ """Returns: (dict) A dictionary of commit message footer entries.
536
+ """
537
+ footers = {}
538
+
539
+ # Extract the lines in the footer block.
540
+ lines = []
541
+ for line in message.strip().splitlines():
542
+ line = line.strip()
543
+ if len(line) == 0:
544
+ del lines[:]
545
+ continue
546
+ lines.append(line)
547
+
548
+ # Parse the footer
549
+ for line in lines:
550
+ m = COMMIT_FOOTER_ENTRY_RE.match(line)
551
+ if not m:
552
+ # If any single line isn't valid, continue anyway for compatibility with
553
+ # Gerrit (which itself uses JGit for this).
554
+ continue
555
+ footers[m.group(1)] = m.group(2).strip()
556
+ return footers
557
+
558
+
559
+ def get_commit_message_footer(message, key):
560
+ """Returns: (str/None) The footer value for 'key', or None if none was found.
561
+ """
562
+ return get_commit_message_footer_map(message).get(key)
563
+
564
+
565
+ # Derived from:
566
+ # http://code.activestate.com/recipes/577972-disk-usage/?in=user-4178764
567
+ def get_total_disk_space():
568
+ cwd = os.getcwd()
569
+ # Windows is the only platform that doesn't support os.statvfs, so
570
+ # we need to special case this.
571
+ if sys.platform.startswith('win'):
572
+ _, total, free = (ctypes.c_ulonglong(), ctypes.c_ulonglong(), \
573
+ ctypes.c_ulonglong())
574
+ if sys.version_info >= (3,) or isinstance(cwd, unicode):
575
+ fn = ctypes.windll.kernel32.GetDiskFreeSpaceExW
576
+ else:
577
+ fn = ctypes.windll.kernel32.GetDiskFreeSpaceExA
578
+ ret = fn(cwd, ctypes.byref(_), ctypes.byref(total), ctypes.byref(free))
579
+ if ret == 0:
580
+ # WinError() will fetch the last error code.
581
+ raise ctypes.WinError()
582
+ return (total.value, free.value)
583
+
584
+ else:
585
+ st = os.statvfs(cwd)
586
+ free = st.f_bavail * st.f_frsize
587
+ total = st.f_blocks * st.f_frsize
588
+ return (total, free)
589
+
590
+
591
+ def _get_target_branch_and_revision(solution_name, git_url, revisions):
592
+ normalized_name = solution_name.strip('/')
593
+ if normalized_name in revisions:
594
+ configured = revisions[normalized_name]
595
+ elif git_url in revisions:
596
+ configured = revisions[git_url]
597
+ else:
598
+ return 'master', 'HEAD'
599
+
600
+ parts = configured.split(':', 1)
601
+ if len(parts) == 2:
602
+ # Support for "branch:revision" syntax.
603
+ return parts
604
+ if COMMIT_HASH_RE.match(configured):
605
+ return 'master', configured
606
+ return configured, 'HEAD'
607
+
608
+
609
+ def get_target_pin(solution_name, git_url, revisions):
610
+ """Returns revision to be checked out if it is pinned, else None."""
611
+ _, revision = _get_target_branch_and_revision(
612
+ solution_name, git_url, revisions)
613
+ if COMMIT_HASH_RE.match(revision):
614
+ return revision
615
+ return None
616
+
617
+
618
+ def force_solution_revision(solution_name, git_url, revisions, cwd):
619
+ branch, revision = _get_target_branch_and_revision(
620
+ solution_name, git_url, revisions)
621
+ if revision and revision.upper() != 'HEAD':
622
+ treeish = revision
623
+ else:
624
+ # TODO(machenbach): This won't work with branch-heads, as Gerrit's
625
+ # destination branch would be e.g. refs/branch-heads/123. But here
626
+ # we need to pass refs/remotes/branch-heads/123 to check out.
627
+ # This will also not work if somebody passes a local refspec like
628
+ # refs/heads/master. It needs to translate to refs/remotes/origin/master
629
+ # first. See also https://crbug.com/740456 .
630
+ if branch.startswith(('refs/', 'origin/')):
631
+ treeish = branch
632
+ else:
633
+ treeish = 'origin/' + branch
634
+
635
+ # Note that -- argument is necessary to ensure that git treats `treeish`
636
+ # argument as revision or ref, and not as a file/directory which happens to
637
+ # have the exact same name.
638
+ git('checkout', '--force', treeish, '--', cwd=cwd)
639
+
640
+
641
+ def _has_in_git_cache(revision_sha1, refs, git_cache_dir, url):
642
+ """Returns whether given revision_sha1 is contained in cache of a given repo.
643
+ """
644
+ try:
645
+ mirror_dir = git(
646
+ 'cache', 'exists', '--quiet', '--cache-dir', git_cache_dir, url).strip()
647
+ git('cat-file', '-e', revision_sha1, cwd=mirror_dir)
648
+ for ref in refs:
649
+ git('cat-file', '-e', ref, cwd=mirror_dir)
650
+ return True
651
+ except SubprocessFailed:
652
+ return False
653
+
654
+
655
+ def is_broken_repo_dir(repo_dir):
656
+ # Treat absence of 'config' as a signal of a partially deleted repo.
657
+ return not path.exists(os.path.join(repo_dir, '.git', 'config'))
658
+
659
+
660
+ def _maybe_break_locks(checkout_path, tries=3):
661
+ """This removes all .lock files from this repo's .git directory.
662
+
663
+ In particular, this will cleanup index.lock files, as well as ref lock
664
+ files.
665
+ """
666
+ def attempt():
667
+ git_dir = os.path.join(checkout_path, '.git')
668
+ for dirpath, _, filenames in os.walk(git_dir):
669
+ for filename in filenames:
670
+ if filename.endswith('.lock'):
671
+ to_break = os.path.join(dirpath, filename)
672
+ print('breaking lock: %s' % to_break)
673
+ try:
674
+ os.remove(to_break)
675
+ except OSError as ex:
676
+ print('FAILED to break lock: %s: %s' % (to_break, ex))
677
+ raise
678
+
679
+ for _ in xrange(tries):
680
+ try:
681
+ attempt()
682
+ return
683
+ except Exception:
684
+ pass
685
+
686
+
687
+
688
+ def git_checkouts(solutions, revisions, refs, no_fetch_tags, git_cache_dir,
689
+ cleanup_dir):
690
+ build_dir = os.getcwd()
691
+ first_solution = True
692
+ for sln in solutions:
693
+ sln_dir = path.join(build_dir, sln['name'])
694
+ _git_checkout(sln, sln_dir, revisions, refs, no_fetch_tags, git_cache_dir,
695
+ cleanup_dir)
696
+ if first_solution:
697
+ git_ref = git('log', '--format=%H', '--max-count=1',
698
+ cwd=path.join(build_dir, sln['name'])
699
+ ).strip()
700
+ first_solution = False
701
+ return git_ref
702
+
703
+
704
+ def _git_checkout(sln, sln_dir, revisions, refs, no_fetch_tags, git_cache_dir,
705
+ cleanup_dir):
706
+ name = sln['name']
707
+ url = sln['url']
708
+ populate_cmd = (['cache', 'populate', '--ignore_locks', '-v',
709
+ '--cache-dir', git_cache_dir, url, '--reset-fetch-config'])
710
+ if no_fetch_tags:
711
+ populate_cmd.extend(['--no-fetch-tags'])
712
+ for ref in refs:
713
+ populate_cmd.extend(['--ref', ref])
714
+
715
+ env = {}
716
+ if url == CHROMIUM_SRC_URL or url + '.git' == CHROMIUM_SRC_URL:
717
+ # This is for performance investigation of `git fetch` in chromium/src.
718
+ env = {
719
+ 'GIT_TRACE': 'true',
720
+ 'GIT_TRACE_PERFORMANCE': 'true',
721
+ }
722
+
723
+ # Step 1: populate/refresh cache, if necessary.
724
+ pin = get_target_pin(name, url, revisions)
725
+ if not pin:
726
+ # Refresh only once.
727
+ git(*populate_cmd, env=env)
728
+ elif _has_in_git_cache(pin, refs, git_cache_dir, url):
729
+ # No need to fetch at all, because we already have needed revision.
730
+ pass
731
+ else:
732
+ # We may need to retry a bit due to eventual consinstency in replication of
733
+ # git servers.
734
+ soft_deadline = time.time() + 60
735
+ attempt = 0
736
+ while True:
737
+ attempt += 1
738
+ # TODO(tandrii): propagate the pin to git server per recommendation of
739
+ # maintainers of *.googlesource.com (workaround git server replication
740
+ # lag).
741
+ git(*populate_cmd, env=env)
742
+ if _has_in_git_cache(pin, refs, git_cache_dir, url):
743
+ break
744
+ overrun = time.time() - soft_deadline
745
+ # Only kick in deadline after second attempt to ensure we retry at least
746
+ # once after initial fetch from not-yet-replicated server.
747
+ if attempt >= 2 and overrun > 0:
748
+ print('Ran %s seconds past deadline. Aborting.' % (overrun,))
749
+ # TODO(tandrii): raise exception immediately here, instead of doing
750
+ # useless step 2 trying to fetch something that we know doesn't exist
751
+ # in cache **after production data gives us confidence to do so**.
752
+ break
753
+
754
+ sleep_secs = min(60, 2**attempt)
755
+ print('waiting %s seconds and trying to fetch again...' % sleep_secs)
756
+ time.sleep(sleep_secs)
757
+
758
+ # Step 2: populate a checkout from local cache. All operations are local.
759
+ mirror_dir = git(
760
+ 'cache', 'exists', '--quiet', '--cache-dir', git_cache_dir, url).strip()
761
+ first_try = True
762
+ while True:
763
+ try:
764
+ # If repo deletion was aborted midway, it may have left .git in broken
765
+ # state.
766
+ if path.exists(sln_dir) and is_broken_repo_dir(sln_dir):
767
+ print('Git repo %s appears to be broken, removing it' % sln_dir)
768
+ remove(sln_dir, cleanup_dir)
769
+
770
+ # Use "tries=1", since we retry manually in this loop.
771
+ if not path.isdir(sln_dir):
772
+ git('clone', '--no-checkout', '--local', '--shared', mirror_dir,
773
+ sln_dir)
774
+ # Detach HEAD to be consistent with the non-clone case
775
+ git('checkout', 'master', '--detach', cwd=sln_dir)
776
+ _git_disable_gc(sln_dir)
777
+ else:
778
+ _git_disable_gc(sln_dir)
779
+ git('remote', 'set-url', 'origin', mirror_dir, cwd=sln_dir)
780
+ git('fetch', 'origin', cwd=sln_dir)
781
+ git('remote', 'set-url', '--push', 'origin', url, cwd=sln_dir)
782
+ for ref in refs:
783
+ refspec = '%s:%s' % (ref, ref.lstrip('+'))
784
+ git('fetch', 'origin', refspec, cwd=sln_dir)
785
+
786
+ # Windows sometimes has trouble deleting files.
787
+ # This can make git commands that rely on locks fail.
788
+ # Try a few times in case Windows has trouble again (and again).
789
+ if sys.platform.startswith('win'):
790
+ _maybe_break_locks(sln_dir, tries=3)
791
+
792
+ force_solution_revision(name, url, revisions, sln_dir)
793
+ git('clean', '-dff', cwd=sln_dir)
794
+ return
795
+ except SubprocessFailed as e:
796
+ # Exited abnormally, there's probably something wrong.
797
+ print('Something failed: %s.' % str(e))
798
+ if first_try:
799
+ first_try = False
800
+ # Lets wipe the checkout and try again.
801
+ remove(sln_dir, cleanup_dir)
802
+ else:
803
+ raise
804
+
805
+ def _git_disable_gc(cwd):
806
+ git('config', 'gc.auto', '0', cwd=cwd)
807
+ git('config', 'gc.autodetach', '0', cwd=cwd)
808
+ git('config', 'gc.autopacklimit', '0', cwd=cwd)
809
+
810
+
811
+ def get_commit_position(git_path, revision='HEAD'):
812
+ """Dumps the 'git' log for a specific revision and parses out the commit
813
+ position.
814
+
815
+ If a commit position metadata key is found, its value will be returned.
816
+ """
817
+ # TODO(iannucci): Use git-footers for this.
818
+ git_log = git('log', '--format=%B', '-n1', revision, cwd=git_path)
819
+ footer_map = get_commit_message_footer_map(git_log)
820
+
821
+ # Search for commit position metadata
822
+ value = (footer_map.get(COMMIT_POSITION_FOOTER_KEY) or
823
+ footer_map.get(COMMIT_ORIGINAL_POSITION_FOOTER_KEY))
824
+ if value:
825
+ return value
826
+ return None
827
+
828
+
829
+ def parse_got_revision(gclient_output, got_revision_mapping):
830
+ """Translate git gclient revision mapping to build properties."""
831
+ properties = {}
832
+ solutions_output = {
833
+ # Make sure path always ends with a single slash.
834
+ '%s/' % path.rstrip('/') : solution_output for path, solution_output
835
+ in gclient_output['solutions'].items()
836
+ }
837
+ for property_name, dir_name in got_revision_mapping.items():
838
+ # Make sure dir_name always ends with a single slash.
839
+ dir_name = '%s/' % dir_name.rstrip('/')
840
+ if dir_name not in solutions_output:
841
+ continue
842
+ solution_output = solutions_output[dir_name]
843
+ if solution_output.get('scm') is None:
844
+ # This is an ignored DEPS, so the output got_revision should be 'None'.
845
+ revision = commit_position = None
846
+ else:
847
+ # Since we are using .DEPS.git, everything had better be git.
848
+ assert solution_output.get('scm') == 'git'
849
+ revision = git('rev-parse', 'HEAD', cwd=dir_name).strip()
850
+ commit_position = get_commit_position(dir_name)
851
+
852
+ properties[property_name] = revision
853
+ if commit_position:
854
+ properties['%s_cp' % property_name] = commit_position
855
+
856
+ return properties
857
+
858
+
859
+ def emit_json(out_file, did_run, gclient_output=None, **kwargs):
860
+ """Write run information into a JSON file."""
861
+ output = {}
862
+ output.update(gclient_output if gclient_output else {})
863
+ output.update({'did_run': did_run})
864
+ output.update(kwargs)
865
+ with open(out_file, 'wb') as f:
866
+ f.write(json.dumps(output, sort_keys=True))
867
+
868
+
869
+ def ensure_checkout(solutions, revisions, first_sln, target_os, target_os_only,
870
+ target_cpu, patch_root, patch_refs, gerrit_rebase_patch_ref,
871
+ no_fetch_tags, refs, git_cache_dir, cleanup_dir,
872
+ gerrit_reset, disable_syntax_validation):
873
+ # Get a checkout of each solution, without DEPS or hooks.
874
+ # Calling git directly because there is no way to run Gclient without
875
+ # invoking DEPS.
876
+ print('Fetching Git checkout')
877
+
878
+ git_checkouts(solutions, revisions, refs, no_fetch_tags, git_cache_dir,
879
+ cleanup_dir)
880
+
881
+ # Ensure our build/ directory is set up with the correct .gclient file.
882
+ gclient_configure(solutions, target_os, target_os_only, target_cpu,
883
+ git_cache_dir)
884
+
885
+ # Windows sometimes has trouble deleting files. This can make git commands
886
+ # that rely on locks fail.
887
+ break_repo_locks = True if sys.platform.startswith('win') else False
888
+ # We want to pass all non-solution revisions into the gclient sync call.
889
+ solution_dirs = {sln['name'] for sln in solutions}
890
+ gc_revisions = {
891
+ dirname: rev for dirname, rev in revisions.items()
892
+ if dirname not in solution_dirs}
893
+ # Gclient sometimes ignores "unmanaged": "False" in the gclient solution
894
+ # if --revision <anything> is passed (for example, for subrepos).
895
+ # This forces gclient to always treat solutions deps as unmanaged.
896
+ for solution_name in list(solution_dirs):
897
+ gc_revisions[solution_name] = 'unmanaged'
898
+
899
+ with git_config_if_not_set('user.name', 'chrome-bot'), \
900
+ git_config_if_not_set('user.email', 'chrome-bot@chromium.org'):
901
+ # Let gclient do the DEPS syncing.
902
+ # The branch-head refspec is a special case because it's possible Chrome
903
+ # src, which contains the branch-head refspecs, is DEPSed in.
904
+ gclient_output = gclient_sync(
905
+ BRANCH_HEADS_REFSPEC in refs,
906
+ TAGS_REFSPEC in refs,
907
+ gc_revisions,
908
+ break_repo_locks,
909
+ disable_syntax_validation,
910
+ patch_refs,
911
+ gerrit_reset,
912
+ gerrit_rebase_patch_ref)
913
+
914
+ # Now that gclient_sync has finished, we should revert any .DEPS.git so that
915
+ # presubmit doesn't complain about it being modified.
916
+ if git('ls-files', '.DEPS.git', cwd=first_sln).strip():
917
+ git('checkout', 'HEAD', '--', '.DEPS.git', cwd=first_sln)
918
+
919
+ # Reset the deps_file point in the solutions so that hooks get run properly.
920
+ for sln in solutions:
921
+ sln['deps_file'] = sln.get('deps_file', 'DEPS').replace('.DEPS.git', 'DEPS')
922
+ gclient_configure(solutions, target_os, target_os_only, target_cpu,
923
+ git_cache_dir)
924
+
925
+ return gclient_output
926
+
927
+
928
+ def parse_revisions(revisions, root):
929
+ """Turn a list of revision specs into a nice dictionary.
930
+
931
+ We will always return a dict with {root: something}. By default if root
932
+ is unspecified, or if revisions is [], then revision will be assigned 'HEAD'
933
+ """
934
+ results = {root.strip('/'): 'HEAD'}
935
+ expanded_revisions = []
936
+ for revision in revisions:
937
+ # Allow rev1,rev2,rev3 format.
938
+ # TODO(hinoka): Delete this when webkit switches to recipes.
939
+ expanded_revisions.extend(revision.split(','))
940
+ for revision in expanded_revisions:
941
+ split_revision = revision.split('@', 1)
942
+ if len(split_revision) == 1:
943
+ # This is just a plain revision, set it as the revision for root.
944
+ results[root] = split_revision[0]
945
+ else:
946
+ # This is an alt_root@revision argument.
947
+ current_root, current_rev = split_revision
948
+
949
+ parsed_root = urlparse.urlparse(current_root)
950
+ if parsed_root.scheme in ['http', 'https']:
951
+ # We want to normalize git urls into .git urls.
952
+ normalized_root = 'https://' + parsed_root.netloc + parsed_root.path
953
+ if not normalized_root.endswith('.git'):
954
+ normalized_root += '.git'
955
+ elif parsed_root.scheme:
956
+ print('WARNING: Unrecognized scheme %s, ignoring' % parsed_root.scheme)
957
+ continue
958
+ else:
959
+ # This is probably a local path.
960
+ normalized_root = current_root.strip('/')
961
+
962
+ results[normalized_root] = current_rev
963
+
964
+ return results
965
+
966
+
967
+ def parse_args():
968
+ parse = optparse.OptionParser()
969
+
970
+ parse.add_option('--root', dest='patch_root',
971
+ help='DEPRECATED: Use --patch_root.')
972
+ parse.add_option('--patch_root', help='Directory to patch on top of.')
973
+ parse.add_option('--patch_ref', dest='patch_refs', action='append', default=[],
974
+ help='Git repository & ref to apply, as REPO@REF.')
975
+ parse.add_option('--gerrit_no_rebase_patch_ref', action='store_true',
976
+ help='Bypass rebase of Gerrit patch ref after checkout.')
977
+ parse.add_option('--gerrit_no_reset', action='store_true',
978
+ help='Bypass calling reset after applying a gerrit ref.')
979
+ parse.add_option('--specs', help='Gcilent spec.')
980
+ parse.add_option('--spec-path', help='Path to a Gcilent spec file.')
981
+ parse.add_option('--revision_mapping_file',
982
+ help=('Path to a json file of the form '
983
+ '{"property_name": "path/to/repo/"}'))
984
+ parse.add_option('--revision', action='append', default=[],
985
+ help='Revision to check out. Can be any form of git ref. '
986
+ 'Can prepend root@<rev> to specify which repository, '
987
+ 'where root is either a filesystem path or git https '
988
+ 'url. To specify Tip of Tree, set rev to HEAD. ')
989
+ parse.add_option(
990
+ '--no_fetch_tags',
991
+ action='store_true',
992
+ help=('Don\'t fetch tags from the server for the git checkout. '
993
+ 'This can speed up fetch considerably when '
994
+ 'there are many tags.'))
995
+ # TODO(machenbach): Remove the flag when all uses have been removed.
996
+ parse.add_option('--output_manifest', action='store_true',
997
+ help=('Deprecated.'))
998
+ parse.add_option('--clobber', action='store_true',
999
+ help='Delete checkout first, always')
1000
+ parse.add_option('--output_json',
1001
+ help='Output JSON information into a specified file')
1002
+ parse.add_option('--refs', action='append',
1003
+ help='Also fetch this refspec for the main solution(s). '
1004
+ 'Eg. +refs/branch-heads/*')
1005
+ parse.add_option('--with_branch_heads', action='store_true',
1006
+ help='Always pass --with_branch_heads to gclient. This '
1007
+ 'does the same thing as --refs +refs/branch-heads/*')
1008
+ parse.add_option('--with_tags', action='store_true',
1009
+ help='Always pass --with_tags to gclient. This '
1010
+ 'does the same thing as --refs +refs/tags/*')
1011
+ parse.add_option('--git-cache-dir', help='Path to git cache directory.')
1012
+ parse.add_option('--cleanup-dir',
1013
+ help='Path to a cleanup directory that can be used for '
1014
+ 'deferred file cleanup.')
1015
+ parse.add_option(
1016
+ '--disable-syntax-validation', action='store_true',
1017
+ help='Disable validation of .gclient and DEPS syntax.')
1018
+
1019
+ options, args = parse.parse_args()
1020
+
1021
+ if options.spec_path:
1022
+ if options.specs:
1023
+ parse.error('At most one of --spec-path and --specs may be specified.')
1024
+ with open(options.spec_path, 'r') as fd:
1025
+ options.specs = fd.read()
1026
+
1027
+ if not options.output_json:
1028
+ parse.error('--output_json is required')
1029
+
1030
+ if not options.git_cache_dir:
1031
+ parse.error('--git-cache-dir is required')
1032
+
1033
+ if not options.refs:
1034
+ options.refs = []
1035
+
1036
+ if options.with_branch_heads:
1037
+ options.refs.append(BRANCH_HEADS_REFSPEC)
1038
+ del options.with_branch_heads
1039
+
1040
+ if options.with_tags:
1041
+ options.refs.append(TAGS_REFSPEC)
1042
+ del options.with_tags
1043
+
1044
+ try:
1045
+ if not options.revision_mapping_file:
1046
+ parse.error('--revision_mapping_file is required')
1047
+
1048
+ with open(options.revision_mapping_file, 'r') as f:
1049
+ options.revision_mapping = json.load(f)
1050
+ except Exception as e:
1051
+ print(
1052
+ 'WARNING: Caught exception while parsing revision_mapping*: %s'
1053
+ % (str(e),))
1054
+
1055
+ # Because we print CACHE_DIR out into a .gclient file, and then later run
1056
+ # eval() on it, backslashes need to be escaped, otherwise "E:\b\build" gets
1057
+ # parsed as "E:[\x08][\x08]uild".
1058
+ if sys.platform.startswith('win'):
1059
+ options.git_cache_dir = options.git_cache_dir.replace('\\', '\\\\')
1060
+
1061
+ return options, args
1062
+
1063
+
1064
+ def prepare(options, git_slns, active):
1065
+ """Prepares the target folder before we checkout."""
1066
+ dir_names = [sln.get('name') for sln in git_slns if 'name' in sln]
1067
+ if options.clobber:
1068
+ ensure_no_checkout(dir_names, options.cleanup_dir)
1069
+ # Make sure we tell recipes that we didn't run if the script exits here.
1070
+ emit_json(options.output_json, did_run=active)
1071
+
1072
+ total_disk_space, free_disk_space = get_total_disk_space()
1073
+ total_disk_space_gb = int(total_disk_space / (1024 * 1024 * 1024))
1074
+ used_disk_space_gb = int((total_disk_space - free_disk_space)
1075
+ / (1024 * 1024 * 1024))
1076
+ percent_used = int(used_disk_space_gb * 100 / total_disk_space_gb)
1077
+ step_text = '[%dGB/%dGB used (%d%%)]' % (used_disk_space_gb,
1078
+ total_disk_space_gb,
1079
+ percent_used)
1080
+ # The first solution is where the primary DEPS file resides.
1081
+ first_sln = dir_names[0]
1082
+
1083
+ # Split all the revision specifications into a nice dict.
1084
+ print('Revisions: %s' % options.revision)
1085
+ revisions = parse_revisions(options.revision, first_sln)
1086
+ print('Fetching Git checkout at %s@%s' % (first_sln, revisions[first_sln]))
1087
+ return revisions, step_text
1088
+
1089
+
1090
+ def checkout(options, git_slns, specs, revisions, step_text):
1091
+ print('Using Python version: %s' % (sys.version,))
1092
+ print('Checking git version...')
1093
+ ver = git('version').strip()
1094
+ print('Using %s' % ver)
1095
+
1096
+ try:
1097
+ protocol = git('config', '--get', 'protocol.version')
1098
+ print('Using git protocol version %s' % protocol)
1099
+ except SubprocessFailed as e:
1100
+ print('git protocol version is not specified.')
1101
+
1102
+ first_sln = git_slns[0]['name']
1103
+ dir_names = [sln.get('name') for sln in git_slns if 'name' in sln]
1104
+ dirty_path = '.dirty_bot_checkout'
1105
+ if os.path.exists(dirty_path):
1106
+ ensure_no_checkout(dir_names, options.cleanup_dir)
1107
+
1108
+ with open(dirty_path, 'w') as f:
1109
+ # create file, no content
1110
+ pass
1111
+
1112
+ should_delete_dirty_file = False
1113
+
1114
+ try:
1115
+ # Outer try is for catching patch failures and exiting gracefully.
1116
+ # Inner try is for catching gclient failures and retrying gracefully.
1117
+ try:
1118
+ checkout_parameters = dict(
1119
+ # First, pass in the base of what we want to check out.
1120
+ solutions=git_slns,
1121
+ revisions=revisions,
1122
+ first_sln=first_sln,
1123
+
1124
+ # Also, target os variables for gclient.
1125
+ target_os=specs.get('target_os', []),
1126
+ target_os_only=specs.get('target_os_only', False),
1127
+
1128
+ # Also, target cpu variables for gclient.
1129
+ target_cpu=specs.get('target_cpu', []),
1130
+
1131
+ # Then, pass in information about how to patch.
1132
+ patch_root=options.patch_root,
1133
+ patch_refs=options.patch_refs,
1134
+ gerrit_rebase_patch_ref=not options.gerrit_no_rebase_patch_ref,
1135
+
1136
+ # Control how the fetch step will occur.
1137
+ no_fetch_tags=options.no_fetch_tags,
1138
+
1139
+ # Finally, extra configurations cleanup dir location.
1140
+ refs=options.refs,
1141
+ git_cache_dir=options.git_cache_dir,
1142
+ cleanup_dir=options.cleanup_dir,
1143
+ gerrit_reset=not options.gerrit_no_reset,
1144
+ disable_syntax_validation=options.disable_syntax_validation)
1145
+ gclient_output = ensure_checkout(**checkout_parameters)
1146
+ should_delete_dirty_file = True
1147
+ except GclientSyncFailed:
1148
+ print('We failed gclient sync, lets delete the checkout and retry.')
1149
+ ensure_no_checkout(dir_names, options.cleanup_dir)
1150
+ gclient_output = ensure_checkout(**checkout_parameters)
1151
+ should_delete_dirty_file = True
1152
+ except PatchFailed as e:
1153
+ # Tell recipes information such as root, got_revision, etc.
1154
+ emit_json(options.output_json,
1155
+ did_run=True,
1156
+ root=first_sln,
1157
+ patch_apply_return_code=e.code,
1158
+ patch_root=options.patch_root,
1159
+ patch_failure=True,
1160
+ failed_patch_body=e.output,
1161
+ step_text='%s PATCH FAILED' % step_text,
1162
+ fixed_revisions=revisions)
1163
+ should_delete_dirty_file = True
1164
+ raise
1165
+ finally:
1166
+ if should_delete_dirty_file:
1167
+ try:
1168
+ os.remove(dirty_path)
1169
+ except OSError:
1170
+ print('Dirty file %s has been removed by a different process.' %
1171
+ dirty_path)
1172
+
1173
+ # Take care of got_revisions outputs.
1174
+ revision_mapping = GOT_REVISION_MAPPINGS.get(git_slns[0]['url'], {})
1175
+ if options.revision_mapping:
1176
+ revision_mapping.update(options.revision_mapping)
1177
+
1178
+ # If the repo is not in the default GOT_REVISION_MAPPINGS and no
1179
+ # revision_mapping were specified on the command line then
1180
+ # default to setting 'got_revision' based on the first solution.
1181
+ if not revision_mapping:
1182
+ revision_mapping['got_revision'] = first_sln
1183
+
1184
+ got_revisions = parse_got_revision(gclient_output, revision_mapping)
1185
+
1186
+ if not got_revisions:
1187
+ # TODO(hinoka): We should probably bail out here, but in the interest
1188
+ # of giving mis-configured bots some time to get fixed use a dummy
1189
+ # revision here.
1190
+ got_revisions = { 'got_revision': 'BOT_UPDATE_NO_REV_FOUND' }
1191
+ #raise Exception('No got_revision(s) found in gclient output')
1192
+
1193
+ # Tell recipes information such as root, got_revision, etc.
1194
+ emit_json(options.output_json,
1195
+ did_run=True,
1196
+ root=first_sln,
1197
+ patch_root=options.patch_root,
1198
+ step_text=step_text,
1199
+ fixed_revisions=revisions,
1200
+ properties=got_revisions,
1201
+ manifest=create_manifest_old(),
1202
+ source_manifest=create_manifest(
1203
+ gclient_output, options.patch_root))
1204
+
1205
+
1206
+ def print_debug_info():
1207
+ print("Debugging info:")
1208
+ debug_params = {
1209
+ 'CURRENT_DIR': path.abspath(os.getcwd()),
1210
+ 'THIS_DIR': THIS_DIR,
1211
+ 'DEPOT_TOOLS_DIR': DEPOT_TOOLS_DIR,
1212
+ }
1213
+ for k, v in sorted(debug_params.items()):
1214
+ print("%s: %r" % (k, v))
1215
+
1216
+
1217
+ def main():
1218
+ # Get inputs.
1219
+ options, _ = parse_args()
1220
+
1221
+ # Check if this script should activate or not.
1222
+ active = True
1223
+
1224
+ # Print a helpful message to tell developers what's going on with this step.
1225
+ print_debug_info()
1226
+
1227
+ # Parse, manipulate, and print the gclient solutions.
1228
+ specs = {}
1229
+ exec(options.specs, specs)
1230
+ orig_solutions = specs.get('solutions', [])
1231
+ git_slns = modify_solutions(orig_solutions)
1232
+
1233
+ solutions_printer(git_slns)
1234
+
1235
+ try:
1236
+ # Dun dun dun, the main part of bot_update.
1237
+ # gn creates hardlinks during the build. By default, this makes
1238
+ # `git reset` overwrite the sources of the hardlinks, which causes
1239
+ # unnecessary rebuilds. (See crbug.com/330461#c13 for an explanation.)
1240
+ with git_config_if_not_set('core.trustctime', 'false'):
1241
+ revisions, step_text = prepare(options, git_slns, active)
1242
+ checkout(options, git_slns, specs, revisions, step_text)
1243
+
1244
+ except PatchFailed as e:
1245
+ # Return a specific non-zero exit code for patch failure (because it is
1246
+ # a failure), but make it different than other failures to distinguish
1247
+ # between infra failures (independent from patch author), and patch
1248
+ # failures (that patch author can fix). However, PatchFailure due to
1249
+ # download patch failure is still an infra problem.
1250
+ if e.code == 3:
1251
+ # Patch download problem.
1252
+ return 87
1253
+ # Genuine patch problem.
1254
+ return 88
1255
+
1256
+
1257
+ if __name__ == '__main__':
1258
+ sys.exit(main())