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,177 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/metadata_finders/base"
4
+
5
+ module Dependabot
6
+ module MetadataFinders
7
+ class Base
8
+ class ChangelogPruner
9
+ attr_reader :dependency, :changelog_text
10
+
11
+ def initialize(dependency:, changelog_text:)
12
+ @dependency = dependency
13
+ @changelog_text = changelog_text
14
+ end
15
+
16
+ def includes_new_version?
17
+ !new_version_changelog_line.nil?
18
+ end
19
+
20
+ # rubocop:disable Metrics/PerceivedComplexity
21
+ # rubocop:disable Metrics/CyclomaticComplexity
22
+ def pruned_text
23
+ changelog_lines = changelog_text.split("\n")
24
+
25
+ slice_range =
26
+ if old_version_changelog_line && new_version_changelog_line
27
+ if old_version_changelog_line < new_version_changelog_line
28
+ Range.new(old_version_changelog_line, -1)
29
+ else
30
+ Range.new(new_version_changelog_line,
31
+ old_version_changelog_line - 1)
32
+ end
33
+ elsif old_version_changelog_line
34
+ return if old_version_changelog_line.zero?
35
+
36
+ # Assumes changelog is in descending order
37
+ Range.new(0, old_version_changelog_line - 1)
38
+ elsif new_version_changelog_line
39
+ # Assumes changelog is in descending order
40
+ Range.new(new_version_changelog_line, -1)
41
+ else
42
+ return unless changelog_contains_relevant_versions?
43
+
44
+ # If the changelog contains any relevant versions, return it in
45
+ # full. We could do better here by fully parsing the changelog
46
+ Range.new(0, -1)
47
+ end
48
+
49
+ changelog_lines.slice(slice_range).join("\n").sub(/\n*\z/, "")
50
+ end
51
+ # rubocop:enable Metrics/PerceivedComplexity
52
+ # rubocop:enable Metrics/CyclomaticComplexity
53
+
54
+ private
55
+
56
+ def old_version_changelog_line
57
+ old_version = git_source? ? previous_ref : dependency.previous_version
58
+ return nil unless old_version
59
+
60
+ changelog_line_for_version(old_version)
61
+ end
62
+
63
+ def new_version_changelog_line
64
+ return nil unless new_version
65
+
66
+ changelog_line_for_version(new_version)
67
+ end
68
+
69
+ # rubocop:disable Metrics/CyclomaticComplexity
70
+ # rubocop:disable Metrics/PerceivedComplexity
71
+ def changelog_line_for_version(version)
72
+ raise "No changelog text" unless changelog_text
73
+ return nil unless version
74
+
75
+ version = version.gsub(/^v/, "")
76
+ escaped_version = Regexp.escape(version)
77
+
78
+ changelog_lines = changelog_text.split("\n")
79
+
80
+ changelog_lines.find_index.with_index do |line, index|
81
+ next false unless line.match?(/(?<!\.)#{escaped_version}(?![.\-])/)
82
+ next false if line.match?(/#{escaped_version}\.\./)
83
+ next true if line.start_with?("#", "!", "==")
84
+ next true if line.match?(/^v?#{escaped_version}:?/)
85
+ next true if line.match?(/^[\+\*\-] (version )?#{escaped_version}/i)
86
+ next true if line.match?(/^\d{4}-\d{2}-\d{2}/)
87
+ next true if changelog_lines[index + 1]&.match?(/^[=\-\+]{3,}\s*$/)
88
+
89
+ false
90
+ end
91
+ end
92
+ # rubocop:enable Metrics/CyclomaticComplexity
93
+ # rubocop:enable Metrics/PerceivedComplexity
94
+
95
+ def changelog_contains_relevant_versions?
96
+ # Assume the changelog is relevant if we can't parse the new version
97
+ return true unless version_class.correct?(dependency.version)
98
+
99
+ # Assume the changelog is relevant if it mentions the new version
100
+ # anywhere
101
+ return true if changelog_text.include?(dependency.version)
102
+
103
+ # Otherwise check if any intermediate versions are included in headers
104
+ versions_in_changelog_headers.any? do |version|
105
+ next false unless version <= version_class.new(dependency.version)
106
+ next true unless dependency.previous_version
107
+ next true unless version_class.correct?(dependency.previous_version)
108
+
109
+ version > version_class.new(dependency.previous_version)
110
+ end
111
+ end
112
+
113
+ def versions_in_changelog_headers
114
+ changelog_lines = changelog_text.split("\n")
115
+ header_lines =
116
+ changelog_lines.select.with_index do |line, index|
117
+ next true if line.start_with?("#", "!")
118
+ next true if line.match?(/^v?\d\.\d/)
119
+ next true if changelog_lines[index + 1]&.match?(/^[=-]+\s*$/)
120
+
121
+ false
122
+ end
123
+
124
+ versions = []
125
+ header_lines.each do |line|
126
+ cleaned_line = line.gsub(/^[^0-9]*/, "").gsub(/[\s,:].*/, "")
127
+ next if cleaned_line.empty? || !version_class.correct?(cleaned_line)
128
+
129
+ versions << version_class.new(cleaned_line)
130
+ end
131
+
132
+ versions
133
+ end
134
+
135
+ def new_version
136
+ @new_version ||= git_source? ? new_ref : dependency.version
137
+ @new_version&.gsub(/^v/, "")
138
+ end
139
+
140
+ def previous_ref
141
+ dependency.previous_requirements.map do |r|
142
+ r.dig(:source, "ref") || r.dig(:source, :ref)
143
+ end.compact.first
144
+ end
145
+
146
+ def new_ref
147
+ dependency.requirements.map do |r|
148
+ r.dig(:source, "ref") || r.dig(:source, :ref)
149
+ end.compact.first
150
+ end
151
+
152
+ def ref_changed?
153
+ previous_ref && new_ref && previous_ref != new_ref
154
+ end
155
+
156
+ # TODO: Refactor me so that Composer doesn't need to be special cased
157
+ def git_source?
158
+ # Special case Composer, which uses git as a source but handles tags
159
+ # internally
160
+ return false if dependency.package_manager == "composer"
161
+
162
+ requirements = dependency.requirements
163
+ sources = requirements.map { |r| r.fetch(:source) }.uniq.compact
164
+ return false if sources.empty?
165
+ raise "Multiple sources! #{sources.join(', ')}" if sources.count > 1
166
+
167
+ source_type = sources.first[:type] || sources.first.fetch("type")
168
+ source_type == "git"
169
+ end
170
+
171
+ def version_class
172
+ Utils.version_class_for_package_manager(dependency.package_manager)
173
+ end
174
+ end
175
+ end
176
+ end
177
+ end
@@ -0,0 +1,217 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/clients/github_with_retries"
4
+ require "dependabot/clients/gitlab"
5
+ require "dependabot/clients/bitbucket"
6
+ require "dependabot/shared_helpers"
7
+ require "dependabot/metadata_finders/base"
8
+
9
+ module Dependabot
10
+ module MetadataFinders
11
+ class Base
12
+ class CommitsFinder
13
+ attr_reader :source, :dependency, :credentials
14
+
15
+ def initialize(source:, dependency:, credentials:)
16
+ @source = source
17
+ @dependency = dependency
18
+ @credentials = credentials
19
+ end
20
+
21
+ def commits_url
22
+ return unless source
23
+ return if source.provider == "azure" # TODO: Fetch Azure commits
24
+
25
+ path =
26
+ case source.provider
27
+ when "github" then github_compare_path(new_tag, previous_tag)
28
+ when "bitbucket" then bitbucket_compare_path(new_tag, previous_tag)
29
+ when "gitlab" then gitlab_compare_path(new_tag, previous_tag)
30
+ else raise "Unexpected source provider '#{source.provider}'"
31
+ end
32
+
33
+ "#{source.url}/#{path}"
34
+ end
35
+
36
+ # rubocop:disable Metrics/CyclomaticComplexity
37
+ def commits
38
+ return [] unless source
39
+ return [] unless new_tag && previous_tag
40
+
41
+ case source.provider
42
+ when "github" then fetch_github_commits
43
+ when "bitbucket" then fetch_bitbucket_commits
44
+ when "gitlab" then fetch_gitlab_commits
45
+ when "azure" then [] # TODO: Fetch Azure commits
46
+ else raise "Unexpected source provider '#{source.provider}'"
47
+ end
48
+ end
49
+ # rubocop:enable Metrics/CyclomaticComplexity
50
+
51
+ def new_tag
52
+ new_version = dependency.version
53
+
54
+ if git_source?(dependency.requirements) then new_version
55
+ else
56
+ tags = dependency_tags.
57
+ select { |t| t =~ version_regex(new_version) }
58
+ tags.find { |t| t.include?(dependency.name) } || tags.first
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ def previous_tag
65
+ previous_version = dependency.previous_version
66
+
67
+ if git_source?(dependency.previous_requirements)
68
+ previous_version || previous_ref
69
+ else
70
+ tags = dependency_tags.
71
+ select { |t| t =~ version_regex(previous_version) }
72
+ tags.find { |t| t.include?(dependency.name) } || tags.first
73
+ end
74
+ end
75
+
76
+ # TODO: Refactor me so that Composer doesn't need to be special cased
77
+ def git_source?(requirements)
78
+ # Special case Composer, which uses git as a source but handles tags
79
+ # internally
80
+ return false if dependency.package_manager == "composer"
81
+
82
+ sources = requirements.map { |r| r.fetch(:source) }.uniq.compact
83
+ return false if sources.empty?
84
+ raise "Multiple sources! #{sources.join(', ')}" if sources.count > 1
85
+
86
+ source_type = sources.first[:type] || sources.first.fetch("type")
87
+ source_type == "git"
88
+ end
89
+
90
+ def previous_ref
91
+ return unless git_source?(dependency.previous_requirements)
92
+
93
+ dependency.previous_requirements.map do |r|
94
+ r.dig(:source, "ref") || r.dig(:source, :ref)
95
+ end.compact.first
96
+ end
97
+
98
+ def version_regex(version)
99
+ /(?:[^0-9\.]|\A)#{Regexp.escape(version || "unknown")}\z/
100
+ end
101
+
102
+ def dependency_tags
103
+ @dependency_tags ||= fetch_dependency_tags
104
+ end
105
+
106
+ def fetch_dependency_tags
107
+ return [] unless source
108
+
109
+ case source.provider
110
+ when "github"
111
+ github_client.tags(source.repo, per_page: 100).map(&:name)
112
+ when "bitbucket"
113
+ bitbucket_client.tags(source.repo).map { |tag| tag["name"] }
114
+ when "gitlab"
115
+ gitlab_client.tags(source.repo).map(&:name)
116
+ when "azure"
117
+ [] # TODO: Fetch Azure tags
118
+ else raise "Unexpected source provider '#{source.provider}'"
119
+ end
120
+ rescue Octokit::NotFound, Gitlab::Error::NotFound,
121
+ Dependabot::Clients::Bitbucket::NotFound
122
+ []
123
+ end
124
+
125
+ def github_compare_path(new_tag, previous_tag)
126
+ if new_tag && previous_tag
127
+ "compare/#{previous_tag}...#{new_tag}"
128
+ elsif new_tag
129
+ "commits/#{new_tag}"
130
+ else
131
+ "commits"
132
+ end
133
+ end
134
+
135
+ def bitbucket_compare_path(new_tag, previous_tag)
136
+ if new_tag && previous_tag
137
+ "branches/compare/#{new_tag}..#{previous_tag}"
138
+ elsif new_tag
139
+ "commits/tag/#{new_tag}"
140
+ else
141
+ "commits"
142
+ end
143
+ end
144
+
145
+ def gitlab_compare_path(new_tag, previous_tag)
146
+ if new_tag && previous_tag
147
+ "compare/#{previous_tag}...#{new_tag}"
148
+ elsif new_tag
149
+ "commits/#{new_tag}"
150
+ else
151
+ "commits/master"
152
+ end
153
+ end
154
+
155
+ def fetch_github_commits
156
+ commits =
157
+ github_client.compare(source.repo, previous_tag, new_tag).commits
158
+ return [] unless commits
159
+
160
+ commits.map do |commit|
161
+ {
162
+ message: commit.commit.message,
163
+ sha: commit.sha,
164
+ html_url: commit.html_url
165
+ }
166
+ end
167
+ rescue Octokit::NotFound
168
+ []
169
+ end
170
+
171
+ def fetch_bitbucket_commits
172
+ bitbucket_client.
173
+ compare(source.repo, previous_tag, new_tag).
174
+ map do |commit|
175
+ {
176
+ message: commit.dig("summary", "raw"),
177
+ sha: commit["hash"],
178
+ html_url: commit.dig("links", "html", "href")
179
+ }
180
+ end
181
+ rescue Dependabot::Clients::Bitbucket::NotFound
182
+ []
183
+ end
184
+
185
+ def fetch_gitlab_commits
186
+ gitlab_client.
187
+ compare(source.repo, previous_tag, new_tag).
188
+ commits.
189
+ map do |commit|
190
+ {
191
+ message: commit["message"],
192
+ sha: commit["id"],
193
+ html_url: "#{source.url}/commit/#{commit['id']}"
194
+ }
195
+ end
196
+ rescue Gitlab::Error::NotFound
197
+ []
198
+ end
199
+
200
+ def gitlab_client
201
+ @gitlab_client ||= Dependabot::Clients::Gitlab.
202
+ for_gitlab_dot_com(credentials: credentials)
203
+ end
204
+
205
+ def github_client
206
+ @github_client ||= Dependabot::Clients::GithubWithRetries.
207
+ for_github_dot_com(credentials: credentials)
208
+ end
209
+
210
+ def bitbucket_client
211
+ @bitbucket_client ||= Dependabot::Clients::Bitbucket.
212
+ for_bitbucket_dot_org(credentials: credentials)
213
+ end
214
+ end
215
+ end
216
+ end
217
+ end
@@ -0,0 +1,251 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/clients/github_with_retries"
4
+ require "dependabot/clients/gitlab"
5
+ require "dependabot/metadata_finders/base"
6
+ require "dependabot/utils"
7
+
8
+ module Dependabot
9
+ module MetadataFinders
10
+ class Base
11
+ class ReleaseFinder
12
+ attr_reader :dependency, :credentials, :source
13
+
14
+ def initialize(source:, dependency:, credentials:)
15
+ @source = source
16
+ @dependency = dependency
17
+ @credentials = credentials
18
+ end
19
+
20
+ def releases_url
21
+ return unless source
22
+
23
+ case source.provider
24
+ when "github" then "#{source.url}/releases"
25
+ when "gitlab" then "#{source.url}/tags"
26
+ when "bitbucket" then nil
27
+ when "azure" then "#{source.url}/tags"
28
+ else raise "Unexpected repo provider '#{source.provider}'"
29
+ end
30
+ end
31
+
32
+ def releases_text
33
+ return unless relevant_releases.any?
34
+ return if relevant_releases.all? { |r| r.body.nil? || r.body == "" }
35
+
36
+ relevant_releases.map { |r| serialize_release(r) }.join("\n\n")
37
+ end
38
+
39
+ private
40
+
41
+ def all_dep_releases
42
+ releases = all_releases
43
+ dep_prefix = dependency.name.downcase
44
+
45
+ releases_with_dependency_name =
46
+ releases.
47
+ reject { |r| r.tag_name.nil? }.
48
+ select { |r| r.tag_name.downcase.include?(dep_prefix) }
49
+
50
+ return releases unless releases_with_dependency_name.any?
51
+
52
+ releases_with_dependency_name
53
+ end
54
+
55
+ def all_releases
56
+ @all_releases ||= fetch_dependency_releases
57
+ end
58
+
59
+ def relevant_releases
60
+ releases = releases_since_previous_version
61
+
62
+ # Sometimes we can't filter the releases properly (if they're
63
+ # prefixed by a number that gets confused with the version). In this
64
+ # case, the best we can do is return nil.
65
+ return [] unless releases.any?
66
+
67
+ if updated_release && version_class.correct?(dependency.version)
68
+ releases = filter_releases_using_updated_release(releases)
69
+ filter_releases_using_updated_version(releases, conservative: true)
70
+ elsif updated_release
71
+ filter_releases_using_updated_release(releases)
72
+ elsif version_class.correct?(dependency.version)
73
+ filter_releases_using_updated_version(releases, conservative: false)
74
+ else
75
+ [updated_release].compact
76
+ end
77
+ end
78
+
79
+ def releases_since_previous_version
80
+ previous_version = dependency.previous_version
81
+ return [updated_release].compact unless previous_version
82
+
83
+ if previous_release && version_class.correct?(previous_version)
84
+ releases = filter_releases_using_previous_release(all_dep_releases)
85
+ filter_releases_using_previous_version(releases, conservative: true)
86
+ elsif previous_release
87
+ filter_releases_using_previous_release(all_dep_releases)
88
+ elsif version_class.correct?(previous_version)
89
+ filter_releases_using_previous_version(
90
+ all_dep_releases,
91
+ conservative: false
92
+ )
93
+ else
94
+ [updated_release].compact
95
+ end
96
+ end
97
+
98
+ def filter_releases_using_previous_release(releases)
99
+ releases.first(releases.index(previous_release))
100
+ end
101
+
102
+ def filter_releases_using_updated_release(releases)
103
+ releases[releases.index(updated_release)..-1]
104
+ end
105
+
106
+ def filter_releases_using_previous_version(releases, conservative:)
107
+ previous_version = version_class.new(dependency.previous_version)
108
+
109
+ releases.reject do |release|
110
+ cleaned_tag = release.tag_name.gsub(/^[^0-9]*/, "")
111
+ cleaned_name = release.name&.gsub(/^[^0-9]*/, "")
112
+
113
+ tag_version = [cleaned_tag, cleaned_name].compact.reject(&:empty?).
114
+ select { |nm| version_class.correct?(nm) }.
115
+ map { |nm| version_class.new(nm) }.max
116
+
117
+ next conservative unless tag_version
118
+
119
+ # Reject any releases that are less than the previous version
120
+ # (e.g., if two major versions are being maintained)
121
+ tag_version <= previous_version
122
+ end
123
+ end
124
+
125
+ def filter_releases_using_updated_version(releases, conservative:)
126
+ updated_version = version_class.new(dependency.version)
127
+
128
+ releases.reject do |release|
129
+ cleaned_tag = release.tag_name.gsub(/^[^0-9]*/, "")
130
+ cleaned_name = release.name&.gsub(/^[^0-9]*/, "")
131
+
132
+ tag_version = [cleaned_tag, cleaned_name].compact.reject(&:empty?).
133
+ select { |nm| version_class.correct?(nm) }.
134
+ map { |nm| version_class.new(nm) }.min
135
+
136
+ next conservative unless tag_version
137
+
138
+ # Reject any releases that are greater than the updated version
139
+ # (e.g., if two major versions are being maintained)
140
+ tag_version > updated_version
141
+ end
142
+ end
143
+
144
+ def updated_release
145
+ release_for_version(dependency.version)
146
+ end
147
+
148
+ def previous_release
149
+ release_for_version(dependency.previous_version)
150
+ end
151
+
152
+ def release_for_version(version)
153
+ return nil unless version
154
+
155
+ release_regex = version_regex(version)
156
+ # Doing two loops looks inefficient, but it ensures consistency
157
+ all_dep_releases.find { |r| release_regex.match?(r.tag_name.to_s) } ||
158
+ all_dep_releases.find { |r| release_regex.match?(r.name.to_s) }
159
+ end
160
+
161
+ def serialize_release(release)
162
+ rel = release
163
+ title = "## #{rel.name.to_s != '' ? rel.name : rel.tag_name}\n"
164
+ body = if rel.body.to_s.gsub(/\n*\z/m, "") == ""
165
+ "No release notes provided."
166
+ else
167
+ rel.body.gsub(/\n*\z/m, "")
168
+ end
169
+
170
+ release_body_includes_title?(rel) ? body : title + body
171
+ end
172
+
173
+ def release_body_includes_title?(release)
174
+ title = release.name.to_s != "" ? release.name : release.tag_name
175
+ release.body.to_s.match?(/\A\s*\#*\s*#{Regexp.quote(title)}/m)
176
+ end
177
+
178
+ def version_regex(version)
179
+ /(?:[^0-9\.]|\A)#{Regexp.escape(version || "unknown")}\z/
180
+ end
181
+
182
+ def version_class
183
+ Utils.version_class_for_package_manager(dependency.package_manager)
184
+ end
185
+
186
+ def fetch_dependency_releases
187
+ return [] unless source
188
+
189
+ case source.provider
190
+ when "github" then fetch_github_releases
191
+ when "bitbucket" then [] # Bitbucket doesn't support releases
192
+ when "gitlab" then fetch_gitlab_releases
193
+ when "azure" then [] # Azure can't list API for annotated tags
194
+ else raise "Unexpected repo provider '#{source.provider}'"
195
+ end
196
+ end
197
+
198
+ def fetch_github_releases
199
+ releases = github_client.releases(source.repo, per_page: 100)
200
+
201
+ # Remove any releases without a tag name. These are draft releases and
202
+ # aren't yet associated with a tag, so shouldn't be used.
203
+ releases = releases.reject { |r| r.tag_name.nil? }
204
+
205
+ clean_release_names =
206
+ releases.map { |r| r.tag_name.gsub(/^[^0-9\.]*/, "") }
207
+
208
+ if clean_release_names.all? { |nm| version_class.correct?(nm) }
209
+ releases.sort_by do |r|
210
+ version_class.new(r.tag_name.gsub(/^[^0-9\.]*/, ""))
211
+ end.reverse
212
+ else
213
+ releases.sort_by(&:id).reverse
214
+ end
215
+ rescue Octokit::NotFound
216
+ []
217
+ end
218
+
219
+ def fetch_gitlab_releases
220
+ releases =
221
+ gitlab_client.
222
+ tags(source.repo).
223
+ select(&:release).
224
+ sort_by { |r| r.commit.authored_date }.
225
+ reverse
226
+
227
+ releases.map do |tag|
228
+ OpenStruct.new(
229
+ name: tag.name,
230
+ tag_name: tag.release.tag_name,
231
+ body: tag.release.description,
232
+ html_url: "#{source.url}/tags/#{tag.name}"
233
+ )
234
+ end
235
+ rescue Gitlab::Error::NotFound
236
+ []
237
+ end
238
+
239
+ def gitlab_client
240
+ @gitlab_client ||= Dependabot::Clients::Gitlab.
241
+ for_gitlab_dot_com(credentials: credentials)
242
+ end
243
+
244
+ def github_client
245
+ @github_client ||= Dependabot::Clients::GithubWithRetries.
246
+ for_github_dot_com(credentials: credentials)
247
+ end
248
+ end
249
+ end
250
+ end
251
+ end