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,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/base"
4
+ require "dependabot/utils/php/version"
5
+ require "dependabot/shared_helpers"
6
+ require "dependabot/errors"
7
+
8
+ module Dependabot
9
+ module FileUpdaters
10
+ module Php
11
+ class Composer < Base
12
+ require_relative "composer/manifest_updater"
13
+ require_relative "composer/lockfile_updater"
14
+
15
+ def self.updated_files_regex
16
+ [
17
+ /^composer\.json$/,
18
+ /^composer\.lock$/
19
+ ]
20
+ end
21
+
22
+ def updated_dependency_files
23
+ updated_files = []
24
+
25
+ if file_changed?(composer_json)
26
+ updated_files <<
27
+ updated_file(
28
+ file: composer_json,
29
+ content: updated_composer_json_content
30
+ )
31
+ end
32
+
33
+ if lockfile
34
+ updated_files <<
35
+ updated_file(file: lockfile, content: updated_lockfile_content)
36
+ end
37
+
38
+ if updated_files.none? ||
39
+ updated_files.sort_by(&:name) == dependency_files.sort_by(&:name)
40
+ raise "No files have changed!"
41
+ end
42
+
43
+ updated_files
44
+ end
45
+
46
+ private
47
+
48
+ def check_required_files
49
+ raise "No composer.json!" unless get_original_file("composer.json")
50
+ end
51
+
52
+ def updated_composer_json_content
53
+ ManifestUpdater.new(
54
+ dependencies: dependencies,
55
+ manifest: composer_json
56
+ ).updated_manifest_content
57
+ end
58
+
59
+ def updated_lockfile_content
60
+ @updated_lockfile_content ||=
61
+ LockfileUpdater.new(
62
+ dependencies: dependencies,
63
+ dependency_files: dependency_files,
64
+ credentials: credentials
65
+ ).updated_lockfile_content
66
+ end
67
+
68
+ def composer_json
69
+ @composer_json ||= get_original_file("composer.json")
70
+ end
71
+
72
+ def lockfile
73
+ @lockfile ||= get_original_file("composer.lock")
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,264 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/php/composer"
4
+ require "dependabot/utils/php/version"
5
+ require "dependabot/shared_helpers"
6
+ require "dependabot/errors"
7
+
8
+ module Dependabot
9
+ module FileUpdaters
10
+ module Php
11
+ class Composer
12
+ class LockfileUpdater
13
+ require_relative "manifest_updater"
14
+
15
+ def initialize(dependencies:, dependency_files:, credentials:)
16
+ @dependencies = dependencies
17
+ @dependency_files = dependency_files
18
+ @credentials = credentials
19
+ end
20
+
21
+ def updated_lockfile_content
22
+ base_directory = dependency_files.first.directory
23
+ @updated_lockfile_content ||=
24
+ SharedHelpers.in_a_temporary_directory(base_directory) do
25
+ write_temporary_dependency_files
26
+
27
+ updated_content = run_update_helper.fetch("composer.lock")
28
+
29
+ updated_content = post_process_lockfile(updated_content)
30
+ if lockfile.content == updated_content
31
+ raise "Expected content to change!"
32
+ end
33
+
34
+ updated_content
35
+ end
36
+ rescue SharedHelpers::HelperSubprocessFailed => error
37
+ handle_composer_errors(error)
38
+ end
39
+
40
+ private
41
+
42
+ attr_reader :dependencies, :dependency_files, :credentials
43
+
44
+ def dependency
45
+ # For now, we'll only ever be updating a single dependency for PHP
46
+ dependencies.first
47
+ end
48
+
49
+ def run_update_helper
50
+ SharedHelpers.with_git_configured(credentials: credentials) do
51
+ SharedHelpers.run_helper_subprocess(
52
+ command: "php #{php_helper_path}",
53
+ function: "update",
54
+ env: credentials_env,
55
+ args: [
56
+ Dir.pwd,
57
+ dependency.name,
58
+ dependency.version,
59
+ git_credentials,
60
+ registry_credentials
61
+ ]
62
+ )
63
+ end
64
+ end
65
+
66
+ def updated_composer_json_content
67
+ ManifestUpdater.new(
68
+ dependencies: dependencies,
69
+ manifest: composer_json
70
+ ).updated_manifest_content
71
+ end
72
+
73
+ # rubocop:disable Metrics/PerceivedComplexity
74
+ # rubocop:disable Metrics/AbcSize
75
+ # rubocop:disable Metrics/CyclomaticComplexity
76
+ # rubocop:disable Metrics/MethodLength
77
+ def handle_composer_errors(error)
78
+ if error.message.start_with?("Failed to execute git checkout")
79
+ raise git_dependency_reference_error(error)
80
+ end
81
+
82
+ if error.message.start_with?("Failed to execute git clone")
83
+ dependency_url =
84
+ error.message.match(/(?:mirror|checkout) '(?<url>.*?)'/).
85
+ named_captures.fetch("url")
86
+ raise GitDependenciesNotReachable, dependency_url
87
+ end
88
+ if error.message.start_with?("Failed to clone")
89
+ dependency_url =
90
+ error.message.match(/Failed to clone (?<url>.*?) via/).
91
+ named_captures.fetch("url")
92
+ raise GitDependenciesNotReachable, dependency_url
93
+ end
94
+ if error.message.start_with?("Could not find a key for ACF PRO")
95
+ raise MissingEnvironmentVariable, "ACF_PRO_KEY"
96
+ end
97
+ if error.message.start_with?("Unknown downloader type: npm-signatu")
98
+ raise DependencyFileNotResolvable, error.message
99
+ end
100
+ if error.message.include?("file could not be downloaded")
101
+ raise DependencyFileNotResolvable, error.message
102
+ end
103
+ if error.message.start_with?("Allowed memory size")
104
+ raise Dependabot::OutOfMemory
105
+ end
106
+
107
+ if error.message.include?("403 Forbidden")
108
+ source = error.message.match(%r{https?://(?<source>[^/]+)/}).
109
+ named_captures.fetch("source")
110
+ raise PrivateSourceAuthenticationFailure, source
111
+ end
112
+ if error.message.include?("Argument 1 passed to Composer")
113
+ msg = "One of your Composer plugins is not compatible with the "\
114
+ "latest version of Composer. Please update Composer and "\
115
+ "try running `composer update` to debug further."
116
+ raise DependencyFileNotResolvable, msg
117
+ end
118
+ raise error
119
+ end
120
+ # rubocop:enable Metrics/PerceivedComplexity
121
+ # rubocop:enable Metrics/AbcSize
122
+ # rubocop:enable Metrics/CyclomaticComplexity
123
+ # rubocop:enable Metrics/MethodLength
124
+
125
+ def write_temporary_dependency_files
126
+ path_dependencies.each do |file|
127
+ path = file.name
128
+ FileUtils.mkdir_p(Pathname.new(path).dirname)
129
+ File.write(file.name, file.content)
130
+ end
131
+
132
+ File.write("composer.json", locked_composer_json_content)
133
+ File.write("composer.lock", lockfile.content)
134
+ end
135
+
136
+ def locked_composer_json_content
137
+ dependencies.
138
+ reduce(updated_composer_json_content) do |content, dep|
139
+ updated_req = dep.version
140
+ next content unless Utils::Php::Version.correct?(updated_req)
141
+
142
+ old_req =
143
+ dep.requirements.find { |r| r[:file] == "composer.json" }&.
144
+ fetch(:requirement)
145
+
146
+ # When updating a subdep there won't be an old requirement
147
+ next content unless old_req
148
+
149
+ regex =
150
+ /
151
+ "#{Regexp.escape(dep.name)}"\s*:\s*
152
+ "#{Regexp.escape(old_req)}"
153
+ /x
154
+
155
+ content.gsub(regex) do |declaration|
156
+ declaration.gsub(%("#{old_req}"), %("#{updated_req}"))
157
+ end
158
+ end
159
+ end
160
+
161
+ def git_dependency_reference_error(error)
162
+ ref = error.message.match(/checkout '(?<ref>.*?)'/).
163
+ named_captures.fetch("ref")
164
+ dependency_name =
165
+ JSON.parse(lockfile.content).
166
+ values_at("packages", "packages-dev").flatten(1).
167
+ find { |dep| dep.dig("source", "reference") == ref }&.
168
+ fetch("name")
169
+
170
+ raise unless dependency_name
171
+
172
+ raise GitDependencyReferenceNotFound, dependency_name
173
+ end
174
+
175
+ def post_process_lockfile(content)
176
+ content = replace_patches(content)
177
+ replace_content_hash(content)
178
+ end
179
+
180
+ def replace_patches(updated_content)
181
+ content = updated_content
182
+ %w(packages packages-dev).each do |package_type|
183
+ JSON.parse(lockfile.content).fetch(package_type).each do |details|
184
+ next unless details["extra"].is_a?(Hash)
185
+ next unless (patches = details.dig("extra", "patches_applied"))
186
+
187
+ updated_object = JSON.parse(content)
188
+ updated_object_package =
189
+ updated_object.
190
+ fetch(package_type).
191
+ find { |d| d["name"] == details["name"] }
192
+
193
+ next unless updated_object_package
194
+
195
+ updated_object_package["extra"] ||= {}
196
+ updated_object_package["extra"]["patches_applied"] = patches
197
+
198
+ content =
199
+ JSON.pretty_generate(updated_object, indent: " ").
200
+ gsub(/\[\n\n\s*\]/, "[]").
201
+ gsub(/\}\z/, "}\n")
202
+ end
203
+ end
204
+ content
205
+ end
206
+
207
+ def replace_content_hash(content)
208
+ existing_hash = JSON.parse(content).fetch("content-hash")
209
+ SharedHelpers.in_a_temporary_directory do
210
+ File.write("composer.json", updated_composer_json_content)
211
+
212
+ content_hash =
213
+ SharedHelpers.run_helper_subprocess(
214
+ command: "php #{php_helper_path}",
215
+ function: "get_content_hash",
216
+ env: credentials_env,
217
+ args: [Dir.pwd]
218
+ )
219
+
220
+ content.gsub(existing_hash, content_hash)
221
+ end
222
+ end
223
+
224
+ def php_helper_path
225
+ project_root = File.join(File.dirname(__FILE__), "../../../../..")
226
+ File.join(project_root, "helpers/php/bin/run.php")
227
+ end
228
+
229
+ def credentials_env
230
+ credentials.
231
+ select { |c| c.fetch("type") == "php_environment_variable" }.
232
+ map { |cred| [cred["env-key"], cred["env-value"]] }.
233
+ to_h
234
+ end
235
+
236
+ def git_credentials
237
+ credentials.
238
+ select { |cred| cred.fetch("type") == "git_source" }
239
+ end
240
+
241
+ def registry_credentials
242
+ credentials.
243
+ select { |cred| cred.fetch("type") == "composer_repository" }
244
+ end
245
+
246
+ def composer_json
247
+ @composer_json ||=
248
+ dependency_files.find { |f| f.name == "composer.json" }
249
+ end
250
+
251
+ def lockfile
252
+ @lockfile ||=
253
+ dependency_files.find { |f| f.name == "composer.lock" }
254
+ end
255
+
256
+ def path_dependencies
257
+ @path_dependencies ||=
258
+ dependency_files.select { |f| f.name.end_with?("/composer.json") }
259
+ end
260
+ end
261
+ end
262
+ end
263
+ end
264
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/php/composer"
4
+
5
+ module Dependabot
6
+ module FileUpdaters
7
+ module Php
8
+ class Composer
9
+ class ManifestUpdater
10
+ def initialize(dependencies:, manifest:)
11
+ @dependencies = dependencies
12
+ @manifest = manifest
13
+ end
14
+
15
+ def updated_manifest_content
16
+ dependencies.reduce(manifest.content.dup) do |content, dep|
17
+ updated_content = content
18
+ updated_requirements(dep).each do |new_req|
19
+ old_req = old_requirement(dep, new_req).fetch(:requirement)
20
+ updated_req = new_req.fetch(:requirement)
21
+
22
+ regex =
23
+ /
24
+ "#{Regexp.escape(dep.name)}"\s*:\s*
25
+ "#{Regexp.escape(old_req)}"
26
+ /x
27
+
28
+ updated_content = content.gsub(regex) do |declaration|
29
+ declaration.gsub(%("#{old_req}"), %("#{updated_req}"))
30
+ end
31
+
32
+ if content == updated_content
33
+ raise "Expected content to change!"
34
+ end
35
+ end
36
+
37
+ updated_content
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ attr_reader :dependencies, :manifest
44
+
45
+ def new_requirements(dependency)
46
+ dependency.requirements.select { |r| r[:file] == manifest.name }
47
+ end
48
+
49
+ def old_requirement(dependency, new_requirement)
50
+ dependency.previous_requirements.
51
+ select { |r| r[:file] == manifest.name }.
52
+ find { |r| r[:groups] == new_requirement[:groups] }
53
+ end
54
+
55
+ def updated_requirements(dependency)
56
+ new_requirements(dependency).
57
+ reject { |r| dependency.previous_requirements.include?(r) }
58
+ end
59
+
60
+ def requirement_changed?(file, dependency)
61
+ changed_requirements =
62
+ dependency.requirements - dependency.previous_requirements
63
+
64
+ changed_requirements.any? { |f| f[:file] == file.name }
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,147 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/base"
4
+ require "dependabot/shared_helpers"
5
+
6
+ module Dependabot
7
+ module FileUpdaters
8
+ module Python
9
+ class Pip < Dependabot::FileUpdaters::Base
10
+ require_relative "pip/pipfile_file_updater"
11
+ require_relative "pip/pip_compile_file_updater"
12
+ require_relative "pip/poetry_file_updater"
13
+ require_relative "pip/requirement_file_updater"
14
+
15
+ def self.updated_files_regex
16
+ [
17
+ /^Pipfile$/,
18
+ /^Pipfile\.lock$/,
19
+ /.*\.txt$/,
20
+ /.*\.in$/,
21
+ /^setup\.py$/,
22
+ /^pyproject\.toml$/,
23
+ /^pyproject\.lock$/
24
+ ]
25
+ end
26
+
27
+ def updated_dependency_files
28
+ updated_files =
29
+ case resolver_type
30
+ when :pipfile then updated_pipfile_based_files
31
+ when :poetry then updated_poetry_based_files
32
+ when :pip_compile then updated_pip_compile_based_files
33
+ when :requirements then updated_requirement_based_files
34
+ else raise "Unexpected resolver type: #{resolver_type}"
35
+ end
36
+
37
+ if updated_files.none? ||
38
+ updated_files.sort_by(&:name) == dependency_files.sort_by(&:name)
39
+ raise "No files have changed!"
40
+ end
41
+
42
+ updated_files
43
+ end
44
+
45
+ private
46
+
47
+ def resolver_type
48
+ reqs = dependencies.flat_map(&:requirements)
49
+ req_files = reqs.map { |r| r.fetch(:file) }
50
+
51
+ # If there are no requirements then this is a sub-dependency. It
52
+ # must come from one of Pipenv, Poetry or pip-tools, and can't come
53
+ # from the first two unless they have a lockfile.
54
+ return subdependency_resolver if reqs.none?
55
+
56
+ # Otherwise, this is a top-level dependency, and we can figure out
57
+ # which resolver to use based on the filename of its requirements
58
+ return :pipfile if req_files.any? { |f| f == "Pipfile" }
59
+ return :poetry if req_files.any? { |f| f == "pyproject.toml" }
60
+ return :pip_compile if req_files.any? { |f| f.end_with?(".in") }
61
+
62
+ # Finally, we should only ever be updating a requirements.txt file if
63
+ # some requirements have changed. Otherwise, this must be a case where
64
+ # we have a requirements.txt *and* some other resolver of which the
65
+ # dependency is a sub-dependency.
66
+ changed_reqs = reqs - dependencies.flat_map(&:previous_requirements)
67
+ changed_reqs.none? ? subdependency_resolver : :requirements
68
+ end
69
+
70
+ def subdependency_resolver
71
+ return :pipfile if pipfile_lock
72
+ return :poetry if poetry_lock || pyproject_lock
73
+ return :pip_compile if pip_compile_files.any?
74
+
75
+ raise "Claimed to be a sub-dependency, but no lockfile exists!"
76
+ end
77
+
78
+ def updated_pipfile_based_files
79
+ PipfileFileUpdater.new(
80
+ dependencies: dependencies,
81
+ dependency_files: dependency_files,
82
+ credentials: credentials
83
+ ).updated_dependency_files
84
+ end
85
+
86
+ def updated_poetry_based_files
87
+ PoetryFileUpdater.new(
88
+ dependencies: dependencies,
89
+ dependency_files: dependency_files,
90
+ credentials: credentials
91
+ ).updated_dependency_files
92
+ end
93
+
94
+ def updated_pip_compile_based_files
95
+ PipCompileFileUpdater.new(
96
+ dependencies: dependencies,
97
+ dependency_files: dependency_files,
98
+ credentials: credentials
99
+ ).updated_dependency_files
100
+ end
101
+
102
+ def updated_requirement_based_files
103
+ RequirementFileUpdater.new(
104
+ dependencies: dependencies,
105
+ dependency_files: dependency_files,
106
+ credentials: credentials
107
+ ).updated_dependency_files
108
+ end
109
+
110
+ def check_required_files
111
+ filenames = dependency_files.map(&:name)
112
+ return if filenames.any? { |name| name.end_with?(".txt", ".in") }
113
+ return if pipfile
114
+ return if pyproject
115
+ return if get_original_file("setup.py")
116
+
117
+ raise "No requirements.txt or setup.py!"
118
+ end
119
+
120
+ def pipfile
121
+ @pipfile ||= get_original_file("Pipfile")
122
+ end
123
+
124
+ def pipfile_lock
125
+ @pipfile_lock ||= get_original_file("Pipfile.lock")
126
+ end
127
+
128
+ def pyproject
129
+ @pyproject ||= get_original_file("pyproject.toml")
130
+ end
131
+
132
+ def pyproject_lock
133
+ @pyproject_lock ||= get_original_file("pyproject.lock")
134
+ end
135
+
136
+ def poetry_lock
137
+ @poetry_lock ||= get_original_file("poetry.lock")
138
+ end
139
+
140
+ def pip_compile_files
141
+ @pip_compile_files ||=
142
+ dependency_files.select { |f| f.name.end_with?(".in") }
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end