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,188 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "parser/current"
4
+ require "dependabot/file_updaters/ruby/bundler"
5
+
6
+ module Dependabot
7
+ module FileUpdaters
8
+ module Ruby
9
+ class Bundler
10
+ class RequirementReplacer
11
+ attr_reader :dependency, :file_type, :updated_requirement,
12
+ :previous_requirement
13
+
14
+ def initialize(dependency:, file_type:, updated_requirement:,
15
+ previous_requirement: nil, insert_if_bare: false)
16
+ @dependency = dependency
17
+ @file_type = file_type
18
+ @updated_requirement = updated_requirement
19
+ @previous_requirement = previous_requirement
20
+ @insert_if_bare = insert_if_bare
21
+ end
22
+
23
+ def rewrite(content)
24
+ buffer = Parser::Source::Buffer.new("(gemfile_content)")
25
+ buffer.source = content
26
+ ast = Parser::CurrentRuby.new.parse(buffer)
27
+
28
+ updated_content = Rewriter.new(
29
+ dependency: dependency,
30
+ file_type: file_type,
31
+ updated_requirement: updated_requirement,
32
+ insert_if_bare: insert_if_bare?
33
+ ).rewrite(buffer, ast)
34
+
35
+ update_comment_spacing_if_required(content, updated_content)
36
+ end
37
+
38
+ private
39
+
40
+ def insert_if_bare?
41
+ @insert_if_bare
42
+ end
43
+
44
+ def update_comment_spacing_if_required(content, updated_content)
45
+ return updated_content unless previous_requirement
46
+
47
+ return updated_content if updated_content == content
48
+ return updated_content if length_change.zero?
49
+
50
+ updated_lines = updated_content.lines
51
+ updated_line_index =
52
+ updated_lines.length.
53
+ times.find { |i| content.lines[i] != updated_content.lines[i] }
54
+ updated_line = updated_lines[updated_line_index]
55
+
56
+ updated_line =
57
+ if length_change.positive?
58
+ updated_line.sub(/(?<=\s)\s{#{length_change}}#/, "#")
59
+ elsif length_change.negative?
60
+ updated_line.sub(/(?<=\s{2})#/, " " * length_change.abs + "#")
61
+ end
62
+
63
+ updated_lines[updated_line_index] = updated_line
64
+ updated_lines.join
65
+ end
66
+
67
+ def length_change
68
+ unless previous_requirement.start_with?("=")
69
+ return updated_requirement.length - previous_requirement.length
70
+ end
71
+
72
+ updated_requirement.length -
73
+ previous_requirement.gsub(/^=/, "").strip.length
74
+ end
75
+
76
+ class Rewriter < Parser::TreeRewriter
77
+ # TODO: Ideally we wouldn't have to ignore all of these, but
78
+ # implementing each one will be tricky.
79
+ SKIPPED_TYPES = %i(send lvar dstr begin if splat const).freeze
80
+
81
+ def initialize(dependency:, file_type:, updated_requirement:,
82
+ insert_if_bare:)
83
+ @dependency = dependency
84
+ @file_type = file_type
85
+ @updated_requirement = updated_requirement
86
+ @insert_if_bare = insert_if_bare
87
+
88
+ return if %i(gemfile gemspec).include?(file_type)
89
+
90
+ raise "File type must be :gemfile or :gemspec. Got #{file_type}."
91
+ end
92
+
93
+ def on_send(node)
94
+ return unless declares_targeted_gem?(node)
95
+
96
+ req_nodes = node.children[3..-1]
97
+ req_nodes = req_nodes.reject { |child| child.type == :hash }
98
+
99
+ return if req_nodes.none? && !insert_if_bare?
100
+ return if req_nodes.any? { |n| SKIPPED_TYPES.include?(n.type) }
101
+
102
+ quote_characters = extract_quote_characters_from(req_nodes)
103
+ space_after_specifier = space_after_specifier?(req_nodes)
104
+
105
+ new_req =
106
+ new_requirement_string(quote_characters, space_after_specifier)
107
+ if req_nodes.any?
108
+ replace(range_for(req_nodes), new_req)
109
+ else
110
+ insert_after(range_for(node.children[2..2]), ", #{new_req}")
111
+ end
112
+ end
113
+
114
+ private
115
+
116
+ attr_reader :dependency, :file_type, :updated_requirement
117
+
118
+ def insert_if_bare?
119
+ @insert_if_bare
120
+ end
121
+
122
+ def declaration_methods
123
+ return %i(gem) if file_type == :gemfile
124
+
125
+ %i(add_dependency add_runtime_dependency
126
+ add_development_dependency)
127
+ end
128
+
129
+ def declares_targeted_gem?(node)
130
+ return false unless declaration_methods.include?(node.children[1])
131
+
132
+ node.children[2].children.first == dependency.name
133
+ end
134
+
135
+ def extract_quote_characters_from(requirement_nodes)
136
+ return ['"', '"'] if requirement_nodes.none?
137
+
138
+ case requirement_nodes.first.type
139
+ when :str, :dstr
140
+ [
141
+ requirement_nodes.first.loc.begin.source,
142
+ requirement_nodes.first.loc.end.source
143
+ ]
144
+ else
145
+ [
146
+ requirement_nodes.first.children.first.loc.begin.source,
147
+ requirement_nodes.first.children.first.loc.end.source
148
+ ]
149
+ end
150
+ end
151
+
152
+ def space_after_specifier?(requirement_nodes)
153
+ return true if requirement_nodes.none?
154
+
155
+ req_string =
156
+ case requirement_nodes.first.type
157
+ when :str, :dstr
158
+ requirement_nodes.first.loc.expression.source
159
+ else
160
+ requirement_nodes.first.children.first.loc.expression.source
161
+ end
162
+
163
+ ops = Gem::Requirement::OPS.keys
164
+ return true if ops.none? { |op| req_string.include?(op) }
165
+
166
+ req_string.include?(" ")
167
+ end
168
+
169
+ def new_requirement_string(quote_characters, space_after_specifier)
170
+ open_quote, close_quote = quote_characters
171
+ new_requirement_string =
172
+ updated_requirement.split(",").
173
+ map { |r| %(#{open_quote}#{r.strip}#{close_quote}) }.
174
+ join(", ")
175
+
176
+ new_requirement_string.delete!(" ") unless space_after_specifier
177
+ new_requirement_string
178
+ end
179
+
180
+ def range_for(nodes)
181
+ nodes.first.loc.begin.begin.join(nodes.last.loc.expression)
182
+ end
183
+ end
184
+ end
185
+ end
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "toml-rb"
4
+ require "dependabot/git_commit_checker"
5
+ require "dependabot/file_updaters/base"
6
+ require "dependabot/file_parsers/rust/cargo"
7
+ require "dependabot/shared_helpers"
8
+
9
+ module Dependabot
10
+ module FileUpdaters
11
+ module Rust
12
+ class Cargo < Dependabot::FileUpdaters::Base
13
+ require_relative "cargo/manifest_updater"
14
+ require_relative "cargo/lockfile_updater"
15
+
16
+ def self.updated_files_regex
17
+ [
18
+ /^Cargo\.toml$/,
19
+ /^Cargo\.lock$/
20
+ ]
21
+ end
22
+
23
+ def updated_dependency_files
24
+ # Returns an array of updated files. Only files that have been updated
25
+ # should be returned.
26
+ updated_files = []
27
+
28
+ manifest_files.each do |file|
29
+ next unless file_changed?(file)
30
+
31
+ updated_files <<
32
+ updated_file(
33
+ file: file,
34
+ content: updated_manifest_content(file)
35
+ )
36
+ end
37
+
38
+ if lockfile && updated_lockfile_content != lockfile.content
39
+ updated_files <<
40
+ updated_file(file: lockfile, content: updated_lockfile_content)
41
+ end
42
+
43
+ raise "No files changed!" if updated_files.empty?
44
+
45
+ updated_files
46
+ end
47
+
48
+ private
49
+
50
+ def check_required_files
51
+ raise "No Cargo.toml!" unless get_original_file("Cargo.toml")
52
+ end
53
+
54
+ def updated_manifest_content(file)
55
+ ManifestUpdater.new(
56
+ dependencies: dependencies,
57
+ manifest: file
58
+ ).updated_manifest_content
59
+ end
60
+
61
+ def updated_lockfile_content
62
+ @updated_lockfile_content ||=
63
+ LockfileUpdater.new(
64
+ dependencies: dependencies,
65
+ dependency_files: dependency_files,
66
+ credentials: credentials
67
+ ).updated_lockfile_content
68
+ end
69
+
70
+ def manifest_files
71
+ @manifest_files ||=
72
+ dependency_files.
73
+ select { |f| f.name.end_with?("Cargo.toml") }.
74
+ reject { |f| f.type == "path_dependency" }
75
+ end
76
+
77
+ def lockfile
78
+ @lockfile ||= get_original_file("Cargo.lock")
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,251 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "toml-rb"
4
+ require "dependabot/git_commit_checker"
5
+ require "dependabot/file_updaters/rust/cargo"
6
+ require "dependabot/file_updaters/rust/cargo/manifest_updater"
7
+ require "dependabot/file_parsers/rust/cargo"
8
+ require "dependabot/shared_helpers"
9
+
10
+ module Dependabot
11
+ module FileUpdaters
12
+ module Rust
13
+ class Cargo
14
+ class LockfileUpdater
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
+ SharedHelpers.in_a_temporary_directory(base_directory) do
24
+ write_temporary_dependency_files
25
+
26
+ SharedHelpers.with_git_configured(credentials: credentials) do
27
+ # Shell out to Cargo, which handles everything for us, and does
28
+ # so without doing an install (so it's fast).
29
+ command = "cargo update -p #{dependency_spec}"
30
+ run_shell_command(command)
31
+ end
32
+
33
+ updated_lockfile = File.read("Cargo.lock")
34
+ updated_lockfile = post_process_lockfile(updated_lockfile)
35
+
36
+ if updated_lockfile.include?(desired_lockfile_content)
37
+ next updated_lockfile
38
+ end
39
+
40
+ raise "Failed to update #{dependency.name}!"
41
+ end
42
+ rescue Dependabot::SharedHelpers::HelperSubprocessFailed => error
43
+ handle_cargo_error(error)
44
+ end
45
+
46
+ private
47
+
48
+ attr_reader :dependencies, :dependency_files, :credentials
49
+
50
+ # Currently, there will only be a single updated dependency
51
+ def dependency
52
+ dependencies.first
53
+ end
54
+
55
+ def handle_cargo_error(error)
56
+ raise unless error.message.include?("no matching version")
57
+ raise if error.message.include?("`#{dependency.name}`")
58
+
59
+ raise Dependabot::DependencyFileNotResolvable, error.message
60
+ end
61
+
62
+ def dependency_spec
63
+ spec = dependency.name
64
+
65
+ if git_dependency?
66
+ spec += ":#{git_previous_version}" if git_previous_version
67
+ elsif dependency.previous_version
68
+ spec += ":#{dependency.previous_version}"
69
+ end
70
+
71
+ spec
72
+ end
73
+
74
+ def git_previous_version
75
+ TomlRB.parse(lockfile.content).
76
+ fetch("package", []).
77
+ select { |p| p["name"] == dependency.name }.
78
+ find { |p| p["source"].end_with?(dependency.previous_version) }.
79
+ fetch("version")
80
+ end
81
+
82
+ def desired_lockfile_content
83
+ return dependency.version if git_dependency?
84
+
85
+ %(name = "#{dependency.name}"\nversion = "#{dependency.version}")
86
+ end
87
+
88
+ def run_shell_command(command)
89
+ raw_response = nil
90
+ IO.popen(command, err: %i(child out)) do |process|
91
+ raw_response = process.read
92
+ end
93
+
94
+ # Raise an error with the output from the shell session if Cargo
95
+ # returns a non-zero status
96
+ return if $CHILD_STATUS.success?
97
+
98
+ raise SharedHelpers::HelperSubprocessFailed.new(
99
+ raw_response,
100
+ command
101
+ )
102
+ end
103
+
104
+ def write_temporary_dependency_files
105
+ write_temporary_manifest_files
106
+ write_temporary_path_dependency_files
107
+
108
+ File.write(lockfile.name, lockfile.content)
109
+ File.write(toolchain.name, toolchain.content) if toolchain
110
+ end
111
+
112
+ def write_temporary_manifest_files
113
+ manifest_files.each do |file|
114
+ path = file.name
115
+ dir = Pathname.new(path).dirname
116
+ FileUtils.mkdir_p(Pathname.new(path).dirname)
117
+ File.write(file.name, prepared_manifest_content(file))
118
+
119
+ FileUtils.mkdir_p(File.join(dir, "src"))
120
+ File.write(File.join(dir, "src/lib.rs"), dummy_app_content)
121
+ File.write(File.join(dir, "src/main.rs"), dummy_app_content)
122
+ end
123
+ end
124
+
125
+ def write_temporary_path_dependency_files
126
+ path_dependency_files.each do |file|
127
+ path = file.name
128
+ dir = Pathname.new(path).dirname
129
+ FileUtils.mkdir_p(Pathname.new(path).dirname)
130
+ File.write(file.name, prepared_path_dependency_content(file))
131
+
132
+ FileUtils.mkdir_p(File.join(dir, "src"))
133
+ File.write(File.join(dir, "src/lib.rs"), dummy_app_content)
134
+ File.write(File.join(dir, "src/main.rs"), dummy_app_content)
135
+ end
136
+ end
137
+
138
+ def prepared_manifest_content(file)
139
+ content = updated_manifest_content(file)
140
+ content = pin_version(content) unless git_dependency?
141
+ content = replace_ssh_urls(content)
142
+ content
143
+ end
144
+
145
+ def prepared_path_dependency_content(file)
146
+ content = file.content.dup
147
+ content = replace_ssh_urls(content)
148
+ content
149
+ end
150
+
151
+ def updated_manifest_content(file)
152
+ ManifestUpdater.new(
153
+ dependencies: dependencies,
154
+ manifest: file
155
+ ).updated_manifest_content
156
+ end
157
+
158
+ def pin_version(content)
159
+ parsed_manifest = TomlRB.parse(content)
160
+
161
+ FileParsers::Rust::Cargo::DEPENDENCY_TYPES.each do |type|
162
+ next unless (req = parsed_manifest.dig(type, dependency.name))
163
+
164
+ updated_req = "=#{dependency.version}"
165
+
166
+ if req.is_a?(Hash)
167
+ parsed_manifest[type][dependency.name]["version"] = updated_req
168
+ else
169
+ parsed_manifest[type][dependency.name] = updated_req
170
+ end
171
+ end
172
+
173
+ TomlRB.dump(parsed_manifest)
174
+ end
175
+
176
+ def replace_ssh_urls(content)
177
+ git_ssh_requirements_to_swap.each do |ssh_url, https_url|
178
+ content = content.gsub(ssh_url, https_url)
179
+ end
180
+ content
181
+ end
182
+
183
+ def post_process_lockfile(content)
184
+ git_ssh_requirements_to_swap.each do |ssh_url, https_url|
185
+ content = content.gsub(https_url, ssh_url)
186
+ end
187
+
188
+ content
189
+ end
190
+
191
+ def git_ssh_requirements_to_swap
192
+ if @git_ssh_requirements_to_swap
193
+ return @git_ssh_requirements_to_swap
194
+ end
195
+
196
+ @git_ssh_requirements_to_swap = {}
197
+
198
+ [*manifest_files, *path_dependency_files].each do |manifest|
199
+ parsed_manifest = TomlRB.parse(manifest.content)
200
+
201
+ FileParsers::Rust::Cargo::DEPENDENCY_TYPES.each do |type|
202
+ (parsed_manifest[type] || {}).each do |_, details|
203
+ next unless details.is_a?(Hash)
204
+ next unless details["git"]&.match?(%r{ssh://git@(.*?)/})
205
+
206
+ @git_ssh_requirements_to_swap[details["git"]] =
207
+ details["git"].gsub(%r{ssh://git@(.*?)/}, 'https://\1/')
208
+ end
209
+ end
210
+ end
211
+
212
+ @git_ssh_requirements_to_swap
213
+ end
214
+
215
+ def dummy_app_content
216
+ %{fn main() {\nprintln!("Hello, world!");\n}}
217
+ end
218
+
219
+ def git_dependency?
220
+ GitCommitChecker.new(
221
+ dependency: dependency,
222
+ credentials: credentials
223
+ ).git_dependency?
224
+ end
225
+
226
+ def manifest_files
227
+ @manifest_files ||=
228
+ dependency_files.
229
+ select { |f| f.name.end_with?("Cargo.toml") }.
230
+ reject { |f| f.type == "path_dependency" }
231
+ end
232
+
233
+ def path_dependency_files
234
+ @path_dependency_files ||=
235
+ dependency_files.
236
+ select { |f| f.type == "path_dependency" }
237
+ end
238
+
239
+ def lockfile
240
+ @lockfile ||= dependency_files.find { |f| f.name == "Cargo.lock" }
241
+ end
242
+
243
+ def toolchain
244
+ @toolchain ||=
245
+ dependency_files.find { |f| f.name == "rust-toolchain" }
246
+ end
247
+ end
248
+ end
249
+ end
250
+ end
251
+ end