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,475 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/java_script/npm_and_yarn"
4
+ require "dependabot/file_parsers/java_script/npm_and_yarn"
5
+ require "dependabot/update_checkers/java_script/npm_and_yarn/registry_finder"
6
+ require "dependabot/shared_helpers"
7
+ require "dependabot/errors"
8
+
9
+ # rubocop:disable Metrics/ClassLength
10
+ module Dependabot
11
+ module FileUpdaters
12
+ module JavaScript
13
+ class NpmAndYarn
14
+ class YarnLockfileUpdater
15
+ require_relative "npmrc_builder"
16
+ require_relative "package_json_updater"
17
+
18
+ def initialize(dependencies:, dependency_files:, credentials:)
19
+ @dependencies = dependencies
20
+ @dependency_files = dependency_files
21
+ @credentials = credentials
22
+ end
23
+
24
+ def updated_yarn_lock_content(yarn_lock)
25
+ @updated_yarn_lock_content ||= {}
26
+ if @updated_yarn_lock_content[yarn_lock.name]
27
+ return @updated_yarn_lock_content[yarn_lock.name]
28
+ end
29
+
30
+ new_content = updated_yarn_lock(yarn_lock)
31
+
32
+ @updated_yarn_lock_content[yarn_lock.name] =
33
+ post_process_yarn_lockfile(new_content)
34
+ end
35
+
36
+ private
37
+
38
+ attr_reader :dependencies, :dependency_files, :credentials
39
+
40
+ UNREACHABLE_GIT = /ls-remote --tags --heads (?<url>.*)/.freeze
41
+ TIMEOUT_FETCHING_PACKAGE =
42
+ %r{(?<url>.+)/(?<package>[^/]+): ETIMEDOUT}.freeze
43
+ INVALID_PACKAGE = /Can't add "(?<package_req>.*)": invalid/.freeze
44
+
45
+ def top_level_dependencies
46
+ dependencies.select(&:top_level?)
47
+ end
48
+
49
+ def sub_dependencies
50
+ dependencies.reject(&:top_level?)
51
+ end
52
+
53
+ def updated_yarn_lock(yarn_lock)
54
+ SharedHelpers.in_a_temporary_directory do
55
+ write_temporary_dependency_files
56
+ lockfile_name = Pathname.new(yarn_lock.name).basename.to_s
57
+ path = Pathname.new(yarn_lock.name).dirname.to_s
58
+ updated_files = run_current_yarn_update(
59
+ path: path,
60
+ lockfile_name: lockfile_name
61
+ )
62
+ updated_files.fetch(lockfile_name)
63
+ end
64
+ rescue SharedHelpers::HelperSubprocessFailed => error
65
+ handle_yarn_lock_updater_error(error, yarn_lock)
66
+ end
67
+
68
+ def run_current_yarn_update(path:, lockfile_name:)
69
+ top_level_dependency_updates = top_level_dependencies.map do |d|
70
+ {
71
+ name: d.name,
72
+ version: d.version,
73
+ requirements: requirements_for_path(d.requirements, path)
74
+ }
75
+ end
76
+
77
+ run_yarn_updater(
78
+ path: path,
79
+ lockfile_name: lockfile_name,
80
+ top_level_dependency_updates: top_level_dependency_updates
81
+ )
82
+ end
83
+
84
+ def run_previous_yarn_update(path:, lockfile_name:)
85
+ previous_top_level_dependencies = top_level_dependencies.map do |d|
86
+ {
87
+ name: d.name,
88
+ version: d.previous_version,
89
+ requirements: requirements_for_path(
90
+ d.previous_requirements, path
91
+ )
92
+ }
93
+ end
94
+
95
+ run_yarn_updater(
96
+ path: path,
97
+ lockfile_name: lockfile_name,
98
+ top_level_dependency_updates: previous_top_level_dependencies
99
+ )
100
+ end
101
+
102
+ # rubocop:disable Metrics/CyclomaticComplexity
103
+ # rubocop:disable Metrics/PerceivedComplexity
104
+ def run_yarn_updater(path:, lockfile_name:,
105
+ top_level_dependency_updates:)
106
+ SharedHelpers.with_git_configured(credentials: credentials) do
107
+ Dir.chdir(path) do
108
+ if top_level_dependency_updates.any?
109
+ run_yarn_top_level_updater(
110
+ top_level_dependency_updates: top_level_dependency_updates
111
+ )
112
+ else
113
+ run_yarn_subdependency_updater(lockfile_name: lockfile_name)
114
+ end
115
+ end
116
+ end
117
+ rescue SharedHelpers::HelperSubprocessFailed => error
118
+ names = dependencies.map(&:name)
119
+ package_missing = names.any? do |name|
120
+ error.message.include?("find package \"#{name}")
121
+ end
122
+
123
+ raise unless error.message.include?("The registry may be down") ||
124
+ error.message.include?("ETIMEDOUT") ||
125
+ error.message.include?("ENOBUFS") ||
126
+ package_missing
127
+
128
+ retry_count ||= 0
129
+ retry_count += 1
130
+ raise if retry_count > 2
131
+
132
+ sleep(rand(3.0..10.0)) && retry
133
+ end
134
+ # rubocop:enable Metrics/CyclomaticComplexity
135
+ # rubocop:enable Metrics/PerceivedComplexity
136
+
137
+ def run_yarn_top_level_updater(top_level_dependency_updates:)
138
+ SharedHelpers.run_helper_subprocess(
139
+ command: "node #{yarn_helper_path}",
140
+ function: "update",
141
+ args: [
142
+ Dir.pwd,
143
+ top_level_dependency_updates
144
+ ]
145
+ )
146
+ end
147
+
148
+ def run_yarn_subdependency_updater(lockfile_name:)
149
+ SharedHelpers.run_helper_subprocess(
150
+ command: "node #{yarn_helper_path}",
151
+ function: "updateSubdependency",
152
+ args: [Dir.pwd, lockfile_name]
153
+ )
154
+ end
155
+
156
+ def requirements_for_path(requirements, path)
157
+ return requirements if path.to_s == "."
158
+
159
+ requirements.map do |r|
160
+ next unless r[:file].start_with?("#{path}/")
161
+
162
+ r.merge(file: r[:file].gsub(/^#{Regexp.quote("#{path}/")}/, ""))
163
+ end.compact
164
+ end
165
+
166
+ # rubocop:disable Metrics/AbcSize
167
+ # rubocop:disable Metrics/CyclomaticComplexity
168
+ # rubocop:disable Metrics/PerceivedComplexity
169
+ # rubocop:disable Metrics/MethodLength
170
+ def handle_yarn_lock_updater_error(error, yarn_lock)
171
+ # When the package.json doesn't include a name or version
172
+ if error.message.match?(INVALID_PACKAGE)
173
+ raise_resolvability_error(error, yarn_lock)
174
+ end
175
+
176
+ if error.message.include?("Couldn't find package")
177
+ package_name =
178
+ error.message.match(/package "(?<package_req>.*)?"/).
179
+ named_captures["package_req"].
180
+ split(/(?<=\w)\@/).first
181
+ handle_missing_package(package_name, error, yarn_lock)
182
+ end
183
+
184
+ if error.message.match?(%r{/[^/]+: Not found})
185
+ package_name =
186
+ error.message.match(%r{/(?<package_name>[^/]+): Not found}).
187
+ named_captures["package_name"]
188
+ handle_missing_package(package_name, error, yarn_lock)
189
+ end
190
+
191
+ if error.message.start_with?("Couldn't find any versions") ||
192
+ error.message.include?(": Not found")
193
+
194
+ names = dependencies.map(&:name)
195
+ if names.any? { |name| error.message.include?(%("#{name}")) }
196
+ # This happens if a new version has been published but npm is
197
+ # having consistency issues. We raise a bespoke error so we can
198
+ # capture and ignore it if we're trying to create a new PR
199
+ # (which will be created successfully at a later date).
200
+ raise Dependabot::InconsistentRegistryResponse, error.message
201
+ end
202
+
203
+ # This happens if a new version has been published that relies on
204
+ # subdependencies that have not yet been published.
205
+ raise error if resolvable_before_update?(yarn_lock)
206
+
207
+ raise_resolvability_error(error, yarn_lock)
208
+ end
209
+
210
+ if error.message.include?("Workspaces can only be enabled in priva")
211
+ raise Dependabot::DependencyFileNotEvaluatable, error.message
212
+ end
213
+
214
+ if error.message.match?(UNREACHABLE_GIT)
215
+ dependency_url = error.message.match(UNREACHABLE_GIT).
216
+ named_captures.fetch("url")
217
+
218
+ raise Dependabot::GitDependenciesNotReachable, dependency_url
219
+ end
220
+
221
+ if error.message.match?(TIMEOUT_FETCHING_PACKAGE)
222
+ handle_timeout(error.message)
223
+ end
224
+
225
+ raise
226
+ end
227
+ # rubocop:enable Metrics/AbcSize
228
+ # rubocop:enable Metrics/CyclomaticComplexity
229
+ # rubocop:enable Metrics/PerceivedComplexity
230
+ # rubocop:enable Metrics/MethodLength
231
+
232
+ def resolvable_before_update?(yarn_lock)
233
+ SharedHelpers.in_a_temporary_directory do
234
+ write_temporary_dependency_files(update_package_json: false)
235
+ lockfile_name = Pathname.new(yarn_lock.name).basename.to_s
236
+ path = Pathname.new(yarn_lock.name).dirname.to_s
237
+ run_previous_yarn_update(path: path, lockfile_name: lockfile_name)
238
+ end
239
+
240
+ true
241
+ rescue SharedHelpers::HelperSubprocessFailed
242
+ false
243
+ end
244
+
245
+ def write_temporary_dependency_files(update_package_json: true)
246
+ write_lockfiles
247
+
248
+ File.write(".npmrc", npmrc_content)
249
+
250
+ package_files.each do |file|
251
+ path = file.name
252
+ FileUtils.mkdir_p(Pathname.new(path).dirname)
253
+
254
+ updated_content =
255
+ if update_package_json && top_level_dependencies.any?
256
+ updated_package_json_content(file)
257
+ else
258
+ file.content
259
+ end
260
+
261
+ updated_content = replace_ssh_sources(updated_content)
262
+
263
+ # A bug prevents Yarn recognising that a directory is part of a
264
+ # workspace if it is specified with a `./` prefix.
265
+ updated_content = remove_workspace_path_prefixes(updated_content)
266
+
267
+ updated_content = sanitized_package_json_content(updated_content)
268
+ File.write(file.name, updated_content)
269
+ end
270
+ end
271
+
272
+ def write_lockfiles
273
+ yarn_locks.each do |f|
274
+ FileUtils.mkdir_p(Pathname.new(f.name).dirname)
275
+
276
+ if top_level_dependencies.any?
277
+ File.write(f.name, f.content)
278
+ else
279
+ File.write(f.name, prepared_yarn_lockfile_content(f.content))
280
+ end
281
+ end
282
+ end
283
+
284
+ # Duplicated in SubdependencyVersionResolver
285
+ # Remove the dependency we want to update from the lockfile and let
286
+ # yarn find the latest resolvable version and fix the lockfile
287
+ def prepared_yarn_lockfile_content(content)
288
+ sub_dependencies.map(&:name).reduce(content) do |result, name|
289
+ result.gsub(/^#{Regexp.quote(name)}\@.*?\n\n/m, "")
290
+ end
291
+ end
292
+
293
+ def replace_ssh_sources(content)
294
+ updated_content = content
295
+
296
+ git_ssh_requirements_to_swap.each do |req|
297
+ new_req = req.gsub(%r{git\+ssh://git@(.*?)[:/]}, 'https://\1/')
298
+ updated_content = updated_content.gsub(req, new_req)
299
+ end
300
+
301
+ updated_content
302
+ end
303
+
304
+ def remove_workspace_path_prefixes(content)
305
+ json = JSON.parse(content)
306
+ return content unless json.key?("workspaces")
307
+
308
+ workspace_object = json.fetch("workspaces")
309
+ paths_array =
310
+ if workspace_object.is_a?(Hash)
311
+ workspace_object.values_at("packages", "nohoist").
312
+ flatten.compact
313
+ elsif workspace_object.is_a?(Array) then workspace_object
314
+ else raise "Unexpected workspace object"
315
+ end
316
+
317
+ paths_array.each { |path| path.gsub!(%r{^\./}, "") }
318
+
319
+ json.to_json
320
+ end
321
+
322
+ def git_ssh_requirements_to_swap
323
+ if @git_ssh_requirements_to_swap
324
+ return @git_ssh_requirements_to_swap
325
+ end
326
+
327
+ git_dependencies =
328
+ dependencies.
329
+ select do |dep|
330
+ dep.requirements.any? { |r| r.dig(:source, :type) == "git" }
331
+ end
332
+
333
+ @git_ssh_requirements_to_swap = []
334
+
335
+ package_files.each do |file|
336
+ FileParsers::JavaScript::NpmAndYarn::DEPENDENCY_TYPES.each do |t|
337
+ JSON.parse(file.content).fetch(t, {}).each do |nm, requirement|
338
+ next unless git_dependencies.map(&:name).include?(nm)
339
+ next unless requirement.start_with?("git+ssh:")
340
+
341
+ req = requirement.split("#").first
342
+ @git_ssh_requirements_to_swap << req
343
+ end
344
+ end
345
+ end
346
+
347
+ @git_ssh_requirements_to_swap
348
+ end
349
+
350
+ def post_process_yarn_lockfile(lockfile_content)
351
+ updated_content = lockfile_content
352
+
353
+ git_ssh_requirements_to_swap.each do |req|
354
+ new_req = req.gsub(%r{git\+ssh://git@(.*?)[:/]}, 'https://\1/')
355
+ updated_content = updated_content.gsub(new_req, req)
356
+ end
357
+
358
+ if remove_integrity_lines?
359
+ updated_content = remove_integrity_lines(updated_content)
360
+ end
361
+
362
+ updated_content
363
+ end
364
+
365
+ def remove_integrity_lines?
366
+ yarn_locks.none? { |f| f.content.include?(" integrity sha") }
367
+ end
368
+
369
+ def remove_integrity_lines(content)
370
+ content.lines.reject { |l| l.match?(/\s*integrity sha/) }.join
371
+ end
372
+
373
+ def handle_missing_package(package_name, error, yarn_lock)
374
+ missing_dep = FileParsers::JavaScript::NpmAndYarn.new(
375
+ dependency_files: dependency_files,
376
+ source: nil,
377
+ credentials: credentials
378
+ ).parse.find { |dep| dep.name == package_name }
379
+
380
+ raise_resolvability_error(error, yarn_lock) unless missing_dep
381
+
382
+ reg = UpdateCheckers::JavaScript::NpmAndYarn::RegistryFinder.new(
383
+ dependency: missing_dep,
384
+ credentials: credentials,
385
+ npmrc_file: dependency_files.
386
+ find { |f| f.name.end_with?(".npmrc") },
387
+ yarnrc_file: dependency_files.
388
+ find { |f| f.name.end_with?(".yarnrc") }
389
+ ).registry
390
+
391
+ # Sanitize Gemfury URLs
392
+ reg = reg.gsub(%r{(?<=\.fury\.io)/.*}, "")
393
+ return if central_registry?(reg) && !package_name.start_with?("@")
394
+
395
+ raise PrivateSourceAuthenticationFailure, reg
396
+ end
397
+
398
+ def central_registry?(registry)
399
+ FileParsers::JavaScript::NpmAndYarn::CENTRAL_REGISTRIES.any? do |r|
400
+ r.include?(registry)
401
+ end
402
+ end
403
+
404
+ def raise_resolvability_error(error, yarn_lock)
405
+ dependency_names = dependencies.map(&:name).join(", ")
406
+ msg = "Error whilst updating #{dependency_names} in "\
407
+ "#{yarn_lock.path}:\n#{error.message}"
408
+ raise Dependabot::DependencyFileNotResolvable, msg
409
+ end
410
+
411
+ def handle_timeout(message)
412
+ url = message.match(TIMEOUT_FETCHING_PACKAGE).named_captures["url"]
413
+ return if url.start_with?("https://registry.npmjs.org")
414
+
415
+ package_name =
416
+ message.match(TIMEOUT_FETCHING_PACKAGE).
417
+ named_captures["package"].gsub("%2f", "/").gsub("%2F", "/")
418
+
419
+ dep = FileParsers::JavaScript::NpmAndYarn.new(
420
+ dependency_files: dependency_files,
421
+ source: nil,
422
+ credentials: credentials
423
+ ).parse.find { |d| d.name == package_name }
424
+ return unless dep
425
+
426
+ raise PrivateSourceTimedOut, url.gsub(%r{https?://}, "")
427
+ end
428
+
429
+ def npmrc_content
430
+ NpmrcBuilder.new(
431
+ credentials: credentials,
432
+ dependency_files: dependency_files
433
+ ).npmrc_content
434
+ end
435
+
436
+ def updated_package_json_content(file)
437
+ @updated_package_json_content ||= {}
438
+ @updated_package_json_content[file.name] ||=
439
+ PackageJsonUpdater.new(
440
+ package_json: file,
441
+ dependencies: top_level_dependencies
442
+ ).updated_package_json.content
443
+ end
444
+
445
+ def npmrc_disables_lockfile?
446
+ npmrc_content.match?(/^package-lock\s*=\s*false/)
447
+ end
448
+
449
+ def sanitized_package_json_content(content)
450
+ content.
451
+ gsub(/\{\{.*?\}\}/, "something"). # {{ name }} syntax not allowed
452
+ gsub(/(?<!\\)\\ /, " "). # escaped whitespace not allowed
453
+ gsub(%r{^\s*//.*}, " ") # comments are not allowed
454
+ end
455
+
456
+ def yarn_locks
457
+ @yarn_locks ||=
458
+ dependency_files.
459
+ select { |f| f.name.end_with?("yarn.lock") }
460
+ end
461
+
462
+ def package_files
463
+ dependency_files.select { |f| f.name.end_with?("package.json") }
464
+ end
465
+
466
+ def yarn_helper_path
467
+ project_root = File.join(File.dirname(__FILE__), "../../../../..")
468
+ File.join(project_root, "helpers/yarn/bin/run.js")
469
+ end
470
+ end
471
+ end
472
+ end
473
+ end
474
+ end
475
+ # rubocop:enable Metrics/ClassLength