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 "excon"
4
+ require "dependabot/metadata_finders/base"
5
+ require "dependabot/shared_helpers"
6
+
7
+ module Dependabot
8
+ module MetadataFinders
9
+ module Rust
10
+ class Cargo < Dependabot::MetadataFinders::Base
11
+ SOURCE_KEYS = %w(repository homepage documentation).freeze
12
+
13
+ private
14
+
15
+ def look_up_source
16
+ case new_source_type
17
+ when "default" then find_source_from_crates_listing
18
+ when "git" then find_source_from_git_url
19
+ else raise "Unexpected source type: #{new_source_type}"
20
+ end
21
+ end
22
+
23
+ def new_source_type
24
+ sources =
25
+ dependency.requirements.map { |r| r.fetch(:source) }.uniq.compact
26
+
27
+ return "default" if sources.empty?
28
+ raise "Multiple sources! #{sources.join(', ')}" if sources.count > 1
29
+
30
+ sources.first[:type] || sources.first.fetch("type")
31
+ end
32
+
33
+ def find_source_from_crates_listing
34
+ potential_source_urls =
35
+ SOURCE_KEYS.
36
+ map { |key| crates_listing.dig("crate", key) }.
37
+ compact
38
+
39
+ source_url = potential_source_urls.find { |url| Source.from_url(url) }
40
+ Source.from_url(source_url)
41
+ end
42
+
43
+ def find_source_from_git_url
44
+ info = dependency.requirements.map { |r| r[:source] }.compact.first
45
+
46
+ url = info[:url] || info.fetch("url")
47
+ Source.from_url(url)
48
+ end
49
+
50
+ def crates_listing
51
+ return @crates_listing unless @crates_listing.nil?
52
+
53
+ response = Excon.get(
54
+ "https://crates.io/api/v1/crates/#{dependency.name}",
55
+ idempotent: true,
56
+ **SharedHelpers.excon_defaults
57
+ )
58
+
59
+ @crates_listing = JSON.parse(response.body)
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,151 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/metadata_finders"
4
+
5
+ module Dependabot
6
+ class PullRequestCreator
7
+ require "dependabot/pull_request_creator/github"
8
+ require "dependabot/pull_request_creator/gitlab"
9
+ require "dependabot/pull_request_creator/message_builder"
10
+ require "dependabot/pull_request_creator/branch_namer"
11
+ require "dependabot/pull_request_creator/labeler"
12
+
13
+ attr_reader :source, :dependencies, :files, :base_commit,
14
+ :credentials, :pr_message_footer, :custom_labels,
15
+ :author_details, :signature_key, :vulnerabilities_fixed,
16
+ :reviewers, :assignees, :milestone, :branch_name_separator
17
+
18
+ def initialize(source:, base_commit:, dependencies:, files:, credentials:,
19
+ pr_message_footer: nil, custom_labels: nil,
20
+ author_details: nil, signature_key: nil,
21
+ reviewers: nil, assignees: nil, milestone: nil,
22
+ vulnerabilities_fixed: {}, branch_name_separator: "/",
23
+ label_language: false)
24
+ @dependencies = dependencies
25
+ @source = source
26
+ @base_commit = base_commit
27
+ @files = files
28
+ @credentials = credentials
29
+ @pr_message_footer = pr_message_footer
30
+ @author_details = author_details
31
+ @signature_key = signature_key
32
+ @custom_labels = custom_labels
33
+ @reviewers = reviewers
34
+ @assignees = assignees
35
+ @milestone = milestone
36
+ @vulnerabilities_fixed = vulnerabilities_fixed
37
+ @branch_name_separator = branch_name_separator
38
+ @label_language = label_language
39
+
40
+ check_dependencies_have_previous_version
41
+ end
42
+
43
+ def check_dependencies_have_previous_version
44
+ return if library? && dependencies.all? { |d| requirements_changed?(d) }
45
+ return if dependencies.all?(&:previous_version)
46
+
47
+ raise "Dependencies must have a previous version or changed " \
48
+ "requirement to have a pull request created for them!"
49
+ end
50
+
51
+ def create
52
+ case source.provider
53
+ when "github" then github_creator.create
54
+ when "gitlab" then gitlab_creator.create
55
+ else raise "Unsupported provider #{source.provider}"
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ def label_language?
62
+ @label_language
63
+ end
64
+
65
+ def github_creator
66
+ Github.new(
67
+ source: source,
68
+ branch_name: branch_namer.new_branch_name,
69
+ base_commit: base_commit,
70
+ credentials: credentials,
71
+ files: files,
72
+ commit_message: message_builder.commit_message,
73
+ pr_description: message_builder.pr_message,
74
+ pr_name: message_builder.pr_name,
75
+ author_details: author_details,
76
+ signature_key: signature_key,
77
+ labeler: labeler,
78
+ reviewers: reviewers,
79
+ assignees: assignees,
80
+ milestone: milestone
81
+ )
82
+ end
83
+
84
+ def gitlab_creator
85
+ Gitlab.new(
86
+ source: source,
87
+ branch_name: branch_namer.new_branch_name,
88
+ base_commit: base_commit,
89
+ credentials: credentials,
90
+ files: files,
91
+ commit_message: message_builder.commit_message,
92
+ pr_description: message_builder.pr_message,
93
+ pr_name: message_builder.pr_name,
94
+ author_details: author_details,
95
+ labeler: labeler,
96
+ assignee: assignees&.first
97
+ )
98
+ end
99
+
100
+ def message_builder
101
+ @message_builder ||
102
+ MessageBuilder.new(
103
+ source: source,
104
+ dependencies: dependencies,
105
+ files: files,
106
+ credentials: credentials,
107
+ author_details: author_details,
108
+ pr_message_footer: pr_message_footer,
109
+ vulnerabilities_fixed: vulnerabilities_fixed
110
+ )
111
+ end
112
+
113
+ def branch_namer
114
+ @branch_namer ||=
115
+ BranchNamer.new(
116
+ dependencies: dependencies,
117
+ files: files,
118
+ target_branch: source.branch,
119
+ separator: branch_name_separator
120
+ )
121
+ end
122
+
123
+ def labeler
124
+ @labeler ||=
125
+ Labeler.new(
126
+ source: source,
127
+ custom_labels: custom_labels,
128
+ credentials: credentials,
129
+ includes_security_fixes: includes_security_fixes?,
130
+ dependencies: dependencies,
131
+ label_language: label_language?
132
+ )
133
+ end
134
+
135
+ def library?
136
+ if files.map(&:name).any? { |name| name.match?(%r{^[^/]*\.gemspec$}) }
137
+ return true
138
+ end
139
+
140
+ dependencies.none?(&:appears_in_lockfile?)
141
+ end
142
+
143
+ def includes_security_fixes?
144
+ vulnerabilities_fixed.values.flatten.any?
145
+ end
146
+
147
+ def requirements_changed?(dependency)
148
+ (dependency.requirements - dependency.previous_requirements).any?
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,170 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/metadata_finders"
4
+ require "dependabot/pull_request_creator"
5
+
6
+ module Dependabot
7
+ class PullRequestCreator
8
+ class BranchNamer
9
+ attr_reader :dependencies, :files, :target_branch, :separator
10
+
11
+ def initialize(dependencies:, files:, target_branch:, separator: "/")
12
+ @dependencies = dependencies
13
+ @files = files
14
+ @target_branch = target_branch
15
+ @separator = separator
16
+ end
17
+
18
+ # rubocop:disable Metrics/AbcSize
19
+ # rubocop:disable Metrics/PerceivedComplexity
20
+ # rubocop:disable Metrics/CyclomaticComplexity
21
+ def new_branch_name
22
+ @name ||=
23
+ if dependencies.count > 1 && updating_a_property?
24
+ property_name
25
+ elsif dependencies.count > 1 && updating_a_dependency_set?
26
+ dependency_set.fetch(:group)
27
+ elsif dependencies.count > 1
28
+ dependencies.map(&:name).join("-and-").tr(":", "-")
29
+ elsif library? && ref_changed?(dependencies.first)
30
+ dep = dependencies.first
31
+ "#{dep.name.tr(':', '-')}-#{new_ref(dep)}"
32
+ elsif library?
33
+ dep = dependencies.first
34
+ "#{dep.name.tr(':', '-')}-#{sanitized_requirement(dep)}"
35
+ else
36
+ dep = dependencies.first
37
+ "#{dep.name.tr(':', '-')}-#{new_version(dep)}"
38
+ end
39
+
40
+ branch_name = File.join(prefixes, @name).gsub(%r{/\.}, "/dot-")
41
+
42
+ # Some users need branch names without slashes
43
+ branch_name.gsub("/", separator)
44
+ end
45
+ # rubocop:enable Metrics/AbcSize
46
+ # rubocop:enable Metrics/PerceivedComplexity
47
+ # rubocop:enable Metrics/CyclomaticComplexity
48
+
49
+ private
50
+
51
+ def prefixes
52
+ [
53
+ "dependabot",
54
+ package_manager,
55
+ files.first.directory.tr(" ", "-"),
56
+ target_branch
57
+ ].compact
58
+ end
59
+
60
+ def package_manager
61
+ dependencies.first.package_manager
62
+ end
63
+
64
+ def updating_a_property?
65
+ dependencies.first.
66
+ requirements.
67
+ any? { |r| r.dig(:metadata, :property_name) }
68
+ end
69
+
70
+ def updating_a_dependency_set?
71
+ dependencies.first.
72
+ requirements.
73
+ any? { |r| r.dig(:metadata, :dependency_set) }
74
+ end
75
+
76
+ def property_name
77
+ @property_name ||= dependencies.first.requirements.
78
+ find { |r| r.dig(:metadata, :property_name) }&.
79
+ dig(:metadata, :property_name)
80
+
81
+ raise "No property name!" unless @property_name
82
+
83
+ @property_name
84
+ end
85
+
86
+ def dependency_set
87
+ @dependency_set ||= dependencies.first.requirements.
88
+ find { |r| r.dig(:metadata, :dependency_set) }&.
89
+ dig(:metadata, :dependency_set)
90
+
91
+ raise "No dependency set!" unless @dependency_set
92
+
93
+ @dependency_set
94
+ end
95
+
96
+ def sanitized_requirement(dependency)
97
+ new_library_requirement(dependency).
98
+ delete(" ").
99
+ gsub("!=", "neq-").
100
+ gsub(">=", "gte-").
101
+ gsub("<=", "lte-").
102
+ gsub("~>", "tw-").
103
+ gsub("^", "tw-").
104
+ gsub("||", "or-").
105
+ gsub("~", "approx-").
106
+ gsub("~=", "tw-").
107
+ gsub(/==*/, "eq-").
108
+ gsub(">", "gt-").
109
+ gsub("<", "lt-").
110
+ gsub("*", "star").
111
+ gsub(",", "-and-")
112
+ end
113
+
114
+ def new_version(dependency)
115
+ if dependency.version.match?(/^[0-9a-f]{40}$/)
116
+ return new_ref(dependency) if ref_changed?(dependency)
117
+
118
+ dependency.version[0..6]
119
+ elsif dependency.version == dependency.previous_version &&
120
+ package_manager == "docker"
121
+ dependency.requirements.
122
+ map { |r| r.dig(:source, "digest") || r.dig(:source, :digest) }.
123
+ compact.first.split(":").last[0..6]
124
+ else
125
+ dependency.version
126
+ end
127
+ end
128
+
129
+ def previous_ref(dependency)
130
+ dependency.previous_requirements.map do |r|
131
+ r.dig(:source, "ref") || r.dig(:source, :ref)
132
+ end.compact.first
133
+ end
134
+
135
+ def new_ref(dependency)
136
+ dependency.requirements.map do |r|
137
+ r.dig(:source, "ref") || r.dig(:source, :ref)
138
+ end.compact.first
139
+ end
140
+
141
+ def ref_changed?(dependency)
142
+ previous_ref(dependency) && new_ref(dependency) &&
143
+ previous_ref(dependency) != new_ref(dependency)
144
+ end
145
+
146
+ def new_library_requirement(dependency)
147
+ updated_reqs =
148
+ dependency.requirements - dependency.previous_requirements
149
+
150
+ gemspec =
151
+ updated_reqs.find { |r| r[:file].match?(%r{^[^/]*\.gemspec$}) }
152
+ return gemspec[:requirement] if gemspec
153
+
154
+ updated_reqs.first[:requirement]
155
+ end
156
+
157
+ def library?
158
+ if files.map(&:name).any? { |name| name.match?(%r{^[^/]*\.gemspec$}) }
159
+ return true
160
+ end
161
+
162
+ dependencies.none?(&:appears_in_lockfile?)
163
+ end
164
+
165
+ def requirements_changed?(dependency)
166
+ (dependency.requirements - dependency.previous_requirements).any?
167
+ end
168
+ end
169
+ end
170
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "time"
4
+ require "gpgme"
5
+ require "tmpdir"
6
+ require "dependabot/pull_request_creator"
7
+
8
+ module Dependabot
9
+ class PullRequestCreator
10
+ class CommitSigner
11
+ attr_reader :author_details, :commit_message, :tree_sha, :parent_sha,
12
+ :signature_key
13
+
14
+ def initialize(author_details:, commit_message:, tree_sha:, parent_sha:,
15
+ signature_key:)
16
+ @author_details = author_details
17
+ @commit_message = commit_message
18
+ @tree_sha = tree_sha
19
+ @parent_sha = parent_sha
20
+ @signature_key = signature_key
21
+ end
22
+
23
+ def signature
24
+ email = author_details[:email]
25
+
26
+ dir = Dir.mktmpdir
27
+
28
+ GPGME::Engine.home_dir = dir
29
+ GPGME::Key.import(signature_key)
30
+
31
+ crypto = GPGME::Crypto.new(armor: true)
32
+ opts = { mode: GPGME::SIG_MODE_DETACH, signer: email }
33
+ crypto.sign(commit_object, opts).to_s
34
+ rescue Errno::ENOTEMPTY
35
+ FileUtils.remove_entry(dir, true)
36
+ # This appears to be a Ruby bug which occurs very rarely
37
+ raise if @retrying
38
+
39
+ @retrying = true
40
+ retry
41
+ ensure
42
+ FileUtils.remove_entry(dir, true)
43
+ end
44
+
45
+ private
46
+
47
+ def commit_object
48
+ time_str = Time.parse(author_details[:date]).strftime("%s %z")
49
+ name = author_details[:name]
50
+ email = author_details[:email]
51
+
52
+ [
53
+ "tree #{tree_sha}",
54
+ "parent #{parent_sha}",
55
+ "author #{name} <#{email}> #{time_str}",
56
+ "committer #{name} <#{email}> #{time_str}",
57
+ "",
58
+ commit_message
59
+ ].join("\n")
60
+ end
61
+ end
62
+ end
63
+ end