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,175 @@
1
+ # frozen_string_literal: true
2
+
3
+ ################################################################################
4
+ # For more details on rust version constraints, see: #
5
+ # - https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html #
6
+ # - https://steveklabnik.github.io/semver/semver/index.html #
7
+ ################################################################################
8
+
9
+ require "dependabot/update_checkers/rust/cargo"
10
+ require "dependabot/utils/rust/requirement"
11
+ require "dependabot/utils/rust/version"
12
+
13
+ module Dependabot
14
+ module UpdateCheckers
15
+ module Rust
16
+ class Cargo
17
+ class RequirementsUpdater
18
+ class UnfixableRequirement < StandardError; end
19
+
20
+ VERSION_REGEX = /[0-9]+(?:\.[A-Za-z0-9\-*]+)*/.freeze
21
+ ALLOWED_UPDATE_STRATEGIES =
22
+ %i(bump_versions bump_versions_if_necessary).freeze
23
+
24
+ def initialize(requirements:, updated_source:, update_strategy:,
25
+ library:, latest_version:, latest_resolvable_version:)
26
+ @requirements = requirements
27
+ @updated_source = updated_source
28
+ @update_strategy = update_strategy
29
+ @library = library
30
+
31
+ check_update_strategy
32
+
33
+ if latest_version && version_class.correct?(latest_version)
34
+ @latest_version = version_class.new(latest_version)
35
+ end
36
+
37
+ return unless latest_resolvable_version
38
+ return unless version_class.correct?(latest_resolvable_version)
39
+
40
+ @latest_resolvable_version =
41
+ version_class.new(latest_resolvable_version)
42
+ end
43
+
44
+ def updated_requirements
45
+ # Note: Order is important here. The FileUpdater needs the updated
46
+ # requirement at index `i` to correspond to the previous requirement
47
+ # at the same index.
48
+ requirements.map do |req|
49
+ req = req.merge(source: updated_source)
50
+ next req unless latest_resolvable_version
51
+ next req if req[:requirement].nil?
52
+
53
+ # TODO: Add a widen_ranges options
54
+ if update_strategy == :bump_versions_if_necessary
55
+ update_version_requirement_if_needed(req)
56
+ else
57
+ update_version_requirement(req)
58
+ end
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ attr_reader :requirements, :updated_source, :update_strategy,
65
+ :latest_version, :latest_resolvable_version
66
+
67
+ def library?
68
+ @library
69
+ end
70
+
71
+ def check_update_strategy
72
+ return if ALLOWED_UPDATE_STRATEGIES.include?(update_strategy)
73
+
74
+ raise "Unknown update strategy: #{update_strategy}"
75
+ end
76
+
77
+ def target_version
78
+ library? ? latest_version : latest_resolvable_version
79
+ end
80
+
81
+ def update_version_requirement(req)
82
+ string_reqs = req[:requirement].split(",").map(&:strip)
83
+
84
+ new_requirement =
85
+ if (exact_req = exact_req(string_reqs))
86
+ # If there's an exact version, just return that
87
+ # (it will dominate any other requirements)
88
+ update_version_string(exact_req)
89
+ elsif (req_to_update = non_range_req(string_reqs)) &&
90
+ update_version_string(req_to_update) != req_to_update
91
+ # If a ~, ^, or * range needs to be updated, just return that
92
+ # (it will dominate any other requirements)
93
+ update_version_string(req_to_update)
94
+ else
95
+ # Otherwise, we must have a range requirement that needs
96
+ # updating. Update it, but keep other requirements too
97
+ update_range_requirements(string_reqs)
98
+ end
99
+
100
+ req.merge(requirement: new_requirement)
101
+ end
102
+
103
+ def update_version_requirement_if_needed(req)
104
+ string_reqs = req[:requirement].split(",").map(&:strip)
105
+ ruby_reqs = string_reqs.map { |r| Utils::Rust::Requirement.new(r) }
106
+
107
+ return req if ruby_reqs.all? { |r| r.satisfied_by?(target_version) }
108
+
109
+ update_version_requirement(req)
110
+ end
111
+
112
+ def update_version_string(req_string)
113
+ req_string.sub(VERSION_REGEX) do |old_version|
114
+ # For pre-release versions, just use the full version string
115
+ next target_version.to_s if old_version.match?(/\d-/)
116
+
117
+ old_parts = old_version.split(".")
118
+ new_parts = target_version.to_s.split(".").
119
+ first(old_parts.count)
120
+ new_parts.map.with_index do |part, i|
121
+ old_parts[i] == "*" ? "*" : part
122
+ end.join(".")
123
+ end
124
+ end
125
+
126
+ def non_range_req(string_reqs)
127
+ string_reqs.find { |r| r.include?("*") || r.match?(/^[\d~^]/) }
128
+ end
129
+
130
+ def exact_req(string_reqs)
131
+ string_reqs.find { |r| Utils::Rust::Requirement.new(r).exact? }
132
+ end
133
+
134
+ def update_range_requirements(string_reqs)
135
+ string_reqs.map do |req|
136
+ next req unless req.match?(/[<>]/)
137
+
138
+ ruby_req = Utils::Rust::Requirement.new(req)
139
+ next req if ruby_req.satisfied_by?(target_version)
140
+
141
+ raise UnfixableRequirement if req.start_with?(">")
142
+
143
+ req.sub(VERSION_REGEX) do |old_version|
144
+ update_greatest_version(old_version, target_version)
145
+ end
146
+ end.join(", ")
147
+ rescue UnfixableRequirement
148
+ :unfixable
149
+ end
150
+
151
+ def update_greatest_version(old_version, version_to_be_permitted)
152
+ version = version_class.new(old_version)
153
+ version = version.release if version.prerelease?
154
+
155
+ index_to_update =
156
+ version.segments.map.with_index { |seg, i| seg.zero? ? 0 : i }.max
157
+
158
+ version.segments.map.with_index do |_, index|
159
+ if index < index_to_update
160
+ version_to_be_permitted.segments[index]
161
+ elsif index == index_to_update
162
+ version_to_be_permitted.segments[index] + 1
163
+ else 0
164
+ end
165
+ end.join(".")
166
+ end
167
+
168
+ def version_class
169
+ Utils::Rust::Version
170
+ end
171
+ end
172
+ end
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,242 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "toml-rb"
4
+ require "dependabot/shared_helpers"
5
+ require "dependabot/file_parsers/rust/cargo"
6
+ require "dependabot/update_checkers/rust/cargo"
7
+ require "dependabot/utils/rust/version"
8
+ require "dependabot/errors"
9
+
10
+ module Dependabot
11
+ module UpdateCheckers
12
+ module Rust
13
+ class Cargo
14
+ class VersionResolver
15
+ BRANCH_NOT_FOUND_REGEX =
16
+ /failed to find branch `(?<branch>[^`]+)`/.freeze
17
+
18
+ def initialize(dependency:, credentials:,
19
+ original_dependency_files:, prepared_dependency_files:)
20
+ @dependency = dependency
21
+ @prepared_dependency_files = prepared_dependency_files
22
+ @original_dependency_files = original_dependency_files
23
+ @credentials = credentials
24
+ end
25
+
26
+ def latest_resolvable_version
27
+ @latest_resolvable_version ||= fetch_latest_resolvable_version
28
+ end
29
+
30
+ private
31
+
32
+ attr_reader :dependency, :credentials,
33
+ :prepared_dependency_files, :original_dependency_files
34
+
35
+ def fetch_latest_resolvable_version
36
+ base_directory = prepared_dependency_files.first.directory
37
+ SharedHelpers.in_a_temporary_directory(base_directory) do
38
+ write_temporary_dependency_files
39
+
40
+ SharedHelpers.with_git_configured(credentials: credentials) do
41
+ # Shell out to Cargo, which handles everything for us, and does
42
+ # so without doing an install (so it's fast).
43
+ command = "cargo update -p #{dependency_spec} --verbose"
44
+ run_cargo_command(command)
45
+ end
46
+
47
+ new_lockfile_content = File.read("Cargo.lock")
48
+ updated_version = get_version_from_lockfile(new_lockfile_content)
49
+
50
+ return if updated_version.nil?
51
+ return updated_version if git_dependency?
52
+
53
+ version_class.new(updated_version)
54
+ end
55
+ rescue SharedHelpers::HelperSubprocessFailed => error
56
+ handle_cargo_errors(error)
57
+ end
58
+
59
+ def get_version_from_lockfile(lockfile_content)
60
+ versions = TomlRB.parse(lockfile_content).fetch("package").
61
+ select { |p| p["name"] == dependency.name }
62
+
63
+ updated_version =
64
+ if dependency.top_level?
65
+ versions.max_by { |p| version_class.new(p.fetch("version")) }
66
+ else
67
+ versions.min_by { |p| version_class.new(p.fetch("version")) }
68
+ end
69
+
70
+ if git_dependency?
71
+ updated_version.fetch("source").split("#").last
72
+ else
73
+ updated_version.fetch("version")
74
+ end
75
+ end
76
+
77
+ def dependency_spec
78
+ spec = dependency.name
79
+
80
+ if git_dependency?
81
+ spec += ":#{git_dependency_version}" if git_dependency_version
82
+ elsif dependency.version
83
+ spec += ":#{dependency.version}"
84
+ end
85
+
86
+ spec
87
+ end
88
+
89
+ def run_cargo_command(command)
90
+ raw_response = nil
91
+ IO.popen(command, err: %i(child out)) do |process|
92
+ raw_response = process.read
93
+ end
94
+
95
+ # Raise an error with the output from the shell session if Cargo
96
+ # returns a non-zero status
97
+ return if $CHILD_STATUS.success?
98
+
99
+ raise SharedHelpers::HelperSubprocessFailed.new(
100
+ raw_response,
101
+ command
102
+ )
103
+ end
104
+
105
+ def write_temporary_dependency_files(prepared: true)
106
+ write_manifest_files(prepared: prepared)
107
+
108
+ File.write(lockfile.name, lockfile.content) if lockfile
109
+ File.write(toolchain.name, toolchain.content) if toolchain
110
+ end
111
+
112
+ def handle_cargo_errors(error)
113
+ if error.message.include?("does not have these features")
114
+ # TODO: Ideally we should update the declaration not to ask
115
+ # for the specified features
116
+ return nil
117
+ end
118
+
119
+ if error.message.match?(BRANCH_NOT_FOUND_REGEX)
120
+ branch = error.message.match(BRANCH_NOT_FOUND_REGEX).
121
+ named_captures.fetch("branch")
122
+ raise Dependabot::BranchNotFound, branch
123
+ end
124
+
125
+ if resolvability_error?(error.message)
126
+ raise Dependabot::DependencyFileNotResolvable, error.message
127
+ end
128
+
129
+ raise error
130
+ end
131
+
132
+ def resolvability_error?(message)
133
+ return true if message.include?("failed to parse lock")
134
+ return true if message.include?("believes it's in a workspace")
135
+ return true if message.include?("wasn't a root")
136
+ return true if message.include?("requires a nightly version")
137
+ return true if message.match?(/feature `[^\`]+` is required/)
138
+
139
+ !original_requirements_resolvable?
140
+ end
141
+
142
+ def original_requirements_resolvable?
143
+ base_directory = original_dependency_files.first.directory
144
+ SharedHelpers.in_a_temporary_directory(base_directory) do
145
+ write_temporary_dependency_files(prepared: false)
146
+
147
+ SharedHelpers.with_git_configured(credentials: credentials) do
148
+ command = "cargo update -p #{dependency_spec} --verbose"
149
+ run_cargo_command(command)
150
+ end
151
+ end
152
+
153
+ true
154
+ rescue SharedHelpers::HelperSubprocessFailed => error
155
+ raise unless error.message.include?("no matching version") ||
156
+ error.message.include?("failed to select a version")
157
+
158
+ false
159
+ end
160
+
161
+ def write_manifest_files(prepared: true)
162
+ manifest_files = if prepared then prepared_manifest_files
163
+ else original_manifest_files
164
+ end
165
+
166
+ manifest_files.each do |file|
167
+ path = file.name
168
+ dir = Pathname.new(path).dirname
169
+ FileUtils.mkdir_p(dir)
170
+ File.write(file.name, sanitized_manifest_content(file.content))
171
+
172
+ FileUtils.mkdir_p(File.join(dir, "src"))
173
+ File.write(File.join(dir, "src/lib.rs"), dummy_app_content)
174
+ File.write(File.join(dir, "src/main.rs"), dummy_app_content)
175
+ end
176
+ end
177
+
178
+ def git_dependency_version
179
+ return unless lockfile
180
+
181
+ TomlRB.parse(lockfile.content).
182
+ fetch("package", []).
183
+ select { |p| p["name"] == dependency.name }.
184
+ find { |p| p["source"].end_with?(dependency.version) }.
185
+ fetch("version")
186
+ end
187
+
188
+ def dummy_app_content
189
+ %{fn main() {\nprintln!("Hello, world!");\n}}
190
+ end
191
+
192
+ def sanitized_manifest_content(content)
193
+ object = TomlRB.parse(content)
194
+
195
+ package_name = object.dig("package", "name")
196
+ return content unless package_name&.match?(/[\{\}]/)
197
+
198
+ if lockfile
199
+ raise "Sanitizing name for pkg with lockfile. Investigate!"
200
+ end
201
+
202
+ object["package"]["name"] = "sanitized"
203
+ TomlRB.dump(object)
204
+ end
205
+
206
+ def prepared_manifest_files
207
+ @prepared_manifest_files ||=
208
+ prepared_dependency_files.
209
+ select { |f| f.name.end_with?("Cargo.toml") }
210
+ end
211
+
212
+ def original_manifest_files
213
+ @original_manifest_files ||=
214
+ original_dependency_files.
215
+ select { |f| f.name.end_with?("Cargo.toml") }
216
+ end
217
+
218
+ def lockfile
219
+ @lockfile ||= prepared_dependency_files.
220
+ find { |f| f.name == "Cargo.lock" }
221
+ end
222
+
223
+ def toolchain
224
+ @toolchain ||= prepared_dependency_files.
225
+ find { |f| f.name == "rust-toolchain" }
226
+ end
227
+
228
+ def git_dependency?
229
+ GitCommitChecker.new(
230
+ dependency: dependency,
231
+ credentials: credentials
232
+ ).git_dependency?
233
+ end
234
+
235
+ def version_class
236
+ Utils::Rust::Version
237
+ end
238
+ end
239
+ end
240
+ end
241
+ end
242
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/utils/dotnet/version"
4
+ require "dependabot/utils/elixir/version"
5
+ require "dependabot/utils/java/version"
6
+ require "dependabot/utils/java_script/version"
7
+ require "dependabot/utils/php/version"
8
+ require "dependabot/utils/python/version"
9
+ require "dependabot/utils/rust/version"
10
+ require "dependabot/utils/go/version"
11
+ require "dependabot/utils/elm/version"
12
+
13
+ require "dependabot/utils/dotnet/requirement"
14
+ require "dependabot/utils/elixir/requirement"
15
+ require "dependabot/utils/java/requirement"
16
+ require "dependabot/utils/java_script/requirement"
17
+ require "dependabot/utils/php/requirement"
18
+ require "dependabot/utils/python/requirement"
19
+ require "dependabot/utils/ruby/requirement"
20
+ require "dependabot/utils/rust/requirement"
21
+ require "dependabot/utils/go/requirement"
22
+ require "dependabot/utils/elm/requirement"
23
+
24
+ # TODO: in due course, these "registries" should live in a wrapper gem, not
25
+ # dependabot-core.
26
+ module Dependabot
27
+ module Utils
28
+ @version_classes = {
29
+ "bundler" => Gem::Version,
30
+ "submodules" => Gem::Version,
31
+ "docker" => Gem::Version,
32
+ "nuget" => Utils::Dotnet::Version,
33
+ "maven" => Utils::Java::Version,
34
+ "gradle" => Utils::Java::Version,
35
+ "npm_and_yarn" => Utils::JavaScript::Version,
36
+ "pip" => Utils::Python::Version,
37
+ "composer" => Utils::Php::Version,
38
+ "hex" => Utils::Elixir::Version,
39
+ "cargo" => Utils::Rust::Version,
40
+ "dep" => Utils::Go::Version,
41
+ "go_modules" => Utils::Go::Version,
42
+ "elm-package" => Utils::Elm::Version
43
+ }
44
+
45
+ def self.version_class_for_package_manager(package_manager)
46
+ version_class = @version_classes[package_manager]
47
+ return version_class if version_class
48
+
49
+ raise "Unsupported package_manager #{package_manager}"
50
+ end
51
+
52
+ def self.register_version_class(package_manager, version_class)
53
+ @version_classes[package_manager] = version_class
54
+ end
55
+
56
+ @requirement_classes = {
57
+ "bundler" => Utils::Ruby::Requirement,
58
+ "submodules" => Utils::Ruby::Requirement,
59
+ "docker" => Utils::Ruby::Requirement,
60
+ "nuget" => Utils::Dotnet::Requirement,
61
+ "maven" => Utils::Java::Requirement,
62
+ "gradle" => Utils::Java::Requirement,
63
+ "npm_and_yarn" => Utils::JavaScript::Requirement,
64
+ "pip" => Utils::Python::Requirement,
65
+ "composer" => Utils::Php::Requirement,
66
+ "hex" => Utils::Elixir::Requirement,
67
+ "cargo" => Utils::Rust::Requirement,
68
+ "dep" => Utils::Go::Requirement,
69
+ "go_modules" => Utils::Go::Requirement,
70
+ "elm-package" => Utils::Elm::Requirement
71
+ }
72
+
73
+ def self.requirement_class_for_package_manager(package_manager)
74
+ requirement_class = @requirement_classes[package_manager]
75
+ return requirement_class if requirement_class
76
+
77
+ raise "Unsupported package_manager #{package_manager}"
78
+ end
79
+
80
+ def self.register_requirement_class(package_manager, requirement_class)
81
+ @requirement_classes[package_manager] = requirement_class
82
+ end
83
+ end
84
+ end