libv8 8.4.255.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (639) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.gitmodules +3 -0
  4. data/.rspec +3 -0
  5. data/.travis.yml +45 -0
  6. data/CHANGELOG.md +111 -0
  7. data/Gemfile +4 -0
  8. data/README.md +152 -0
  9. data/Rakefile +125 -0
  10. data/appveyor.yml.disabled +36 -0
  11. data/ext/libv8/arch.rb +20 -0
  12. data/ext/libv8/builder.rb +106 -0
  13. data/ext/libv8/extconf.rb +7 -0
  14. data/ext/libv8/location.rb +89 -0
  15. data/ext/libv8/paths.rb +28 -0
  16. data/lib/libv8.rb +9 -0
  17. data/lib/libv8/version.rb +3 -0
  18. data/libv8.gemspec +30 -0
  19. data/scaleway.png +0 -0
  20. data/spec/location_spec.rb +69 -0
  21. data/spec/spec_helper.rb +4 -0
  22. data/thefrontside.png +0 -0
  23. data/vendor/depot_tools/.cipd_impl.ps1 +129 -0
  24. data/vendor/depot_tools/.gitattributes +55 -0
  25. data/vendor/depot_tools/.gitignore +92 -0
  26. data/vendor/depot_tools/.style.yapf +4 -0
  27. data/vendor/depot_tools/.vpython +55 -0
  28. data/vendor/depot_tools/.vpython3 +23 -0
  29. data/vendor/depot_tools/CROS_OWNERS +7 -0
  30. data/vendor/depot_tools/GOMA_OWNERS +9 -0
  31. data/vendor/depot_tools/LICENSE +27 -0
  32. data/vendor/depot_tools/LUCI_OWNERS +5 -0
  33. data/vendor/depot_tools/OWNERS +39 -0
  34. data/vendor/depot_tools/PRESUBMIT.py +150 -0
  35. data/vendor/depot_tools/README.gclient.md +67 -0
  36. data/vendor/depot_tools/README.git-cl.md +99 -0
  37. data/vendor/depot_tools/README.md +78 -0
  38. data/vendor/depot_tools/WATCHLISTS +26 -0
  39. data/vendor/depot_tools/auth.py +163 -0
  40. data/vendor/depot_tools/autoninja +36 -0
  41. data/vendor/depot_tools/autoninja.bat +33 -0
  42. data/vendor/depot_tools/autoninja.py +148 -0
  43. data/vendor/depot_tools/bb +12 -0
  44. data/vendor/depot_tools/bb.bat +7 -0
  45. data/vendor/depot_tools/bootstrap/README.md +155 -0
  46. data/vendor/depot_tools/bootstrap/bootstrap.py +356 -0
  47. data/vendor/depot_tools/bootstrap/git-bash.template.sh +12 -0
  48. data/vendor/depot_tools/bootstrap/git.template.bat +5 -0
  49. data/vendor/depot_tools/bootstrap/manifest.txt +27 -0
  50. data/vendor/depot_tools/bootstrap/manifest_bleeding_edge.txt +27 -0
  51. data/vendor/depot_tools/bootstrap/profile.d.python.sh +20 -0
  52. data/vendor/depot_tools/bootstrap/python27.bat +46 -0
  53. data/vendor/depot_tools/bootstrap/python3.bat +46 -0
  54. data/vendor/depot_tools/bootstrap/win_tools.bat +79 -0
  55. data/vendor/depot_tools/bootstrap_python3 +35 -0
  56. data/vendor/depot_tools/breakpad.py +12 -0
  57. data/vendor/depot_tools/cbuildbot +1 -0
  58. data/vendor/depot_tools/chrome_set_ver +1 -0
  59. data/vendor/depot_tools/cipd +247 -0
  60. data/vendor/depot_tools/cipd.bat +67 -0
  61. data/vendor/depot_tools/cipd_bin_setup.bat +6 -0
  62. data/vendor/depot_tools/cipd_bin_setup.sh +22 -0
  63. data/vendor/depot_tools/cipd_client_version +1 -0
  64. data/vendor/depot_tools/cipd_client_version.digests +22 -0
  65. data/vendor/depot_tools/cipd_manifest.txt +63 -0
  66. data/vendor/depot_tools/cipd_manifest.versions +438 -0
  67. data/vendor/depot_tools/cit +8 -0
  68. data/vendor/depot_tools/cit.bat +12 -0
  69. data/vendor/depot_tools/cit.py +167 -0
  70. data/vendor/depot_tools/clang-format +8 -0
  71. data/vendor/depot_tools/clang-format.bat +12 -0
  72. data/vendor/depot_tools/clang_format.py +79 -0
  73. data/vendor/depot_tools/clang_format_merge_driver +8 -0
  74. data/vendor/depot_tools/clang_format_merge_driver.bat +12 -0
  75. data/vendor/depot_tools/clang_format_merge_driver.py +69 -0
  76. data/vendor/depot_tools/codereview.settings +6 -0
  77. data/vendor/depot_tools/compile_single_file +8 -0
  78. data/vendor/depot_tools/compile_single_file.bat +11 -0
  79. data/vendor/depot_tools/compile_single_file.py +79 -0
  80. data/vendor/depot_tools/cpplint.bat +11 -0
  81. data/vendor/depot_tools/cpplint.py +6097 -0
  82. data/vendor/depot_tools/cpplint_chromium.py +50 -0
  83. data/vendor/depot_tools/cros +87 -0
  84. data/vendor/depot_tools/cros_sdk +1 -0
  85. data/vendor/depot_tools/crosjobs +13 -0
  86. data/vendor/depot_tools/detect_host_arch.py +55 -0
  87. data/vendor/depot_tools/dirmd +12 -0
  88. data/vendor/depot_tools/dirmd.bat +7 -0
  89. data/vendor/depot_tools/download_from_google_storage +8 -0
  90. data/vendor/depot_tools/download_from_google_storage.bat +12 -0
  91. data/vendor/depot_tools/download_from_google_storage.py +634 -0
  92. data/vendor/depot_tools/ensure_bootstrap +53 -0
  93. data/vendor/depot_tools/fetch +21 -0
  94. data/vendor/depot_tools/fetch.bat +28 -0
  95. data/vendor/depot_tools/fetch.py +319 -0
  96. data/vendor/depot_tools/fetch_configs/android.py +34 -0
  97. data/vendor/depot_tools/fetch_configs/android_internal.py +34 -0
  98. data/vendor/depot_tools/fetch_configs/breakpad.py +44 -0
  99. data/vendor/depot_tools/fetch_configs/chromium.py +66 -0
  100. data/vendor/depot_tools/fetch_configs/config_util.py +52 -0
  101. data/vendor/depot_tools/fetch_configs/crashpad.py +41 -0
  102. data/vendor/depot_tools/fetch_configs/dart.py +45 -0
  103. data/vendor/depot_tools/fetch_configs/depot_tools.py +44 -0
  104. data/vendor/depot_tools/fetch_configs/devtools-frontend.py +44 -0
  105. data/vendor/depot_tools/fetch_configs/goma_client.py +41 -0
  106. data/vendor/depot_tools/fetch_configs/gyp.py +41 -0
  107. data/vendor/depot_tools/fetch_configs/infra.py +40 -0
  108. data/vendor/depot_tools/fetch_configs/infra_internal.py +45 -0
  109. data/vendor/depot_tools/fetch_configs/inspector_protocol.py +40 -0
  110. data/vendor/depot_tools/fetch_configs/ios.py +34 -0
  111. data/vendor/depot_tools/fetch_configs/ios_internal.py +39 -0
  112. data/vendor/depot_tools/fetch_configs/nacl.py +48 -0
  113. data/vendor/depot_tools/fetch_configs/naclports.py +47 -0
  114. data/vendor/depot_tools/fetch_configs/node-ci.py +41 -0
  115. data/vendor/depot_tools/fetch_configs/pdfium.py +40 -0
  116. data/vendor/depot_tools/fetch_configs/skia.py +41 -0
  117. data/vendor/depot_tools/fetch_configs/skia_buildbot.py +41 -0
  118. data/vendor/depot_tools/fetch_configs/syzygy.py +41 -0
  119. data/vendor/depot_tools/fetch_configs/v8.py +44 -0
  120. data/vendor/depot_tools/fetch_configs/webrtc.py +52 -0
  121. data/vendor/depot_tools/fetch_configs/webrtc_android.py +34 -0
  122. data/vendor/depot_tools/fetch_configs/webrtc_ios.py +34 -0
  123. data/vendor/depot_tools/fix_encoding.py +385 -0
  124. data/vendor/depot_tools/gclient +38 -0
  125. data/vendor/depot_tools/gclient-new-workdir.py +124 -0
  126. data/vendor/depot_tools/gclient.bat +32 -0
  127. data/vendor/depot_tools/gclient.py +3198 -0
  128. data/vendor/depot_tools/gclient_completion.sh +76 -0
  129. data/vendor/depot_tools/gclient_eval.py +891 -0
  130. data/vendor/depot_tools/gclient_paths.py +152 -0
  131. data/vendor/depot_tools/gclient_scm.py +1615 -0
  132. data/vendor/depot_tools/gclient_utils.py +1280 -0
  133. data/vendor/depot_tools/gerrit_client.py +151 -0
  134. data/vendor/depot_tools/gerrit_util.py +996 -0
  135. data/vendor/depot_tools/git-cache +6 -0
  136. data/vendor/depot_tools/git-cl +6 -0
  137. data/vendor/depot_tools/git-crrev-parse +53 -0
  138. data/vendor/depot_tools/git-drover +6 -0
  139. data/vendor/depot_tools/git-find-releases +6 -0
  140. data/vendor/depot_tools/git-footers +6 -0
  141. data/vendor/depot_tools/git-freeze +8 -0
  142. data/vendor/depot_tools/git-gs +9 -0
  143. data/vendor/depot_tools/git-hyper-blame +6 -0
  144. data/vendor/depot_tools/git-map +6 -0
  145. data/vendor/depot_tools/git-map-branches +6 -0
  146. data/vendor/depot_tools/git-mark-merge-base +6 -0
  147. data/vendor/depot_tools/git-nav-downstream +6 -0
  148. data/vendor/depot_tools/git-nav-upstream +6 -0
  149. data/vendor/depot_tools/git-new-branch +6 -0
  150. data/vendor/depot_tools/git-number +6 -0
  151. data/vendor/depot_tools/git-rebase-update +6 -0
  152. data/vendor/depot_tools/git-rename-branch +6 -0
  153. data/vendor/depot_tools/git-reparent-branch +6 -0
  154. data/vendor/depot_tools/git-retry +8 -0
  155. data/vendor/depot_tools/git-runhooks +23 -0
  156. data/vendor/depot_tools/git-squash-branch +6 -0
  157. data/vendor/depot_tools/git-templates/description +3 -0
  158. data/vendor/depot_tools/git-templates/hooks/applypatch-msg +4 -0
  159. data/vendor/depot_tools/git-templates/hooks/post-applypatch +4 -0
  160. data/vendor/depot_tools/git-templates/hooks/post-checkout +4 -0
  161. data/vendor/depot_tools/git-templates/hooks/post-commit +4 -0
  162. data/vendor/depot_tools/git-templates/hooks/post-merge +4 -0
  163. data/vendor/depot_tools/git-templates/hooks/post-update +4 -0
  164. data/vendor/depot_tools/git-templates/hooks/pre-applypatch +4 -0
  165. data/vendor/depot_tools/git-templates/hooks/pre-auto-gc +4 -0
  166. data/vendor/depot_tools/git-templates/hooks/pre-commit +4 -0
  167. data/vendor/depot_tools/git-templates/hooks/pre-rebase +4 -0
  168. data/vendor/depot_tools/git-templates/hooks/prepare-commit-msg +4 -0
  169. data/vendor/depot_tools/git-templates/info/exclude +6 -0
  170. data/vendor/depot_tools/git-thaw +13 -0
  171. data/vendor/depot_tools/git-upstream-diff +9 -0
  172. data/vendor/depot_tools/git_cache.py +786 -0
  173. data/vendor/depot_tools/git_cl.py +5158 -0
  174. data/vendor/depot_tools/git_cl_completion.sh +48 -0
  175. data/vendor/depot_tools/git_common.py +1101 -0
  176. data/vendor/depot_tools/git_dates.py +62 -0
  177. data/vendor/depot_tools/git_drover.py +469 -0
  178. data/vendor/depot_tools/git_find_releases.py +67 -0
  179. data/vendor/depot_tools/git_footers.py +261 -0
  180. data/vendor/depot_tools/git_freezer.py +40 -0
  181. data/vendor/depot_tools/git_hyper_blame.py +391 -0
  182. data/vendor/depot_tools/git_map.py +166 -0
  183. data/vendor/depot_tools/git_map_branches.py +354 -0
  184. data/vendor/depot_tools/git_mark_merge_base.py +73 -0
  185. data/vendor/depot_tools/git_nav_downstream.py +69 -0
  186. data/vendor/depot_tools/git_new_branch.py +82 -0
  187. data/vendor/depot_tools/git_number.py +301 -0
  188. data/vendor/depot_tools/git_rebase_update.py +351 -0
  189. data/vendor/depot_tools/git_rename_branch.py +55 -0
  190. data/vendor/depot_tools/git_reparent_branch.py +101 -0
  191. data/vendor/depot_tools/git_retry.py +181 -0
  192. data/vendor/depot_tools/git_squash_branch.py +28 -0
  193. data/vendor/depot_tools/git_upstream_diff.py +64 -0
  194. data/vendor/depot_tools/gn +8 -0
  195. data/vendor/depot_tools/gn.bat +12 -0
  196. data/vendor/depot_tools/gn.py +78 -0
  197. data/vendor/depot_tools/goma_auth +12 -0
  198. data/vendor/depot_tools/goma_auth.bat +8 -0
  199. data/vendor/depot_tools/goma_ctl +12 -0
  200. data/vendor/depot_tools/goma_ctl.bat +8 -0
  201. data/vendor/depot_tools/gsutil.py +190 -0
  202. data/vendor/depot_tools/gsutil.py.bat +23 -0
  203. data/vendor/depot_tools/gsutil.vpython +120 -0
  204. data/vendor/depot_tools/infra/README.md +1 -0
  205. data/vendor/depot_tools/infra/config/OWNERS +7 -0
  206. data/vendor/depot_tools/infra/config/README.md +1 -0
  207. data/vendor/depot_tools/infra/config/recipes.cfg +26 -0
  208. data/vendor/depot_tools/led +12 -0
  209. data/vendor/depot_tools/led.bat +7 -0
  210. data/vendor/depot_tools/lockfile.py +116 -0
  211. data/vendor/depot_tools/luci-auth +13 -0
  212. data/vendor/depot_tools/luci-auth.bat +8 -0
  213. data/vendor/depot_tools/lucicfg +12 -0
  214. data/vendor/depot_tools/lucicfg.bat +7 -0
  215. data/vendor/depot_tools/mac_toolchain +12 -0
  216. data/vendor/depot_tools/man/html/depot_tools.html +934 -0
  217. data/vendor/depot_tools/man/html/depot_tools_tutorial.html +1593 -0
  218. data/vendor/depot_tools/man/html/git-cl.html +1033 -0
  219. data/vendor/depot_tools/man/html/git-drover.html +1048 -0
  220. data/vendor/depot_tools/man/html/git-footers.html +878 -0
  221. data/vendor/depot_tools/man/html/git-freeze.html +859 -0
  222. data/vendor/depot_tools/man/html/git-hyper-blame.html +878 -0
  223. data/vendor/depot_tools/man/html/git-map-branches.html +904 -0
  224. data/vendor/depot_tools/man/html/git-map.html +887 -0
  225. data/vendor/depot_tools/man/html/git-mark-merge-base.html +826 -0
  226. data/vendor/depot_tools/man/html/git-nav-downstream.html +844 -0
  227. data/vendor/depot_tools/man/html/git-nav-upstream.html +853 -0
  228. data/vendor/depot_tools/man/html/git-new-branch.html +932 -0
  229. data/vendor/depot_tools/man/html/git-rebase-update.html +961 -0
  230. data/vendor/depot_tools/man/html/git-rename-branch.html +794 -0
  231. data/vendor/depot_tools/man/html/git-reparent-branch.html +847 -0
  232. data/vendor/depot_tools/man/html/git-retry.html +858 -0
  233. data/vendor/depot_tools/man/html/git-squash-branch.html +881 -0
  234. data/vendor/depot_tools/man/html/git-thaw.html +794 -0
  235. data/vendor/depot_tools/man/html/git-upstream-diff.html +923 -0
  236. data/vendor/depot_tools/man/man1/git-cl.1 +198 -0
  237. data/vendor/depot_tools/man/man1/git-drover.1 +330 -0
  238. data/vendor/depot_tools/man/man1/git-footers.1 +144 -0
  239. data/vendor/depot_tools/man/man1/git-freeze.1 +113 -0
  240. data/vendor/depot_tools/man/man1/git-hyper-blame.1 +128 -0
  241. data/vendor/depot_tools/man/man1/git-map-branches.1 +210 -0
  242. data/vendor/depot_tools/man/man1/git-map.1 +179 -0
  243. data/vendor/depot_tools/man/man1/git-mark-merge-base.1 +69 -0
  244. data/vendor/depot_tools/man/man1/git-nav-downstream.1 +112 -0
  245. data/vendor/depot_tools/man/man1/git-nav-upstream.1 +122 -0
  246. data/vendor/depot_tools/man/man1/git-new-branch.1 +176 -0
  247. data/vendor/depot_tools/man/man1/git-rebase-update.1 +177 -0
  248. data/vendor/depot_tools/man/man1/git-rename-branch.1 +53 -0
  249. data/vendor/depot_tools/man/man1/git-reparent-branch.1 +93 -0
  250. data/vendor/depot_tools/man/man1/git-retry.1 +108 -0
  251. data/vendor/depot_tools/man/man1/git-squash-branch.1 +129 -0
  252. data/vendor/depot_tools/man/man1/git-thaw.1 +54 -0
  253. data/vendor/depot_tools/man/man1/git-upstream-diff.1 +153 -0
  254. data/vendor/depot_tools/man/man7/depot_tools.7 +139 -0
  255. data/vendor/depot_tools/man/man7/depot_tools_tutorial.7 +1061 -0
  256. data/vendor/depot_tools/man/push_to_gs.sh +4 -0
  257. data/vendor/depot_tools/man/src/.gitignore +5 -0
  258. data/vendor/depot_tools/man/src/_aliases.txt +5 -0
  259. data/vendor/depot_tools/man/src/_footer.txt +8 -0
  260. data/vendor/depot_tools/man/src/_git-cl_desc.helper.txt +1 -0
  261. data/vendor/depot_tools/man/src/_git-drover_desc.helper.txt +2 -0
  262. data/vendor/depot_tools/man/src/_git-footers_desc.helper.txt +1 -0
  263. data/vendor/depot_tools/man/src/_git-freeze_desc.helper.txt +1 -0
  264. data/vendor/depot_tools/man/src/_git-hyper-blame_desc.helper.txt +1 -0
  265. data/vendor/depot_tools/man/src/_git-map-branches_desc.helper.txt +4 -0
  266. data/vendor/depot_tools/man/src/_git-map_desc.helper.txt +3 -0
  267. data/vendor/depot_tools/man/src/_git-mark-merge-base_desc.helper.txt +1 -0
  268. data/vendor/depot_tools/man/src/_git-nav-downstream_desc.helper.txt +1 -0
  269. data/vendor/depot_tools/man/src/_git-nav-upstream_desc.helper.txt +1 -0
  270. data/vendor/depot_tools/man/src/_git-new-branch_desc.helper.txt +1 -0
  271. data/vendor/depot_tools/man/src/_git-rebase-update_desc.helper.txt +1 -0
  272. data/vendor/depot_tools/man/src/_git-rename-branch_desc.helper.txt +1 -0
  273. data/vendor/depot_tools/man/src/_git-reparent-branch_desc.helper.txt +1 -0
  274. data/vendor/depot_tools/man/src/_git-retry_desc.helper.txt +2 -0
  275. data/vendor/depot_tools/man/src/_git-squash-branch_desc.helper.txt +1 -0
  276. data/vendor/depot_tools/man/src/_git-thaw_desc.helper.txt +2 -0
  277. data/vendor/depot_tools/man/src/_git-upstream-diff_desc.helper.txt +1 -0
  278. data/vendor/depot_tools/man/src/_helper_prefix.txt +1 -0
  279. data/vendor/depot_tools/man/src/asciidoc-override.css +7 -0
  280. data/vendor/depot_tools/man/src/common_demo_functions.sh +84 -0
  281. data/vendor/depot_tools/man/src/demo_repo.sh +43 -0
  282. data/vendor/depot_tools/man/src/depot_tools.txt +28 -0
  283. data/vendor/depot_tools/man/src/depot_tools_tutorial.demo.walkthrough.sh +155 -0
  284. data/vendor/depot_tools/man/src/depot_tools_tutorial.txt +432 -0
  285. data/vendor/depot_tools/man/src/filter_demo_output.py +141 -0
  286. data/vendor/depot_tools/man/src/git-cl.txt +119 -0
  287. data/vendor/depot_tools/man/src/git-drover.demo.1.sh +22 -0
  288. data/vendor/depot_tools/man/src/git-drover.demo.2.sh +23 -0
  289. data/vendor/depot_tools/man/src/git-drover.demo.3.sh +27 -0
  290. data/vendor/depot_tools/man/src/git-drover.demo.4.sh +39 -0
  291. data/vendor/depot_tools/man/src/git-drover.demo.common.sh +19 -0
  292. data/vendor/depot_tools/man/src/git-drover.txt +102 -0
  293. data/vendor/depot_tools/man/src/git-footers.demo.1.sh +17 -0
  294. data/vendor/depot_tools/man/src/git-footers.txt +71 -0
  295. data/vendor/depot_tools/man/src/git-freeze.demo.1.sh +23 -0
  296. data/vendor/depot_tools/man/src/git-freeze.txt +54 -0
  297. data/vendor/depot_tools/man/src/git-hyper-blame.demo.1.sh +3 -0
  298. data/vendor/depot_tools/man/src/git-hyper-blame.demo.2.sh +4 -0
  299. data/vendor/depot_tools/man/src/git-hyper-blame.demo.common.sh +57 -0
  300. data/vendor/depot_tools/man/src/git-hyper-blame.txt +85 -0
  301. data/vendor/depot_tools/man/src/git-map-branches.demo.1.sh +8 -0
  302. data/vendor/depot_tools/man/src/git-map-branches.txt +64 -0
  303. data/vendor/depot_tools/man/src/git-map.demo.1.sh +3 -0
  304. data/vendor/depot_tools/man/src/git-map.txt +67 -0
  305. data/vendor/depot_tools/man/src/git-mark-merge-base.txt +46 -0
  306. data/vendor/depot_tools/man/src/git-nav-downstream.demo.1.sh +12 -0
  307. data/vendor/depot_tools/man/src/git-nav-downstream.txt +40 -0
  308. data/vendor/depot_tools/man/src/git-nav-upstream.demo.1.sh +12 -0
  309. data/vendor/depot_tools/man/src/git-nav-upstream.txt +39 -0
  310. data/vendor/depot_tools/man/src/git-new-branch.demo.1.sh +17 -0
  311. data/vendor/depot_tools/man/src/git-new-branch.txt +82 -0
  312. data/vendor/depot_tools/man/src/git-rebase-update.txt +141 -0
  313. data/vendor/depot_tools/man/src/git-rename-branch.txt +28 -0
  314. data/vendor/depot_tools/man/src/git-reparent-branch.txt +61 -0
  315. data/vendor/depot_tools/man/src/git-retry.txt +67 -0
  316. data/vendor/depot_tools/man/src/git-squash-branch.demo.1.sh +12 -0
  317. data/vendor/depot_tools/man/src/git-squash-branch.txt +59 -0
  318. data/vendor/depot_tools/man/src/git-thaw.txt +29 -0
  319. data/vendor/depot_tools/man/src/git-upstream-diff.txt +107 -0
  320. data/vendor/depot_tools/man/src/make_docs.sh +260 -0
  321. data/vendor/depot_tools/man/src/prep_demo_repo.sh +103 -0
  322. data/vendor/depot_tools/metrics.README.md +101 -0
  323. data/vendor/depot_tools/metrics.py +297 -0
  324. data/vendor/depot_tools/metrics_utils.py +293 -0
  325. data/vendor/depot_tools/my_activity.py +971 -0
  326. data/vendor/depot_tools/ninja +44 -0
  327. data/vendor/depot_tools/ninja-linux32 +0 -0
  328. data/vendor/depot_tools/ninja-linux64 +0 -0
  329. data/vendor/depot_tools/ninja-mac +0 -0
  330. data/vendor/depot_tools/ninja.exe +0 -0
  331. data/vendor/depot_tools/ninjalog.README.md +64 -0
  332. data/vendor/depot_tools/ninjalog_uploader.py +233 -0
  333. data/vendor/depot_tools/ninjalog_uploader_wrapper.py +125 -0
  334. data/vendor/depot_tools/owners.py +641 -0
  335. data/vendor/depot_tools/owners_finder.py +385 -0
  336. data/vendor/depot_tools/post_build_ninja_summary.py +350 -0
  337. data/vendor/depot_tools/presubmit_canned_checks.py +1655 -0
  338. data/vendor/depot_tools/presubmit_support.py +1923 -0
  339. data/vendor/depot_tools/profile.xml +8 -0
  340. data/vendor/depot_tools/prpc +13 -0
  341. data/vendor/depot_tools/prpc.bat +8 -0
  342. data/vendor/depot_tools/pylint +9 -0
  343. data/vendor/depot_tools/pylint-1.5 +78 -0
  344. data/vendor/depot_tools/pylint-1.6 +78 -0
  345. data/vendor/depot_tools/pylint-1.7 +78 -0
  346. data/vendor/depot_tools/pylint-1.8 +78 -0
  347. data/vendor/depot_tools/pylint-1.9 +78 -0
  348. data/vendor/depot_tools/pylint.bat +12 -0
  349. data/vendor/depot_tools/pylint_main.py +45 -0
  350. data/vendor/depot_tools/pylintrc +349 -0
  351. data/vendor/depot_tools/python-bin/python3 +7 -0
  352. data/vendor/depot_tools/python_runner.sh +60 -0
  353. data/vendor/depot_tools/rdb +12 -0
  354. data/vendor/depot_tools/rdb.bat +7 -0
  355. data/vendor/depot_tools/recipes/OWNERS +4 -0
  356. data/vendor/depot_tools/recipes/README.recipes.md +1079 -0
  357. data/vendor/depot_tools/recipes/recipe_modules/OWNERS +1 -0
  358. data/vendor/depot_tools/recipes/recipe_modules/bot_update/OWNERS +2 -0
  359. data/vendor/depot_tools/recipes/recipe_modules/bot_update/__init__.py +38 -0
  360. data/vendor/depot_tools/recipes/recipe_modules/bot_update/api.py +516 -0
  361. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic.json +117 -0
  362. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic_luci.json +117 -0
  363. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic_with_branch_heads.json +118 -0
  364. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/clobber.json +211 -0
  365. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/deprecated_got_revision_mapping.json +194 -0
  366. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/gerrit_no_rebase_patch_ref.json +211 -0
  367. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/gerrit_no_reset.json +211 -0
  368. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/input_commit_with_id_without_repo.json +210 -0
  369. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/multiple_patch_refs.json +214 -0
  370. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_apply_patch_on_gclient.json +265 -0
  371. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_cp_checkout_HEAD.json +65 -0
  372. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_cp_checkout_a_branch_head.json +65 -0
  373. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_cp_checkout_a_specific_commit.json +65 -0
  374. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_cp_checkout_master.json +65 -0
  375. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/refs.json +212 -0
  376. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/reset_root_solution_revision.json +210 -0
  377. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/resolve_chromium_fixed_version.json +117 -0
  378. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail.json +95 -0
  379. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail_patch.json +209 -0
  380. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail_patch_download.json +193 -0
  381. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_angle.json +265 -0
  382. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_branch_heads.json +261 -0
  383. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_feature_branch.json +261 -0
  384. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_v8_feature_branch.json +265 -0
  385. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_webrtc.json +265 -0
  386. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_v8.json +265 -0
  387. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_v8_head_by_default.json +265 -0
  388. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/unrecognized_commit_repo.json +8 -0
  389. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/with_tags.json +211 -0
  390. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.py +308 -0
  391. data/vendor/depot_tools/recipes/recipe_modules/bot_update/resources/__init__.py +0 -0
  392. data/vendor/depot_tools/recipes/recipe_modules/bot_update/resources/bot_update.py +1258 -0
  393. data/vendor/depot_tools/recipes/recipe_modules/bot_update/test_api.py +93 -0
  394. data/vendor/depot_tools/recipes/recipe_modules/bot_update/tests/do_not_retry_patch_failures_in_cq.py +42 -0
  395. data/vendor/depot_tools/recipes/recipe_modules/bot_update/tests/ensure_checkout.py +35 -0
  396. data/vendor/depot_tools/recipes/recipe_modules/cipd/__init__.py +9 -0
  397. data/vendor/depot_tools/recipes/recipe_modules/cipd/api.py +455 -0
  398. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/basic.json +403 -0
  399. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/basic_pkg.json +403 -0
  400. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/describe-failed.json +82 -0
  401. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/describe-many-instances.json +411 -0
  402. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/mac64.json +403 -0
  403. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_file.json +315 -0
  404. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_mode.json +313 -0
  405. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_verfile.json +313 -0
  406. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/win64.json +403 -0
  407. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.py +187 -0
  408. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/junk arch.json +5 -0
  409. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/junk bits.json +5 -0
  410. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_arm_32.json +12 -0
  411. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_arm_64.json +12 -0
  412. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_intel_32.json +12 -0
  413. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_intel_64.json +12 -0
  414. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_mips_64.json +12 -0
  415. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/mac_intel_64.json +12 -0
  416. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/win_intel_32.json +12 -0
  417. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/win_intel_64.json +12 -0
  418. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.py +59 -0
  419. data/vendor/depot_tools/recipes/recipe_modules/cipd/test_api.py +93 -0
  420. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/__init__.py +9 -0
  421. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/api.py +75 -0
  422. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/basic.json +83 -0
  423. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/basic_luci.json +83 -0
  424. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/win.json +83 -0
  425. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.py +55 -0
  426. data/vendor/depot_tools/recipes/recipe_modules/gclient/__init__.py +13 -0
  427. data/vendor/depot_tools/recipes/recipe_modules/gclient/api.py +428 -0
  428. data/vendor/depot_tools/recipes/recipe_modules/gclient/config.py +462 -0
  429. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/basic.json +238 -0
  430. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/revision.json +240 -0
  431. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/tryserver.json +238 -0
  432. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.py +95 -0
  433. data/vendor/depot_tools/recipes/recipe_modules/gclient/resources/diff_deps.py +16 -0
  434. data/vendor/depot_tools/recipes/recipe_modules/gclient/test_api.py +36 -0
  435. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/diff_deps.expected/basic.json +55 -0
  436. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/diff_deps.expected/dont have revision yet.json +84 -0
  437. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/diff_deps.expected/no change, exception.json +83 -0
  438. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/diff_deps.expected/windows.json +55 -0
  439. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/diff_deps.py +88 -0
  440. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/patch_project.py +92 -0
  441. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/sync_failure.py +24 -0
  442. data/vendor/depot_tools/recipes/recipe_modules/gerrit/__init__.py +8 -0
  443. data/vendor/depot_tools/recipes/recipe_modules/gerrit/api.py +178 -0
  444. data/vendor/depot_tools/recipes/recipe_modules/gerrit/examples/full.expected/basic.json +284 -0
  445. data/vendor/depot_tools/recipes/recipe_modules/gerrit/examples/full.py +73 -0
  446. data/vendor/depot_tools/recipes/recipe_modules/gerrit/test_api.py +53 -0
  447. data/vendor/depot_tools/recipes/recipe_modules/git/__init__.py +11 -0
  448. data/vendor/depot_tools/recipes/recipe_modules/git/api.py +405 -0
  449. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic.json +217 -0
  450. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_branch.json +217 -0
  451. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_file_name.json +219 -0
  452. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_hash.json +216 -0
  453. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_ref.json +217 -0
  454. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_submodule_update_force.json +218 -0
  455. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_tags.json +218 -0
  456. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/can_fail_build.json +164 -0
  457. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/cannot_fail_build.json +220 -0
  458. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/cat-file_test.json +239 -0
  459. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_delta.json +290 -0
  460. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_failed.json +220 -0
  461. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_with_bad_output.json +222 -0
  462. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_with_bad_output_fails_build.json +111 -0
  463. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/curl_trace_file.json +218 -0
  464. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/git-cache-checkout.json +265 -0
  465. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/platform_win.json +217 -0
  466. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/rebase_failed.json +221 -0
  467. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/remote_not_origin.json +219 -0
  468. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/set_got_revision.json +218 -0
  469. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.py +170 -0
  470. data/vendor/depot_tools/recipes/recipe_modules/git/resources/git_setup.py +52 -0
  471. data/vendor/depot_tools/recipes/recipe_modules/git/test_api.py +18 -0
  472. data/vendor/depot_tools/recipes/recipe_modules/git_cl/__init__.py +5 -0
  473. data/vendor/depot_tools/recipes/recipe_modules/git_cl/api.py +50 -0
  474. data/vendor/depot_tools/recipes/recipe_modules/git_cl/config.py +22 -0
  475. data/vendor/depot_tools/recipes/recipe_modules/git_cl/examples/full.expected/basic.json +105 -0
  476. data/vendor/depot_tools/recipes/recipe_modules/git_cl/examples/full.py +47 -0
  477. data/vendor/depot_tools/recipes/recipe_modules/gitiles/OWNERS +2 -0
  478. data/vendor/depot_tools/recipes/recipe_modules/gitiles/__init__.py +12 -0
  479. data/vendor/depot_tools/recipes/recipe_modules/gitiles/api.py +257 -0
  480. data/vendor/depot_tools/recipes/recipe_modules/gitiles/examples/full.expected/basic.json +596 -0
  481. data/vendor/depot_tools/recipes/recipe_modules/gitiles/examples/full.py +93 -0
  482. data/vendor/depot_tools/recipes/recipe_modules/gitiles/resources/gerrit_client.py +251 -0
  483. data/vendor/depot_tools/recipes/recipe_modules/gitiles/test_api.py +95 -0
  484. data/vendor/depot_tools/recipes/recipe_modules/gitiles/tests/parse_repo_url.expected/basic.json +5 -0
  485. data/vendor/depot_tools/recipes/recipe_modules/gitiles/tests/parse_repo_url.py +49 -0
  486. data/vendor/depot_tools/recipes/recipe_modules/gsutil/__init__.py +4 -0
  487. data/vendor/depot_tools/recipes/recipe_modules/gsutil/api.py +222 -0
  488. data/vendor/depot_tools/recipes/recipe_modules/gsutil/examples/full.expected/basic.json +247 -0
  489. data/vendor/depot_tools/recipes/recipe_modules/gsutil/examples/full.py +92 -0
  490. data/vendor/depot_tools/recipes/recipe_modules/gsutil/resources/gsutil_smart_retry.py +69 -0
  491. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/__init__.py +36 -0
  492. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/api.py +140 -0
  493. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/ancient_version.json +83 -0
  494. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/automatic_version.json +83 -0
  495. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/explicit_version.json +83 -0
  496. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/linux.json +21 -0
  497. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/mac.json +83 -0
  498. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/win.json +21 -0
  499. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.py +42 -0
  500. data/vendor/depot_tools/recipes/recipe_modules/presubmit/__init__.py +27 -0
  501. data/vendor/depot_tools/recipes/recipe_modules/presubmit/api.py +251 -0
  502. data/vendor/depot_tools/recipes/recipe_modules/presubmit/examples/full.expected/basic.json +27 -0
  503. data/vendor/depot_tools/recipes/recipe_modules/presubmit/examples/full.py +19 -0
  504. data/vendor/depot_tools/recipes/recipe_modules/presubmit/properties.proto +14 -0
  505. data/vendor/depot_tools/recipes/recipe_modules/presubmit/test_api.py +19 -0
  506. data/vendor/depot_tools/recipes/recipe_modules/presubmit/tests/execute.py +247 -0
  507. data/vendor/depot_tools/recipes/recipe_modules/presubmit/tests/prepare.py +49 -0
  508. data/vendor/depot_tools/recipes/recipe_modules/tryserver/__init__.py +18 -0
  509. data/vendor/depot_tools/recipes/recipe_modules/tryserver/api.py +264 -0
  510. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/basic_tags.json +57 -0
  511. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch.json +190 -0
  512. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch_and_target_ref.json +190 -0
  513. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch.json +21 -0
  514. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch_new.json +22 -0
  515. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.py +95 -0
  516. data/vendor/depot_tools/recipes/recipe_modules/tryserver/test_api.py +14 -0
  517. data/vendor/depot_tools/recipes/recipe_modules/tryserver/tests/gerrit_change_fetch_ref_timeout.py +29 -0
  518. data/vendor/depot_tools/recipes/recipe_modules/tryserver/tests/gerrit_change_owner.expected/basic.json +5 -0
  519. data/vendor/depot_tools/recipes/recipe_modules/tryserver/tests/gerrit_change_owner.py +22 -0
  520. data/vendor/depot_tools/recipes/recipe_modules/tryserver/tests/gerrit_change_target_ref.py +32 -0
  521. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/__init__.py +25 -0
  522. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/api.py +137 -0
  523. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/linux.json +21 -0
  524. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/mac.json +21 -0
  525. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/win.json +108 -0
  526. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.py +21 -0
  527. data/vendor/depot_tools/recipes/recipes.py +249 -0
  528. data/vendor/depot_tools/recipes/recipes/fetch_end_to_end_test.expected/basic.json +175 -0
  529. data/vendor/depot_tools/recipes/recipes/fetch_end_to_end_test.py +56 -0
  530. data/vendor/depot_tools/recipes/trigger_recipe_roller.txt +13 -0
  531. data/vendor/depot_tools/repo +1194 -0
  532. data/vendor/depot_tools/roll-dep +21 -0
  533. data/vendor/depot_tools/roll-dep.bat +21 -0
  534. data/vendor/depot_tools/roll_dep.py +282 -0
  535. data/vendor/depot_tools/scm.py +415 -0
  536. data/vendor/depot_tools/setup_color.py +130 -0
  537. data/vendor/depot_tools/split_cl.py +263 -0
  538. data/vendor/depot_tools/subcommand.py +261 -0
  539. data/vendor/depot_tools/subprocess2.py +258 -0
  540. data/vendor/depot_tools/third_party/__init__.py +5 -0
  541. data/vendor/depot_tools/third_party/colorama/LICENSE.txt +27 -0
  542. data/vendor/depot_tools/third_party/colorama/README.chromium +12 -0
  543. data/vendor/depot_tools/third_party/colorama/README.rst +346 -0
  544. data/vendor/depot_tools/third_party/colorama/__init__.py +6 -0
  545. data/vendor/depot_tools/third_party/colorama/ansi.py +102 -0
  546. data/vendor/depot_tools/third_party/colorama/ansitowin32.py +257 -0
  547. data/vendor/depot_tools/third_party/colorama/initialise.py +80 -0
  548. data/vendor/depot_tools/third_party/colorama/win32.py +152 -0
  549. data/vendor/depot_tools/third_party/colorama/winterm.py +169 -0
  550. data/vendor/depot_tools/third_party/coverage/AUTHORS.txt +43 -0
  551. data/vendor/depot_tools/third_party/coverage/PKG-INFO +41 -0
  552. data/vendor/depot_tools/third_party/coverage/README.chromium +13 -0
  553. data/vendor/depot_tools/third_party/coverage/__init__.py +120 -0
  554. data/vendor/depot_tools/third_party/coverage/__main__.py +4 -0
  555. data/vendor/depot_tools/third_party/coverage/annotate.py +101 -0
  556. data/vendor/depot_tools/third_party/coverage/backward.py +184 -0
  557. data/vendor/depot_tools/third_party/coverage/bytecode.py +75 -0
  558. data/vendor/depot_tools/third_party/coverage/cmdline.py +740 -0
  559. data/vendor/depot_tools/third_party/coverage/codeunit.py +145 -0
  560. data/vendor/depot_tools/third_party/coverage/collector.py +353 -0
  561. data/vendor/depot_tools/third_party/coverage/config.py +213 -0
  562. data/vendor/depot_tools/third_party/coverage/control.py +776 -0
  563. data/vendor/depot_tools/third_party/coverage/data.py +278 -0
  564. data/vendor/depot_tools/third_party/coverage/debug.py +54 -0
  565. data/vendor/depot_tools/third_party/coverage/execfile.py +171 -0
  566. data/vendor/depot_tools/third_party/coverage/files.py +309 -0
  567. data/vendor/depot_tools/third_party/coverage/fullcoverage/encodings.py +57 -0
  568. data/vendor/depot_tools/third_party/coverage/html.py +387 -0
  569. data/vendor/depot_tools/third_party/coverage/htmlfiles/coverage_html.js +376 -0
  570. data/vendor/depot_tools/third_party/coverage/htmlfiles/index.html +104 -0
  571. data/vendor/depot_tools/third_party/coverage/htmlfiles/jquery-1.4.3.min.js +166 -0
  572. data/vendor/depot_tools/third_party/coverage/htmlfiles/jquery.hotkeys.js +99 -0
  573. data/vendor/depot_tools/third_party/coverage/htmlfiles/jquery.isonscreen.js +53 -0
  574. data/vendor/depot_tools/third_party/coverage/htmlfiles/jquery.min.js +166 -0
  575. data/vendor/depot_tools/third_party/coverage/htmlfiles/jquery.tablesorter.min.js +2 -0
  576. data/vendor/depot_tools/third_party/coverage/htmlfiles/keybd_closed.png +0 -0
  577. data/vendor/depot_tools/third_party/coverage/htmlfiles/keybd_open.png +0 -0
  578. data/vendor/depot_tools/third_party/coverage/htmlfiles/pyfile.html +90 -0
  579. data/vendor/depot_tools/third_party/coverage/htmlfiles/style.css +300 -0
  580. data/vendor/depot_tools/third_party/coverage/misc.py +163 -0
  581. data/vendor/depot_tools/third_party/coverage/parser.py +666 -0
  582. data/vendor/depot_tools/third_party/coverage/phystokens.py +208 -0
  583. data/vendor/depot_tools/third_party/coverage/report.py +92 -0
  584. data/vendor/depot_tools/third_party/coverage/results.py +286 -0
  585. data/vendor/depot_tools/third_party/coverage/summary.py +86 -0
  586. data/vendor/depot_tools/third_party/coverage/templite.py +166 -0
  587. data/vendor/depot_tools/third_party/coverage/version.py +9 -0
  588. data/vendor/depot_tools/third_party/coverage/xmlreport.py +155 -0
  589. data/vendor/depot_tools/third_party/httplib2/LICENSE +1339 -0
  590. data/vendor/depot_tools/third_party/httplib2/README.chromium +15 -0
  591. data/vendor/depot_tools/third_party/httplib2/__init__.py +1780 -0
  592. data/vendor/depot_tools/third_party/httplib2/cacerts.txt +2196 -0
  593. data/vendor/depot_tools/third_party/httplib2/iri2uri.py +110 -0
  594. data/vendor/depot_tools/third_party/httplib2/socks.py +448 -0
  595. data/vendor/depot_tools/third_party/repo/COPYING +202 -0
  596. data/vendor/depot_tools/third_party/repo/README.chromium +4 -0
  597. data/vendor/depot_tools/third_party/repo/__init__.py +0 -0
  598. data/vendor/depot_tools/third_party/repo/progress.py +117 -0
  599. data/vendor/depot_tools/third_party/retry_decorator/LICENSE.google +30 -0
  600. data/vendor/depot_tools/third_party/retry_decorator/__init__.py +0 -0
  601. data/vendor/depot_tools/third_party/retry_decorator/decorators.py +45 -0
  602. data/vendor/depot_tools/third_party/schema/.editorconfig +15 -0
  603. data/vendor/depot_tools/third_party/schema/.gitignore +174 -0
  604. data/vendor/depot_tools/third_party/schema/.travis.yml +37 -0
  605. data/vendor/depot_tools/third_party/schema/LICENSE-MIT +19 -0
  606. data/vendor/depot_tools/third_party/schema/MANIFEST.in +1 -0
  607. data/vendor/depot_tools/third_party/schema/README.chromium +12 -0
  608. data/vendor/depot_tools/third_party/schema/README.rst +382 -0
  609. data/vendor/depot_tools/third_party/schema/__init__.py +1 -0
  610. data/vendor/depot_tools/third_party/schema/schema.py +338 -0
  611. data/vendor/depot_tools/third_party/schema/setup.cfg +5 -0
  612. data/vendor/depot_tools/third_party/schema/setup.py +30 -0
  613. data/vendor/depot_tools/third_party/schema/test_schema.py +556 -0
  614. data/vendor/depot_tools/third_party/schema/tox.ini +33 -0
  615. data/vendor/depot_tools/third_party/six/LICENSE.txt +18 -0
  616. data/vendor/depot_tools/third_party/six/README.chromium +10 -0
  617. data/vendor/depot_tools/third_party/six/__init__.py +762 -0
  618. data/vendor/depot_tools/update_depot_tools +138 -0
  619. data/vendor/depot_tools/update_depot_tools.bat +65 -0
  620. data/vendor/depot_tools/update_depot_tools_toggle.py +38 -0
  621. data/vendor/depot_tools/upload_metrics.py +26 -0
  622. data/vendor/depot_tools/upload_to_google_storage.py +306 -0
  623. data/vendor/depot_tools/vpython +42 -0
  624. data/vendor/depot_tools/vpython.bat +7 -0
  625. data/vendor/depot_tools/vpython3 +55 -0
  626. data/vendor/depot_tools/vpython3.bat +12 -0
  627. data/vendor/depot_tools/watchlists.py +141 -0
  628. data/vendor/depot_tools/weekly +54 -0
  629. data/vendor/depot_tools/win32imports.py +61 -0
  630. data/vendor/depot_tools/win_toolchain/OWNERS +2 -0
  631. data/vendor/depot_tools/win_toolchain/README.md +74 -0
  632. data/vendor/depot_tools/win_toolchain/get_toolchain_if_necessary.py +599 -0
  633. data/vendor/depot_tools/win_toolchain/package_from_installed.py +524 -0
  634. data/vendor/depot_tools/wtf +81 -0
  635. data/vendor/depot_tools/yapf +21 -0
  636. data/vendor/depot_tools/yapf.bat +12 -0
  637. data/vendor/depot_tools/zsh-goodies/README +6 -0
  638. data/vendor/depot_tools/zsh-goodies/_gclient +14 -0
  639. metadata +729 -0
@@ -0,0 +1,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)