dependabot-core 0.76.1

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 (321) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +6408 -0
  3. data/LICENSE +37 -0
  4. data/README.md +115 -0
  5. data/helpers/elixir/bin/check_update.exs +92 -0
  6. data/helpers/elixir/bin/do_update.exs +39 -0
  7. data/helpers/elixir/bin/parse_deps.exs +103 -0
  8. data/helpers/elixir/bin/run.exs +76 -0
  9. data/helpers/elixir/mix.exs +21 -0
  10. data/helpers/elixir/mix.lock +3 -0
  11. data/helpers/go/Makefile +9 -0
  12. data/helpers/go/go.mod +9 -0
  13. data/helpers/go/go.sum +5 -0
  14. data/helpers/go/importresolver/main.go +34 -0
  15. data/helpers/go/main.go +77 -0
  16. data/helpers/go/updatechecker/main.go +107 -0
  17. data/helpers/go/updater/go.mod +3 -0
  18. data/helpers/go/updater/go.sum +2 -0
  19. data/helpers/go/updater/helpers.go +57 -0
  20. data/helpers/go/updater/main.go +48 -0
  21. data/helpers/npm/.agignore +1 -0
  22. data/helpers/npm/.envrc +2 -0
  23. data/helpers/npm/.eslintrc +14 -0
  24. data/helpers/npm/.nvimrc +7 -0
  25. data/helpers/npm/bin/run.js +34 -0
  26. data/helpers/npm/lib/helpers.js +25 -0
  27. data/helpers/npm/lib/peer-dependency-checker.js +102 -0
  28. data/helpers/npm/lib/subdependency-updater.js +48 -0
  29. data/helpers/npm/lib/updater.js +95 -0
  30. data/helpers/npm/package.json +17 -0
  31. data/helpers/npm/test/fixtures/npm-left-pad.json +1 -0
  32. data/helpers/npm/test/fixtures/updater/original/package-lock.json +16 -0
  33. data/helpers/npm/test/fixtures/updater/original/package.json +9 -0
  34. data/helpers/npm/test/fixtures/updater/updated/package-lock.json +16 -0
  35. data/helpers/npm/test/helpers.js +7 -0
  36. data/helpers/npm/test/updater.test.js +50 -0
  37. data/helpers/npm/yarn.lock +6120 -0
  38. data/helpers/php/.php_cs +34 -0
  39. data/helpers/php/bin/run.php +57 -0
  40. data/helpers/php/composer.json +14 -0
  41. data/helpers/php/composer.lock +1521 -0
  42. data/helpers/php/composer.phar +0 -0
  43. data/helpers/php/setup.sh +4 -0
  44. data/helpers/php/src/DependabotInstallationManager.php +61 -0
  45. data/helpers/php/src/DependabotPluginManager.php +23 -0
  46. data/helpers/php/src/ExceptionIO.php +25 -0
  47. data/helpers/php/src/Hasher.php +21 -0
  48. data/helpers/php/src/UpdateChecker.php +123 -0
  49. data/helpers/php/src/Updater.php +97 -0
  50. data/helpers/python/lib/__init__.py +0 -0
  51. data/helpers/python/lib/hasher.py +23 -0
  52. data/helpers/python/lib/parser.py +130 -0
  53. data/helpers/python/requirements.txt +9 -0
  54. data/helpers/python/run.py +18 -0
  55. data/helpers/test/run.rb +15 -0
  56. data/helpers/utils/git-credential-store-immutable +10 -0
  57. data/helpers/yarn/.agignore +1 -0
  58. data/helpers/yarn/.envrc +2 -0
  59. data/helpers/yarn/.eslintrc +14 -0
  60. data/helpers/yarn/.nvimrc +7 -0
  61. data/helpers/yarn/bin/run.js +36 -0
  62. data/helpers/yarn/lib/fix-duplicates.js +53 -0
  63. data/helpers/yarn/lib/helpers.js +5 -0
  64. data/helpers/yarn/lib/lockfile-parser.js +21 -0
  65. data/helpers/yarn/lib/peer-dependency-checker.js +130 -0
  66. data/helpers/yarn/lib/replace-lockfile-declaration.js +45 -0
  67. data/helpers/yarn/lib/subdependency-updater.js +69 -0
  68. data/helpers/yarn/lib/updater.js +254 -0
  69. data/helpers/yarn/package.json +17 -0
  70. data/helpers/yarn/test/fixtures/updater/original/package.json +6 -0
  71. data/helpers/yarn/test/fixtures/updater/original/yarn.lock +11 -0
  72. data/helpers/yarn/test/fixtures/updater/updated/yarn.lock +12 -0
  73. data/helpers/yarn/test/fixtures/updater/with-version-comments/package.json +5 -0
  74. data/helpers/yarn/test/fixtures/updater/with-version-comments/yarn.lock +13 -0
  75. data/helpers/yarn/test/fixtures/yarnpkg-is-positive.json +1 -0
  76. data/helpers/yarn/test/fixtures/yarnpkg-left-pad.json +1 -0
  77. data/helpers/yarn/test/helpers.js +7 -0
  78. data/helpers/yarn/test/updater.test.js +93 -0
  79. data/helpers/yarn/yarn.lock +4912 -0
  80. data/lib/bundler_definition_bundler_version_patch.rb +15 -0
  81. data/lib/bundler_definition_ruby_version_patch.rb +14 -0
  82. data/lib/bundler_git_source_patch.rb +27 -0
  83. data/lib/dependabot.rb +4 -0
  84. data/lib/dependabot/clients/bitbucket.rb +101 -0
  85. data/lib/dependabot/clients/github_with_retries.rb +117 -0
  86. data/lib/dependabot/clients/gitlab.rb +72 -0
  87. data/lib/dependabot/dependency.rb +118 -0
  88. data/lib/dependabot/dependency_file.rb +54 -0
  89. data/lib/dependabot/errors.rb +179 -0
  90. data/lib/dependabot/file_fetchers.rb +48 -0
  91. data/lib/dependabot/file_fetchers/README.md +65 -0
  92. data/lib/dependabot/file_fetchers/base.rb +302 -0
  93. data/lib/dependabot/file_fetchers/docker/docker.rb +40 -0
  94. data/lib/dependabot/file_fetchers/dotnet/nuget.rb +215 -0
  95. data/lib/dependabot/file_fetchers/dotnet/nuget/import_paths_finder.rb +51 -0
  96. data/lib/dependabot/file_fetchers/dotnet/nuget/sln_project_paths_finder.rb +55 -0
  97. data/lib/dependabot/file_fetchers/elixir/hex.rb +78 -0
  98. data/lib/dependabot/file_fetchers/elm/elm_package.rb +52 -0
  99. data/lib/dependabot/file_fetchers/git/submodules.rb +73 -0
  100. data/lib/dependabot/file_fetchers/go/dep.rb +69 -0
  101. data/lib/dependabot/file_fetchers/go/modules.rb +64 -0
  102. data/lib/dependabot/file_fetchers/java/gradle.rb +56 -0
  103. data/lib/dependabot/file_fetchers/java/gradle/settings_file_parser.rb +66 -0
  104. data/lib/dependabot/file_fetchers/java/maven.rb +127 -0
  105. data/lib/dependabot/file_fetchers/java_script/npm_and_yarn.rb +330 -0
  106. data/lib/dependabot/file_fetchers/java_script/npm_and_yarn/path_dependency_builder.rb +107 -0
  107. data/lib/dependabot/file_fetchers/php/composer.rb +131 -0
  108. data/lib/dependabot/file_fetchers/python/pip.rb +305 -0
  109. data/lib/dependabot/file_fetchers/ruby/bundler.rb +185 -0
  110. data/lib/dependabot/file_fetchers/ruby/bundler/child_gemfile_finder.rb +70 -0
  111. data/lib/dependabot/file_fetchers/ruby/bundler/path_gemspec_finder.rb +114 -0
  112. data/lib/dependabot/file_fetchers/ruby/bundler/require_relative_finder.rb +67 -0
  113. data/lib/dependabot/file_fetchers/rust/cargo.rb +240 -0
  114. data/lib/dependabot/file_parsers.rb +48 -0
  115. data/lib/dependabot/file_parsers/README.md +45 -0
  116. data/lib/dependabot/file_parsers/base.rb +31 -0
  117. data/lib/dependabot/file_parsers/base/dependency_set.rb +77 -0
  118. data/lib/dependabot/file_parsers/docker/docker.rb +164 -0
  119. data/lib/dependabot/file_parsers/dotnet/nuget.rb +85 -0
  120. data/lib/dependabot/file_parsers/dotnet/nuget/packages_config_parser.rb +65 -0
  121. data/lib/dependabot/file_parsers/dotnet/nuget/project_file_parser.rb +156 -0
  122. data/lib/dependabot/file_parsers/dotnet/nuget/property_value_finder.rb +131 -0
  123. data/lib/dependabot/file_parsers/elixir/hex.rb +134 -0
  124. data/lib/dependabot/file_parsers/elm/elm_package.rb +136 -0
  125. data/lib/dependabot/file_parsers/git/submodules.rb +69 -0
  126. data/lib/dependabot/file_parsers/go/dep.rb +163 -0
  127. data/lib/dependabot/file_parsers/go/modules.rb +34 -0
  128. data/lib/dependabot/file_parsers/go/modules/go_mod_parser.rb +134 -0
  129. data/lib/dependabot/file_parsers/java/gradle.rb +236 -0
  130. data/lib/dependabot/file_parsers/java/gradle/property_value_finder.rb +90 -0
  131. data/lib/dependabot/file_parsers/java/gradle/repositories_finder.rb +145 -0
  132. data/lib/dependabot/file_parsers/java/maven.rb +252 -0
  133. data/lib/dependabot/file_parsers/java/maven/property_value_finder.rb +166 -0
  134. data/lib/dependabot/file_parsers/java/maven/repositories_finder.rb +188 -0
  135. data/lib/dependabot/file_parsers/java_script/npm_and_yarn.rb +394 -0
  136. data/lib/dependabot/file_parsers/php/composer.rb +177 -0
  137. data/lib/dependabot/file_parsers/python/pip.rb +223 -0
  138. data/lib/dependabot/file_parsers/python/pip/pipfile_files_parser.rb +154 -0
  139. data/lib/dependabot/file_parsers/python/pip/poetry_files_parser.rb +141 -0
  140. data/lib/dependabot/file_parsers/python/pip/setup_file_parser.rb +160 -0
  141. data/lib/dependabot/file_parsers/ruby/bundler.rb +295 -0
  142. data/lib/dependabot/file_parsers/ruby/bundler/file_preparer.rb +85 -0
  143. data/lib/dependabot/file_parsers/ruby/bundler/gemfile_checker.rb +48 -0
  144. data/lib/dependabot/file_parsers/rust/cargo.rb +213 -0
  145. data/lib/dependabot/file_updaters.rb +48 -0
  146. data/lib/dependabot/file_updaters/README.md +58 -0
  147. data/lib/dependabot/file_updaters/base.rb +52 -0
  148. data/lib/dependabot/file_updaters/docker/docker.rb +133 -0
  149. data/lib/dependabot/file_updaters/dotnet/nuget.rb +151 -0
  150. data/lib/dependabot/file_updaters/dotnet/nuget/packages_config_declaration_finder.rb +69 -0
  151. data/lib/dependabot/file_updaters/dotnet/nuget/project_file_declaration_finder.rb +78 -0
  152. data/lib/dependabot/file_updaters/dotnet/nuget/property_value_updater.rb +64 -0
  153. data/lib/dependabot/file_updaters/elixir/hex.rb +71 -0
  154. data/lib/dependabot/file_updaters/elixir/hex/lockfile_updater.rb +147 -0
  155. data/lib/dependabot/file_updaters/elixir/hex/mixfile_git_pin_updater.rb +53 -0
  156. data/lib/dependabot/file_updaters/elixir/hex/mixfile_requirement_updater.rb +74 -0
  157. data/lib/dependabot/file_updaters/elixir/hex/mixfile_sanitizer.rb +28 -0
  158. data/lib/dependabot/file_updaters/elixir/hex/mixfile_updater.rb +98 -0
  159. data/lib/dependabot/file_updaters/elm/elm_package.rb +79 -0
  160. data/lib/dependabot/file_updaters/elm/elm_package/elm_json_updater.rb +69 -0
  161. data/lib/dependabot/file_updaters/elm/elm_package/elm_package_updater.rb +69 -0
  162. data/lib/dependabot/file_updaters/git/submodules.rb +38 -0
  163. data/lib/dependabot/file_updaters/go/dep.rb +77 -0
  164. data/lib/dependabot/file_updaters/go/dep/lockfile_updater.rb +219 -0
  165. data/lib/dependabot/file_updaters/go/dep/manifest_updater.rb +155 -0
  166. data/lib/dependabot/file_updaters/go/modules.rb +71 -0
  167. data/lib/dependabot/file_updaters/go/modules/go_mod_updater.rb +81 -0
  168. data/lib/dependabot/file_updaters/java/gradle.rb +176 -0
  169. data/lib/dependabot/file_updaters/java/gradle/dependency_set_updater.rb +66 -0
  170. data/lib/dependabot/file_updaters/java/gradle/property_value_updater.rb +58 -0
  171. data/lib/dependabot/file_updaters/java/maven.rb +155 -0
  172. data/lib/dependabot/file_updaters/java/maven/declaration_finder.rb +132 -0
  173. data/lib/dependabot/file_updaters/java/maven/property_value_updater.rb +61 -0
  174. data/lib/dependabot/file_updaters/java_script/npm_and_yarn.rb +159 -0
  175. data/lib/dependabot/file_updaters/java_script/npm_and_yarn/npm_lockfile_updater.rb +532 -0
  176. data/lib/dependabot/file_updaters/java_script/npm_and_yarn/npmrc_builder.rb +191 -0
  177. data/lib/dependabot/file_updaters/java_script/npm_and_yarn/package_json_preparer.rb +91 -0
  178. data/lib/dependabot/file_updaters/java_script/npm_and_yarn/package_json_updater.rb +220 -0
  179. data/lib/dependabot/file_updaters/java_script/npm_and_yarn/yarn_lockfile_updater.rb +475 -0
  180. data/lib/dependabot/file_updaters/php/composer.rb +78 -0
  181. data/lib/dependabot/file_updaters/php/composer/lockfile_updater.rb +264 -0
  182. data/lib/dependabot/file_updaters/php/composer/manifest_updater.rb +70 -0
  183. data/lib/dependabot/file_updaters/python/pip.rb +147 -0
  184. data/lib/dependabot/file_updaters/python/pip/pip_compile_file_updater.rb +363 -0
  185. data/lib/dependabot/file_updaters/python/pip/pipfile_file_updater.rb +397 -0
  186. data/lib/dependabot/file_updaters/python/pip/pipfile_preparer.rb +125 -0
  187. data/lib/dependabot/file_updaters/python/pip/poetry_file_updater.rb +289 -0
  188. data/lib/dependabot/file_updaters/python/pip/pyproject_preparer.rb +105 -0
  189. data/lib/dependabot/file_updaters/python/pip/requirement_file_updater.rb +166 -0
  190. data/lib/dependabot/file_updaters/python/pip/requirement_replacer.rb +95 -0
  191. data/lib/dependabot/file_updaters/python/pip/setup_file_sanitizer.rb +91 -0
  192. data/lib/dependabot/file_updaters/ruby/bundler.rb +121 -0
  193. data/lib/dependabot/file_updaters/ruby/bundler/gemfile_updater.rb +116 -0
  194. data/lib/dependabot/file_updaters/ruby/bundler/gemspec_dependency_name_finder.rb +52 -0
  195. data/lib/dependabot/file_updaters/ruby/bundler/gemspec_sanitizer.rb +298 -0
  196. data/lib/dependabot/file_updaters/ruby/bundler/gemspec_updater.rb +64 -0
  197. data/lib/dependabot/file_updaters/ruby/bundler/git_pin_replacer.rb +80 -0
  198. data/lib/dependabot/file_updaters/ruby/bundler/git_source_remover.rb +102 -0
  199. data/lib/dependabot/file_updaters/ruby/bundler/lockfile_updater.rb +384 -0
  200. data/lib/dependabot/file_updaters/ruby/bundler/requirement_replacer.rb +188 -0
  201. data/lib/dependabot/file_updaters/rust/cargo.rb +83 -0
  202. data/lib/dependabot/file_updaters/rust/cargo/lockfile_updater.rb +251 -0
  203. data/lib/dependabot/file_updaters/rust/cargo/manifest_updater.rb +162 -0
  204. data/lib/dependabot/git_commit_checker.rb +412 -0
  205. data/lib/dependabot/metadata_finders.rb +46 -0
  206. data/lib/dependabot/metadata_finders/README.md +53 -0
  207. data/lib/dependabot/metadata_finders/base.rb +117 -0
  208. data/lib/dependabot/metadata_finders/base/changelog_finder.rb +317 -0
  209. data/lib/dependabot/metadata_finders/base/changelog_pruner.rb +177 -0
  210. data/lib/dependabot/metadata_finders/base/commits_finder.rb +217 -0
  211. data/lib/dependabot/metadata_finders/base/release_finder.rb +251 -0
  212. data/lib/dependabot/metadata_finders/docker/docker.rb +18 -0
  213. data/lib/dependabot/metadata_finders/dotnet/nuget.rb +116 -0
  214. data/lib/dependabot/metadata_finders/elixir/hex.rb +69 -0
  215. data/lib/dependabot/metadata_finders/elm/elm_package.rb +22 -0
  216. data/lib/dependabot/metadata_finders/git/submodules.rb +20 -0
  217. data/lib/dependabot/metadata_finders/go/dep.rb +56 -0
  218. data/lib/dependabot/metadata_finders/java/maven.rb +173 -0
  219. data/lib/dependabot/metadata_finders/java_script/npm_and_yarn.rb +215 -0
  220. data/lib/dependabot/metadata_finders/php/composer.rb +66 -0
  221. data/lib/dependabot/metadata_finders/python/pip.rb +120 -0
  222. data/lib/dependabot/metadata_finders/ruby/bundler.rb +150 -0
  223. data/lib/dependabot/metadata_finders/rust/cargo.rb +64 -0
  224. data/lib/dependabot/pull_request_creator.rb +151 -0
  225. data/lib/dependabot/pull_request_creator/branch_namer.rb +170 -0
  226. data/lib/dependabot/pull_request_creator/commit_signer.rb +63 -0
  227. data/lib/dependabot/pull_request_creator/github.rb +233 -0
  228. data/lib/dependabot/pull_request_creator/gitlab.rb +122 -0
  229. data/lib/dependabot/pull_request_creator/labeler.rb +361 -0
  230. data/lib/dependabot/pull_request_creator/message_builder.rb +888 -0
  231. data/lib/dependabot/pull_request_updater.rb +43 -0
  232. data/lib/dependabot/pull_request_updater/github.rb +151 -0
  233. data/lib/dependabot/shared_helpers.rb +201 -0
  234. data/lib/dependabot/source.rb +120 -0
  235. data/lib/dependabot/update_checkers.rb +48 -0
  236. data/lib/dependabot/update_checkers/README.md +67 -0
  237. data/lib/dependabot/update_checkers/base.rb +220 -0
  238. data/lib/dependabot/update_checkers/docker/docker.rb +290 -0
  239. data/lib/dependabot/update_checkers/dotnet/nuget.rb +127 -0
  240. data/lib/dependabot/update_checkers/dotnet/nuget/property_updater.rb +97 -0
  241. data/lib/dependabot/update_checkers/dotnet/nuget/repository_finder.rb +232 -0
  242. data/lib/dependabot/update_checkers/dotnet/nuget/requirements_updater.rb +81 -0
  243. data/lib/dependabot/update_checkers/dotnet/nuget/version_finder.rb +231 -0
  244. data/lib/dependabot/update_checkers/elixir/hex.rb +274 -0
  245. data/lib/dependabot/update_checkers/elixir/hex/file_preparer.rb +193 -0
  246. data/lib/dependabot/update_checkers/elixir/hex/requirements_updater.rb +177 -0
  247. data/lib/dependabot/update_checkers/elixir/hex/version_resolver.rb +175 -0
  248. data/lib/dependabot/update_checkers/elm/elm_package.rb +126 -0
  249. data/lib/dependabot/update_checkers/elm/elm_package/cli_parser.rb +33 -0
  250. data/lib/dependabot/update_checkers/elm/elm_package/elm_18_version_resolver.rb +234 -0
  251. data/lib/dependabot/update_checkers/elm/elm_package/elm_19_version_resolver.rb +198 -0
  252. data/lib/dependabot/update_checkers/elm/elm_package/requirements_updater.rb +75 -0
  253. data/lib/dependabot/update_checkers/git/submodules.rb +52 -0
  254. data/lib/dependabot/update_checkers/go/dep.rb +311 -0
  255. data/lib/dependabot/update_checkers/go/dep/file_preparer.rb +221 -0
  256. data/lib/dependabot/update_checkers/go/dep/latest_version_finder.rb +169 -0
  257. data/lib/dependabot/update_checkers/go/dep/requirements_updater.rb +223 -0
  258. data/lib/dependabot/update_checkers/go/dep/version_resolver.rb +164 -0
  259. data/lib/dependabot/update_checkers/go/modules.rb +112 -0
  260. data/lib/dependabot/update_checkers/java/gradle.rb +148 -0
  261. data/lib/dependabot/update_checkers/java/gradle/multi_dependency_updater.rb +105 -0
  262. data/lib/dependabot/update_checkers/java/gradle/version_finder.rb +183 -0
  263. data/lib/dependabot/update_checkers/java/maven.rb +159 -0
  264. data/lib/dependabot/update_checkers/java/maven/property_updater.rb +127 -0
  265. data/lib/dependabot/update_checkers/java/maven/requirements_updater.rb +92 -0
  266. data/lib/dependabot/update_checkers/java/maven/version_finder.rb +225 -0
  267. data/lib/dependabot/update_checkers/java_script/npm_and_yarn.rb +280 -0
  268. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/latest_version_finder.rb +342 -0
  269. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/library_detector.rb +69 -0
  270. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/registry_finder.rb +226 -0
  271. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/requirements_updater.rb +197 -0
  272. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/subdependency_version_resolver.rb +228 -0
  273. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/version_resolver.rb +452 -0
  274. data/lib/dependabot/update_checkers/php/composer.rb +165 -0
  275. data/lib/dependabot/update_checkers/php/composer/requirements_updater.rb +243 -0
  276. data/lib/dependabot/update_checkers/php/composer/version_resolver.rb +203 -0
  277. data/lib/dependabot/update_checkers/python/pip.rb +227 -0
  278. data/lib/dependabot/update_checkers/python/pip/latest_version_finder.rb +252 -0
  279. data/lib/dependabot/update_checkers/python/pip/pip_compile_version_resolver.rb +380 -0
  280. data/lib/dependabot/update_checkers/python/pip/pipfile_version_resolver.rb +559 -0
  281. data/lib/dependabot/update_checkers/python/pip/poetry_version_resolver.rb +300 -0
  282. data/lib/dependabot/update_checkers/python/pip/requirements_updater.rb +367 -0
  283. data/lib/dependabot/update_checkers/ruby/bundler.rb +324 -0
  284. data/lib/dependabot/update_checkers/ruby/bundler/file_preparer.rb +278 -0
  285. data/lib/dependabot/update_checkers/ruby/bundler/force_updater.rb +261 -0
  286. data/lib/dependabot/update_checkers/ruby/bundler/latest_version_finder.rb +169 -0
  287. data/lib/dependabot/update_checkers/ruby/bundler/requirements_updater.rb +264 -0
  288. data/lib/dependabot/update_checkers/ruby/bundler/ruby_requirement_setter.rb +115 -0
  289. data/lib/dependabot/update_checkers/ruby/bundler/shared_bundler_helpers.rb +243 -0
  290. data/lib/dependabot/update_checkers/ruby/bundler/version_resolver.rb +255 -0
  291. data/lib/dependabot/update_checkers/rust/cargo.rb +282 -0
  292. data/lib/dependabot/update_checkers/rust/cargo/file_preparer.rb +202 -0
  293. data/lib/dependabot/update_checkers/rust/cargo/requirements_updater.rb +175 -0
  294. data/lib/dependabot/update_checkers/rust/cargo/version_resolver.rb +242 -0
  295. data/lib/dependabot/utils.rb +84 -0
  296. data/lib/dependabot/utils/docker/credentials_finder.rb +65 -0
  297. data/lib/dependabot/utils/dotnet/requirement.rb +90 -0
  298. data/lib/dependabot/utils/dotnet/version.rb +22 -0
  299. data/lib/dependabot/utils/elixir/requirement.rb +53 -0
  300. data/lib/dependabot/utils/elixir/version.rb +59 -0
  301. data/lib/dependabot/utils/elm/requirement.rb +92 -0
  302. data/lib/dependabot/utils/elm/version.rb +19 -0
  303. data/lib/dependabot/utils/go/path_converter.rb +74 -0
  304. data/lib/dependabot/utils/go/requirement.rb +152 -0
  305. data/lib/dependabot/utils/go/shared_helper.rb +20 -0
  306. data/lib/dependabot/utils/go/version.rb +40 -0
  307. data/lib/dependabot/utils/java/requirement.rb +110 -0
  308. data/lib/dependabot/utils/java/version.rb +179 -0
  309. data/lib/dependabot/utils/java_script/requirement.rb +117 -0
  310. data/lib/dependabot/utils/java_script/version.rb +30 -0
  311. data/lib/dependabot/utils/php/requirement.rb +97 -0
  312. data/lib/dependabot/utils/php/version.rb +22 -0
  313. data/lib/dependabot/utils/python/requirement.rb +130 -0
  314. data/lib/dependabot/utils/python/version.rb +88 -0
  315. data/lib/dependabot/utils/ruby/requirement.rb +26 -0
  316. data/lib/dependabot/utils/rust/requirement.rb +108 -0
  317. data/lib/dependabot/utils/rust/version.rb +32 -0
  318. data/lib/dependabot/version.rb +5 -0
  319. data/lib/python_requirement_parser.rb +33 -0
  320. data/lib/python_versions.rb +21 -0
  321. metadata +641 -0
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/pull_request_updater/github"
4
+
5
+ module Dependabot
6
+ class PullRequestUpdater
7
+ attr_reader :source, :files, :base_commit, :credentials,
8
+ :pull_request_number, :author_details, :signature_key
9
+
10
+ def initialize(source:, base_commit:, files:, credentials:,
11
+ pull_request_number:, author_details: nil,
12
+ signature_key: nil)
13
+ @source = source
14
+ @base_commit = base_commit
15
+ @files = files
16
+ @credentials = credentials
17
+ @pull_request_number = pull_request_number
18
+ @author_details = author_details
19
+ @signature_key = signature_key
20
+ end
21
+
22
+ def update
23
+ case source.provider
24
+ when "github" then github_updater.update
25
+ else raise "Unsupported provider #{source.provider}"
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def github_updater
32
+ Github.new(
33
+ source: source,
34
+ base_commit: base_commit,
35
+ files: files,
36
+ credentials: credentials,
37
+ pull_request_number: pull_request_number,
38
+ author_details: author_details,
39
+ signature_key: signature_key
40
+ )
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,151 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "octokit"
4
+ require "dependabot/clients/github_with_retries"
5
+ require "dependabot/pull_request_creator/commit_signer"
6
+ require "dependabot/pull_request_updater"
7
+
8
+ module Dependabot
9
+ class PullRequestUpdater
10
+ class Github
11
+ attr_reader :source, :files, :base_commit, :credentials,
12
+ :pull_request_number, :author_details, :signature_key
13
+
14
+ def initialize(source:, base_commit:, files:, credentials:,
15
+ pull_request_number:, author_details: nil,
16
+ signature_key: nil)
17
+ @source = source
18
+ @base_commit = base_commit
19
+ @files = files
20
+ @credentials = credentials
21
+ @pull_request_number = pull_request_number
22
+ @author_details = author_details
23
+ @signature_key = signature_key
24
+ end
25
+
26
+ def update
27
+ return unless branch_exists?
28
+
29
+ commit = create_commit
30
+ branch = update_branch(commit)
31
+ update_pull_request_target_branch
32
+ branch
33
+ end
34
+
35
+ private
36
+
37
+ def update_pull_request_target_branch
38
+ target_branch = source.branch || pull_request.base.repo.default_branch
39
+ return if target_branch == pull_request.base.ref
40
+
41
+ github_client_for_source.update_pull_request(
42
+ source.repo,
43
+ pull_request_number,
44
+ base: target_branch
45
+ )
46
+ end
47
+
48
+ def github_client_for_source
49
+ @github_client_for_source ||=
50
+ Dependabot::Clients::GithubWithRetries.for_source(
51
+ source: source,
52
+ credentials: credentials
53
+ )
54
+ end
55
+
56
+ def pull_request
57
+ @pull_request ||=
58
+ github_client_for_source.pull_request(
59
+ source.repo,
60
+ pull_request_number
61
+ )
62
+ end
63
+
64
+ def branch_exists?
65
+ github_client_for_source.branch(source.repo, pull_request.head.ref)
66
+ rescue Octokit::NotFound
67
+ false
68
+ end
69
+
70
+ def create_commit
71
+ tree = create_tree
72
+
73
+ options = author_details&.any? ? { author: author_details } : {}
74
+
75
+ if options[:author]&.any? && signature_key
76
+ options[:author][:date] = Time.now.utc.iso8601
77
+ options[:signature] = commit_signature(tree, options[:author])
78
+ end
79
+
80
+ github_client_for_source.create_commit(
81
+ source.repo,
82
+ commit_message,
83
+ tree.sha,
84
+ base_commit,
85
+ options
86
+ )
87
+ end
88
+
89
+ def create_tree
90
+ file_trees = files.map do |file|
91
+ if file.type == "file"
92
+ {
93
+ path: file.path.sub(%r{^/}, ""),
94
+ mode: "100644",
95
+ type: "blob",
96
+ content: file.content
97
+ }
98
+ elsif file.type == "submodule"
99
+ {
100
+ path: file.path.sub(%r{^/}, ""),
101
+ mode: "160000",
102
+ type: "commit",
103
+ sha: file.content
104
+ }
105
+ else
106
+ raise "Unknown file type #{file.type}"
107
+ end
108
+ end
109
+
110
+ github_client_for_source.create_tree(
111
+ source.repo,
112
+ file_trees,
113
+ base_tree: base_commit
114
+ )
115
+ end
116
+
117
+ def update_branch(commit)
118
+ github_client_for_source.update_ref(
119
+ source.repo,
120
+ "heads/" + pull_request.head.ref,
121
+ commit.sha,
122
+ true
123
+ )
124
+ rescue Octokit::UnprocessableEntity => error
125
+ # Return quietly if the branch has been deleted
126
+ return nil if error.message.match?(/Reference does not exist/i)
127
+
128
+ # Return quietly if the branch has been merged
129
+ return nil if error.message.match?(/Reference cannot be updated/i)
130
+
131
+ raise
132
+ end
133
+
134
+ def commit_message
135
+ github_client_for_source.
136
+ git_commit(source.repo, pull_request.head.sha).
137
+ message
138
+ end
139
+
140
+ def commit_signature(tree, author_details_with_date)
141
+ PullRequestCreator::CommitSigner.new(
142
+ author_details: author_details_with_date,
143
+ commit_message: commit_message,
144
+ tree_sha: tree.sha,
145
+ parent_sha: base_commit,
146
+ signature_key: signature_key
147
+ ).signature
148
+ end
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,201 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require "tmpdir"
5
+ require "excon"
6
+ require "English"
7
+ require "digest"
8
+
9
+ module Dependabot
10
+ module SharedHelpers
11
+ BUMP_TMP_FILE_PREFIX = "dependabot_"
12
+ BUMP_TMP_DIR_PATH = "tmp"
13
+ GIT_CONFIG_GLOBAL_PATH = File.expand_path("~/.gitconfig")
14
+
15
+ class ChildProcessFailed < StandardError
16
+ attr_reader :error_class, :error_message, :error_backtrace
17
+
18
+ def initialize(error_class:, error_message:, error_backtrace:)
19
+ @error_class = error_class
20
+ @error_message = error_message
21
+ @error_backtrace = error_backtrace
22
+
23
+ msg = "Child process raised #{error_class} with message: "\
24
+ "#{error_message}"
25
+ super(msg)
26
+ set_backtrace(error_backtrace)
27
+ end
28
+ end
29
+
30
+ def self.in_a_temporary_directory(directory = "/")
31
+ Dir.mkdir(BUMP_TMP_DIR_PATH) unless Dir.exist?(BUMP_TMP_DIR_PATH)
32
+ Dir.mktmpdir(BUMP_TMP_FILE_PREFIX, BUMP_TMP_DIR_PATH) do |dir|
33
+ path = Pathname.new(File.join(dir, directory)).expand_path
34
+ FileUtils.mkpath(path)
35
+ Dir.chdir(path) { yield(path) }
36
+ end
37
+ end
38
+
39
+ def self.in_a_forked_process
40
+ read, write = IO.pipe
41
+
42
+ pid = fork do
43
+ read.close
44
+ result = yield
45
+ rescue Exception => error # rubocop:disable Lint/RescueException
46
+ result = { _error_details: { error_class: error.class.to_s,
47
+ error_message: error.message,
48
+ error_backtrace: error.backtrace } }
49
+ ensure
50
+ Marshal.dump(result, write)
51
+ exit!(0)
52
+ end
53
+
54
+ write.close
55
+ result = read.read
56
+ Process.wait(pid)
57
+ result = Marshal.load(result) # rubocop:disable Security/MarshalLoad
58
+
59
+ return result unless result.is_a?(Hash) && result[:_error_details]
60
+
61
+ raise ChildProcessFailed, result[:_error_details]
62
+ end
63
+
64
+ class HelperSubprocessFailed < StandardError
65
+ def initialize(message, command)
66
+ super(message)
67
+ @command = command
68
+ end
69
+
70
+ def raven_context
71
+ { fingerprint: [@command] }
72
+ end
73
+ end
74
+
75
+ def self.run_helper_subprocess(command:, function:, args:, env: nil,
76
+ popen_opts: {})
77
+ raw_response = nil
78
+ popen_args = [env, command, "w+"].compact
79
+ IO.popen(*popen_args, popen_opts) do |process|
80
+ process.write(JSON.dump(function: function, args: args))
81
+ process.close_write
82
+ raw_response = process.read
83
+ end
84
+
85
+ response = JSON.parse(raw_response)
86
+ return response["result"] if $CHILD_STATUS.success?
87
+
88
+ raise HelperSubprocessFailed.new(response["error"], command)
89
+ rescue JSON::ParserError
90
+ raise HelperSubprocessFailed.new(raw_response, command) if raw_response
91
+
92
+ raise HelperSubprocessFailed.new("No output from command", command)
93
+ end
94
+
95
+ def self.excon_middleware
96
+ Excon.defaults[:middlewares] + [Excon::Middleware::RedirectFollower]
97
+ end
98
+
99
+ def self.excon_defaults
100
+ {
101
+ connect_timeout: 5,
102
+ write_timeout: 5,
103
+ read_timeout: 5,
104
+ omit_default_port: true,
105
+ middlewares: excon_middleware
106
+ }
107
+ end
108
+
109
+ def self.with_git_configured(credentials:)
110
+ backup_git_config_path = stash_global_git_config
111
+ configure_git_to_use_https_with_credentials(credentials)
112
+ yield
113
+ ensure
114
+ reset_global_git_config(backup_git_config_path)
115
+ end
116
+
117
+ def self.configure_git_to_use_https_with_credentials(credentials)
118
+ configure_git_to_use_https
119
+ configure_git_credentials(credentials)
120
+ end
121
+
122
+ def self.configure_git_to_use_https
123
+ # Note: we use --global here (rather than --system) so that Dependabot
124
+ # can be run without privileged access
125
+ run_shell_command(
126
+ 'git config --global --replace-all url."https://github.com/".'\
127
+ "insteadOf ssh://git@github.com/ && "\
128
+ 'git config --global --add url."https://github.com/".'\
129
+ "insteadOf ssh://git@github.com: && "\
130
+ 'git config --global --add url."https://github.com/".'\
131
+ "insteadOf git@github.com: && "\
132
+ 'git config --global --add url."https://github.com/".'\
133
+ "insteadOf git@github.com/ && "\
134
+ 'git config --global --add url."https://github.com/".'\
135
+ "insteadOf git://github.com/"
136
+ )
137
+ end
138
+
139
+ def self.configure_git_credentials(credentials)
140
+ # Then add a file-based credential store that loads a file in this repo.
141
+ # Under the hood this uses git credential-store, but it's invoked through
142
+ # an wrapper binary that only allows non-mutative commands. Without this,
143
+ # whenever the credentials are deemed to be invalid, they're erased.
144
+ credential_helper_path =
145
+ File.join(__dir__, "../../helpers/utils/git-credential-store-immutable")
146
+ run_shell_command(
147
+ "git config --global credential.helper "\
148
+ "'#{credential_helper_path} --file=#{Dir.pwd}/git.store'"
149
+ )
150
+
151
+ # Build the content for our credentials file
152
+ git_store_content = ""
153
+ credentials.each do |cred|
154
+ next unless cred["type"] == "git_source"
155
+
156
+ authenticated_url =
157
+ "https://#{cred.fetch('username')}:#{cred.fetch('password')}"\
158
+ "@#{cred.fetch('host')}"
159
+
160
+ git_store_content += authenticated_url + "\n"
161
+ end
162
+
163
+ # Save the file
164
+ File.write("git.store", git_store_content)
165
+ end
166
+
167
+ def self.stash_global_git_config
168
+ return unless File.exist?(GIT_CONFIG_GLOBAL_PATH)
169
+
170
+ contents = File.read(GIT_CONFIG_GLOBAL_PATH)
171
+ digest = Digest::SHA2.hexdigest(contents)[0...10]
172
+ backup_path = GIT_CONFIG_GLOBAL_PATH + ".backup-#{digest}"
173
+
174
+ FileUtils.mv(GIT_CONFIG_GLOBAL_PATH, backup_path)
175
+ backup_path
176
+ end
177
+
178
+ def self.reset_global_git_config(backup_path)
179
+ return if backup_path.nil?
180
+ return unless File.exist?(backup_path)
181
+
182
+ FileUtils.mv(backup_path, GIT_CONFIG_GLOBAL_PATH)
183
+ end
184
+
185
+ def self.run_shell_command(command)
186
+ raw_response = nil
187
+ IO.popen(command, err: %i(child out)) do |process|
188
+ raw_response = process.read
189
+ end
190
+
191
+ # Raise an error with the output from the shell session if the
192
+ # command returns a non-zero status
193
+ return if $CHILD_STATUS.success?
194
+
195
+ raise SharedHelpers::HelperSubprocessFailed.new(
196
+ raw_response,
197
+ command
198
+ )
199
+ end
200
+ end
201
+ end
@@ -0,0 +1,120 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dependabot
4
+ class Source
5
+ GITHUB_SOURCE = %r{
6
+ (?<provider>github)
7
+ (?:\.com)[/:]
8
+ (?<repo>[\w.-]+/(?:(?!\.git|\.\s)[\w.-])+)
9
+ (?:(?:/tree|/blob)/(?<branch>[^/]+)/(?<directory>.*)[\#|/])?
10
+ }x.freeze
11
+
12
+ GITLAB_SOURCE = %r{
13
+ (?<provider>gitlab)
14
+ (?:\.com)[/:]
15
+ (?<repo>[^/\s]+/(?:(?!\.git|\.\s)[^/\s#"',])+)
16
+ (?:(?:/tree|/blob)/(?<branch>[^/]+)/(?<directory>.*)[\#|/])?
17
+ }x.freeze
18
+
19
+ BITBUCKET_SOURCE = %r{
20
+ (?<provider>bitbucket)
21
+ (?:\.org)[/:]
22
+ (?<repo>[^/\s]+/(?:(?!\.git|\.\s)[^/\s#"',])+)
23
+ (?:(?:/src)/(?<branch>[^/]+)/(?<directory>.*)[\#|/])?
24
+ }x.freeze
25
+
26
+ AZURE_SOURCE = %r{
27
+ (?<provider>azure)
28
+ (?:\.com)[/:]
29
+ (?<repo>[^/\s]+/([^/\s]+/)?(?:_git/)(?:(?!\.git|\.\s)[^/\s#?"',])+)
30
+ }x.freeze
31
+
32
+ SOURCE_REGEX = /
33
+ (?:#{GITHUB_SOURCE})|
34
+ (?:#{GITLAB_SOURCE})|
35
+ (?:#{BITBUCKET_SOURCE})|
36
+ (?:#{AZURE_SOURCE})
37
+ /x.freeze
38
+
39
+ attr_reader :provider, :repo, :directory, :branch, :hostname, :api_endpoint
40
+
41
+ def self.from_url(url_string)
42
+ return unless url_string&.match?(SOURCE_REGEX)
43
+
44
+ captures = url_string.match(SOURCE_REGEX).named_captures
45
+
46
+ new(
47
+ provider: captures.fetch("provider"),
48
+ repo: captures.fetch("repo"),
49
+ directory: captures.fetch("directory"),
50
+ branch: captures.fetch("branch")
51
+ )
52
+ end
53
+
54
+ def initialize(provider:, repo:, directory: nil, branch: nil, hostname: nil,
55
+ api_endpoint: nil)
56
+ if hostname.nil? ^ api_endpoint.nil?
57
+ msg = "Both hostname and api_endpoint must be specified if either "\
58
+ "are. Alternatively, both may be left blank to use the "\
59
+ "provider's defaults."
60
+ raise msg
61
+ end
62
+
63
+ @provider = provider
64
+ @repo = repo
65
+ @directory = directory
66
+ @branch = branch
67
+ @hostname = hostname || default_hostname(provider)
68
+ @api_endpoint = api_endpoint || default_api_endpoint(provider)
69
+ end
70
+
71
+ def url
72
+ case provider
73
+ when "github" then "https://github.com/" + repo
74
+ when "bitbucket" then "https://bitbucket.org/" + repo
75
+ when "gitlab" then "https://gitlab.com/" + repo
76
+ when "azure" then "https://dev.azure.com/" + repo
77
+ else raise "Unexpected repo provider '#{provider}'"
78
+ end
79
+ end
80
+
81
+ def organization
82
+ repo.split("/").first
83
+ end
84
+
85
+ def project
86
+ raise "Project is an Azure DevOps concept only" unless provider == "azure"
87
+
88
+ parts = repo.split("/_git/")
89
+ return parts.first.split("/").last if parts.first.split("/").count == 2
90
+
91
+ parts.last
92
+ end
93
+
94
+ def unscoped_repo
95
+ repo.split("/").last
96
+ end
97
+
98
+ private
99
+
100
+ def default_hostname(provider)
101
+ case provider
102
+ when "github" then "github.com"
103
+ when "bitbucket" then "bitbucket.org"
104
+ when "gitlab" then "gitlab.com"
105
+ when "azure" then "dev.azure.com"
106
+ else raise "Unexpected provider '#{provider}'"
107
+ end
108
+ end
109
+
110
+ def default_api_endpoint(provider)
111
+ case provider
112
+ when "github" then "https://api.github.com/"
113
+ when "bitbucket" then "https://api.bitbucket.org/2.0/"
114
+ when "gitlab" then "https://gitlab.com/api/v4"
115
+ when "azure" then "https://dev.azure.com/"
116
+ else raise "Unexpected provider '#{provider}'"
117
+ end
118
+ end
119
+ end
120
+ end