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,641 @@
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
+ r"""A database of OWNERS files.
6
+
7
+ OWNERS files indicate who is allowed to approve changes in a specific directory
8
+ (or who is allowed to make changes without needing approval of another OWNER).
9
+ Note that all changes must still be reviewed by someone familiar with the code,
10
+ so you may need approval from both an OWNER and a reviewer in many cases.
11
+
12
+ The syntax of the OWNERS file is, roughly:
13
+
14
+ lines := (\s* line? \s* comment? \s* "\n")*
15
+
16
+ line := directive
17
+ | "per-file" \s+ glob \s* "=" \s* directive
18
+
19
+ directive := "set noparent"
20
+ | "file:" owner_file
21
+ | email_address
22
+ | "*"
23
+
24
+ glob := [a-zA-Z0-9_-*?]+
25
+
26
+ comment := "#" [^"\n"]*
27
+
28
+ owner_file := "OWNERS"
29
+ | [^"\n"]* "_OWNERS"
30
+
31
+ Email addresses must follow the foo@bar.com short form (exact syntax given
32
+ in BASIC_EMAIL_REGEXP, below). Filename globs follow the simple unix
33
+ shell conventions, and relative and absolute paths are not allowed (i.e.,
34
+ globs only refer to the files in the current directory).
35
+
36
+ If a user's email is one of the email_addresses in the file, the user is
37
+ considered an "OWNER" for all files in the directory.
38
+
39
+ If the "per-file" directive is used, the line only applies to files in that
40
+ directory that match the filename glob specified.
41
+
42
+ If the "set noparent" directive used, then only entries in this OWNERS file
43
+ apply to files in this directory; if the "set noparent" directive is not
44
+ used, then entries in OWNERS files in enclosing (upper) directories also
45
+ apply (up until a "set noparent is encountered").
46
+
47
+ If "per-file glob=set noparent" is used, then global directives are ignored
48
+ for the glob, and only the "per-file" owners are used for files matching that
49
+ glob.
50
+
51
+ If the "file:" directive is used, the referred to OWNERS file will be parsed and
52
+ considered when determining the valid set of OWNERS. If the filename starts with
53
+ "//" it is relative to the root of the repository, otherwise it is relative to
54
+ the current file. The referred to file *must* be named OWNERS or end in a suffix
55
+ of _OWNERS.
56
+
57
+ Examples for all of these combinations can be found in tests/owners_unittest.py.
58
+ """
59
+
60
+ import collections
61
+ import fnmatch
62
+ import os
63
+ import random
64
+ import re
65
+
66
+ try:
67
+ # This fallback applies for all versions of Python before 3.3
68
+ import collections.abc as collections_abc
69
+ except ImportError:
70
+ import collections as collections_abc
71
+
72
+
73
+ # If this is present by itself on a line, this means that everyone can review.
74
+ EVERYONE = '*'
75
+
76
+
77
+ # Recognizes 'X@Y' email addresses. Very simplistic.
78
+ BASIC_EMAIL_REGEXP = r'^[\w\-\+\%\.]+\@[\w\-\+\%\.]+$'
79
+
80
+
81
+ # Key for global comments per email address. Should be unlikely to be a
82
+ # pathname.
83
+ GLOBAL_STATUS = '*'
84
+
85
+
86
+ def _assert_is_collection(obj):
87
+ assert not isinstance(obj, str)
88
+ # Module 'collections' has no 'Iterable' member
89
+ # pylint: disable=no-member
90
+ if hasattr(collections_abc, 'Iterable') and hasattr(collections_abc, 'Sized'):
91
+ assert (isinstance(obj, collections_abc.Iterable) and
92
+ isinstance(obj, collections_abc.Sized))
93
+
94
+
95
+ class SyntaxErrorInOwnersFile(Exception):
96
+ def __init__(self, path, lineno, msg):
97
+ super(SyntaxErrorInOwnersFile, self).__init__((path, lineno, msg))
98
+ self.path = path
99
+ self.lineno = lineno
100
+ self.msg = msg
101
+
102
+ def __str__(self):
103
+ return '%s:%d syntax error: %s' % (self.path, self.lineno, self.msg)
104
+
105
+
106
+ class Database(object):
107
+ """A database of OWNERS files for a repository.
108
+
109
+ This class allows you to find a suggested set of reviewers for a list
110
+ of changed files, and see if a list of changed files is covered by a
111
+ list of reviewers."""
112
+
113
+ def __init__(self, root, fopen, os_path):
114
+ """Args:
115
+ root: the path to the root of the Repository
116
+ open: function callback to open a text file for reading
117
+ os_path: module/object callback with fields for 'abspath', 'dirname',
118
+ 'exists', 'join', and 'relpath'
119
+ """
120
+ self.root = root
121
+ self.fopen = fopen
122
+ self.os_path = os_path
123
+
124
+ # Pick a default email regexp to use; callers can override as desired.
125
+ self.email_regexp = re.compile(BASIC_EMAIL_REGEXP)
126
+
127
+ # Replacement contents for the given files. Maps the file name of an
128
+ # OWNERS file (relative to root) to an iterator returning the replacement
129
+ # file contents.
130
+ self.override_files = {}
131
+
132
+ # Mapping of owners to the paths or globs they own.
133
+ self._owners_to_paths = {EVERYONE: set()}
134
+
135
+ # Mappings of directories -> globs in the directory -> owners
136
+ # Example: "chrome/browser" -> "chrome/browser/*.h" -> ("john", "maria")
137
+ # Paths used as keys must use slashes as the separator, even on Windows.
138
+ self._paths_to_owners = {}
139
+
140
+ # Mapping reviewers to the preceding comment per file in the OWNERS files.
141
+ self.comments = {}
142
+
143
+ # Cache of compiled regexes for _fnmatch()
144
+ self._fnmatch_cache = {}
145
+
146
+ # Sets of paths that stop us from looking above them for owners.
147
+ # (This is implicitly true for the root directory).
148
+ #
149
+ # The implementation is a mapping:
150
+ # Directory -> globs in the directory,
151
+ #
152
+ # Example:
153
+ # 'ui/events/devices/mojo' -> 'ui/events/devices/mojo/*_struct_traits*.*'
154
+ self._stop_looking = {'': set([''])}
155
+
156
+ # Set of files which have already been read.
157
+ self.read_files = set()
158
+
159
+ # Set of files which were included from other files. Files are processed
160
+ # differently depending on whether they are regular owners files or
161
+ # being included from another file.
162
+ self._included_files = {}
163
+
164
+ # File with global status lines for owners.
165
+ self._status_file = None
166
+
167
+ def _file_affects_ownership(self, path):
168
+ """Returns true if the path refers to a file that could affect ownership."""
169
+ filename = self.os_path.split(path)[-1]
170
+ return filename == 'OWNERS' or filename.endswith('_OWNERS')
171
+
172
+
173
+ def reviewers_for(self, files, author):
174
+ """Returns a suggested set of reviewers that will cover the files.
175
+
176
+ files is a sequence of paths relative to (and under) self.root.
177
+ If author is nonempty, we ensure it is not included in the set returned
178
+ in order avoid suggesting the author as a reviewer for their own changes."""
179
+ self._check_paths(files)
180
+ self.load_data_needed_for(files)
181
+
182
+ suggested_owners = self._covering_set_of_owners_for(files, author)
183
+ if EVERYONE in suggested_owners:
184
+ if len(suggested_owners) > 1:
185
+ suggested_owners.remove(EVERYONE)
186
+ else:
187
+ suggested_owners = set(['<anyone>'])
188
+ return suggested_owners
189
+
190
+ def files_not_covered_by(self, files, reviewers):
191
+ """Returns the files not owned by one of the reviewers.
192
+
193
+ Args:
194
+ files is a sequence of paths relative to (and under) self.root.
195
+ reviewers is a sequence of strings matching self.email_regexp.
196
+ """
197
+ self._check_paths(files)
198
+ self._check_reviewers(reviewers)
199
+ self.load_data_needed_for(files)
200
+
201
+ return set(f for f in files if not self._is_obj_covered_by(f, reviewers))
202
+
203
+ def _check_paths(self, files):
204
+ def _is_under(f, pfx):
205
+ return self.os_path.abspath(self.os_path.join(pfx, f)).startswith(pfx)
206
+ _assert_is_collection(files)
207
+ assert all(not self.os_path.isabs(f) and
208
+ _is_under(f, self.os_path.abspath(self.root)) for f in files)
209
+
210
+ def _check_reviewers(self, reviewers):
211
+ _assert_is_collection(reviewers)
212
+ assert all(self.email_regexp.match(r) for r in reviewers), reviewers
213
+
214
+ def _is_obj_covered_by(self, objname, reviewers):
215
+ reviewers = list(reviewers) + [EVERYONE]
216
+ while True:
217
+ for reviewer in reviewers:
218
+ for owned_pattern in self._owners_to_paths.get(reviewer, set()):
219
+ if fnmatch.fnmatch(objname, owned_pattern):
220
+ return True
221
+ if self._should_stop_looking(objname):
222
+ break
223
+ objname = self.os_path.dirname(objname)
224
+ return False
225
+
226
+ def enclosing_dir_with_owners(self, objname):
227
+ """Returns the innermost enclosing directory that has an OWNERS file."""
228
+ dirpath = objname
229
+ while not self._owners_for(dirpath):
230
+ if self._should_stop_looking(dirpath):
231
+ break
232
+ dirpath = self.os_path.dirname(dirpath)
233
+ return dirpath
234
+
235
+ def load_data_needed_for(self, files):
236
+ self._read_global_comments()
237
+ visited_dirs = set()
238
+ for f in files:
239
+ # Always use slashes as separators.
240
+ f = f.replace(os.sep, '/')
241
+ dirpath = self.os_path.dirname(f)
242
+ while dirpath not in visited_dirs:
243
+ visited_dirs.add(dirpath)
244
+
245
+ obj_owners = self._owners_for(dirpath)
246
+ if obj_owners:
247
+ break
248
+ self._read_owners(self.os_path.join(dirpath, 'OWNERS'))
249
+ if self._should_stop_looking(dirpath):
250
+ break
251
+
252
+ dirpath = self.os_path.dirname(dirpath)
253
+
254
+ def _should_stop_looking(self, objname):
255
+ dirname = objname
256
+ while True:
257
+ if dirname in self._stop_looking:
258
+ if any(self._fnmatch(objname, stop_looking)
259
+ for stop_looking in self._stop_looking[dirname]):
260
+ return True
261
+ up_dirname = self.os_path.dirname(dirname)
262
+ if up_dirname == dirname:
263
+ break
264
+ dirname = up_dirname
265
+ return False
266
+
267
+ def _get_root_affected_dir(self, obj_name):
268
+ """Returns the deepest directory/path that is affected by a file pattern
269
+ |obj_name|."""
270
+ root_affected_dir = obj_name
271
+ while '*' in root_affected_dir:
272
+ root_affected_dir = self.os_path.dirname(root_affected_dir)
273
+ return root_affected_dir
274
+
275
+ def _owners_for(self, objname):
276
+ obj_owners = set()
277
+
278
+ # Possibly relevant rules can be found stored at every directory
279
+ # level so iterate upwards, looking for them.
280
+ dirname = objname
281
+ while True:
282
+ dir_owner_rules = self._paths_to_owners.get(dirname)
283
+ if dir_owner_rules:
284
+ for owned_path, path_owners in dir_owner_rules.items():
285
+ if self._fnmatch(objname, owned_path):
286
+ obj_owners |= path_owners
287
+ up_dirname = self.os_path.dirname(dirname)
288
+ if up_dirname == dirname:
289
+ break
290
+ dirname = up_dirname
291
+
292
+ return obj_owners
293
+
294
+ def _read_owners(self, path):
295
+ owners_path = self.os_path.join(self.root, path)
296
+ if not (self.os_path.exists(owners_path) or (path in self.override_files)):
297
+ return
298
+
299
+ if owners_path in self.read_files:
300
+ return
301
+
302
+ self.read_files.add(owners_path)
303
+
304
+ is_toplevel = path == 'OWNERS'
305
+
306
+ comment = []
307
+ dirpath = self.os_path.dirname(path)
308
+ in_comment = False
309
+ # We treat the beginning of the file as an blank line.
310
+ previous_line_was_blank = True
311
+ reset_comment_after_use = False
312
+ lineno = 0
313
+
314
+ if path in self.override_files:
315
+ file_iter = self.override_files[path]
316
+ else:
317
+ file_iter = self.fopen(owners_path)
318
+
319
+ for line in file_iter:
320
+ lineno += 1
321
+ line = line.strip()
322
+ if line.startswith('#'):
323
+ if is_toplevel:
324
+ m = re.match(r'#\s*OWNERS_STATUS\s+=\s+(.+)$', line)
325
+ if m:
326
+ self._status_file = m.group(1).strip()
327
+ continue
328
+ if not in_comment:
329
+ comment = []
330
+ reset_comment_after_use = not previous_line_was_blank
331
+ comment.append(line[1:].strip())
332
+ in_comment = True
333
+ continue
334
+ in_comment = False
335
+
336
+ if line == '':
337
+ comment = []
338
+ previous_line_was_blank = True
339
+ continue
340
+
341
+ # If the line ends with a comment, strip the comment and store it for this
342
+ # line only.
343
+ line, _, line_comment = line.partition('#')
344
+ line = line.strip()
345
+ line_comment = [line_comment.strip()] if line_comment else []
346
+
347
+ previous_line_was_blank = False
348
+ if line == 'set noparent':
349
+ self._stop_looking.setdefault(
350
+ self._get_root_affected_dir(dirpath), set()).add(dirpath)
351
+ continue
352
+
353
+ m = re.match('per-file (.+)=(.+)', line)
354
+ if m:
355
+ glob_string = m.group(1).strip()
356
+ directive = m.group(2).strip()
357
+ full_glob_string = self.os_path.join(self.root, dirpath, glob_string)
358
+ if '/' in glob_string or '\\' in glob_string:
359
+ raise SyntaxErrorInOwnersFile(owners_path, lineno,
360
+ 'per-file globs cannot span directories or use escapes: "%s"' %
361
+ line)
362
+ relative_glob_string = self.os_path.relpath(full_glob_string, self.root)
363
+ self._add_entry(relative_glob_string, directive, owners_path,
364
+ lineno, '\n'.join(comment + line_comment))
365
+ if reset_comment_after_use:
366
+ comment = []
367
+ continue
368
+
369
+ if line.startswith('set '):
370
+ raise SyntaxErrorInOwnersFile(owners_path, lineno,
371
+ 'unknown option: "%s"' % line[4:].strip())
372
+
373
+ self._add_entry(dirpath, line, owners_path, lineno,
374
+ ' '.join(comment + line_comment))
375
+ if reset_comment_after_use:
376
+ comment = []
377
+
378
+ def _read_global_comments(self):
379
+ if not self._status_file:
380
+ if not 'OWNERS' in self.read_files:
381
+ self._read_owners('OWNERS')
382
+ if not self._status_file:
383
+ return
384
+
385
+ owners_status_path = self.os_path.join(self.root, self._status_file)
386
+ if not self.os_path.exists(owners_status_path):
387
+ raise IOError('Could not find global status file "%s"' %
388
+ owners_status_path)
389
+
390
+ if owners_status_path in self.read_files:
391
+ return
392
+
393
+ self.read_files.add(owners_status_path)
394
+
395
+ lineno = 0
396
+ for line in self.fopen(owners_status_path):
397
+ lineno += 1
398
+ line = line.strip()
399
+ if line.startswith('#'):
400
+ continue
401
+ if line == '':
402
+ continue
403
+
404
+ m = re.match('(.+?):(.+)', line)
405
+ if m:
406
+ owner = m.group(1).strip()
407
+ comment = m.group(2).strip()
408
+ if not self.email_regexp.match(owner):
409
+ raise SyntaxErrorInOwnersFile(owners_status_path, lineno,
410
+ 'invalid email address: "%s"' % owner)
411
+
412
+ self.comments.setdefault(owner, {})
413
+ self.comments[owner][GLOBAL_STATUS] = comment
414
+ continue
415
+
416
+ raise SyntaxErrorInOwnersFile(owners_status_path, lineno,
417
+ 'cannot parse status entry: "%s"' % line.strip())
418
+
419
+ def _add_entry(self, owned_paths, directive, owners_path, lineno, comment):
420
+ # Consistently uses paths with slashes as the keys or else Windows will
421
+ # break in surprising and untested ways.
422
+ owned_paths = owned_paths.replace(os.sep, '/')
423
+ if directive == 'set noparent':
424
+ self._stop_looking.setdefault(
425
+ self._get_root_affected_dir(owned_paths), set()).add(owned_paths)
426
+ elif directive.startswith('file:'):
427
+ include_file = self._resolve_include(directive[5:], owners_path, lineno)
428
+ if not include_file:
429
+ raise SyntaxErrorInOwnersFile(owners_path, lineno,
430
+ ('%s does not refer to an existing file.' % directive[5:]))
431
+
432
+ included_owners = self._read_just_the_owners(include_file)
433
+ for owner in included_owners:
434
+ self._owners_to_paths.setdefault(owner, set()).add(owned_paths)
435
+ self._paths_to_owners.setdefault(
436
+ self._get_root_affected_dir(owned_paths), {}).setdefault(
437
+ owned_paths, set()).add(owner)
438
+ elif self.email_regexp.match(directive) or directive == EVERYONE:
439
+ if comment:
440
+ self.comments.setdefault(directive, {})
441
+ self.comments[directive][owned_paths] = comment
442
+ self._owners_to_paths.setdefault(directive, set()).add(owned_paths)
443
+ self._paths_to_owners.setdefault(
444
+ self._get_root_affected_dir(owned_paths), {}).setdefault(
445
+ owned_paths, set()).add(directive)
446
+ else:
447
+ raise SyntaxErrorInOwnersFile(owners_path, lineno,
448
+ ('"%s" is not a "set noparent", file include, "*", '
449
+ 'or an email address.' % (directive,)))
450
+
451
+ def _resolve_include(self, path, start, lineno):
452
+ if path.startswith('//'):
453
+ include_path = path[2:]
454
+ else:
455
+ assert start.startswith(self.root)
456
+ start = self.os_path.dirname(self.os_path.relpath(start, self.root))
457
+ include_path = self.os_path.normpath(self.os_path.join(start, path))
458
+
459
+ if include_path in self.override_files:
460
+ return include_path
461
+
462
+ owners_path = self.os_path.join(self.root, include_path)
463
+ # Paths included via "file:" must end in OWNERS or _OWNERS. Files that can
464
+ # affect ownership have a different set of ownership rules, so that users
465
+ # cannot self-approve changes adding themselves to an OWNERS file.
466
+ if not self._file_affects_ownership(owners_path):
467
+ raise SyntaxErrorInOwnersFile(start, lineno, 'file: include must specify '
468
+ 'a file named OWNERS or ending in _OWNERS')
469
+
470
+ if not self.os_path.exists(owners_path):
471
+ return None
472
+
473
+ return include_path
474
+
475
+ def _read_just_the_owners(self, include_file):
476
+ if include_file in self._included_files:
477
+ return self._included_files[include_file]
478
+
479
+ owners = set()
480
+ self._included_files[include_file] = owners
481
+ lineno = 0
482
+ if include_file in self.override_files:
483
+ file_iter = self.override_files[include_file]
484
+ else:
485
+ file_iter = self.fopen(self.os_path.join(self.root, include_file))
486
+ for line in file_iter:
487
+ lineno += 1
488
+ line = line.strip()
489
+ if (line.startswith('#') or line == '' or
490
+ line.startswith('set noparent') or
491
+ line.startswith('per-file')):
492
+ continue
493
+
494
+ # If the line ends with a comment, strip the comment.
495
+ line, _delim, _comment = line.partition('#')
496
+ line = line.strip()
497
+
498
+ if self.email_regexp.match(line) or line == EVERYONE:
499
+ owners.add(line)
500
+ continue
501
+ if line.startswith('file:'):
502
+ sub_include_file = self._resolve_include(line[5:], include_file, lineno)
503
+ sub_owners = self._read_just_the_owners(sub_include_file)
504
+ owners.update(sub_owners)
505
+ continue
506
+
507
+ raise SyntaxErrorInOwnersFile(include_file, lineno,
508
+ ('"%s" is not a "set noparent", file include, "*", '
509
+ 'or an email address.' % (line,)))
510
+ return owners
511
+
512
+ def _covering_set_of_owners_for(self, files, author):
513
+ dirs_remaining = set(self.enclosing_dir_with_owners(f) for f in files)
514
+ all_possible_owners = self.all_possible_owners(dirs_remaining, author)
515
+ suggested_owners = set()
516
+ while dirs_remaining and all_possible_owners:
517
+ owner = self.lowest_cost_owner(all_possible_owners, dirs_remaining)
518
+ suggested_owners.add(owner)
519
+ dirs_to_remove = set(el[0] for el in all_possible_owners[owner])
520
+ dirs_remaining -= dirs_to_remove
521
+ # Now that we've used `owner` and covered all their dirs, remove them
522
+ # from consideration.
523
+ del all_possible_owners[owner]
524
+ for o, dirs in list(all_possible_owners.items()):
525
+ new_dirs = [(d, dist) for (d, dist) in dirs if d not in dirs_to_remove]
526
+ if not new_dirs:
527
+ del all_possible_owners[o]
528
+ else:
529
+ all_possible_owners[o] = new_dirs
530
+ return suggested_owners
531
+
532
+ def _all_possible_owners_for_dir_or_file(self, dir_or_file, author,
533
+ cache):
534
+ """Returns a dict of {potential owner: (dir_or_file, distance)} mappings.
535
+ """
536
+ assert not dir_or_file.startswith("/")
537
+ res = cache.get(dir_or_file)
538
+ if res is None:
539
+ res = {}
540
+ dirname = dir_or_file
541
+ for owner in self._owners_for(dirname):
542
+ if author and owner == author:
543
+ continue
544
+ res.setdefault(owner, [])
545
+ res[owner] = (dir_or_file, 1)
546
+ if not self._should_stop_looking(dirname):
547
+ dirname = self.os_path.dirname(dirname)
548
+
549
+ parent_res = self._all_possible_owners_for_dir_or_file(dirname,
550
+ author, cache)
551
+
552
+ # Merge the parent information with our information, adjusting
553
+ # distances as necessary, and replacing the parent directory
554
+ # names with our names.
555
+ for owner, par_dir_and_distances in parent_res.items():
556
+ if owner in res:
557
+ # If the same person is in multiple OWNERS files above a given
558
+ # directory, only count the closest one.
559
+ continue
560
+ parent_distance = par_dir_and_distances[1]
561
+ res[owner] = (dir_or_file, parent_distance + 1)
562
+
563
+ cache[dir_or_file] = res
564
+
565
+ return res
566
+
567
+ def all_possible_owners(self, dirs_and_files, author):
568
+ """Returns a dict of {potential owner: (dir, distance)} mappings.
569
+
570
+ A distance of 1 is the lowest/closest possible distance (which makes the
571
+ subsequent math easier).
572
+ """
573
+
574
+ all_possible_owners_for_dir_or_file_cache = {}
575
+ all_possible_owners = {}
576
+ for current_dir in dirs_and_files:
577
+ # Always use slashes as separators.
578
+ current_dir = current_dir.replace(os.sep, '/')
579
+ dir_owners = self._all_possible_owners_for_dir_or_file(
580
+ current_dir, author,
581
+ all_possible_owners_for_dir_or_file_cache)
582
+ for owner, dir_and_distance in dir_owners.items():
583
+ if owner in all_possible_owners:
584
+ all_possible_owners[owner].append(dir_and_distance)
585
+ else:
586
+ all_possible_owners[owner] = [dir_and_distance]
587
+
588
+ return all_possible_owners
589
+
590
+ def _fnmatch(self, filename, pattern):
591
+ """Same as fnmatch.fnmatch(), but internally caches the compiled regexes."""
592
+ # Make sure backslashes are never used in the filename. The regex
593
+ # expressions generated by fnmatch.translate don't handle matching slashes
594
+ # to backslashes.
595
+ filename = filename.replace(os.sep, '/')
596
+ assert pattern.count('\\') == 0, 'Backslashes found in %s' % pattern
597
+ matcher = self._fnmatch_cache.get(pattern)
598
+ if matcher is None:
599
+ matcher = re.compile(fnmatch.translate(pattern)).match
600
+ self._fnmatch_cache[pattern] = matcher
601
+ return matcher(filename)
602
+
603
+ @staticmethod
604
+ def total_costs_by_owner(all_possible_owners, dirs):
605
+ # We want to minimize both the number of reviewers and the distance
606
+ # from the files/dirs needing reviews. The "pow(X, 1.75)" below is
607
+ # an arbitrarily-selected scaling factor that seems to work well - it
608
+ # will select one reviewer in the parent directory over three reviewers
609
+ # in subdirs, but not one reviewer over just two.
610
+ result = {}
611
+ for owner in all_possible_owners:
612
+ total_distance = 0
613
+ num_directories_owned = 0
614
+ for dirname, distance in all_possible_owners[owner]:
615
+ if dirname in dirs:
616
+ total_distance += distance
617
+ num_directories_owned += 1
618
+ if num_directories_owned:
619
+ result[owner] = (total_distance /
620
+ pow(num_directories_owned, 1.75))
621
+ return result
622
+
623
+ @staticmethod
624
+ def lowest_cost_owner(all_possible_owners, dirs):
625
+ total_costs_by_owner = Database.total_costs_by_owner(all_possible_owners,
626
+ dirs)
627
+ # Return the lowest cost owner. In the case of a tie, pick one randomly.
628
+ lowest_cost = min(total_costs_by_owner.values())
629
+ lowest_cost_owners = [
630
+ owner for owner, cost in total_costs_by_owner.items()
631
+ if cost == lowest_cost]
632
+ return random.Random().choice(lowest_cost_owners)
633
+
634
+ def owners_rooted_at_file(self, filename):
635
+ """Returns a set of all owners transitively listed in filename.
636
+
637
+ This function returns a set of all the owners either listed in filename, or
638
+ in a file transitively included by filename. Lines that are not plain owners
639
+ (i.e. per-file owners) are ignored.
640
+ """
641
+ return self._read_just_the_owners(filename)