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,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/base"
4
+
5
+ module Dependabot
6
+ module FileUpdaters
7
+ module Elm
8
+ class ElmPackage < Base
9
+ require_relative "elm_package/elm_package_updater"
10
+ require_relative "elm_package/elm_json_updater"
11
+
12
+ def self.updated_files_regex
13
+ [
14
+ /^elm-package\.json$/,
15
+ /^elm\.json$/
16
+ ]
17
+ end
18
+
19
+ def updated_dependency_files
20
+ updated_files = []
21
+
22
+ elm_package_files.each do |file|
23
+ next unless file_changed?(file)
24
+
25
+ updated_files <<
26
+ updated_file(
27
+ file: file,
28
+ content: updated_elm_package_content(file)
29
+ )
30
+ end
31
+
32
+ elm_json_files.each do |file|
33
+ next unless file_changed?(file)
34
+
35
+ updated_files <<
36
+ updated_file(
37
+ file: file,
38
+ content: updated_elm_json_content(file)
39
+ )
40
+ end
41
+
42
+ raise "No files have changed!" if updated_files.none?
43
+
44
+ updated_files
45
+ end
46
+
47
+ private
48
+
49
+ def check_required_files
50
+ return if elm_json_files.any? || elm_package_files.any?
51
+
52
+ raise "No elm.json or elm-package.json!"
53
+ end
54
+
55
+ def updated_elm_package_content(file)
56
+ ElmPackageUpdater.new(
57
+ dependencies: dependencies,
58
+ elm_package_file: file
59
+ ).updated_elm_package_file_content
60
+ end
61
+
62
+ def updated_elm_json_content(file)
63
+ ElmJsonUpdater.new(
64
+ dependencies: dependencies,
65
+ elm_json_file: file
66
+ ).updated_content
67
+ end
68
+
69
+ def elm_package_files
70
+ dependency_files.select { |f| f.name.end_with?("elm-package.json") }
71
+ end
72
+
73
+ def elm_json_files
74
+ dependency_files.select { |f| f.name.end_with?("elm.json") }
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/elm/elm_package"
4
+
5
+ module Dependabot
6
+ module FileUpdaters
7
+ module Elm
8
+ class ElmPackage
9
+ class ElmJsonUpdater
10
+ def initialize(elm_json_file:, dependencies:)
11
+ @elm_json_file = elm_json_file
12
+ @dependencies = dependencies
13
+ end
14
+
15
+ def updated_content
16
+ dependencies.
17
+ select { |dep| requirement_changed?(elm_json_file, dep) }.
18
+ reduce(elm_json_file.content.dup) do |content, dep|
19
+ updated_content = content
20
+
21
+ updated_content = update_requirement(
22
+ content: updated_content,
23
+ filename: elm_json_file.name,
24
+ dependency: dep
25
+ )
26
+
27
+ next updated_content unless content == updated_content
28
+
29
+ raise "Expected content to change!"
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ attr_reader :elm_json_file, :dependencies
36
+
37
+ def requirement_changed?(file, dependency)
38
+ changed_requirements =
39
+ dependency.requirements - dependency.previous_requirements
40
+
41
+ changed_requirements.any? { |f| f[:file] == file.name }
42
+ end
43
+
44
+ def update_requirement(content:, filename:, dependency:)
45
+ updated_req =
46
+ dependency.requirements.
47
+ find { |r| r.fetch(:file) == filename }.
48
+ fetch(:requirement)
49
+
50
+ old_req =
51
+ dependency.previous_requirements.
52
+ find { |r| r.fetch(:file) == filename }.
53
+ fetch(:requirement)
54
+
55
+ return content unless old_req
56
+
57
+ dep = dependency
58
+ regex =
59
+ /"#{Regexp.quote(dep.name)}"\s*:\s+"#{Regexp.quote(old_req)}"/
60
+
61
+ content.gsub(regex) do |declaration|
62
+ declaration.gsub(%("#{old_req}"), %("#{updated_req}"))
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/elm/elm_package"
4
+
5
+ module Dependabot
6
+ module FileUpdaters
7
+ module Elm
8
+ class ElmPackage
9
+ class ElmPackageUpdater
10
+ def initialize(elm_package_file:, dependencies:)
11
+ @elm_package_file = elm_package_file
12
+ @dependencies = dependencies
13
+ end
14
+
15
+ def updated_elm_package_file_content
16
+ dependencies.
17
+ select { |dep| requirement_changed?(elm_package_file, dep) }.
18
+ reduce(elm_package_file.content.dup) do |content, dep|
19
+ updated_content = content
20
+
21
+ updated_content = update_requirement(
22
+ content: updated_content,
23
+ filename: elm_package_file.name,
24
+ dependency: dep
25
+ )
26
+
27
+ next updated_content unless content == updated_content
28
+
29
+ raise "Expected content to change!"
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ attr_reader :elm_package_file, :dependencies
36
+
37
+ def requirement_changed?(file, dependency)
38
+ changed_requirements =
39
+ dependency.requirements - dependency.previous_requirements
40
+
41
+ changed_requirements.any? { |f| f[:file] == file.name }
42
+ end
43
+
44
+ def update_requirement(content:, filename:, dependency:)
45
+ updated_req =
46
+ dependency.requirements.
47
+ find { |r| r.fetch(:file) == filename }.
48
+ fetch(:requirement)
49
+
50
+ old_req =
51
+ dependency.previous_requirements.
52
+ find { |r| r.fetch(:file) == filename }.
53
+ fetch(:requirement)
54
+
55
+ return content unless old_req
56
+
57
+ dep = dependency
58
+ regex =
59
+ /"#{Regexp.quote(dep.name)}"\s*:\s+"#{Regexp.quote(old_req)}"/
60
+
61
+ content.gsub(regex) do |declaration|
62
+ declaration.gsub(%("#{old_req}"), %("#{updated_req}"))
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/base"
4
+
5
+ module Dependabot
6
+ module FileUpdaters
7
+ module Git
8
+ class Submodules < Dependabot::FileUpdaters::Base
9
+ def self.updated_files_regex
10
+ []
11
+ end
12
+
13
+ def updated_dependency_files
14
+ [updated_file(file: submodule, content: dependency.version)]
15
+ end
16
+
17
+ private
18
+
19
+ def dependency
20
+ # Git submodules will only ever be updating a single dependency
21
+ dependencies.first
22
+ end
23
+
24
+ def check_required_files
25
+ %w(.gitmodules).each do |filename|
26
+ raise "No #{filename}!" unless get_original_file(filename)
27
+ end
28
+ end
29
+
30
+ def submodule
31
+ @submodule ||= dependency_files.find do |file|
32
+ file.name == dependency.name
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,77 @@
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 Dep < Dependabot::FileUpdaters::Base
10
+ require_relative "dep/manifest_updater"
11
+ require_relative "dep/lockfile_updater"
12
+
13
+ def self.updated_files_regex
14
+ [
15
+ /^Gopkg\.toml$/,
16
+ /^Gopkg\.lock$/,
17
+ /^go\.mod$/,
18
+ /^go\.sum$/
19
+ ]
20
+ end
21
+
22
+ def updated_dependency_files
23
+ updated_files = []
24
+
25
+ if manifest && file_changed?(manifest)
26
+ updated_files <<
27
+ updated_file(
28
+ file: manifest,
29
+ content: updated_manifest_content
30
+ )
31
+ end
32
+
33
+ if lockfile
34
+ updated_files <<
35
+ updated_file(file: lockfile, content: updated_lockfile_content)
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 get_original_file("Gopkg.toml")
47
+ return if get_original_file("go.mod")
48
+
49
+ raise "No Gopkg.toml or go.mod!"
50
+ end
51
+
52
+ def manifest
53
+ @manifest ||= get_original_file("Gopkg.toml")
54
+ end
55
+
56
+ def lockfile
57
+ @lockfile ||= get_original_file("Gopkg.lock")
58
+ end
59
+
60
+ def updated_manifest_content
61
+ ManifestUpdater.new(
62
+ dependencies: dependencies,
63
+ manifest: manifest
64
+ ).updated_manifest_content
65
+ end
66
+
67
+ def updated_lockfile_content
68
+ LockfileUpdater.new(
69
+ dependencies: dependencies,
70
+ dependency_files: dependency_files,
71
+ credentials: credentials
72
+ ).updated_lockfile_content
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,219 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "toml-rb"
4
+
5
+ require "dependabot/shared_helpers"
6
+ require "dependabot/dependency_file"
7
+ require "dependabot/file_updaters/go/dep"
8
+ require "dependabot/file_parsers/go/dep"
9
+
10
+ module Dependabot
11
+ module FileUpdaters
12
+ module Go
13
+ class Dep
14
+ class LockfileUpdater
15
+ def initialize(dependencies:, dependency_files:, credentials:)
16
+ @dependencies = dependencies
17
+ @dependency_files = dependency_files
18
+ @credentials = credentials
19
+ end
20
+
21
+ def updated_lockfile_content
22
+ deps = dependencies.select { |d| appears_in_lockfile(d) }
23
+ return lockfile.content if deps.none?
24
+
25
+ base_directory = File.join("src", "project",
26
+ dependency_files.first.directory)
27
+ base_parts = base_directory.split("/").length
28
+ updated_content =
29
+ SharedHelpers.in_a_temporary_directory(base_directory) do |dir|
30
+ write_temporary_dependency_files
31
+
32
+ SharedHelpers.with_git_configured(credentials: credentials) do
33
+ # Shell out to dep, which handles everything for us.
34
+ # Note: We are currently doing a full install here (we're not
35
+ # passing no-vendor) because dep needs to generate the digests
36
+ # for each project.
37
+ command = "dep ensure -update #{deps.map(&:name).join(' ')}"
38
+ dir_parts = dir.realpath.to_s.split("/")
39
+ gopath = File.join(dir_parts[0..-(base_parts + 1)])
40
+ run_shell_command(command, "GOPATH" => gopath)
41
+ end
42
+
43
+ File.read("Gopkg.lock")
44
+ end
45
+
46
+ updated_content
47
+ end
48
+
49
+ private
50
+
51
+ attr_reader :dependencies, :dependency_files, :credentials
52
+
53
+ def run_shell_command(command, env = {})
54
+ raw_response = nil
55
+ IO.popen(env, command, err: %i(child out)) do |process|
56
+ raw_response = process.read
57
+ end
58
+
59
+ # Raise an error with the output from the shell session if dep
60
+ # returns a non-zero status
61
+ return if $CHILD_STATUS.success?
62
+
63
+ raise SharedHelpers::HelperSubprocessFailed.new(
64
+ raw_response,
65
+ command
66
+ )
67
+ end
68
+
69
+ def write_temporary_dependency_files
70
+ File.write(lockfile.name, lockfile.content)
71
+
72
+ # Overwrite the manifest with our custom prepared one
73
+ File.write(prepared_manifest.name, prepared_manifest.content)
74
+
75
+ File.write("hello.go", dummy_app_content)
76
+ end
77
+
78
+ def prepared_manifest
79
+ DependencyFile.new(
80
+ name: manifest.name,
81
+ content: prepared_manifest_content
82
+ )
83
+ end
84
+
85
+ def prepared_manifest_content
86
+ parsed_manifest = TomlRB.parse(manifest.content)
87
+
88
+ parsed_manifest["override"] =
89
+ add_fsnotify_override(parsed_manifest["override"])
90
+
91
+ dependencies.each do |dep|
92
+ req = dep.requirements.find { |r| r[:file] == manifest.name }
93
+ next unless appears_in_lockfile(dep)
94
+
95
+ if req
96
+ update_constraint!(parsed_manifest, dep)
97
+ else
98
+ create_constraint!(parsed_manifest, dep)
99
+ end
100
+ end
101
+
102
+ TomlRB.dump(parsed_manifest)
103
+ end
104
+
105
+ # Used to lock the version when updating a top-level dependency
106
+ def update_constraint!(parsed_manifest, dep)
107
+ details =
108
+ parsed_manifest.
109
+ values_at(*FileParsers::Go::Dep::REQUIREMENT_TYPES).
110
+ flatten.compact.find { |d| d["name"] == dep.name }
111
+
112
+ req = dep.requirements.find { |r| r[:file] == manifest.name }
113
+
114
+ if req.fetch(:source).fetch(:type) == "git" && !details["branch"]
115
+ # Note: we don't try to update to a specific revision if the
116
+ # branch was previously specified because the change in
117
+ # specification type would be persisted in the lockfile
118
+ details["revision"] = dep.version if details["revision"]
119
+ details["version"] = dep.version if details["version"]
120
+ elsif req.fetch(:source).fetch(:type) == "default"
121
+ details.delete("branch")
122
+ details.delete("revision")
123
+ details["version"] = "=#{dep.version}"
124
+ end
125
+ end
126
+
127
+ # Used to lock the version when updating a subdependency
128
+ def create_constraint!(parsed_manifest, dep)
129
+ details = { "name" => dep.name }
130
+
131
+ # Fetch the details from the lockfile to check whether this
132
+ # sub-dependency needs a git revision or a version.
133
+ original_details =
134
+ parsed_file(lockfile).fetch("projects").
135
+ find { |p| p["name"] == dep.name }
136
+
137
+ if original_details["source"]
138
+ details["source"] = original_details["source"]
139
+ end
140
+
141
+ if original_details["version"]
142
+ details["version"] = dep.version
143
+ else
144
+ details["revision"] = dep.version
145
+ end
146
+
147
+ parsed_manifest["constraint"] ||= []
148
+ parsed_manifest["constraint"] << details
149
+ end
150
+
151
+ # Work around a dep bug that results in a panic
152
+ def add_fsnotify_override(overrides)
153
+ overrides ||= []
154
+ dep_name = "gopkg.in/fsnotify.v1"
155
+
156
+ override = overrides.find { |s| s["name"] == dep_name }
157
+ if override.nil?
158
+ override = { "name" => dep_name }
159
+ overrides << override
160
+ end
161
+
162
+ unless override["source"]
163
+ override["source"] = "gopkg.in/fsnotify/fsnotify.v1"
164
+ end
165
+
166
+ overrides
167
+ end
168
+
169
+ def dummy_app_content
170
+ base = "package main\n\n"\
171
+ "import \"fmt\"\n\n"
172
+
173
+ packages_to_import.each { |nm| base += "import \"#{nm}\"\n\n" }
174
+
175
+ base + "func main() {\n fmt.Printf(\"hello, world\\n\")\n}"
176
+ end
177
+
178
+ def packages_to_import
179
+ parsed_lockfile = TomlRB.parse(lockfile.content)
180
+
181
+ # If the lockfile was created using dep v0.5.0+ then it will tell us
182
+ # exactly which packages to import
183
+ if parsed_lockfile.dig("solve-meta", "input-imports")
184
+ return parsed_lockfile.dig("solve-meta", "input-imports")
185
+ end
186
+
187
+ # Otherwise we have no way of knowing, so import everything in the
188
+ # lockfile that isn't marked as internal
189
+ parsed_lockfile.fetch("projects").flat_map do |dep|
190
+ dep["packages"].map do |package|
191
+ next if package.start_with?("internal")
192
+
193
+ package == "." ? dep["name"] : File.join(dep["name"], package)
194
+ end.compact
195
+ end
196
+ end
197
+
198
+ def appears_in_lockfile(dep)
199
+ !parsed_file(lockfile)["projects"]&.
200
+ find { |p| p["name"] == dep.name }.nil?
201
+ end
202
+
203
+ def parsed_file(file)
204
+ @parsed_file ||= {}
205
+ @parsed_file[file.name] ||= TomlRB.parse(file.content)
206
+ end
207
+
208
+ def manifest
209
+ @manifest ||= dependency_files.find { |f| f.name == "Gopkg.toml" }
210
+ end
211
+
212
+ def lockfile
213
+ @lockfile ||= dependency_files.find { |f| f.name == "Gopkg.lock" }
214
+ end
215
+ end
216
+ end
217
+ end
218
+ end
219
+ end