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,282 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "excon"
4
+ require "dependabot/git_commit_checker"
5
+ require "dependabot/update_checkers/base"
6
+
7
+ module Dependabot
8
+ module UpdateCheckers
9
+ module Rust
10
+ class Cargo < Dependabot::UpdateCheckers::Base
11
+ require_relative "cargo/requirements_updater"
12
+ require_relative "cargo/version_resolver"
13
+ require_relative "cargo/file_preparer"
14
+
15
+ def latest_version
16
+ return if path_dependency?
17
+
18
+ @latest_version =
19
+ if git_dependency?
20
+ latest_version_for_git_dependency
21
+ elsif git_subdependency?
22
+ # TODO: Dependabot can't update git sub-dependencies yet, because
23
+ # they can't be passed to GitCommitChecker.
24
+ nil
25
+ else
26
+ versions = available_versions
27
+ versions.reject!(&:prerelease?) unless wants_prerelease?
28
+ versions.reject! do |v|
29
+ ignore_reqs.any? { |r| r.satisfied_by?(v) }
30
+ end
31
+ versions.max
32
+ end
33
+ end
34
+
35
+ def latest_resolvable_version
36
+ return if path_dependency?
37
+
38
+ @latest_resolvable_version ||=
39
+ if git_dependency?
40
+ latest_resolvable_version_for_git_dependency
41
+ elsif git_subdependency?
42
+ # TODO: Dependabot can't update git sub-dependencies yet, because
43
+ # they can't be passed to GitCommitChecker.
44
+ nil
45
+ else
46
+ fetch_latest_resolvable_version(unlock_requirement: true)
47
+ end
48
+ end
49
+
50
+ def latest_resolvable_version_with_no_unlock
51
+ return if path_dependency?
52
+
53
+ @latest_resolvable_version_with_no_unlock ||=
54
+ if git_dependency?
55
+ latest_resolvable_commit_with_unchanged_git_source
56
+ else
57
+ fetch_latest_resolvable_version(unlock_requirement: false)
58
+ end
59
+ end
60
+
61
+ def updated_requirements
62
+ RequirementsUpdater.new(
63
+ requirements: dependency.requirements,
64
+ updated_source: updated_source,
65
+ latest_resolvable_version: latest_resolvable_version&.to_s,
66
+ latest_version: latest_version&.to_s,
67
+ library: library?,
68
+ update_strategy: requirement_update_strategy
69
+ ).updated_requirements
70
+ end
71
+
72
+ private
73
+
74
+ def latest_version_resolvable_with_full_unlock?
75
+ # Full unlock checks aren't implemented for Rust (yet)
76
+ false
77
+ end
78
+
79
+ def updated_dependencies_after_full_unlock
80
+ raise NotImplementedError
81
+ end
82
+
83
+ def library?
84
+ # If it has a lockfile, treat it as an application. Otherwise treat it
85
+ # as a library.
86
+ dependency_files.none? { |f| f.name == "Cargo.lock" }
87
+ end
88
+
89
+ def requirement_update_strategy
90
+ library? ? :bump_versions_if_necessary : :bump_versions
91
+ end
92
+
93
+ def latest_version_for_git_dependency
94
+ latest_git_version_sha
95
+ end
96
+
97
+ def latest_git_version_sha
98
+ # If the gem isn't pinned, the latest version is just the latest
99
+ # commit for the specified branch.
100
+ unless git_commit_checker.pinned?
101
+ return git_commit_checker.head_commit_for_current_branch
102
+ end
103
+
104
+ # If the dependency is pinned to a tag that looks like a version then
105
+ # we want to update that tag. The latest version will then be the SHA
106
+ # of the latest tag that looks like a version.
107
+ if git_commit_checker.pinned_ref_looks_like_version?
108
+ latest_tag = git_commit_checker.local_tag_for_latest_version
109
+ return latest_tag&.fetch(:commit_sha) || dependency.version
110
+ end
111
+
112
+ # If the dependency is pinned to a tag that doesn't look like a
113
+ # version then there's nothing we can do.
114
+ dependency.version
115
+ end
116
+
117
+ def latest_resolvable_version_for_git_dependency
118
+ # If the gem isn't pinned, the latest version is just the latest
119
+ # commit for the specified branch.
120
+ unless git_commit_checker.pinned?
121
+ return latest_resolvable_commit_with_unchanged_git_source
122
+ end
123
+
124
+ # If the dependency is pinned to a tag that looks like a version then
125
+ # we want to update that tag. The latest version will then be the SHA
126
+ # of the latest tag that looks like a version.
127
+ if git_commit_checker.pinned_ref_looks_like_version? &&
128
+ latest_git_tag_is_resolvable?
129
+ new_tag = git_commit_checker.local_tag_for_latest_version
130
+ return new_tag.fetch(:commit_sha)
131
+ end
132
+
133
+ # If the dependency is pinned then there's nothing we can do.
134
+ dependency.version
135
+ end
136
+
137
+ def latest_git_tag_is_resolvable?
138
+ return @git_tag_resolvable if @latest_git_tag_is_resolvable_checked
139
+
140
+ @latest_git_tag_is_resolvable_checked = true
141
+
142
+ return false if git_commit_checker.local_tag_for_latest_version.nil?
143
+
144
+ replacement_tag = git_commit_checker.local_tag_for_latest_version
145
+
146
+ prepared_files = FilePreparer.new(
147
+ dependency_files: dependency_files,
148
+ dependency: dependency,
149
+ unlock_requirement: true,
150
+ replacement_git_pin: replacement_tag.fetch(:tag)
151
+ ).prepared_dependency_files
152
+
153
+ VersionResolver.new(
154
+ dependency: dependency,
155
+ prepared_dependency_files: prepared_files,
156
+ original_dependency_files: dependency_files,
157
+ credentials: credentials
158
+ ).latest_resolvable_version
159
+ @git_tag_resolvable = true
160
+ rescue SharedHelpers::HelperSubprocessFailed => error
161
+ raise error unless error.message.include?("versions conflict")
162
+
163
+ @git_tag_resolvable = false
164
+ end
165
+
166
+ def latest_resolvable_commit_with_unchanged_git_source
167
+ fetch_latest_resolvable_version(unlock_requirement: false)
168
+ rescue SharedHelpers::HelperSubprocessFailed => error
169
+ # Resolution may fail, as Cargo updates straight to the tip of the
170
+ # branch. Just return `nil` if it does (so no update).
171
+ return if error.message.include?("versions conflict")
172
+
173
+ raise error
174
+ end
175
+
176
+ def fetch_latest_resolvable_version(unlock_requirement:)
177
+ prepared_files = FilePreparer.new(
178
+ dependency_files: dependency_files,
179
+ dependency: dependency,
180
+ unlock_requirement: unlock_requirement,
181
+ latest_allowable_version: latest_version
182
+ ).prepared_dependency_files
183
+
184
+ VersionResolver.new(
185
+ dependency: dependency,
186
+ prepared_dependency_files: prepared_files,
187
+ original_dependency_files: dependency_files,
188
+ credentials: credentials
189
+ ).latest_resolvable_version
190
+ end
191
+
192
+ def updated_source
193
+ # Never need to update source, unless a git_dependency
194
+ return dependency_source_details unless git_dependency?
195
+
196
+ # Update the git tag if updating a pinned version
197
+ if git_commit_checker.pinned_ref_looks_like_version? &&
198
+ latest_git_tag_is_resolvable?
199
+ new_tag = git_commit_checker.local_tag_for_latest_version
200
+ return dependency_source_details.merge(ref: new_tag.fetch(:tag))
201
+ end
202
+
203
+ # Otherwise return the original source
204
+ dependency_source_details
205
+ end
206
+
207
+ def dependency_source_details
208
+ sources =
209
+ dependency.requirements.map { |r| r.fetch(:source) }.uniq.compact
210
+
211
+ raise "Multiple sources! #{sources.join(', ')}" if sources.count > 1
212
+
213
+ sources.first
214
+ end
215
+
216
+ def wants_prerelease?
217
+ if dependency.version &&
218
+ version_class.new(dependency.version).prerelease?
219
+ return true
220
+ end
221
+
222
+ dependency.requirements.any? do |req|
223
+ reqs = (req.fetch(:requirement) || "").split(",").map(&:strip)
224
+ reqs.any? { |r| r.match?(/[A-Za-z]/) }
225
+ end
226
+ end
227
+
228
+ def available_versions
229
+ crates_listing.
230
+ fetch("versions", []).
231
+ reject { |v| v["yanked"] }.
232
+ map { |v| version_class.new(v.fetch("num")) }
233
+ end
234
+
235
+ def git_dependency?
236
+ git_commit_checker.git_dependency?
237
+ end
238
+
239
+ def git_subdependency?
240
+ return false if dependency.top_level?
241
+
242
+ !version_class.correct?(dependency.version)
243
+ end
244
+
245
+ def path_dependency?
246
+ sources = dependency.requirements.
247
+ map { |r| r.fetch(:source) }.uniq.compact
248
+
249
+ raise "Multiple sources! #{sources.join(', ')}" if sources.count > 1
250
+
251
+ sources.first&.fetch(:type) == "path"
252
+ end
253
+
254
+ def git_commit_checker
255
+ @git_commit_checker ||=
256
+ GitCommitChecker.new(
257
+ dependency: dependency,
258
+ credentials: credentials
259
+ )
260
+ end
261
+
262
+ def crates_listing
263
+ return @crates_listing unless @crates_listing.nil?
264
+
265
+ response = Excon.get(
266
+ "https://crates.io/api/v1/crates/#{dependency.name}",
267
+ idempotent: true,
268
+ **SharedHelpers.excon_defaults
269
+ )
270
+
271
+ @crates_listing = JSON.parse(response.body)
272
+ rescue Excon::Error::Timeout
273
+ retrying ||= false
274
+ raise if retrying
275
+
276
+ retrying = true
277
+ sleep(rand(1.0..5.0)) && retry
278
+ end
279
+ end
280
+ end
281
+ end
282
+ end
@@ -0,0 +1,202 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "toml-rb"
4
+ require "dependabot/dependency_file"
5
+ require "dependabot/file_parsers/rust/cargo"
6
+ require "dependabot/update_checkers/rust/cargo"
7
+
8
+ module Dependabot
9
+ module UpdateCheckers
10
+ module Rust
11
+ class Cargo
12
+ # This class takes a set of dependency files and sanitizes them for use
13
+ # in UpdateCheckers::Rust::Cargo.
14
+ class FilePreparer
15
+ def initialize(dependency_files:, dependency:,
16
+ unlock_requirement: true,
17
+ replacement_git_pin: nil,
18
+ latest_allowable_version: nil)
19
+ @dependency_files = dependency_files
20
+ @dependency = dependency
21
+ @unlock_requirement = unlock_requirement
22
+ @replacement_git_pin = replacement_git_pin
23
+ @latest_allowable_version = latest_allowable_version
24
+ end
25
+
26
+ def prepared_dependency_files
27
+ files = []
28
+ files += manifest_files.map do |file|
29
+ DependencyFile.new(
30
+ name: file.name,
31
+ content: manifest_content_for_update_check(file),
32
+ directory: file.directory
33
+ )
34
+ end
35
+ files << lockfile if lockfile
36
+ files << toolchain if toolchain
37
+ files
38
+ end
39
+
40
+ private
41
+
42
+ attr_reader :dependency_files, :dependency, :replacement_git_pin,
43
+ :latest_allowable_version
44
+
45
+ def unlock_requirement?
46
+ @unlock_requirement
47
+ end
48
+
49
+ def replace_git_pin?
50
+ !replacement_git_pin.nil?
51
+ end
52
+
53
+ def manifest_content_for_update_check(file)
54
+ content = file.content
55
+
56
+ unless file.support_file?
57
+ content = replace_version_constraint(content, file.name)
58
+ content = replace_git_pin(content) if replace_git_pin?
59
+ end
60
+
61
+ content = replace_ssh_urls(content)
62
+
63
+ content
64
+ end
65
+
66
+ # Note: We don't need to care about formatting in this method, since
67
+ # we're only using the manifest to find the latest resolvable version
68
+ def replace_version_constraint(content, filename)
69
+ parsed_manifest = TomlRB.parse(content)
70
+
71
+ FileParsers::Rust::Cargo::DEPENDENCY_TYPES.each do |type|
72
+ next unless (req = parsed_manifest.dig(type, dependency.name))
73
+
74
+ updated_req = temporary_requirement_for_resolution(filename)
75
+
76
+ if req.is_a?(Hash)
77
+ parsed_manifest[type][dependency.name]["version"] = updated_req
78
+ else
79
+ parsed_manifest[type][dependency.name] = updated_req
80
+ end
81
+ end
82
+
83
+ TomlRB.dump(parsed_manifest)
84
+ end
85
+
86
+ def replace_git_pin(content)
87
+ parsed_manifest = TomlRB.parse(content)
88
+
89
+ FileParsers::Rust::Cargo::DEPENDENCY_TYPES.each do |type|
90
+ next unless (req = parsed_manifest.dig(type, dependency.name))
91
+ next unless req.is_a?(Hash)
92
+ next unless [req["tag"], req["rev"]].compact.uniq.count == 1
93
+
94
+ if req["tag"]
95
+ parsed_manifest[type][dependency.name]["tag"] =
96
+ replacement_git_pin
97
+ end
98
+
99
+ if req["rev"]
100
+ parsed_manifest[type][dependency.name]["rev"] =
101
+ replacement_git_pin
102
+ end
103
+ end
104
+
105
+ TomlRB.dump(parsed_manifest)
106
+ end
107
+
108
+ def replace_ssh_urls(content)
109
+ parsed_manifest = TomlRB.parse(content)
110
+
111
+ FileParsers::Rust::Cargo::DEPENDENCY_TYPES.each do |type|
112
+ (parsed_manifest[type] || {}).each do |_, details|
113
+ next unless details.is_a?(Hash)
114
+ next unless details["git"]
115
+
116
+ details["git"] = details["git"].
117
+ gsub(%r{ssh://git@(.*?)/}, 'https://\1/')
118
+ end
119
+ end
120
+
121
+ TomlRB.dump(parsed_manifest)
122
+ end
123
+
124
+ def temporary_requirement_for_resolution(filename)
125
+ original_req = dependency.requirements.
126
+ find { |r| r.fetch(:file) == filename }&.
127
+ fetch(:requirement)
128
+
129
+ lower_bound_req =
130
+ if original_req && !unlock_requirement?
131
+ original_req
132
+ else
133
+ ">= #{lower_bound_version}"
134
+ end
135
+
136
+ unless Utils::Rust::Version.correct?(latest_allowable_version) &&
137
+ Utils::Rust::Version.new(latest_allowable_version) >=
138
+ Utils::Rust::Version.new(lower_bound_version)
139
+ return lower_bound_req
140
+ end
141
+
142
+ lower_bound_req + ", <= #{latest_allowable_version}"
143
+ end
144
+
145
+ def lower_bound_version
146
+ @lower_bound_version ||=
147
+ if git_dependency? && git_dependency_version
148
+ git_dependency_version
149
+ elsif !git_dependency? && dependency.version
150
+ dependency.version
151
+ else
152
+ version_from_requirement =
153
+ dependency.requirements.map { |r| r.fetch(:requirement) }.
154
+ compact.
155
+ flat_map { |req_str| Utils::Rust::Requirement.new(req_str) }.
156
+ flat_map(&:requirements).
157
+ reject { |req_array| req_array.first.start_with?("<") }.
158
+ map(&:last).
159
+ max&.to_s
160
+
161
+ version_from_requirement || 0
162
+ end
163
+ end
164
+
165
+ def git_dependency_version
166
+ return unless lockfile
167
+
168
+ TomlRB.parse(lockfile.content).
169
+ fetch("package", []).
170
+ select { |p| p["name"] == dependency.name }.
171
+ find { |p| p["source"].end_with?(dependency.version) }.
172
+ fetch("version")
173
+ end
174
+
175
+ def manifest_files
176
+ @manifest_files ||=
177
+ dependency_files.select { |f| f.name.end_with?("Cargo.toml") }
178
+
179
+ raise "No Cargo.toml!" if @manifest_files.none?
180
+
181
+ @manifest_files
182
+ end
183
+
184
+ def lockfile
185
+ @lockfile ||= dependency_files.find { |f| f.name == "Cargo.lock" }
186
+ end
187
+
188
+ def toolchain
189
+ @toolchain ||=
190
+ dependency_files.find { |f| f.name == "rust-toolchain" }
191
+ end
192
+
193
+ def git_dependency?
194
+ GitCommitChecker.
195
+ new(dependency: dependency, credentials: []).
196
+ git_dependency?
197
+ end
198
+ end
199
+ end
200
+ end
201
+ end
202
+ end