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,155 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/go/dep"
4
+
5
+ module Dependabot
6
+ module FileUpdaters
7
+ module Go
8
+ class Dep
9
+ class ManifestUpdater
10
+ def initialize(dependencies:, manifest:)
11
+ @dependencies = dependencies
12
+ @manifest = manifest
13
+ end
14
+
15
+ def updated_manifest_content
16
+ dependencies.
17
+ select { |dep| requirement_changed?(manifest, dep) }.
18
+ reduce(manifest.content.dup) do |content, dep|
19
+ updated_content = content
20
+
21
+ updated_content = update_requirements(
22
+ content: updated_content,
23
+ filename: manifest.name,
24
+ dependency: dep
25
+ )
26
+ updated_content = update_git_pin(
27
+ content: updated_content,
28
+ filename: manifest.name,
29
+ dependency: dep
30
+ )
31
+
32
+ if content == updated_content
33
+ raise "Expected content to change!"
34
+ end
35
+
36
+ updated_content
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ attr_reader :dependencies, :manifest
43
+
44
+ def requirement_changed?(file, dependency)
45
+ changed_requirements =
46
+ dependency.requirements - dependency.previous_requirements
47
+
48
+ changed_requirements.any? { |f| f[:file] == file.name }
49
+ end
50
+
51
+ def update_requirements(content:, filename:, dependency:)
52
+ updated_content = content.dup
53
+
54
+ # The UpdateChecker ensures the order of requirements is preserved
55
+ # when updating, so we can zip them together in new/old pairs.
56
+ reqs = dependency.requirements.
57
+ zip(dependency.previous_requirements).
58
+ reject { |new_req, old_req| new_req == old_req }
59
+
60
+ # Loop through each changed requirement
61
+ reqs.each do |new_req, old_req|
62
+ raise "Bad req match" unless new_req[:file] == old_req[:file]
63
+ next if new_req[:requirement] == old_req[:requirement]
64
+ next unless new_req[:file] == filename
65
+
66
+ updated_content = update_manifest_req(
67
+ content: updated_content,
68
+ dep: dependency,
69
+ old_req: old_req.fetch(:requirement),
70
+ new_req: new_req.fetch(:requirement)
71
+ )
72
+ end
73
+
74
+ updated_content
75
+ end
76
+
77
+ def update_git_pin(content:, filename:, dependency:)
78
+ updated_pin =
79
+ dependency.requirements.
80
+ find { |r| r[:file] == filename }&.
81
+ dig(:source, :ref)
82
+
83
+ old_pin =
84
+ dependency.previous_requirements.
85
+ find { |r| r[:file] == filename }&.
86
+ dig(:source, :ref)
87
+
88
+ return content unless old_pin
89
+
90
+ update_manifest_pin(
91
+ content: content,
92
+ dep: dependency,
93
+ old_pin: old_pin,
94
+ new_pin: updated_pin
95
+ )
96
+ end
97
+
98
+ # rubocop:disable Metrics/CyclomaticComplexity
99
+ # rubocop:disable Metrics/PerceivedComplexity
100
+ def update_manifest_req(content:, dep:, old_req:, new_req:)
101
+ declaration = content.scan(declaration_regex(dep)).
102
+ find { |m| old_req.nil? || m.include?(old_req) }
103
+
104
+ return content unless declaration
105
+
106
+ if old_req && new_req
107
+ content.gsub(declaration) do |line|
108
+ line.gsub(old_req, new_req)
109
+ end
110
+ elsif old_req && new_req.nil?
111
+ content.gsub(declaration) do |line|
112
+ line.gsub(/\R+.*version\s*=.*/, "")
113
+ end
114
+ elsif old_req.nil? && new_req
115
+ content.gsub(declaration) do |line|
116
+ indent = line.match(/(?<indent>\s*)name/).
117
+ named_captures.fetch("indent")
118
+ version_declaration = indent + "version = \"#{new_req}\""
119
+ line.gsub(/name\s*=.*/) { |nm_ln| nm_ln + version_declaration }
120
+ end
121
+ end
122
+ end
123
+ # rubocop:enable Metrics/CyclomaticComplexity
124
+ # rubocop:enable Metrics/PerceivedComplexity
125
+
126
+ def update_manifest_pin(content:, dep:, old_pin:, new_pin:)
127
+ declaration = content.scan(declaration_regex(dep)).
128
+ find { |m| m.include?(old_pin) }
129
+
130
+ return content unless declaration
131
+
132
+ if old_pin && new_pin
133
+ content.gsub(declaration) do |line|
134
+ line.gsub(old_pin, new_pin)
135
+ end
136
+ elsif old_pin && new_pin.nil?
137
+ content.gsub(declaration) do |line|
138
+ line.gsub(/\R+.*(revision|branch)\s*=.*/, "")
139
+ end
140
+ end
141
+ end
142
+
143
+ def declaration_regex(dep)
144
+ /
145
+ (?<=\]\])
146
+ (?:(?!^\[).)*
147
+ name\s*=\s*["']#{Regexp.escape(dep.name)}["']
148
+ (?:(?!^\[).)*
149
+ /mx
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/shared_helpers"
4
+ require "dependabot/file_updaters/base"
5
+
6
+ module Dependabot
7
+ module FileUpdaters
8
+ module Go
9
+ class Modules < Dependabot::FileUpdaters::Base
10
+ require_relative "modules/go_mod_updater"
11
+
12
+ def self.updated_files_regex
13
+ [
14
+ /^go\.mod$/,
15
+ /^go\.sum$/
16
+ ]
17
+ end
18
+
19
+ def updated_dependency_files
20
+ updated_files = []
21
+
22
+ if go_mod && file_changed?(go_mod)
23
+ updated_files <<
24
+ updated_file(
25
+ file: go_mod,
26
+ content: file_updater.updated_go_mod_content
27
+ )
28
+
29
+ if go_sum && go_sum.content != file_updater.updated_go_sum_content
30
+ updated_files <<
31
+ updated_file(
32
+ file: go_sum,
33
+ content: file_updater.updated_go_sum_content
34
+ )
35
+ end
36
+ end
37
+
38
+ raise "No files changed!" if updated_files.none?
39
+
40
+ updated_files
41
+ end
42
+
43
+ private
44
+
45
+ def check_required_files
46
+ return if go_mod
47
+
48
+ raise "No go.mod!"
49
+ end
50
+
51
+ def go_mod
52
+ @go_mod ||= get_original_file("go.mod")
53
+ end
54
+
55
+ def go_sum
56
+ @go_sum ||= get_original_file("go.sum")
57
+ end
58
+
59
+ def file_updater
60
+ @file_updater ||=
61
+ Modules::GoModUpdater.new(
62
+ dependencies: dependencies,
63
+ go_mod: go_mod,
64
+ go_sum: go_sum,
65
+ credentials: credentials
66
+ )
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/go/modules"
4
+ require "dependabot/utils/go/shared_helper"
5
+
6
+ module Dependabot
7
+ module FileUpdaters
8
+ module Go
9
+ class Modules
10
+ class GoModUpdater
11
+ def initialize(dependencies:, go_mod:, go_sum:, credentials:)
12
+ @dependencies = dependencies
13
+ @go_mod = go_mod
14
+ @go_sum = go_sum
15
+ @credentials = credentials
16
+ end
17
+
18
+ def updated_go_mod_content
19
+ @updated_go_mod_content ||=
20
+ SharedHelpers.in_a_temporary_directory do
21
+ SharedHelpers.with_git_configured(credentials: credentials) do
22
+ File.write("go.mod", go_mod.content)
23
+
24
+ deps = dependencies.map do |dep|
25
+ {
26
+ name: dep.name,
27
+ version: "v" + dep.version.sub(/^v/i, ""),
28
+ indirect: dep.requirements.empty?
29
+ }
30
+ end
31
+
32
+ SharedHelpers.run_helper_subprocess(
33
+ command: Utils::Go::SharedHelper.path,
34
+ function: "updateDependencyFile",
35
+ args: { dependencies: deps }
36
+ )
37
+ end
38
+ end
39
+ end
40
+
41
+ def updated_go_sum_content
42
+ return nil unless go_sum
43
+
44
+ # This needs to be run separately so we don't nest subprocess calls
45
+ updated_go_mod_content
46
+
47
+ @updated_go_sum_content ||=
48
+ SharedHelpers.in_a_temporary_directory do
49
+ SharedHelpers.with_git_configured(credentials: credentials) do
50
+ File.write("go.mod", updated_go_mod_content)
51
+ File.write("go.sum", go_sum.content)
52
+ File.write("main.go", dummy_main_go)
53
+
54
+ `GO111MODULE=on go get -d`
55
+ unless $CHILD_STATUS.success?
56
+ raise Dependabot::DependencyFileNotParseable, go_sum.path
57
+ end
58
+
59
+ File.read("go.sum")
60
+ end
61
+ end
62
+ end
63
+
64
+ private
65
+
66
+ def dummy_main_go
67
+ lines = ["package main", "import ("]
68
+ dependencies.each do |dep|
69
+ lines << "_ \"#{dep.name}\""
70
+ end
71
+ lines << ")"
72
+ lines << "func main() {}"
73
+ lines.join("\n")
74
+ end
75
+
76
+ attr_reader :dependencies, :go_mod, :go_sum, :credentials
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,176 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/base"
4
+ require "dependabot/file_parsers/java/gradle"
5
+
6
+ module Dependabot
7
+ module FileUpdaters
8
+ module Java
9
+ class Gradle < Dependabot::FileUpdaters::Base
10
+ require_relative "gradle/dependency_set_updater"
11
+ require_relative "gradle/property_value_updater"
12
+
13
+ def self.updated_files_regex
14
+ [/^build\.gradle$/, %r{/build\.gradle$}]
15
+ end
16
+
17
+ def updated_dependency_files
18
+ updated_files = buildfiles.dup
19
+
20
+ # Loop through each of the changed requirements, applying changes to
21
+ # all buildfiles for that change. Note that the logic is different
22
+ # here to other languages because Java has property inheritance across
23
+ # files (although we're not supporting it for gradle yet).
24
+ dependencies.each do |dependency|
25
+ updated_files = update_buildfiles_for_dependency(
26
+ buildfiles: updated_files,
27
+ dependency: dependency
28
+ )
29
+ end
30
+
31
+ updated_files = updated_files.reject { |f| buildfiles.include?(f) }
32
+
33
+ raise "No files changed!" if updated_files.none?
34
+
35
+ updated_files
36
+ end
37
+
38
+ private
39
+
40
+ def check_required_files
41
+ raise "No build.gradle!" unless get_original_file("build.gradle")
42
+ end
43
+
44
+ def update_buildfiles_for_dependency(buildfiles:, dependency:)
45
+ files = buildfiles.dup
46
+
47
+ # The UpdateChecker ensures the order of requirements is preserved
48
+ # when updating, so we can zip them together in new/old pairs.
49
+ reqs = dependency.requirements.zip(dependency.previous_requirements).
50
+ reject { |new_req, old_req| new_req == old_req }
51
+
52
+ # Loop through each changed requirement and update the buildfiles
53
+ reqs.each do |new_req, old_req|
54
+ raise "Bad req match" unless new_req[:file] == old_req[:file]
55
+ next if new_req[:requirement] == old_req[:requirement]
56
+
57
+ buildfile = files.find { |f| f.name == new_req.fetch(:file) }
58
+
59
+ if new_req.dig(:metadata, :property_name)
60
+ files = update_files_for_property_change(files, old_req, new_req)
61
+ elsif new_req.dig(:metadata, :dependency_set)
62
+ files = update_files_for_dep_set_change(files, old_req, new_req)
63
+ else
64
+ files[files.index(buildfile)] =
65
+ update_version_in_buildfile(
66
+ dependency,
67
+ buildfile,
68
+ old_req,
69
+ new_req
70
+ )
71
+ end
72
+ end
73
+
74
+ files
75
+ end
76
+
77
+ def update_files_for_property_change(buildfiles, old_req, new_req)
78
+ files = buildfiles.dup
79
+ property_name = new_req.fetch(:metadata).fetch(:property_name)
80
+ buildfile = files.find { |f| f.name == new_req.fetch(:file) }
81
+
82
+ PropertyValueUpdater.new(dependency_files: files).
83
+ update_files_for_property_change(
84
+ property_name: property_name,
85
+ callsite_buildfile: buildfile,
86
+ previous_value: old_req.fetch(:requirement),
87
+ updated_value: new_req.fetch(:requirement)
88
+ )
89
+ end
90
+
91
+ def update_files_for_dep_set_change(buildfiles, old_req, new_req)
92
+ files = buildfiles.dup
93
+ dependency_set = new_req.fetch(:metadata).fetch(:dependency_set)
94
+ buildfile = files.find { |f| f.name == new_req.fetch(:file) }
95
+
96
+ DependencySetUpdater.new(dependency_files: files).
97
+ update_files_for_dep_set_change(
98
+ dependency_set: dependency_set,
99
+ buildfile: buildfile,
100
+ previous_requirement: old_req.fetch(:requirement),
101
+ updated_requirement: new_req.fetch(:requirement)
102
+ )
103
+ end
104
+
105
+ def update_version_in_buildfile(dependency, buildfile, previous_req,
106
+ requirement)
107
+ updated_content =
108
+ buildfile.content.gsub(
109
+ original_buildfile_declaration(dependency, previous_req),
110
+ updated_buildfile_declaration(
111
+ dependency,
112
+ previous_req,
113
+ requirement
114
+ )
115
+ )
116
+
117
+ if updated_content == buildfile.content
118
+ raise "Expected content to change!"
119
+ end
120
+
121
+ updated_file(file: buildfile, content: updated_content)
122
+ end
123
+
124
+ def original_buildfile_declaration(dependency, requirement)
125
+ # This implementation is limited to declarations that appear on a
126
+ # single line.
127
+ buildfile = buildfiles.find { |f| f.name == requirement.fetch(:file) }
128
+ buildfile.content.lines.find do |line|
129
+ line = evaluate_properties(line, buildfile)
130
+ next false unless line.include?(dependency.name.split(":").first)
131
+ next false unless line.include?(dependency.name.split(":").last)
132
+
133
+ line.include?(requirement.fetch(:requirement))
134
+ end
135
+ end
136
+
137
+ def evaluate_properties(string, buildfile)
138
+ result = string.dup
139
+
140
+ string.scan(FileParsers::Java::Gradle::PROPERTY_REGEX) do
141
+ prop_name = Regexp.last_match.named_captures.fetch("property_name")
142
+ property_value = property_value_finder.property_value(
143
+ property_name: prop_name,
144
+ callsite_buildfile: buildfile
145
+ )
146
+ next unless property_value
147
+
148
+ result.sub!(Regexp.last_match.to_s, property_value)
149
+ end
150
+
151
+ result
152
+ end
153
+
154
+ def property_value_finder
155
+ @property_value_finder ||=
156
+ FileParsers::Java::Gradle::PropertyValueFinder.
157
+ new(dependency_files: dependency_files)
158
+ end
159
+
160
+ def updated_buildfile_declaration(dependency, previous_req, requirement)
161
+ original_req_string = previous_req.fetch(:requirement)
162
+
163
+ original_buildfile_declaration(dependency, previous_req).gsub(
164
+ original_req_string,
165
+ requirement.fetch(:requirement)
166
+ )
167
+ end
168
+
169
+ def buildfiles
170
+ @buildfiles ||=
171
+ dependency_files.select { |f| f.name.end_with?("build.gradle") }
172
+ end
173
+ end
174
+ end
175
+ end
176
+ end