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,169 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "excon"
4
+ require "toml-rb"
5
+
6
+ require "dependabot/source"
7
+ require "dependabot/update_checkers/go/dep"
8
+ require "dependabot/git_commit_checker"
9
+ require "dependabot/utils/go/path_converter"
10
+
11
+ module Dependabot
12
+ module UpdateCheckers
13
+ module Go
14
+ class Dep
15
+ class LatestVersionFinder
16
+ def initialize(dependency:, dependency_files:, credentials:,
17
+ ignored_versions:)
18
+ @dependency = dependency
19
+ @dependency_files = dependency_files
20
+ @credentials = credentials
21
+ @ignored_versions = ignored_versions
22
+ end
23
+
24
+ def latest_version
25
+ @latest_version ||=
26
+ if git_dependency? then latest_version_for_git_dependency
27
+ else latest_release_tag_version
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ attr_reader :dependency, :dependency_files, :credentials,
34
+ :ignored_versions
35
+
36
+ def latest_release_tag_version
37
+ if @latest_release_tag_lookup_attempted
38
+ return @latest_release_tag_version
39
+ end
40
+
41
+ @latest_release_tag_lookup_attempted = true
42
+
43
+ latest_release_str = fetch_latest_release_tag&.sub(/^v?/, "")
44
+ return unless latest_release_str
45
+ return unless version_class.correct?(latest_release_str)
46
+
47
+ @latest_release_tag_version =
48
+ version_class.new(latest_release_str)
49
+ end
50
+
51
+ def fetch_latest_release_tag
52
+ # If this is a git dependency then getting the latest tag is trivial
53
+ if git_dependency?
54
+ return git_commit_checker.
55
+ local_tag_for_latest_version&.fetch(:tag)
56
+ end
57
+
58
+ # If not, we need to find the URL for the source code.
59
+ path = dependency.requirements.
60
+ map { |r| r.dig(:source, :source) }.compact.first
61
+ path ||= dependency.name
62
+
63
+ source_url = git_source(path)
64
+ return unless source_url
65
+
66
+ # Given a source, we want to find the latest tag. Piggy-back off the
67
+ # logic in GitCommitChecker to do so.
68
+ git_dep = Dependency.new(
69
+ name: dependency.name,
70
+ version: dependency.version,
71
+ requirements: [{
72
+ file: "Gopkg.toml",
73
+ groups: [],
74
+ requirement: nil,
75
+ source: { type: "git", url: source_url }
76
+ }],
77
+ package_manager: dependency.package_manager
78
+ )
79
+
80
+ GitCommitChecker.
81
+ new(dependency: git_dep, credentials: credentials).
82
+ local_tag_for_latest_version&.fetch(:tag)
83
+ end
84
+
85
+ def latest_version_for_git_dependency
86
+ latest_release = latest_release_tag_version
87
+
88
+ # If there's been a release that includes the current pinned ref or
89
+ # that the current branch is behind, we switch to that release.
90
+ return latest_release if branch_or_ref_in_release?(latest_release)
91
+
92
+ # Otherwise, if the gem isn't pinned, the latest version is just the
93
+ # latest commit for the specified branch.
94
+ unless git_commit_checker.pinned?
95
+ return git_commit_checker.head_commit_for_current_branch
96
+ end
97
+
98
+ # If the dependency is pinned to a tag that looks like a version
99
+ # then we want to update that tag.
100
+ if git_commit_checker.pinned_ref_looks_like_version?
101
+ latest_tag = git_commit_checker.local_tag_for_latest_version
102
+ return version_from_tag(latest_tag)
103
+ end
104
+
105
+ # If the dependency is pinned to a tag that doesn't look like a
106
+ # version then there's nothing we can do.
107
+ nil
108
+ end
109
+
110
+ def git_source(path)
111
+ Dependabot::Utils::Go::PathConverter.git_url_for_path(path)
112
+ end
113
+
114
+ def version_from_tag(tag)
115
+ # To compare with the current version we either use the commit SHA
116
+ # (if that's what the parser picked up) of the tag name.
117
+ if dependency.version&.match?(/^[0-9a-f]{40}$/)
118
+ return tag&.fetch(:commit_sha)
119
+ end
120
+
121
+ tag&.fetch(:tag)
122
+ end
123
+
124
+ def branch_or_ref_in_release?(release)
125
+ return false unless release
126
+
127
+ git_commit_checker.branch_or_ref_in_release?(release)
128
+ end
129
+
130
+ def git_dependency?
131
+ git_commit_checker.git_dependency?
132
+ end
133
+
134
+ def git_commit_checker
135
+ @git_commit_checker ||=
136
+ GitCommitChecker.new(
137
+ dependency: dependency,
138
+ credentials: credentials,
139
+ ignored_versions: ignored_versions
140
+ )
141
+ end
142
+
143
+ def parsed_file(file)
144
+ @parsed_file ||= {}
145
+ @parsed_file[file.name] ||= TomlRB.parse(file.content)
146
+ end
147
+
148
+ def version_class
149
+ Utils.version_class_for_package_manager(dependency.package_manager)
150
+ end
151
+
152
+ def manifest
153
+ @manifest ||= dependency_files.find { |f| f.name == "Gopkg.toml" }
154
+ raise "No Gopkg.lock!" unless @manifest
155
+
156
+ @manifest
157
+ end
158
+
159
+ def lockfile
160
+ @lockfile = dependency_files.find { |f| f.name == "Gopkg.lock" }
161
+ raise "No Gopkg.lock!" unless @lockfile
162
+
163
+ @lockfile
164
+ end
165
+ end
166
+ end
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,223 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/update_checkers/go/dep"
4
+ require "dependabot/utils/go/requirement"
5
+ require "dependabot/utils/go/version"
6
+
7
+ module Dependabot
8
+ module UpdateCheckers
9
+ module Go
10
+ class Dep
11
+ class RequirementsUpdater
12
+ class UnfixableRequirement < StandardError; end
13
+
14
+ VERSION_REGEX = /[0-9]+(?:\.[A-Za-z0-9\-*]+)*/.freeze
15
+ ALLOWED_UPDATE_STRATEGIES = %i(widen_ranges bump_versions).freeze
16
+
17
+ def initialize(requirements:, updated_source:, update_strategy:,
18
+ latest_version:, latest_resolvable_version:)
19
+ @requirements = requirements
20
+ @updated_source = updated_source
21
+ @update_strategy = update_strategy
22
+
23
+ check_update_strategy
24
+
25
+ if latest_version && version_class.correct?(latest_version)
26
+ @latest_version = version_class.new(latest_version)
27
+ end
28
+
29
+ return unless latest_resolvable_version
30
+ return unless version_class.correct?(latest_resolvable_version)
31
+
32
+ @latest_resolvable_version =
33
+ version_class.new(latest_resolvable_version)
34
+ end
35
+
36
+ def updated_requirements
37
+ requirements.map do |req|
38
+ req = req.merge(source: updated_source)
39
+ next req unless latest_resolvable_version
40
+ next initial_req_after_source_change(req) unless req[:requirement]
41
+
42
+ case update_strategy
43
+ when :widen_ranges then widen_requirement(req)
44
+ when :bump_versions then update_version(req)
45
+ else raise "Unexpected update strategy: #{update_strategy}"
46
+ end
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ attr_reader :requirements, :updated_source, :update_strategy,
53
+ :latest_version, :latest_resolvable_version
54
+
55
+ def check_update_strategy
56
+ return if ALLOWED_UPDATE_STRATEGIES.include?(update_strategy)
57
+
58
+ raise "Unknown update strategy: #{update_strategy}"
59
+ end
60
+
61
+ def updating_from_git_to_version?
62
+ return false unless updated_source&.fetch(:type) == "default"
63
+
64
+ original_source = requirements.map { |r| r[:source] }.compact.first
65
+ original_source&.fetch(:type) == "git"
66
+ end
67
+
68
+ def initial_req_after_source_change(req)
69
+ return req unless updating_from_git_to_version?
70
+ return req unless req.fetch(:requirement).nil?
71
+
72
+ new_req =
73
+ if req.fetch(:file) == "go.mod"
74
+ "v#{latest_resolvable_version.to_s.gsub(/^v/, '')}"
75
+ else
76
+ "^#{latest_resolvable_version}"
77
+ end
78
+ req.merge(requirement: new_req)
79
+ end
80
+
81
+ def widen_requirement(req)
82
+ current_requirement = req[:requirement]
83
+ version = latest_resolvable_version
84
+
85
+ ruby_reqs = ruby_requirements(current_requirement)
86
+ return req if ruby_reqs.any? { |r| r.satisfied_by?(version) }
87
+
88
+ reqs = current_requirement.strip.split(",").map(&:strip)
89
+
90
+ updated_requirement =
91
+ if current_requirement.include?("||")
92
+ # Further widen the range by adding another OR condition
93
+ current_requirement + " || ^#{version}"
94
+ elsif reqs.any? { |r| r.match?(/(<|-\s)/) }
95
+ # Further widen the range by updating the upper bound
96
+ update_range_requirement(current_requirement)
97
+ else
98
+ # Convert existing requirement to a range
99
+ create_new_range_requirement(reqs)
100
+ end
101
+
102
+ req.merge(requirement: updated_requirement)
103
+ end
104
+
105
+ def update_version(req)
106
+ current_requirement = req[:requirement]
107
+ version = latest_resolvable_version
108
+
109
+ ruby_reqs = ruby_requirements(current_requirement)
110
+ reqs = current_requirement.strip.split(",").map(&:strip)
111
+
112
+ if ruby_reqs.any? { |r| r.satisfied_by?(version) } &&
113
+ current_requirement.match?(/(<|-\s|\|\|)/)
114
+ return req
115
+ end
116
+
117
+ updated_requirement =
118
+ if current_requirement.include?("||")
119
+ # Further widen the range by adding another OR condition
120
+ current_requirement + " || ^#{version}"
121
+ elsif reqs.any? { |r| r.match?(/(<|-\s)/) }
122
+ # Further widen the range by updating the upper bound
123
+ update_range_requirement(current_requirement)
124
+ else
125
+ update_version_requirement(reqs)
126
+ end
127
+
128
+ req.merge(requirement: updated_requirement)
129
+ end
130
+
131
+ def ruby_requirements(requirement_string)
132
+ requirement_class.requirements_array(requirement_string)
133
+ end
134
+
135
+ def update_range_requirement(req_string)
136
+ range_requirement = req_string.split(",").
137
+ find { |r| r.match?(/<|(\s+-\s+)/) }
138
+
139
+ versions = range_requirement.scan(VERSION_REGEX)
140
+ upper_bound = versions.map { |v| version_class.new(v) }.max
141
+ new_upper_bound = update_greatest_version(
142
+ upper_bound,
143
+ latest_resolvable_version
144
+ )
145
+
146
+ req_string.sub(
147
+ upper_bound.to_s,
148
+ new_upper_bound.to_s
149
+ )
150
+ end
151
+
152
+ def create_new_range_requirement(string_reqs)
153
+ version = latest_resolvable_version
154
+
155
+ lower_bound =
156
+ string_reqs.
157
+ map { |req| requirement_class.new(req) }.
158
+ flat_map { |req| req.requirements.map(&:last) }.
159
+ min.to_s
160
+
161
+ upper_bound =
162
+ if string_reqs.first.start_with?("~") &&
163
+ version.to_s.split(".").count > 1
164
+ create_upper_bound_for_tilda_req(string_reqs.first)
165
+ else
166
+ upper_bound_parts = [version.to_s.split(".").first.to_i + 1]
167
+ upper_bound_parts.
168
+ fill("0", 1..(lower_bound.split(".").count - 1)).
169
+ join(".")
170
+ end
171
+
172
+ ">= #{lower_bound}, < #{upper_bound}"
173
+ end
174
+
175
+ def update_version_requirement(string_reqs)
176
+ version = latest_resolvable_version.to_s.gsub(/^v/, "")
177
+ current_req = string_reqs.first
178
+
179
+ current_req.gsub(VERSION_REGEX, version)
180
+ end
181
+
182
+ def create_upper_bound_for_tilda_req(string_req)
183
+ tilda_version = requirement_class.new(string_req).
184
+ requirements.map(&:last).
185
+ min.to_s
186
+
187
+ upper_bound_parts = latest_resolvable_version.to_s.split(".")
188
+ upper_bound_parts.slice(0, tilda_version.to_s.split(".").count)
189
+ upper_bound_parts[-1] = "0"
190
+ upper_bound_parts[-2] = (upper_bound_parts[-2].to_i + 1).to_s
191
+
192
+ upper_bound_parts.join(".")
193
+ end
194
+
195
+ def update_greatest_version(old_version, version_to_be_permitted)
196
+ version = version_class.new(old_version)
197
+ version = version.release if version.prerelease?
198
+
199
+ index_to_update =
200
+ version.segments.map.with_index { |seg, i| seg.zero? ? 0 : i }.max
201
+
202
+ version.segments.map.with_index do |_, index|
203
+ if index < index_to_update
204
+ version_to_be_permitted.segments[index]
205
+ elsif index == index_to_update
206
+ version_to_be_permitted.segments[index] + 1
207
+ else 0
208
+ end
209
+ end.join(".")
210
+ end
211
+
212
+ def version_class
213
+ Utils::Go::Version
214
+ end
215
+
216
+ def requirement_class
217
+ Utils::Go::Requirement
218
+ end
219
+ end
220
+ end
221
+ end
222
+ end
223
+ end
@@ -0,0 +1,164 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "toml-rb"
4
+ require "dependabot/shared_helpers"
5
+ require "dependabot/update_checkers/go/dep"
6
+ require "dependabot/errors"
7
+
8
+ module Dependabot
9
+ module UpdateCheckers
10
+ module Go
11
+ class Dep
12
+ class VersionResolver
13
+ NOT_FOUND_REGEX =
14
+ /failed to list versions for (?<repo_url>.*?):\s+/.freeze
15
+ INDEX_OUT_OF_RANGE_REGEX =
16
+ /panic: runtime error: index out of range.*findValidVersion/m.freeze
17
+
18
+ def initialize(dependency:, dependency_files:, credentials:)
19
+ @dependency = dependency
20
+ @dependency_files = dependency_files
21
+ @credentials = credentials
22
+ end
23
+
24
+ def latest_resolvable_version
25
+ if defined?(@latest_resolvable_version)
26
+ return @latest_resolvable_version
27
+ end
28
+
29
+ @latest_resolvable_version = fetch_latest_resolvable_version
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :dependency, :dependency_files, :credentials
35
+
36
+ def fetch_latest_resolvable_version
37
+ base_directory = File.join("src", "project",
38
+ dependency_files.first.directory)
39
+ base_parts = base_directory.split("/").length
40
+ updated_version =
41
+ SharedHelpers.in_a_temporary_directory(base_directory) do |dir|
42
+ write_temporary_dependency_files
43
+
44
+ SharedHelpers.with_git_configured(credentials: credentials) do
45
+ # Shell out to dep, which handles everything for us, and does
46
+ # so without doing an install (so it's fast).
47
+ command = "dep ensure -update --no-vendor #{dependency.name}"
48
+ dir_parts = dir.realpath.to_s.split("/")
49
+ gopath = File.join(dir_parts[0..-(base_parts + 1)])
50
+ run_shell_command(command, "GOPATH" => gopath)
51
+ end
52
+
53
+ new_lockfile_content = File.read("Gopkg.lock")
54
+
55
+ get_version_from_lockfile(new_lockfile_content)
56
+ end
57
+
58
+ updated_version
59
+ rescue SharedHelpers::HelperSubprocessFailed => error
60
+ handle_dep_errors(error)
61
+ end
62
+
63
+ def get_version_from_lockfile(lockfile_content)
64
+ package = TomlRB.parse(lockfile_content).fetch("projects").
65
+ find { |p| p["name"] == dependency.name }
66
+
67
+ version = package["version"]
68
+
69
+ if version && version_class.correct?(version.sub(/^v?/, ""))
70
+ version_class.new(version.sub(/^v?/, ""))
71
+ elsif version
72
+ version
73
+ else
74
+ package.fetch("revision")
75
+ end
76
+ end
77
+
78
+ def handle_dep_errors(error)
79
+ if error.message.match?(NOT_FOUND_REGEX)
80
+ url = error.message.match(NOT_FOUND_REGEX).
81
+ named_captures.fetch("repo_url")
82
+
83
+ raise Dependabot::GitDependenciesNotReachable, url
84
+ end
85
+
86
+ # A dep bug that probably isn't going to be fixed any time soon :-(
87
+ # - https://github.com/golang/dep/issues/1437
88
+ # - https://github.com/golang/dep/issues/649
89
+ # - https://github.com/golang/dep/issues/2041
90
+ # - https://twitter.com/miekg/status/996682296739745792
91
+ return if error.message.match?(INDEX_OUT_OF_RANGE_REGEX)
92
+
93
+ raise
94
+ end
95
+
96
+ def run_shell_command(command, env = {})
97
+ raw_response = nil
98
+ IO.popen(env, command, err: %i(child out)) do |process|
99
+ raw_response = process.read
100
+ end
101
+
102
+ # Raise an error with the output from the shell session if dep
103
+ # returns a non-zero status
104
+ return if $CHILD_STATUS.success?
105
+
106
+ raise SharedHelpers::HelperSubprocessFailed.new(
107
+ raw_response,
108
+ command
109
+ )
110
+ end
111
+
112
+ def write_temporary_dependency_files
113
+ dependency_files.each do |file|
114
+ path = file.name
115
+ FileUtils.mkdir_p(Pathname.new(path).dirname)
116
+ File.write(file.name, file.content)
117
+ end
118
+
119
+ File.write("hello.go", dummy_app_content)
120
+ end
121
+
122
+ def dummy_app_content
123
+ base = "package main\n\n"\
124
+ "import \"fmt\"\n\n"
125
+
126
+ packages_to_import.each { |nm| base += "import \"#{nm}\"\n\n" }
127
+
128
+ base + "func main() {\n fmt.Printf(\"hello, world\\n\")\n}"
129
+ end
130
+
131
+ def packages_to_import
132
+ return [] unless lockfile
133
+
134
+ parsed_lockfile = TomlRB.parse(lockfile.content)
135
+
136
+ # If the lockfile was created using dep v0.5.0+ then it will tell us
137
+ # exactly which packages to import
138
+ if parsed_lockfile.dig("solve-meta", "input-imports")
139
+ return parsed_lockfile.dig("solve-meta", "input-imports")
140
+ end
141
+
142
+ # Otherwise we have no way of knowing, so import everything in the
143
+ # lockfile that isn't marked as internal
144
+ parsed_lockfile.fetch("projects").flat_map do |dep|
145
+ dep["packages"].map do |package|
146
+ next if package.start_with?("internal")
147
+
148
+ package == "." ? dep["name"] : File.join(dep["name"], package)
149
+ end.compact
150
+ end
151
+ end
152
+
153
+ def lockfile
154
+ @lockfile = dependency_files.find { |f| f.name == "Gopkg.lock" }
155
+ end
156
+
157
+ def version_class
158
+ Utils.version_class_for_package_manager(dependency.package_manager)
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end