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,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/ruby/bundler"
4
+
5
+ module Dependabot
6
+ module FileUpdaters
7
+ module Ruby
8
+ class Bundler
9
+ class GemspecUpdater
10
+ require_relative "requirement_replacer"
11
+
12
+ def initialize(dependencies:, gemspec:)
13
+ @dependencies = dependencies
14
+ @gemspec = gemspec
15
+ end
16
+
17
+ def updated_gemspec_content
18
+ content = gemspec.content
19
+
20
+ dependencies.each do |dependency|
21
+ content = replace_gemspec_version_requirement(
22
+ gemspec, dependency, content
23
+ )
24
+ end
25
+
26
+ content
27
+ end
28
+
29
+ private
30
+
31
+ attr_reader :dependencies, :gemspec
32
+
33
+ def replace_gemspec_version_requirement(gemspec, dependency, content)
34
+ return content unless requirement_changed?(gemspec, dependency)
35
+
36
+ updated_requirement =
37
+ dependency.requirements.
38
+ find { |r| r[:file] == gemspec.name }.
39
+ fetch(:requirement)
40
+
41
+ previous_requirement =
42
+ dependency.previous_requirements.
43
+ find { |r| r[:file] == gemspec.name }.
44
+ fetch(:requirement)
45
+
46
+ RequirementReplacer.new(
47
+ dependency: dependency,
48
+ file_type: :gemspec,
49
+ updated_requirement: updated_requirement,
50
+ previous_requirement: previous_requirement
51
+ ).rewrite(content)
52
+ end
53
+
54
+ def requirement_changed?(file, dependency)
55
+ changed_requirements =
56
+ dependency.requirements - dependency.previous_requirements
57
+
58
+ changed_requirements.any? { |f| f[:file] == file.name }
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,80 @@
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 GitPinReplacer
11
+ attr_reader :dependency, :new_pin
12
+
13
+ def initialize(dependency:, new_pin:)
14
+ @dependency = dependency
15
+ @new_pin = new_pin
16
+ end
17
+
18
+ def rewrite(content)
19
+ buffer = Parser::Source::Buffer.new("(gemfile_content)")
20
+ buffer.source = content
21
+ ast = Parser::CurrentRuby.new.parse(buffer)
22
+
23
+ Rewriter.
24
+ new(dependency: dependency, new_pin: new_pin).
25
+ rewrite(buffer, ast)
26
+ end
27
+
28
+ class Rewriter < Parser::TreeRewriter
29
+ PIN_KEYS = %i(ref tag).freeze
30
+ attr_reader :dependency, :new_pin
31
+
32
+ def initialize(dependency:, new_pin:)
33
+ @dependency = dependency
34
+ @new_pin = new_pin
35
+ end
36
+
37
+ def on_send(node)
38
+ return unless declares_targeted_gem?(node)
39
+ return unless node.children.last.type == :hash
40
+
41
+ kwargs_node = node.children.last
42
+ kwargs_node.children.each do |hash_pair|
43
+ next unless PIN_KEYS.include?(key_from_hash_pair(hash_pair))
44
+
45
+ update_value(hash_pair)
46
+ end
47
+ end
48
+
49
+ private
50
+
51
+ def declares_targeted_gem?(node)
52
+ return false unless node.children[1] == :gem
53
+
54
+ node.children[2].children.first == dependency.name
55
+ end
56
+
57
+ def key_from_hash_pair(node)
58
+ node.children.first.children.first.to_sym
59
+ end
60
+
61
+ def update_value(hash_pair)
62
+ value_node = hash_pair.children.last
63
+ open_quote_character, close_quote_character =
64
+ extract_quote_characters_from(value_node)
65
+
66
+ replace(
67
+ value_node.loc.expression,
68
+ %(#{open_quote_character}#{new_pin}#{close_quote_character})
69
+ )
70
+ end
71
+
72
+ def extract_quote_characters_from(value_node)
73
+ [value_node.loc.begin.source, value_node.loc.end.source]
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,102 @@
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 GitSourceRemover
11
+ attr_reader :dependency
12
+
13
+ def initialize(dependency:)
14
+ @dependency = dependency
15
+ end
16
+
17
+ def rewrite(content)
18
+ buffer = Parser::Source::Buffer.new("(gemfile_content)")
19
+ buffer.source = content
20
+ ast = Parser::CurrentRuby.new.parse(buffer)
21
+
22
+ Rewriter.new(dependency: dependency).rewrite(buffer, ast)
23
+ end
24
+
25
+ class Rewriter < Parser::TreeRewriter
26
+ # TODO: Hack until Bundler 1.16.0 is available on Heroku
27
+ GOOD_KEYS = %i(
28
+ group groups path glob name require platform platforms type
29
+ source install_if
30
+ ).freeze
31
+
32
+ attr_reader :dependency
33
+
34
+ def initialize(dependency:)
35
+ @dependency = dependency
36
+ end
37
+
38
+ def on_send(node)
39
+ return unless declares_targeted_gem?(node)
40
+ return unless node.children.last.type == :hash
41
+
42
+ kwargs_node = node.children.last
43
+ keys = kwargs_node.children.map do |hash_pair|
44
+ key_from_hash_pair(hash_pair)
45
+ end
46
+
47
+ if keys.none? { |key| GOOD_KEYS.include?(key) }
48
+ remove_all_kwargs(node)
49
+ else
50
+ remove_git_related_kwargs(kwargs_node)
51
+ end
52
+ end
53
+
54
+ private
55
+
56
+ def declares_targeted_gem?(node)
57
+ return false unless node.children[1] == :gem
58
+
59
+ node.children[2].children.first == dependency.name
60
+ end
61
+
62
+ def key_from_hash_pair(node)
63
+ node.children.first.children.first.to_sym
64
+ end
65
+
66
+ def remove_all_kwargs(node)
67
+ kwargs_node = node.children.last
68
+
69
+ range_to_remove =
70
+ kwargs_node.loc.expression.join(node.children[-2].loc.end.end)
71
+
72
+ remove(range_to_remove)
73
+ end
74
+
75
+ def remove_git_related_kwargs(kwargs_node)
76
+ good_key_index = nil
77
+ hash_pairs = kwargs_node.children
78
+
79
+ hash_pairs.each_with_index do |hash_pair, index|
80
+ if GOOD_KEYS.include?(key_from_hash_pair(hash_pair))
81
+ good_key_index = index
82
+ next
83
+ end
84
+
85
+ range_to_remove =
86
+ if good_key_index.nil?
87
+ next_arg_start = hash_pairs[index + 1].loc.expression.begin
88
+ hash_pair.loc.expression.join(next_arg_start)
89
+ else
90
+ last_arg_end = hash_pairs[good_key_index].loc.expression.end
91
+ hash_pair.loc.expression.join(last_arg_end)
92
+ end
93
+
94
+ remove(range_to_remove)
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,384 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler"
4
+
5
+ require "bundler_definition_ruby_version_patch"
6
+ require "bundler_definition_bundler_version_patch"
7
+ require "bundler_git_source_patch"
8
+
9
+ require "dependabot/shared_helpers"
10
+ require "dependabot/errors"
11
+ require "dependabot/file_updaters/ruby/bundler"
12
+ require "dependabot/git_commit_checker"
13
+
14
+ # rubocop:disable Metrics/ClassLength
15
+ module Dependabot
16
+ module FileUpdaters
17
+ module Ruby
18
+ class Bundler
19
+ class LockfileUpdater
20
+ require_relative "gemfile_updater"
21
+ require_relative "gemspec_updater"
22
+ require_relative "gemspec_sanitizer"
23
+ require_relative "gemspec_dependency_name_finder"
24
+
25
+ LOCKFILE_ENDING =
26
+ /(?<ending>\s*(?:RUBY VERSION|BUNDLED WITH).*)/m.freeze
27
+ GIT_DEPENDENCIES_SECTION = /GIT\n.*?\n\n(?!GIT)/m.freeze
28
+ GIT_DEPENDENCY_DETAILS = /GIT\n.*?\n\n/m.freeze
29
+ GEM_NOT_FOUND_ERROR_REGEX =
30
+ /locked to (?<name>[^\s]+) \(|not find (?<name>[^\s]+)-\d/.freeze
31
+ RETRYABLE_ERRORS = [::Bundler::HTTPError].freeze
32
+
33
+ # Can't be a constant because some of these don't exist in bundler
34
+ # 1.15, which Heroku uses, which causes an exception on boot.
35
+ def gemspec_sources
36
+ [
37
+ ::Bundler::Source::Path,
38
+ ::Bundler::Source::Gemspec
39
+ ]
40
+ end
41
+
42
+ def initialize(dependencies:, dependency_files:, credentials:)
43
+ @dependencies = dependencies
44
+ @dependency_files = dependency_files
45
+ @credentials = credentials
46
+ end
47
+
48
+ def updated_lockfile_content
49
+ @updated_lockfile_content ||=
50
+ begin
51
+ updated_content = build_updated_lockfile
52
+
53
+ if lockfile.content == updated_content
54
+ raise "Expected content to change!"
55
+ end
56
+
57
+ updated_content
58
+ end
59
+ end
60
+
61
+ private
62
+
63
+ attr_reader :dependencies, :dependency_files, :credentials
64
+
65
+ def build_updated_lockfile
66
+ base_dir = dependency_files.first.directory
67
+ lockfile_body =
68
+ SharedHelpers.in_a_temporary_directory(base_dir) do |tmp_dir|
69
+ write_temporary_dependency_files
70
+
71
+ SharedHelpers.in_a_forked_process do
72
+ # Set the path for path gemspec correctly
73
+ ::Bundler.instance_variable_set(:@root, tmp_dir)
74
+
75
+ # Remove installed gems from the default Rubygems index
76
+ ::Gem::Specification.all = []
77
+
78
+ # Set auth details
79
+ relevant_credentials.each do |cred|
80
+ ::Bundler.settings.set_command_option(
81
+ cred.fetch("host"),
82
+ cred["token"] || "#{cred['username']}:#{cred['password']}"
83
+ )
84
+ end
85
+
86
+ generate_lockfile
87
+ end
88
+ end
89
+ post_process_lockfile(lockfile_body)
90
+ end
91
+
92
+ def write_temporary_dependency_files
93
+ File.write(gemfile.name, updated_gemfile_content(gemfile))
94
+ File.write(lockfile.name, sanitized_lockfile_body)
95
+
96
+ top_level_gemspecs.each do |gemspec|
97
+ File.write(
98
+ gemspec.name,
99
+ sanitized_gemspec_content(updated_gemspec_content(gemspec))
100
+ )
101
+ end
102
+
103
+ write_ruby_version_file
104
+ write_path_gemspecs
105
+ write_imported_ruby_files
106
+
107
+ evaled_gemfiles.each do |file|
108
+ path = file.name
109
+ FileUtils.mkdir_p(Pathname.new(path).dirname)
110
+ File.write(path, updated_gemfile_content(file))
111
+ end
112
+ end
113
+
114
+ def generate_lockfile
115
+ dependencies_to_unlock = dependencies.map(&:name)
116
+
117
+ begin
118
+ definition = build_definition(dependencies_to_unlock)
119
+
120
+ old_reqs = lock_deps_being_updated_to_exact_versions(definition)
121
+
122
+ definition.resolve_remotely!
123
+
124
+ old_reqs.each do |dep_name, old_req|
125
+ d_dep = definition.dependencies.find { |d| d.name == dep_name }
126
+ if old_req == :none then definition.dependencies.delete(d_dep)
127
+ else d_dep.instance_variable_set(:@requirement, old_req)
128
+ end
129
+ end
130
+
131
+ definition.to_lock
132
+ rescue ::Bundler::GemNotFound => error
133
+ unlock_yanked_gem(dependencies_to_unlock, error) && retry
134
+ rescue ::Bundler::VersionConflict => error
135
+ unlock_blocking_subdeps(dependencies_to_unlock, error) && retry
136
+ rescue *RETRYABLE_ERRORS
137
+ raise if @retrying
138
+
139
+ @retrying = true
140
+ sleep(rand(1.0..5.0))
141
+ retry
142
+ end
143
+ end
144
+
145
+ def unlock_yanked_gem(dependencies_to_unlock, error)
146
+ raise unless error.message.match?(GEM_NOT_FOUND_ERROR_REGEX)
147
+
148
+ gem_name = error.message.match(GEM_NOT_FOUND_ERROR_REGEX).
149
+ named_captures["name"]
150
+ raise if dependencies_to_unlock.include?(gem_name)
151
+
152
+ dependencies_to_unlock << gem_name
153
+ end
154
+
155
+ def unlock_blocking_subdeps(dependencies_to_unlock, error)
156
+ all_deps = ::Bundler::LockfileParser.new(sanitized_lockfile_body).
157
+ specs.map(&:name).map(&:to_s)
158
+ top_level = build_definition([]).dependencies.
159
+ map(&:name).map(&:to_s)
160
+ allowed_new_unlocks = all_deps - top_level - dependencies_to_unlock
161
+
162
+ # Unlock any sub-dependencies that Bundler reports caused the
163
+ # conflict
164
+ potentials_deps =
165
+ error.cause.conflicts.values.
166
+ flat_map(&:requirement_trees).
167
+ map do |tree|
168
+ tree.find { |req| allowed_new_unlocks.include?(req.name) }
169
+ end.compact.map(&:name)
170
+
171
+ # If there's nothing more we can unlock, give up
172
+ raise if potentials_deps.none?
173
+
174
+ dependencies_to_unlock.append(*potentials_deps)
175
+ end
176
+
177
+ def build_definition(dependencies_to_unlock)
178
+ defn = ::Bundler::Definition.build(
179
+ gemfile.name,
180
+ lockfile.name,
181
+ gems: dependencies_to_unlock
182
+ )
183
+
184
+ # Bundler unlocks the sub-dependencies of gems it is passed even
185
+ # if those sub-deps are top-level dependencies. We only want true
186
+ # subdeps unlocked, like they were in the UpdateChecker, so we
187
+ # mutate the unlocked gems array.
188
+ unlocked = defn.instance_variable_get(:@unlock).fetch(:gems)
189
+ must_not_unlock = defn.dependencies.map(&:name).map(&:to_s) -
190
+ dependencies_to_unlock
191
+ unlocked.reject! { |n| must_not_unlock.include?(n) }
192
+
193
+ defn
194
+ end
195
+
196
+ def lock_deps_being_updated_to_exact_versions(definition)
197
+ dependencies.each_with_object({}) do |dep, old_reqs|
198
+ defn_dep = definition.dependencies.find { |d| d.name == dep.name }
199
+
200
+ if defn_dep.nil?
201
+ definition.dependencies <<
202
+ ::Bundler::Dependency.new(dep.name, dep.version)
203
+ old_reqs[dep.name] = :none
204
+ elsif git_dependency?(dep) &&
205
+ defn_dep.source.is_a?(::Bundler::Source::Git)
206
+ defn_dep.source.unlock!
207
+ elsif Gem::Version.correct?(dep.version)
208
+ new_req = Gem::Requirement.create("= #{dep.version}")
209
+ old_reqs[dep.name] = defn_dep.requirement
210
+ defn_dep.instance_variable_set(:@requirement, new_req)
211
+ end
212
+ end
213
+ end
214
+
215
+ def write_ruby_version_file
216
+ return unless ruby_version_file
217
+
218
+ path = ruby_version_file.name
219
+ FileUtils.mkdir_p(Pathname.new(path).dirname)
220
+ File.write(path, ruby_version_file.content)
221
+ end
222
+
223
+ def write_path_gemspecs
224
+ path_gemspecs.each do |file|
225
+ path = file.name
226
+ FileUtils.mkdir_p(Pathname.new(path).dirname)
227
+ File.write(path, sanitized_gemspec_content(file.content))
228
+ end
229
+ end
230
+
231
+ def write_imported_ruby_files
232
+ imported_ruby_files.each do |file|
233
+ path = file.name
234
+ FileUtils.mkdir_p(Pathname.new(path).dirname)
235
+ File.write(path, file.content)
236
+ end
237
+ end
238
+
239
+ def path_gemspecs
240
+ all = dependency_files.select { |f| f.name.end_with?(".gemspec") }
241
+ all - top_level_gemspecs
242
+ end
243
+
244
+ def imported_ruby_files
245
+ dependency_files.
246
+ select { |f| f.name.end_with?(".rb") }.
247
+ reject { |f| f.name == "gems.rb" }
248
+ end
249
+
250
+ def top_level_gemspecs
251
+ dependency_files.select { |f| f.name.match?(%r{^[^/]*\.gemspec$}) }
252
+ end
253
+
254
+ def ruby_version_file
255
+ dependency_files.find { |f| f.name == ".ruby-version" }
256
+ end
257
+
258
+ def post_process_lockfile(lockfile_body)
259
+ lockfile_body = reorder_git_dependencies(lockfile_body)
260
+ replace_lockfile_ending(lockfile_body)
261
+ end
262
+
263
+ def reorder_git_dependencies(lockfile_body)
264
+ new_section = lockfile_body.match(GIT_DEPENDENCIES_SECTION)&.to_s
265
+ old_section = lockfile.content.match(GIT_DEPENDENCIES_SECTION)&.to_s
266
+
267
+ return lockfile_body unless new_section && old_section
268
+
269
+ new_deps = new_section.scan(GIT_DEPENDENCY_DETAILS)
270
+ old_deps = old_section.scan(GIT_DEPENDENCY_DETAILS)
271
+
272
+ return lockfile_body unless new_deps.count == old_deps.count
273
+
274
+ reordered_new_section = new_deps.sort_by do |new_dep_details|
275
+ remote = new_dep_details.match(/remote: (?<remote>.*\n)/)[:remote]
276
+ i = old_deps.index { |details| details.include?(remote) }
277
+
278
+ # If this dependency isn't in the old lockfile then we can't rely
279
+ # on that (presumably outdated) lockfile to do reordering.
280
+ # Instead, we just return the default-ordered content just
281
+ # generated.
282
+ return lockfile_body unless i
283
+
284
+ i
285
+ end.join
286
+
287
+ lockfile_body.gsub(new_section, reordered_new_section)
288
+ end
289
+
290
+ def replace_lockfile_ending(lockfile_body)
291
+ # Re-add the old `BUNDLED WITH` version (and remove the RUBY VERSION
292
+ # if it wasn't previously present in the lockfile)
293
+ lockfile_body.gsub(
294
+ LOCKFILE_ENDING,
295
+ lockfile.content.match(LOCKFILE_ENDING)&.[](:ending) || "\n"
296
+ )
297
+ end
298
+
299
+ def sanitized_gemspec_content(gemspec_content)
300
+ new_version = replacement_version_for_gemspec(gemspec_content)
301
+
302
+ GemspecSanitizer.
303
+ new(replacement_version: new_version).
304
+ rewrite(gemspec_content)
305
+ end
306
+
307
+ def replacement_version_for_gemspec(gemspec_content)
308
+ return "0.0.1" unless lockfile
309
+
310
+ gemspec_specs =
311
+ ::Bundler::LockfileParser.new(sanitized_lockfile_body).specs.
312
+ select { |s| gemspec_sources.include?(s.source.class) }
313
+
314
+ gem_name =
315
+ GemspecDependencyNameFinder.new(gemspec_content: gemspec_content).
316
+ dependency_name
317
+
318
+ return gemspec_specs.first&.version || "0.0.1" unless gem_name
319
+
320
+ spec = gemspec_specs.find { |s| s.name == gem_name }
321
+ spec&.version || gemspec_specs.first&.version || "0.0.1"
322
+ end
323
+
324
+ def relevant_credentials
325
+ credentials.select do |cred|
326
+ next true if cred["type"] == "git_source"
327
+ next true if cred["type"] == "rubygems_server"
328
+
329
+ false
330
+ end
331
+ end
332
+
333
+ def updated_gemfile_content(file)
334
+ GemfileUpdater.new(
335
+ dependencies: dependencies,
336
+ gemfile: file
337
+ ).updated_gemfile_content
338
+ end
339
+
340
+ def updated_gemspec_content(gemspec)
341
+ GemspecUpdater.new(
342
+ dependencies: dependencies,
343
+ gemspec: gemspec
344
+ ).updated_gemspec_content
345
+ end
346
+
347
+ def gemfile
348
+ @gemfile ||= dependency_files.find { |f| f.name == "Gemfile" } ||
349
+ dependency_files.find { |f| f.name == "gems.rb" }
350
+ end
351
+
352
+ def lockfile
353
+ @lockfile ||=
354
+ dependency_files.find { |f| f.name == "Gemfile.lock" } ||
355
+ dependency_files.find { |f| f.name == "gems.locked" }
356
+ end
357
+
358
+ def sanitized_lockfile_body
359
+ lockfile.content.gsub(LOCKFILE_ENDING, "")
360
+ end
361
+
362
+ def evaled_gemfiles
363
+ @evaled_gemfiles ||=
364
+ dependency_files.
365
+ reject { |f| f.name.end_with?(".gemspec") }.
366
+ reject { |f| f.name.end_with?(".lock") }.
367
+ reject { |f| f.name.end_with?(".ruby-version") }.
368
+ reject { |f| f.name == "Gemfile" }.
369
+ reject { |f| f.name == "gems.rb" }.
370
+ reject { |f| f.name == "gems.locked" }
371
+ end
372
+
373
+ def git_dependency?(dep)
374
+ GitCommitChecker.new(
375
+ dependency: dep,
376
+ credentials: credentials
377
+ ).git_dependency?
378
+ end
379
+ end
380
+ end
381
+ end
382
+ end
383
+ end
384
+ # rubocop:enable Metrics/ClassLength