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,162 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/rust/cargo"
4
+
5
+ module Dependabot
6
+ module FileUpdaters
7
+ module Rust
8
+ class Cargo
9
+ class ManifestUpdater
10
+ def initialize(dependencies:, manifest:)
11
+ @dependencies = dependencies
12
+ @manifest = manifest
13
+ end
14
+
15
+ def updated_manifest_content
16
+ dependencies.
17
+ select { |dep| requirement_changed?(manifest, dep) }.
18
+ reduce(manifest.content.dup) do |content, dep|
19
+ updated_content = content
20
+
21
+ updated_content = update_requirements(
22
+ content: updated_content,
23
+ filename: manifest.name,
24
+ dependency: dep
25
+ )
26
+
27
+ updated_content = update_git_pin(
28
+ content: updated_content,
29
+ filename: manifest.name,
30
+ dependency: dep
31
+ )
32
+
33
+ if content == updated_content
34
+ raise "Expected content to change!"
35
+ end
36
+
37
+ updated_content
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ attr_reader :dependencies, :manifest
44
+
45
+ def requirement_changed?(file, dependency)
46
+ changed_requirements =
47
+ dependency.requirements - dependency.previous_requirements
48
+
49
+ changed_requirements.any? { |f| f[:file] == file.name }
50
+ end
51
+
52
+ def update_requirements(content:, filename:, dependency:)
53
+ updated_content = content.dup
54
+
55
+ # The UpdateChecker ensures the order of requirements is preserved
56
+ # when updating, so we can zip them together in new/old pairs.
57
+ reqs = dependency.requirements.
58
+ zip(dependency.previous_requirements).
59
+ reject { |new_req, old_req| new_req == old_req }
60
+
61
+ # Loop through each changed requirement
62
+ reqs.each do |new_req, old_req|
63
+ raise "Bad req match" unless new_req[:file] == old_req[:file]
64
+ next if new_req[:requirement] == old_req[:requirement]
65
+ next unless new_req[:file] == filename
66
+
67
+ updated_content = update_manifest_req(
68
+ content: updated_content,
69
+ dep: dependency,
70
+ old_req: old_req.fetch(:requirement),
71
+ new_req: new_req.fetch(:requirement)
72
+ )
73
+ end
74
+
75
+ updated_content
76
+ end
77
+
78
+ def update_git_pin(content:, filename:, dependency:)
79
+ updated_pin =
80
+ dependency.requirements.
81
+ find { |r| r[:file] == filename }&.
82
+ dig(:source, :ref)
83
+
84
+ old_pin =
85
+ dependency.previous_requirements.
86
+ find { |r| r[:file] == filename }&.
87
+ dig(:source, :ref)
88
+
89
+ return content unless old_pin
90
+
91
+ update_manifest_pin(
92
+ content: content,
93
+ dep: dependency,
94
+ old_pin: old_pin,
95
+ new_pin: updated_pin
96
+ )
97
+ end
98
+
99
+ def update_manifest_req(content:, dep:, old_req:, new_req:)
100
+ simple_declaration = content.scan(declaration_regex(dep)).
101
+ find { |m| m.include?(old_req) }
102
+
103
+ if simple_declaration
104
+ content.gsub(simple_declaration) do |line|
105
+ line.gsub(old_req, new_req)
106
+ end
107
+ elsif content.match?(feature_declaration_version_regex(dep))
108
+ content.gsub(feature_declaration_version_regex(dep)) do |part|
109
+ line = content.match(feature_declaration_version_regex(dep)).
110
+ named_captures.fetch("version_declaration")
111
+ new_line = line.gsub(old_req, new_req)
112
+ part.gsub(line, new_line)
113
+ end
114
+ else
115
+ content
116
+ end
117
+ end
118
+
119
+ def update_manifest_pin(content:, dep:, old_pin:, new_pin:)
120
+ simple_declaration = content.scan(declaration_regex(dep)).
121
+ find { |m| m.include?(old_pin) }
122
+
123
+ if simple_declaration
124
+ content.gsub(simple_declaration) do |line|
125
+ line.gsub(old_pin, new_pin)
126
+ end
127
+ elsif content.match?(feature_declaration_pin_regex(dep))
128
+ content.gsub(feature_declaration_pin_regex(dep)) do |part|
129
+ line = content.match(feature_declaration_pin_regex(dep)).
130
+ named_captures.fetch("pin_declaration")
131
+ new_line = line.gsub(old_pin, new_pin)
132
+ part.gsub(line, new_line)
133
+ end
134
+ else
135
+ content
136
+ end
137
+ end
138
+
139
+ def declaration_regex(dep)
140
+ /(?:^|["'])#{Regexp.escape(dep.name)}["']?\s*=.*$/i
141
+ end
142
+
143
+ def feature_declaration_version_regex(dep)
144
+ /
145
+ #{Regexp.quote("dependencies.#{dep.name}]")}
146
+ (?:(?!^\[).)+
147
+ (?<version_declaration>version\s*=[^\[]*)$
148
+ /mx
149
+ end
150
+
151
+ def feature_declaration_pin_regex(dep)
152
+ /
153
+ #{Regexp.quote("dependencies.#{dep.name}]")}
154
+ (?:(?!^\[).)+
155
+ (?<pin_declaration>(?:tag|rev)\s*=[^\[]*)$
156
+ /mx
157
+ end
158
+ end
159
+ end
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,412 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "excon"
4
+ require "gitlab"
5
+ require "dependabot/clients/github_with_retries"
6
+ require "dependabot/metadata_finders"
7
+ require "dependabot/errors"
8
+ require "dependabot/utils"
9
+ require "dependabot/source"
10
+
11
+ # rubocop:disable Metrics/ClassLength
12
+ module Dependabot
13
+ class GitCommitChecker
14
+ VERSION_REGEX = /(?<version>[0-9]+\.[0-9]+(?:\.[a-zA-Z0-9\-]+)*)$/.freeze
15
+ KNOWN_HOSTS = /github\.com|bitbucket\.org|gitlab.com/.freeze
16
+
17
+ def initialize(dependency:, credentials:, ignored_versions: [],
18
+ requirement_class: nil, version_class: nil)
19
+ @dependency = dependency
20
+ @credentials = credentials
21
+ @ignored_versions = ignored_versions
22
+ @requirement_class = requirement_class
23
+ @version_class = version_class
24
+ end
25
+
26
+ def git_dependency?
27
+ return false if dependency_source_details.nil?
28
+
29
+ dependency_source_details.fetch(:type) == "git"
30
+ end
31
+
32
+ def pinned?
33
+ raise "Not a git dependency!" unless git_dependency?
34
+
35
+ ref = dependency_source_details.fetch(:ref)
36
+ branch = dependency_source_details.fetch(:branch)
37
+
38
+ return false if ref.nil?
39
+ return false if branch == ref
40
+ return true if branch
41
+ return true if dependency.version&.start_with?(ref)
42
+
43
+ # Check the specified `ref` isn't actually a branch
44
+ !local_upload_pack.match?("refs/heads/#{ref}")
45
+ end
46
+
47
+ def pinned_ref_looks_like_version?
48
+ return false unless pinned?
49
+
50
+ dependency_source_details.fetch(:ref).match?(VERSION_REGEX)
51
+ end
52
+
53
+ def branch_or_ref_in_release?(version)
54
+ pinned_ref_in_release?(version) || branch_behind_release?(version)
55
+ end
56
+
57
+ def head_commit_for_current_branch
58
+ return dependency.version if pinned?
59
+
60
+ branch_ref = ref_or_branch ? "refs/heads/#{ref_or_branch}" : "HEAD"
61
+
62
+ # Remove the opening clause of the upload pack as this isn't always
63
+ # followed by a line break. When it isn't (e.g., with Bitbucket) it causes
64
+ # problems for our `sha_for_update_pack_line` logic
65
+ line = local_upload_pack.
66
+ gsub(/.*git-upload-pack/, "").
67
+ lines.find { |l| l.include?(" #{branch_ref}") }
68
+
69
+ return sha_for_update_pack_line(line) if line
70
+
71
+ raise Dependabot::GitDependencyReferenceNotFound, dependency.name
72
+ end
73
+
74
+ def local_tag_for_latest_version
75
+ tag =
76
+ local_tags.
77
+ select { |t| t.name.match?(VERSION_REGEX) }.
78
+ reject { |t| tag_included_in_ignore_reqs?(t) }.
79
+ reject { |t| tag_is_prerelease?(t) && !wants_prerelease? }.
80
+ max_by do |t|
81
+ version = t.name.match(VERSION_REGEX).named_captures.fetch("version")
82
+ version_class.new(version)
83
+ end
84
+
85
+ return unless tag
86
+
87
+ {
88
+ tag: tag.name,
89
+ commit_sha: tag.commit_sha,
90
+ tag_sha: tag.tag_sha
91
+ }
92
+ end
93
+
94
+ private
95
+
96
+ attr_reader :dependency, :credentials, :ignored_versions
97
+
98
+ def pinned_ref_in_release?(version)
99
+ raise "Not a git dependency!" unless git_dependency?
100
+
101
+ return false unless pinned?
102
+ return false if listing_source_url.nil?
103
+
104
+ tag = listing_tag_for_version(version.to_s)
105
+ return false unless tag
106
+
107
+ commit_included_in_tag?(
108
+ commit: dependency_source_details.fetch(:ref),
109
+ tag: tag,
110
+ allow_identical: true
111
+ )
112
+ end
113
+
114
+ def branch_behind_release?(version)
115
+ raise "Not a git dependency!" unless git_dependency?
116
+
117
+ return false if ref_or_branch.nil?
118
+ return false if listing_source_url.nil?
119
+
120
+ tag = listing_tag_for_version(version.to_s)
121
+ return false unless tag
122
+
123
+ # Check if behind, excluding the case where it's identical, because
124
+ # we normally wouldn't switch you from tracking master to a release.
125
+ commit_included_in_tag?(
126
+ commit: ref_or_branch,
127
+ tag: tag,
128
+ allow_identical: false
129
+ )
130
+ end
131
+
132
+ def local_upload_pack
133
+ @local_upload_pack ||=
134
+ fetch_upload_pack_for(dependency_source_details.fetch(:url))
135
+ end
136
+
137
+ def local_tags
138
+ return [] unless local_upload_pack
139
+
140
+ tags_for_upload_pack(local_upload_pack)
141
+ end
142
+
143
+ def tags_for_upload_pack(upload_pack)
144
+ peeled_lines = []
145
+ unpeeled_lines = []
146
+
147
+ upload_pack.lines.each do |line|
148
+ next unless line.split(" ").last.start_with?("refs/tags")
149
+
150
+ if line.strip.end_with?("^{}") then peeled_lines << line
151
+ else unpeeled_lines << line
152
+ end
153
+ end
154
+
155
+ unpeeled_lines.map do |line|
156
+ tag_name = line.split(" refs/tags/").last.strip
157
+ tag_sha = sha_for_update_pack_line(line)
158
+ peeled_line = peeled_lines.find do |pl|
159
+ pl.split(" refs/tags/").last.strip == "#{tag_name}^{}"
160
+ end
161
+
162
+ commit_sha =
163
+ peeled_line ? sha_for_update_pack_line(peeled_line) : tag_sha
164
+
165
+ if dependency_source_details&.fetch(:ref, nil)&.start_with?("tags/")
166
+ tag_name = "tags/#{tag_name}"
167
+ end
168
+
169
+ OpenStruct.new(name: tag_name, tag_sha: tag_sha, commit_sha: commit_sha)
170
+ end
171
+ end
172
+
173
+ # rubocop:disable Metrics/CyclomaticComplexity
174
+ # rubocop:disable Metrics/PerceivedComplexity
175
+ def fetch_upload_pack_for(uri)
176
+ response = Excon.get(
177
+ service_pack_uri(uri),
178
+ idempotent: true,
179
+ **SharedHelpers.excon_defaults
180
+ )
181
+
182
+ return response.body if response.status == 200
183
+ if response.status >= 500 && uri.match?(KNOWN_HOSTS)
184
+ raise "Server error at #{uri}: #{response.body}"
185
+ end
186
+
187
+ raise Dependabot::GitDependenciesNotReachable, [uri]
188
+ rescue Excon::Error::Socket, Excon::Error::Timeout
189
+ retry_count ||= 0
190
+ retry_count += 1
191
+
192
+ sleep(rand(0.9)) && retry if retry_count < 2 && uri.match?(KNOWN_HOSTS)
193
+ raise if uri.match?(KNOWN_HOSTS)
194
+
195
+ raise Dependabot::GitDependenciesNotReachable, [uri]
196
+ end
197
+ # rubocop:enable Metrics/CyclomaticComplexity
198
+ # rubocop:enable Metrics/PerceivedComplexity
199
+
200
+ def service_pack_uri(uri)
201
+ service_pack_uri = uri_with_auth(uri)
202
+ service_pack_uri = service_pack_uri.gsub(%r{/$}, "")
203
+ service_pack_uri += ".git" unless service_pack_uri.end_with?(".git")
204
+ service_pack_uri + "/info/refs?service=git-upload-pack"
205
+ end
206
+
207
+ def uri_with_auth(uri)
208
+ bare_uri =
209
+ if uri.include?("git@") then uri.split("git@").last.sub(":", "/")
210
+ else uri.sub(%r{.*?://}, "")
211
+ end
212
+ cred = credentials.select { |c| c["type"] == "git_source" }.
213
+ find { |c| bare_uri.start_with?(c["host"]) }
214
+
215
+ if bare_uri.match?(%r{[^/]+:[^/]+@})
216
+ # URI already has authentication details
217
+ "https://#{bare_uri}"
218
+ elsif cred
219
+ # URI doesn't have authentication details, but we have credentials
220
+ auth_string = "#{cred.fetch('username')}:#{cred.fetch('password')}"
221
+ "https://#{auth_string}@#{bare_uri}"
222
+ else
223
+ # No credentials, so just return the https URI
224
+ "https://#{bare_uri}"
225
+ end
226
+ end
227
+
228
+ def commit_included_in_tag?(tag:, commit:, allow_identical: false)
229
+ status =
230
+ case Source.from_url(listing_source_url)&.provider
231
+ when "github" then github_commit_comparison_status(tag, commit)
232
+ when "gitlab" then gitlab_commit_comparison_status(tag, commit)
233
+ when "bitbucket" then bitbucket_commit_comparison_status(tag, commit)
234
+ else raise "Unknown source"
235
+ end
236
+
237
+ return true if status == "behind"
238
+
239
+ allow_identical && status == "identical"
240
+ rescue Octokit::NotFound, Gitlab::Error::NotFound,
241
+ Octokit::InternalServerError
242
+ false
243
+ end
244
+
245
+ def github_commit_comparison_status(ref1, ref2)
246
+ client = Clients::GithubWithRetries.
247
+ for_github_dot_com(credentials: credentials)
248
+
249
+ client.compare(listing_source_repo, ref1, ref2).status
250
+ end
251
+
252
+ def gitlab_commit_comparison_status(ref1, ref2)
253
+ access_token = credentials.
254
+ select { |cred| cred["type"] == "git_source" }.
255
+ find { |cred| cred["host"] == "gitlab.com" }&.
256
+ fetch("token")
257
+
258
+ client = Gitlab.client(endpoint: "https://gitlab.com/api/v4",
259
+ private_token: access_token.to_s)
260
+
261
+ comparison = client.compare(listing_source_repo, ref1, ref2)
262
+
263
+ if comparison.commits.none? then "behind"
264
+ elsif comparison.compare_same_ref then "identical"
265
+ else "ahead"
266
+ end
267
+ end
268
+
269
+ def bitbucket_commit_comparison_status(ref1, ref2)
270
+ url = "https://api.bitbucket.org/2.0/repositories/"\
271
+ "#{listing_source_repo}/commits/?"\
272
+ "include=#{ref2}&exclude=#{ref1}"
273
+
274
+ response = Excon.get(url,
275
+ headers: bitbucket_auth_header,
276
+ idempotent: true,
277
+ **SharedHelpers.excon_defaults)
278
+
279
+ # Conservatively assume that ref2 is ahead in the equality case, of
280
+ # if we get an unexpected format (e.g., due to a 404)
281
+ if JSON.parse(response.body).fetch("values", ["x"]).none? then "behind"
282
+ else "ahead"
283
+ end
284
+ end
285
+
286
+ def bitbucket_auth_header
287
+ token = credentials.
288
+ select { |cred| cred["type"] == "git_source" }.
289
+ find { |cred| cred["host"] == "bitbucket.org" }&.
290
+ fetch("token")
291
+
292
+ if token.nil? then {}
293
+ elsif token.include?(":")
294
+ encoded_token = Base64.encode64(token).delete("\n")
295
+ { "Authorization" => "Basic #{encoded_token}" }
296
+ elsif Base64.decode64(token).ascii_only? &&
297
+ Base64.decode64(token).include?(":")
298
+ { "Authorization" => "Basic #{token.delete("\n")}" }
299
+ else
300
+ { "Authorization" => "Bearer #{token}" }
301
+ end
302
+ end
303
+
304
+ def dependency_source_details
305
+ sources =
306
+ dependency.requirements.map { |r| r.fetch(:source) }.uniq.compact
307
+
308
+ return sources.first if sources.count <= 1
309
+
310
+ # If there are multiple source types, or multiple source URLs, then it's
311
+ # unclear how we should proceed
312
+ if sources.map { |s| [s.fetch(:type), s.fetch(:url, nil)] }.uniq.count > 1
313
+ raise "Multiple sources! #{sources.join(', ')}"
314
+ end
315
+
316
+ # Otherwise it's reasonable to take the first source and use that. This
317
+ # will happen if we have multiple git sources with difference references
318
+ # specified. In that case it's fine to update them all.
319
+ sources.first
320
+ end
321
+
322
+ def ref_or_branch
323
+ dependency_source_details.fetch(:ref) ||
324
+ dependency_source_details.fetch(:branch)
325
+ end
326
+
327
+ def listing_source_url
328
+ @listing_source_url ||=
329
+ begin
330
+ # Remove the git source, so the metadata finder looks on the
331
+ # registry
332
+ candidate_dep = Dependency.new(
333
+ name: dependency.name,
334
+ version: dependency.version,
335
+ requirements: [],
336
+ package_manager: dependency.package_manager
337
+ )
338
+
339
+ MetadataFinders.
340
+ for_package_manager(dependency.package_manager).
341
+ new(dependency: candidate_dep, credentials: credentials).
342
+ source_url
343
+ end
344
+ end
345
+
346
+ def listing_source_repo
347
+ return unless listing_source_url
348
+
349
+ Source.from_url(listing_source_url)&.repo
350
+ end
351
+
352
+ def listing_tag_for_version(version)
353
+ listing_tags.
354
+ find { |t| t.name =~ /(?:[^0-9\.]|\A)#{Regexp.escape(version)}\z/ }&.
355
+ name
356
+ end
357
+
358
+ def listing_tags
359
+ return [] unless listing_upload_pack
360
+
361
+ tags_for_upload_pack(listing_upload_pack)
362
+ rescue GitDependenciesNotReachable
363
+ []
364
+ end
365
+
366
+ def listing_upload_pack
367
+ return unless listing_source_url
368
+
369
+ @listing_upload_pack ||= fetch_upload_pack_for(listing_source_url)
370
+ end
371
+
372
+ def ignore_reqs
373
+ ignored_versions.map { |req| requirement_class.new(req.split(",")) }
374
+ end
375
+
376
+ def wants_prerelease?
377
+ return false unless dependency_source_details&.fetch(:ref, nil)
378
+ return false unless pinned_ref_looks_like_version?
379
+
380
+ version = dependency_source_details.fetch(:ref).match(VERSION_REGEX).
381
+ named_captures.fetch("version")
382
+ version_class.new(version).prerelease?
383
+ end
384
+
385
+ def tag_included_in_ignore_reqs?(tag)
386
+ version = tag.name.match(VERSION_REGEX).named_captures.fetch("version")
387
+ ignore_reqs.any? { |r| r.satisfied_by?(version_class.new(version)) }
388
+ end
389
+
390
+ def tag_is_prerelease?(tag)
391
+ version = tag.name.match(VERSION_REGEX).named_captures.fetch("version")
392
+ version_class.new(version).prerelease?
393
+ end
394
+
395
+ def version_class
396
+ return @version_class if @version_class
397
+
398
+ Utils.version_class_for_package_manager(dependency.package_manager)
399
+ end
400
+
401
+ def requirement_class
402
+ return @requirement_class if @requirement_class
403
+
404
+ Utils.requirement_class_for_package_manager(dependency.package_manager)
405
+ end
406
+
407
+ def sha_for_update_pack_line(line)
408
+ line.split(" ").first.chars.last(40).join
409
+ end
410
+ end
411
+ end
412
+ # rubocop:enable Metrics/ClassLength