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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +6408 -0
- data/LICENSE +37 -0
- data/README.md +115 -0
- data/helpers/elixir/bin/check_update.exs +92 -0
- data/helpers/elixir/bin/do_update.exs +39 -0
- data/helpers/elixir/bin/parse_deps.exs +103 -0
- data/helpers/elixir/bin/run.exs +76 -0
- data/helpers/elixir/mix.exs +21 -0
- data/helpers/elixir/mix.lock +3 -0
- data/helpers/go/Makefile +9 -0
- data/helpers/go/go.mod +9 -0
- data/helpers/go/go.sum +5 -0
- data/helpers/go/importresolver/main.go +34 -0
- data/helpers/go/main.go +77 -0
- data/helpers/go/updatechecker/main.go +107 -0
- data/helpers/go/updater/go.mod +3 -0
- data/helpers/go/updater/go.sum +2 -0
- data/helpers/go/updater/helpers.go +57 -0
- data/helpers/go/updater/main.go +48 -0
- data/helpers/npm/.agignore +1 -0
- data/helpers/npm/.envrc +2 -0
- data/helpers/npm/.eslintrc +14 -0
- data/helpers/npm/.nvimrc +7 -0
- data/helpers/npm/bin/run.js +34 -0
- data/helpers/npm/lib/helpers.js +25 -0
- data/helpers/npm/lib/peer-dependency-checker.js +102 -0
- data/helpers/npm/lib/subdependency-updater.js +48 -0
- data/helpers/npm/lib/updater.js +95 -0
- data/helpers/npm/package.json +17 -0
- data/helpers/npm/test/fixtures/npm-left-pad.json +1 -0
- data/helpers/npm/test/fixtures/updater/original/package-lock.json +16 -0
- data/helpers/npm/test/fixtures/updater/original/package.json +9 -0
- data/helpers/npm/test/fixtures/updater/updated/package-lock.json +16 -0
- data/helpers/npm/test/helpers.js +7 -0
- data/helpers/npm/test/updater.test.js +50 -0
- data/helpers/npm/yarn.lock +6120 -0
- data/helpers/php/.php_cs +34 -0
- data/helpers/php/bin/run.php +57 -0
- data/helpers/php/composer.json +14 -0
- data/helpers/php/composer.lock +1521 -0
- data/helpers/php/composer.phar +0 -0
- data/helpers/php/setup.sh +4 -0
- data/helpers/php/src/DependabotInstallationManager.php +61 -0
- data/helpers/php/src/DependabotPluginManager.php +23 -0
- data/helpers/php/src/ExceptionIO.php +25 -0
- data/helpers/php/src/Hasher.php +21 -0
- data/helpers/php/src/UpdateChecker.php +123 -0
- data/helpers/php/src/Updater.php +97 -0
- data/helpers/python/lib/__init__.py +0 -0
- data/helpers/python/lib/hasher.py +23 -0
- data/helpers/python/lib/parser.py +130 -0
- data/helpers/python/requirements.txt +9 -0
- data/helpers/python/run.py +18 -0
- data/helpers/test/run.rb +15 -0
- data/helpers/utils/git-credential-store-immutable +10 -0
- data/helpers/yarn/.agignore +1 -0
- data/helpers/yarn/.envrc +2 -0
- data/helpers/yarn/.eslintrc +14 -0
- data/helpers/yarn/.nvimrc +7 -0
- data/helpers/yarn/bin/run.js +36 -0
- data/helpers/yarn/lib/fix-duplicates.js +53 -0
- data/helpers/yarn/lib/helpers.js +5 -0
- data/helpers/yarn/lib/lockfile-parser.js +21 -0
- data/helpers/yarn/lib/peer-dependency-checker.js +130 -0
- data/helpers/yarn/lib/replace-lockfile-declaration.js +45 -0
- data/helpers/yarn/lib/subdependency-updater.js +69 -0
- data/helpers/yarn/lib/updater.js +254 -0
- data/helpers/yarn/package.json +17 -0
- data/helpers/yarn/test/fixtures/updater/original/package.json +6 -0
- data/helpers/yarn/test/fixtures/updater/original/yarn.lock +11 -0
- data/helpers/yarn/test/fixtures/updater/updated/yarn.lock +12 -0
- data/helpers/yarn/test/fixtures/updater/with-version-comments/package.json +5 -0
- data/helpers/yarn/test/fixtures/updater/with-version-comments/yarn.lock +13 -0
- data/helpers/yarn/test/fixtures/yarnpkg-is-positive.json +1 -0
- data/helpers/yarn/test/fixtures/yarnpkg-left-pad.json +1 -0
- data/helpers/yarn/test/helpers.js +7 -0
- data/helpers/yarn/test/updater.test.js +93 -0
- data/helpers/yarn/yarn.lock +4912 -0
- data/lib/bundler_definition_bundler_version_patch.rb +15 -0
- data/lib/bundler_definition_ruby_version_patch.rb +14 -0
- data/lib/bundler_git_source_patch.rb +27 -0
- data/lib/dependabot.rb +4 -0
- data/lib/dependabot/clients/bitbucket.rb +101 -0
- data/lib/dependabot/clients/github_with_retries.rb +117 -0
- data/lib/dependabot/clients/gitlab.rb +72 -0
- data/lib/dependabot/dependency.rb +118 -0
- data/lib/dependabot/dependency_file.rb +54 -0
- data/lib/dependabot/errors.rb +179 -0
- data/lib/dependabot/file_fetchers.rb +48 -0
- data/lib/dependabot/file_fetchers/README.md +65 -0
- data/lib/dependabot/file_fetchers/base.rb +302 -0
- data/lib/dependabot/file_fetchers/docker/docker.rb +40 -0
- data/lib/dependabot/file_fetchers/dotnet/nuget.rb +215 -0
- data/lib/dependabot/file_fetchers/dotnet/nuget/import_paths_finder.rb +51 -0
- data/lib/dependabot/file_fetchers/dotnet/nuget/sln_project_paths_finder.rb +55 -0
- data/lib/dependabot/file_fetchers/elixir/hex.rb +78 -0
- data/lib/dependabot/file_fetchers/elm/elm_package.rb +52 -0
- data/lib/dependabot/file_fetchers/git/submodules.rb +73 -0
- data/lib/dependabot/file_fetchers/go/dep.rb +69 -0
- data/lib/dependabot/file_fetchers/go/modules.rb +64 -0
- data/lib/dependabot/file_fetchers/java/gradle.rb +56 -0
- data/lib/dependabot/file_fetchers/java/gradle/settings_file_parser.rb +66 -0
- data/lib/dependabot/file_fetchers/java/maven.rb +127 -0
- data/lib/dependabot/file_fetchers/java_script/npm_and_yarn.rb +330 -0
- data/lib/dependabot/file_fetchers/java_script/npm_and_yarn/path_dependency_builder.rb +107 -0
- data/lib/dependabot/file_fetchers/php/composer.rb +131 -0
- data/lib/dependabot/file_fetchers/python/pip.rb +305 -0
- data/lib/dependabot/file_fetchers/ruby/bundler.rb +185 -0
- data/lib/dependabot/file_fetchers/ruby/bundler/child_gemfile_finder.rb +70 -0
- data/lib/dependabot/file_fetchers/ruby/bundler/path_gemspec_finder.rb +114 -0
- data/lib/dependabot/file_fetchers/ruby/bundler/require_relative_finder.rb +67 -0
- data/lib/dependabot/file_fetchers/rust/cargo.rb +240 -0
- data/lib/dependabot/file_parsers.rb +48 -0
- data/lib/dependabot/file_parsers/README.md +45 -0
- data/lib/dependabot/file_parsers/base.rb +31 -0
- data/lib/dependabot/file_parsers/base/dependency_set.rb +77 -0
- data/lib/dependabot/file_parsers/docker/docker.rb +164 -0
- data/lib/dependabot/file_parsers/dotnet/nuget.rb +85 -0
- data/lib/dependabot/file_parsers/dotnet/nuget/packages_config_parser.rb +65 -0
- data/lib/dependabot/file_parsers/dotnet/nuget/project_file_parser.rb +156 -0
- data/lib/dependabot/file_parsers/dotnet/nuget/property_value_finder.rb +131 -0
- data/lib/dependabot/file_parsers/elixir/hex.rb +134 -0
- data/lib/dependabot/file_parsers/elm/elm_package.rb +136 -0
- data/lib/dependabot/file_parsers/git/submodules.rb +69 -0
- data/lib/dependabot/file_parsers/go/dep.rb +163 -0
- data/lib/dependabot/file_parsers/go/modules.rb +34 -0
- data/lib/dependabot/file_parsers/go/modules/go_mod_parser.rb +134 -0
- data/lib/dependabot/file_parsers/java/gradle.rb +236 -0
- data/lib/dependabot/file_parsers/java/gradle/property_value_finder.rb +90 -0
- data/lib/dependabot/file_parsers/java/gradle/repositories_finder.rb +145 -0
- data/lib/dependabot/file_parsers/java/maven.rb +252 -0
- data/lib/dependabot/file_parsers/java/maven/property_value_finder.rb +166 -0
- data/lib/dependabot/file_parsers/java/maven/repositories_finder.rb +188 -0
- data/lib/dependabot/file_parsers/java_script/npm_and_yarn.rb +394 -0
- data/lib/dependabot/file_parsers/php/composer.rb +177 -0
- data/lib/dependabot/file_parsers/python/pip.rb +223 -0
- data/lib/dependabot/file_parsers/python/pip/pipfile_files_parser.rb +154 -0
- data/lib/dependabot/file_parsers/python/pip/poetry_files_parser.rb +141 -0
- data/lib/dependabot/file_parsers/python/pip/setup_file_parser.rb +160 -0
- data/lib/dependabot/file_parsers/ruby/bundler.rb +295 -0
- data/lib/dependabot/file_parsers/ruby/bundler/file_preparer.rb +85 -0
- data/lib/dependabot/file_parsers/ruby/bundler/gemfile_checker.rb +48 -0
- data/lib/dependabot/file_parsers/rust/cargo.rb +213 -0
- data/lib/dependabot/file_updaters.rb +48 -0
- data/lib/dependabot/file_updaters/README.md +58 -0
- data/lib/dependabot/file_updaters/base.rb +52 -0
- data/lib/dependabot/file_updaters/docker/docker.rb +133 -0
- data/lib/dependabot/file_updaters/dotnet/nuget.rb +151 -0
- data/lib/dependabot/file_updaters/dotnet/nuget/packages_config_declaration_finder.rb +69 -0
- data/lib/dependabot/file_updaters/dotnet/nuget/project_file_declaration_finder.rb +78 -0
- data/lib/dependabot/file_updaters/dotnet/nuget/property_value_updater.rb +64 -0
- data/lib/dependabot/file_updaters/elixir/hex.rb +71 -0
- data/lib/dependabot/file_updaters/elixir/hex/lockfile_updater.rb +147 -0
- data/lib/dependabot/file_updaters/elixir/hex/mixfile_git_pin_updater.rb +53 -0
- data/lib/dependabot/file_updaters/elixir/hex/mixfile_requirement_updater.rb +74 -0
- data/lib/dependabot/file_updaters/elixir/hex/mixfile_sanitizer.rb +28 -0
- data/lib/dependabot/file_updaters/elixir/hex/mixfile_updater.rb +98 -0
- data/lib/dependabot/file_updaters/elm/elm_package.rb +79 -0
- data/lib/dependabot/file_updaters/elm/elm_package/elm_json_updater.rb +69 -0
- data/lib/dependabot/file_updaters/elm/elm_package/elm_package_updater.rb +69 -0
- data/lib/dependabot/file_updaters/git/submodules.rb +38 -0
- data/lib/dependabot/file_updaters/go/dep.rb +77 -0
- data/lib/dependabot/file_updaters/go/dep/lockfile_updater.rb +219 -0
- data/lib/dependabot/file_updaters/go/dep/manifest_updater.rb +155 -0
- data/lib/dependabot/file_updaters/go/modules.rb +71 -0
- data/lib/dependabot/file_updaters/go/modules/go_mod_updater.rb +81 -0
- data/lib/dependabot/file_updaters/java/gradle.rb +176 -0
- data/lib/dependabot/file_updaters/java/gradle/dependency_set_updater.rb +66 -0
- data/lib/dependabot/file_updaters/java/gradle/property_value_updater.rb +58 -0
- data/lib/dependabot/file_updaters/java/maven.rb +155 -0
- data/lib/dependabot/file_updaters/java/maven/declaration_finder.rb +132 -0
- data/lib/dependabot/file_updaters/java/maven/property_value_updater.rb +61 -0
- data/lib/dependabot/file_updaters/java_script/npm_and_yarn.rb +159 -0
- data/lib/dependabot/file_updaters/java_script/npm_and_yarn/npm_lockfile_updater.rb +532 -0
- data/lib/dependabot/file_updaters/java_script/npm_and_yarn/npmrc_builder.rb +191 -0
- data/lib/dependabot/file_updaters/java_script/npm_and_yarn/package_json_preparer.rb +91 -0
- data/lib/dependabot/file_updaters/java_script/npm_and_yarn/package_json_updater.rb +220 -0
- data/lib/dependabot/file_updaters/java_script/npm_and_yarn/yarn_lockfile_updater.rb +475 -0
- data/lib/dependabot/file_updaters/php/composer.rb +78 -0
- data/lib/dependabot/file_updaters/php/composer/lockfile_updater.rb +264 -0
- data/lib/dependabot/file_updaters/php/composer/manifest_updater.rb +70 -0
- data/lib/dependabot/file_updaters/python/pip.rb +147 -0
- data/lib/dependabot/file_updaters/python/pip/pip_compile_file_updater.rb +363 -0
- data/lib/dependabot/file_updaters/python/pip/pipfile_file_updater.rb +397 -0
- data/lib/dependabot/file_updaters/python/pip/pipfile_preparer.rb +125 -0
- data/lib/dependabot/file_updaters/python/pip/poetry_file_updater.rb +289 -0
- data/lib/dependabot/file_updaters/python/pip/pyproject_preparer.rb +105 -0
- data/lib/dependabot/file_updaters/python/pip/requirement_file_updater.rb +166 -0
- data/lib/dependabot/file_updaters/python/pip/requirement_replacer.rb +95 -0
- data/lib/dependabot/file_updaters/python/pip/setup_file_sanitizer.rb +91 -0
- data/lib/dependabot/file_updaters/ruby/bundler.rb +121 -0
- data/lib/dependabot/file_updaters/ruby/bundler/gemfile_updater.rb +116 -0
- data/lib/dependabot/file_updaters/ruby/bundler/gemspec_dependency_name_finder.rb +52 -0
- data/lib/dependabot/file_updaters/ruby/bundler/gemspec_sanitizer.rb +298 -0
- data/lib/dependabot/file_updaters/ruby/bundler/gemspec_updater.rb +64 -0
- data/lib/dependabot/file_updaters/ruby/bundler/git_pin_replacer.rb +80 -0
- data/lib/dependabot/file_updaters/ruby/bundler/git_source_remover.rb +102 -0
- data/lib/dependabot/file_updaters/ruby/bundler/lockfile_updater.rb +384 -0
- data/lib/dependabot/file_updaters/ruby/bundler/requirement_replacer.rb +188 -0
- data/lib/dependabot/file_updaters/rust/cargo.rb +83 -0
- data/lib/dependabot/file_updaters/rust/cargo/lockfile_updater.rb +251 -0
- data/lib/dependabot/file_updaters/rust/cargo/manifest_updater.rb +162 -0
- data/lib/dependabot/git_commit_checker.rb +412 -0
- data/lib/dependabot/metadata_finders.rb +46 -0
- data/lib/dependabot/metadata_finders/README.md +53 -0
- data/lib/dependabot/metadata_finders/base.rb +117 -0
- data/lib/dependabot/metadata_finders/base/changelog_finder.rb +317 -0
- data/lib/dependabot/metadata_finders/base/changelog_pruner.rb +177 -0
- data/lib/dependabot/metadata_finders/base/commits_finder.rb +217 -0
- data/lib/dependabot/metadata_finders/base/release_finder.rb +251 -0
- data/lib/dependabot/metadata_finders/docker/docker.rb +18 -0
- data/lib/dependabot/metadata_finders/dotnet/nuget.rb +116 -0
- data/lib/dependabot/metadata_finders/elixir/hex.rb +69 -0
- data/lib/dependabot/metadata_finders/elm/elm_package.rb +22 -0
- data/lib/dependabot/metadata_finders/git/submodules.rb +20 -0
- data/lib/dependabot/metadata_finders/go/dep.rb +56 -0
- data/lib/dependabot/metadata_finders/java/maven.rb +173 -0
- data/lib/dependabot/metadata_finders/java_script/npm_and_yarn.rb +215 -0
- data/lib/dependabot/metadata_finders/php/composer.rb +66 -0
- data/lib/dependabot/metadata_finders/python/pip.rb +120 -0
- data/lib/dependabot/metadata_finders/ruby/bundler.rb +150 -0
- data/lib/dependabot/metadata_finders/rust/cargo.rb +64 -0
- data/lib/dependabot/pull_request_creator.rb +151 -0
- data/lib/dependabot/pull_request_creator/branch_namer.rb +170 -0
- data/lib/dependabot/pull_request_creator/commit_signer.rb +63 -0
- data/lib/dependabot/pull_request_creator/github.rb +233 -0
- data/lib/dependabot/pull_request_creator/gitlab.rb +122 -0
- data/lib/dependabot/pull_request_creator/labeler.rb +361 -0
- data/lib/dependabot/pull_request_creator/message_builder.rb +888 -0
- data/lib/dependabot/pull_request_updater.rb +43 -0
- data/lib/dependabot/pull_request_updater/github.rb +151 -0
- data/lib/dependabot/shared_helpers.rb +201 -0
- data/lib/dependabot/source.rb +120 -0
- data/lib/dependabot/update_checkers.rb +48 -0
- data/lib/dependabot/update_checkers/README.md +67 -0
- data/lib/dependabot/update_checkers/base.rb +220 -0
- data/lib/dependabot/update_checkers/docker/docker.rb +290 -0
- data/lib/dependabot/update_checkers/dotnet/nuget.rb +127 -0
- data/lib/dependabot/update_checkers/dotnet/nuget/property_updater.rb +97 -0
- data/lib/dependabot/update_checkers/dotnet/nuget/repository_finder.rb +232 -0
- data/lib/dependabot/update_checkers/dotnet/nuget/requirements_updater.rb +81 -0
- data/lib/dependabot/update_checkers/dotnet/nuget/version_finder.rb +231 -0
- data/lib/dependabot/update_checkers/elixir/hex.rb +274 -0
- data/lib/dependabot/update_checkers/elixir/hex/file_preparer.rb +193 -0
- data/lib/dependabot/update_checkers/elixir/hex/requirements_updater.rb +177 -0
- data/lib/dependabot/update_checkers/elixir/hex/version_resolver.rb +175 -0
- data/lib/dependabot/update_checkers/elm/elm_package.rb +126 -0
- data/lib/dependabot/update_checkers/elm/elm_package/cli_parser.rb +33 -0
- data/lib/dependabot/update_checkers/elm/elm_package/elm_18_version_resolver.rb +234 -0
- data/lib/dependabot/update_checkers/elm/elm_package/elm_19_version_resolver.rb +198 -0
- data/lib/dependabot/update_checkers/elm/elm_package/requirements_updater.rb +75 -0
- data/lib/dependabot/update_checkers/git/submodules.rb +52 -0
- data/lib/dependabot/update_checkers/go/dep.rb +311 -0
- data/lib/dependabot/update_checkers/go/dep/file_preparer.rb +221 -0
- data/lib/dependabot/update_checkers/go/dep/latest_version_finder.rb +169 -0
- data/lib/dependabot/update_checkers/go/dep/requirements_updater.rb +223 -0
- data/lib/dependabot/update_checkers/go/dep/version_resolver.rb +164 -0
- data/lib/dependabot/update_checkers/go/modules.rb +112 -0
- data/lib/dependabot/update_checkers/java/gradle.rb +148 -0
- data/lib/dependabot/update_checkers/java/gradle/multi_dependency_updater.rb +105 -0
- data/lib/dependabot/update_checkers/java/gradle/version_finder.rb +183 -0
- data/lib/dependabot/update_checkers/java/maven.rb +159 -0
- data/lib/dependabot/update_checkers/java/maven/property_updater.rb +127 -0
- data/lib/dependabot/update_checkers/java/maven/requirements_updater.rb +92 -0
- data/lib/dependabot/update_checkers/java/maven/version_finder.rb +225 -0
- data/lib/dependabot/update_checkers/java_script/npm_and_yarn.rb +280 -0
- data/lib/dependabot/update_checkers/java_script/npm_and_yarn/latest_version_finder.rb +342 -0
- data/lib/dependabot/update_checkers/java_script/npm_and_yarn/library_detector.rb +69 -0
- data/lib/dependabot/update_checkers/java_script/npm_and_yarn/registry_finder.rb +226 -0
- data/lib/dependabot/update_checkers/java_script/npm_and_yarn/requirements_updater.rb +197 -0
- data/lib/dependabot/update_checkers/java_script/npm_and_yarn/subdependency_version_resolver.rb +228 -0
- data/lib/dependabot/update_checkers/java_script/npm_and_yarn/version_resolver.rb +452 -0
- data/lib/dependabot/update_checkers/php/composer.rb +165 -0
- data/lib/dependabot/update_checkers/php/composer/requirements_updater.rb +243 -0
- data/lib/dependabot/update_checkers/php/composer/version_resolver.rb +203 -0
- data/lib/dependabot/update_checkers/python/pip.rb +227 -0
- data/lib/dependabot/update_checkers/python/pip/latest_version_finder.rb +252 -0
- data/lib/dependabot/update_checkers/python/pip/pip_compile_version_resolver.rb +380 -0
- data/lib/dependabot/update_checkers/python/pip/pipfile_version_resolver.rb +559 -0
- data/lib/dependabot/update_checkers/python/pip/poetry_version_resolver.rb +300 -0
- data/lib/dependabot/update_checkers/python/pip/requirements_updater.rb +367 -0
- data/lib/dependabot/update_checkers/ruby/bundler.rb +324 -0
- data/lib/dependabot/update_checkers/ruby/bundler/file_preparer.rb +278 -0
- data/lib/dependabot/update_checkers/ruby/bundler/force_updater.rb +261 -0
- data/lib/dependabot/update_checkers/ruby/bundler/latest_version_finder.rb +169 -0
- data/lib/dependabot/update_checkers/ruby/bundler/requirements_updater.rb +264 -0
- data/lib/dependabot/update_checkers/ruby/bundler/ruby_requirement_setter.rb +115 -0
- data/lib/dependabot/update_checkers/ruby/bundler/shared_bundler_helpers.rb +243 -0
- data/lib/dependabot/update_checkers/ruby/bundler/version_resolver.rb +255 -0
- data/lib/dependabot/update_checkers/rust/cargo.rb +282 -0
- data/lib/dependabot/update_checkers/rust/cargo/file_preparer.rb +202 -0
- data/lib/dependabot/update_checkers/rust/cargo/requirements_updater.rb +175 -0
- data/lib/dependabot/update_checkers/rust/cargo/version_resolver.rb +242 -0
- data/lib/dependabot/utils.rb +84 -0
- data/lib/dependabot/utils/docker/credentials_finder.rb +65 -0
- data/lib/dependabot/utils/dotnet/requirement.rb +90 -0
- data/lib/dependabot/utils/dotnet/version.rb +22 -0
- data/lib/dependabot/utils/elixir/requirement.rb +53 -0
- data/lib/dependabot/utils/elixir/version.rb +59 -0
- data/lib/dependabot/utils/elm/requirement.rb +92 -0
- data/lib/dependabot/utils/elm/version.rb +19 -0
- data/lib/dependabot/utils/go/path_converter.rb +74 -0
- data/lib/dependabot/utils/go/requirement.rb +152 -0
- data/lib/dependabot/utils/go/shared_helper.rb +20 -0
- data/lib/dependabot/utils/go/version.rb +40 -0
- data/lib/dependabot/utils/java/requirement.rb +110 -0
- data/lib/dependabot/utils/java/version.rb +179 -0
- data/lib/dependabot/utils/java_script/requirement.rb +117 -0
- data/lib/dependabot/utils/java_script/version.rb +30 -0
- data/lib/dependabot/utils/php/requirement.rb +97 -0
- data/lib/dependabot/utils/php/version.rb +22 -0
- data/lib/dependabot/utils/python/requirement.rb +130 -0
- data/lib/dependabot/utils/python/version.rb +88 -0
- data/lib/dependabot/utils/ruby/requirement.rb +26 -0
- data/lib/dependabot/utils/rust/requirement.rb +108 -0
- data/lib/dependabot/utils/rust/version.rb +32 -0
- data/lib/dependabot/version.rb +5 -0
- data/lib/python_requirement_parser.rb +33 -0
- data/lib/python_versions.rb +21 -0
- metadata +641 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "excon"
|
|
4
|
+
require "dependabot/update_checkers/base"
|
|
5
|
+
require "dependabot/shared_helpers"
|
|
6
|
+
require "dependabot/errors"
|
|
7
|
+
|
|
8
|
+
module Dependabot
|
|
9
|
+
module UpdateCheckers
|
|
10
|
+
module Elm
|
|
11
|
+
class ElmPackage < Dependabot::UpdateCheckers::Base
|
|
12
|
+
require_relative "elm_package/requirements_updater"
|
|
13
|
+
require_relative "elm_package/elm_18_version_resolver"
|
|
14
|
+
require_relative "elm_package/elm_19_version_resolver"
|
|
15
|
+
|
|
16
|
+
def latest_version
|
|
17
|
+
@latest_version ||= candidate_versions.max
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Overwrite the base class to allow multi-dependency update PRs for
|
|
21
|
+
# dependencies for which we don't have a version.
|
|
22
|
+
def can_update?(requirements_to_unlock:)
|
|
23
|
+
if dependency.appears_in_lockfile?
|
|
24
|
+
version_can_update?(requirements_to_unlock: requirements_to_unlock)
|
|
25
|
+
elsif requirements_to_unlock == :none
|
|
26
|
+
false
|
|
27
|
+
elsif requirements_to_unlock == :own
|
|
28
|
+
requirements_can_update?
|
|
29
|
+
elsif requirements_to_unlock == :all
|
|
30
|
+
updated_dependencies_after_full_unlock.any?
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def latest_resolvable_version
|
|
35
|
+
@latest_resolvable_version ||=
|
|
36
|
+
version_resolver.
|
|
37
|
+
latest_resolvable_version(unlock_requirement: :own)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def latest_resolvable_version_with_no_unlock
|
|
41
|
+
# Irrelevant, since Elm has a single dependency file (well, there's
|
|
42
|
+
# also `exact-dependencies.json`, but it's not recommended that that
|
|
43
|
+
# is committed).
|
|
44
|
+
nil
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def updated_requirements
|
|
48
|
+
RequirementsUpdater.new(
|
|
49
|
+
requirements: dependency.requirements,
|
|
50
|
+
latest_resolvable_version: latest_resolvable_version
|
|
51
|
+
).updated_requirements
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
def version_resolver
|
|
57
|
+
@version_resolver ||=
|
|
58
|
+
if dependency.requirements.any? { |r| r.fetch(:file) == "elm.json" }
|
|
59
|
+
Elm19VersionResolver.new(
|
|
60
|
+
dependency: dependency,
|
|
61
|
+
dependency_files: dependency_files
|
|
62
|
+
)
|
|
63
|
+
else
|
|
64
|
+
Elm18VersionResolver.new(
|
|
65
|
+
dependency: dependency,
|
|
66
|
+
dependency_files: dependency_files,
|
|
67
|
+
candidate_versions: candidate_versions
|
|
68
|
+
)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def updated_dependencies_after_full_unlock
|
|
73
|
+
version_resolver.updated_dependencies_after_full_unlock
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def latest_version_resolvable_with_full_unlock?
|
|
77
|
+
latest_version == version_resolver.
|
|
78
|
+
latest_resolvable_version(unlock_requirement: :all)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def candidate_versions
|
|
82
|
+
all_versions.
|
|
83
|
+
reject { |v| ignore_reqs.any? { |r| r.satisfied_by?(v) } }
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def all_versions
|
|
87
|
+
return @all_versions if @version_lookup_attempted
|
|
88
|
+
|
|
89
|
+
@version_lookup_attempted = true
|
|
90
|
+
|
|
91
|
+
response = Excon.get(
|
|
92
|
+
"https://package.elm-lang.org/packages/#{dependency.name}/"\
|
|
93
|
+
"releases.json",
|
|
94
|
+
idempotent: true,
|
|
95
|
+
**Dependabot::SharedHelpers.excon_defaults
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
return @all_versions = [] unless response.status == 200
|
|
99
|
+
|
|
100
|
+
@all_versions =
|
|
101
|
+
JSON.parse(response.body).
|
|
102
|
+
keys.
|
|
103
|
+
map { |v| version_class.new(v) }.
|
|
104
|
+
sort
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Overwrite the base class's requirements_up_to_date? method to instead
|
|
108
|
+
# check whether the latest version is allowed
|
|
109
|
+
def requirements_up_to_date?
|
|
110
|
+
return false unless latest_version
|
|
111
|
+
|
|
112
|
+
dependency.requirements.
|
|
113
|
+
map { |r| r.fetch(:requirement) }.
|
|
114
|
+
map { |r| requirement_class.new(r) }.
|
|
115
|
+
all? { |r| r.satisfied_by?(latest_version) }
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def ignore_reqs
|
|
119
|
+
# Note: we use Gem::Requirement here because ignore conditions will
|
|
120
|
+
# be passed as Ruby ranges
|
|
121
|
+
ignored_versions.map { |req| Gem::Requirement.new(req.split(",")) }
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "dependabot/utils/elm/version"
|
|
4
|
+
require "dependabot/update_checkers/elm/elm_package"
|
|
5
|
+
|
|
6
|
+
module Dependabot
|
|
7
|
+
module UpdateCheckers
|
|
8
|
+
module Elm
|
|
9
|
+
class ElmPackage
|
|
10
|
+
class CliParser
|
|
11
|
+
INSTALL_DEPENDENCY_REGEX =
|
|
12
|
+
%r{([^\s]+\/[^\s]+)\s+(\d+\.\d+\.\d+)}.freeze
|
|
13
|
+
UPGRADE_DEPENDENCY_REGEX =
|
|
14
|
+
%r{([^\s]+\/[^\s]+) \(\d+\.\d+\.\d+ => (\d+\.\d+\.\d+)\)}.freeze
|
|
15
|
+
|
|
16
|
+
def self.decode_install_preview(text)
|
|
17
|
+
installs = {}
|
|
18
|
+
|
|
19
|
+
# Parse new installs
|
|
20
|
+
text.scan(INSTALL_DEPENDENCY_REGEX).
|
|
21
|
+
each { |n, v| installs[n] = Utils::Elm::Version.new(v) }
|
|
22
|
+
|
|
23
|
+
# Parse upgrades
|
|
24
|
+
text.scan(UPGRADE_DEPENDENCY_REGEX).
|
|
25
|
+
each { |n, v| installs[n] = Utils::Elm::Version.new(v) }
|
|
26
|
+
|
|
27
|
+
installs
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "dependabot/shared_helpers"
|
|
4
|
+
require "dependabot/errors"
|
|
5
|
+
require "dependabot/file_parsers/elm/elm_package"
|
|
6
|
+
require "dependabot/update_checkers/elm/elm_package"
|
|
7
|
+
require "dependabot/update_checkers/elm/elm_package/cli_parser"
|
|
8
|
+
require "dependabot/update_checkers/elm/elm_package/requirements_updater"
|
|
9
|
+
require "dependabot/utils/elm/requirement"
|
|
10
|
+
|
|
11
|
+
module Dependabot
|
|
12
|
+
module UpdateCheckers
|
|
13
|
+
module Elm
|
|
14
|
+
class ElmPackage
|
|
15
|
+
class Elm18VersionResolver
|
|
16
|
+
class UnrecoverableState < StandardError; end
|
|
17
|
+
|
|
18
|
+
def initialize(dependency:, dependency_files:, candidate_versions:)
|
|
19
|
+
@dependency = dependency
|
|
20
|
+
@dependency_files = dependency_files
|
|
21
|
+
@candidate_versions = candidate_versions
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def latest_resolvable_version(unlock_requirement:)
|
|
25
|
+
unless %i(none own all).include?(unlock_requirement)
|
|
26
|
+
raise "Invalid unlock setting: #{unlock_requirement}"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Elm has no lockfile, so we will never create an update PR if
|
|
30
|
+
# unlock requirements are `none`. Just return the current version.
|
|
31
|
+
return current_version if unlock_requirement == :none
|
|
32
|
+
|
|
33
|
+
# Otherwise, we gotta check a few conditions to see if bumping
|
|
34
|
+
# wouldn't also bump other deps in elm-package.json
|
|
35
|
+
candidate_versions.sort.reverse_each do |version|
|
|
36
|
+
return version if can_update?(version, unlock_requirement)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Fall back to returning the dependency's current version, which is
|
|
40
|
+
# presumed to be resolvable
|
|
41
|
+
current_version
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def updated_dependencies_after_full_unlock
|
|
45
|
+
version = latest_resolvable_version(unlock_requirement: :all)
|
|
46
|
+
deps_after_install = fetch_install_metadata(target_version: version)
|
|
47
|
+
|
|
48
|
+
original_dependency_details.map do |original_dep|
|
|
49
|
+
new_version = deps_after_install.fetch(original_dep.name)
|
|
50
|
+
|
|
51
|
+
old_reqs = original_dep.requirements.map do |req|
|
|
52
|
+
requirement_class.new(req[:requirement])
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
next if old_reqs.all? { |req| req.satisfied_by?(new_version) }
|
|
56
|
+
|
|
57
|
+
new_requirements =
|
|
58
|
+
RequirementsUpdater.new(
|
|
59
|
+
requirements: original_dep.requirements,
|
|
60
|
+
latest_resolvable_version: new_version.to_s
|
|
61
|
+
).updated_requirements
|
|
62
|
+
|
|
63
|
+
Dependency.new(
|
|
64
|
+
name: original_dep.name,
|
|
65
|
+
version: new_version.to_s,
|
|
66
|
+
requirements: new_requirements,
|
|
67
|
+
previous_version: original_dep.version,
|
|
68
|
+
previous_requirements: original_dep.requirements,
|
|
69
|
+
package_manager: original_dep.package_manager
|
|
70
|
+
)
|
|
71
|
+
end.compact
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
private
|
|
75
|
+
|
|
76
|
+
attr_reader :dependency, :dependency_files, :candidate_versions
|
|
77
|
+
|
|
78
|
+
def can_update?(version, unlock_requirement)
|
|
79
|
+
deps_after_install = fetch_install_metadata(target_version: version)
|
|
80
|
+
|
|
81
|
+
result = check_install_result(deps_after_install, version)
|
|
82
|
+
|
|
83
|
+
# If the install was clean then we can definitely update
|
|
84
|
+
return true if result == :clean_bump
|
|
85
|
+
|
|
86
|
+
# Otherwise, we can still update if the result was a forced full
|
|
87
|
+
# unlock and we're allowed to unlock other requirements
|
|
88
|
+
return false unless unlock_requirement == :all
|
|
89
|
+
|
|
90
|
+
result == :forced_full_unlock_bump
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def check_install_result(deps_after_install, target_version)
|
|
94
|
+
# This can go one of 5 ways:
|
|
95
|
+
# 1) We bump our dep and no other dep is bumped
|
|
96
|
+
# 2) We bump our dep and another dep is bumped too
|
|
97
|
+
# Scenario: NoRedInk/datetimepicker bump to 3.0.2 also
|
|
98
|
+
# bumps elm-css to 14
|
|
99
|
+
# 3) We bump our dep but actually elm-package doesn't bump it
|
|
100
|
+
# Scenario: elm-css bump to 14 but datetimepicker is at 3.0.1
|
|
101
|
+
# 4) We bump our dep but elm-package just says
|
|
102
|
+
# "Packages configured successfully!"
|
|
103
|
+
# Narrator: they weren't
|
|
104
|
+
# Scenario: impossible dependency (i.e. elm-css 999.999.999)
|
|
105
|
+
# a <= v < b where a is greater than latest version
|
|
106
|
+
# 5) We bump our dep but elm-package blows up (not handled here)
|
|
107
|
+
# Scenario: rtfeldman/elm-css 14 && rtfeldman/hashed-class 1.0.0
|
|
108
|
+
# I'm not sure what's different from this scenario
|
|
109
|
+
# to 3), why it blows up instead of just rolling
|
|
110
|
+
# elm-css back to version 9 which is what
|
|
111
|
+
# hashed-class requires
|
|
112
|
+
|
|
113
|
+
# 4) We bump our dep but elm-package just says
|
|
114
|
+
# "Packages configured successfully!"
|
|
115
|
+
return :empty_elm_stuff_bug if deps_after_install.empty?
|
|
116
|
+
|
|
117
|
+
version_after_install = deps_after_install.fetch(dependency.name)
|
|
118
|
+
|
|
119
|
+
# 3) We bump our dep but actually elm-package doesn't bump it
|
|
120
|
+
return :downgrade_bug if version_after_install < target_version
|
|
121
|
+
|
|
122
|
+
other_top_level_deps_bumped =
|
|
123
|
+
original_dependency_details.
|
|
124
|
+
reject { |dep| dep.name == dependency.name }.
|
|
125
|
+
select do |dep|
|
|
126
|
+
reqs = dep.requirements.map { |r| r.fetch(:requirement) }
|
|
127
|
+
reqs = reqs.map { |r| requirement_class.new(r) }
|
|
128
|
+
reqs.any? { |r| !r.satisfied_by?(deps_after_install[dep.name]) }
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# 2) We bump our dep and another dep is bumped
|
|
132
|
+
return :forced_full_unlock_bump if other_top_level_deps_bumped.any?
|
|
133
|
+
|
|
134
|
+
# 1) We bump our dep and no other dep is bumped
|
|
135
|
+
:clean_bump
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def fetch_install_metadata(target_version:)
|
|
139
|
+
@install_cache ||= {}
|
|
140
|
+
@install_cache[target_version.to_s] ||=
|
|
141
|
+
SharedHelpers.in_a_temporary_directory do
|
|
142
|
+
write_temporary_dependency_files(target_version: target_version)
|
|
143
|
+
|
|
144
|
+
# Elm package install outputs a preview of the actions to be
|
|
145
|
+
# performed. We can use this preview to calculate whether it
|
|
146
|
+
# would do anything funny
|
|
147
|
+
command = "yes n | elm-package install"
|
|
148
|
+
response = run_shell_command(command)
|
|
149
|
+
|
|
150
|
+
deps_after_install = CliParser.decode_install_preview(response)
|
|
151
|
+
|
|
152
|
+
deps_after_install
|
|
153
|
+
rescue SharedHelpers::HelperSubprocessFailed => error
|
|
154
|
+
# 5) We bump our dep but elm-package blows up
|
|
155
|
+
handle_elm_package_errors(error)
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def run_shell_command(command)
|
|
160
|
+
raw_response = nil
|
|
161
|
+
IO.popen(command, err: %i(child out)) do |process|
|
|
162
|
+
raw_response = process.read
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
# Raise an error with the output from the shell session if Elm
|
|
166
|
+
# returns a non-zero status
|
|
167
|
+
return raw_response if $CHILD_STATUS.success?
|
|
168
|
+
|
|
169
|
+
raise SharedHelpers::HelperSubprocessFailed.new(
|
|
170
|
+
raw_response,
|
|
171
|
+
command
|
|
172
|
+
)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def handle_elm_package_errors(error)
|
|
176
|
+
if error.message.include?("I cannot find a set of packages that " \
|
|
177
|
+
"works with your constraints")
|
|
178
|
+
raise Dependabot::DependencyFileNotResolvable, error.message
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
# I don't know any other errors
|
|
182
|
+
raise error
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def write_temporary_dependency_files(target_version:)
|
|
186
|
+
dependency_files.each do |file|
|
|
187
|
+
path = file.name
|
|
188
|
+
FileUtils.mkdir_p(Pathname.new(path).dirname)
|
|
189
|
+
|
|
190
|
+
File.write(
|
|
191
|
+
path,
|
|
192
|
+
updated_elm_package_content(file.content, target_version)
|
|
193
|
+
)
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
def updated_elm_package_content(content, version)
|
|
198
|
+
json = JSON.parse(content)
|
|
199
|
+
|
|
200
|
+
new_requirement = RequirementsUpdater.new(
|
|
201
|
+
requirements: dependency.requirements,
|
|
202
|
+
latest_resolvable_version: version.to_s
|
|
203
|
+
).updated_requirements.first[:requirement]
|
|
204
|
+
|
|
205
|
+
json["dependencies"][dependency.name] = new_requirement
|
|
206
|
+
JSON.dump(json)
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def original_dependency_details
|
|
210
|
+
@original_dependency_details ||=
|
|
211
|
+
FileParsers::Elm::ElmPackage.new(
|
|
212
|
+
dependency_files: dependency_files,
|
|
213
|
+
source: nil
|
|
214
|
+
).parse
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def current_version
|
|
218
|
+
return unless dependency.version
|
|
219
|
+
|
|
220
|
+
version_class.new(dependency.version)
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def version_class
|
|
224
|
+
Utils::Elm::Version
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
def requirement_class
|
|
228
|
+
Utils::Elm::Requirement
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
end
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "dependabot/shared_helpers"
|
|
4
|
+
require "dependabot/errors"
|
|
5
|
+
require "dependabot/file_parsers/elm/elm_package"
|
|
6
|
+
require "dependabot/update_checkers/elm/elm_package"
|
|
7
|
+
require "dependabot/update_checkers/elm/elm_package/cli_parser"
|
|
8
|
+
require "dependabot/update_checkers/elm/elm_package/requirements_updater"
|
|
9
|
+
require "dependabot/utils/elm/requirement"
|
|
10
|
+
|
|
11
|
+
module Dependabot
|
|
12
|
+
module UpdateCheckers
|
|
13
|
+
module Elm
|
|
14
|
+
class ElmPackage
|
|
15
|
+
class Elm19VersionResolver
|
|
16
|
+
class UnrecoverableState < StandardError; end
|
|
17
|
+
|
|
18
|
+
def initialize(dependency:, dependency_files:)
|
|
19
|
+
@dependency = dependency
|
|
20
|
+
@dependency_files = dependency_files
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def latest_resolvable_version(unlock_requirement:)
|
|
24
|
+
unless %i(none own all).include?(unlock_requirement)
|
|
25
|
+
raise "Invalid unlock setting: #{unlock_requirement}"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Elm has no lockfile, so we will never create an update PR if
|
|
29
|
+
# unlock requirements are `none`. Just return the current version.
|
|
30
|
+
return current_version if unlock_requirement == :none
|
|
31
|
+
|
|
32
|
+
# Otherwise, we gotta check a few conditions to see if bumping
|
|
33
|
+
# wouldn't also bump other deps in elm-package.json
|
|
34
|
+
fetch_latest_resolvable_version(unlock_requirement)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def updated_dependencies_after_full_unlock
|
|
38
|
+
changed_deps = install_metadata
|
|
39
|
+
|
|
40
|
+
original_dependency_details.map do |original_dep|
|
|
41
|
+
new_version = changed_deps.fetch(original_dep.name, nil)
|
|
42
|
+
next unless new_version
|
|
43
|
+
|
|
44
|
+
old_reqs = original_dep.requirements.map do |req|
|
|
45
|
+
requirement_class.new(req[:requirement])
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
next if old_reqs.all? { |req| req.satisfied_by?(new_version) }
|
|
49
|
+
|
|
50
|
+
new_requirements =
|
|
51
|
+
RequirementsUpdater.new(
|
|
52
|
+
requirements: original_dep.requirements,
|
|
53
|
+
latest_resolvable_version: new_version.to_s
|
|
54
|
+
).updated_requirements
|
|
55
|
+
|
|
56
|
+
Dependency.new(
|
|
57
|
+
name: original_dep.name,
|
|
58
|
+
version: new_version.to_s,
|
|
59
|
+
requirements: new_requirements,
|
|
60
|
+
previous_version: original_dep.version,
|
|
61
|
+
previous_requirements: original_dep.requirements,
|
|
62
|
+
package_manager: original_dep.package_manager
|
|
63
|
+
)
|
|
64
|
+
end.compact
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
private
|
|
68
|
+
|
|
69
|
+
attr_reader :dependency, :dependency_files
|
|
70
|
+
|
|
71
|
+
def fetch_latest_resolvable_version(unlock_requirement)
|
|
72
|
+
changed_deps = install_metadata
|
|
73
|
+
|
|
74
|
+
result = check_install_result(changed_deps)
|
|
75
|
+
version_after_install = changed_deps.fetch(dependency.name)
|
|
76
|
+
|
|
77
|
+
# If the install was clean then we can definitely update
|
|
78
|
+
return version_after_install if result == :clean_bump
|
|
79
|
+
|
|
80
|
+
# Otherwise, we can still update if the result was a forced full
|
|
81
|
+
# unlock and we're allowed to unlock other requirements
|
|
82
|
+
return version_after_install if unlock_requirement == :all
|
|
83
|
+
|
|
84
|
+
current_version
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def check_install_result(changed_deps)
|
|
88
|
+
other_deps_bumped =
|
|
89
|
+
changed_deps.
|
|
90
|
+
keys.
|
|
91
|
+
reject { |name| name == dependency.name }
|
|
92
|
+
|
|
93
|
+
return :forced_full_unlock_bump if other_deps_bumped.any?
|
|
94
|
+
|
|
95
|
+
:clean_bump
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def install_metadata
|
|
99
|
+
@install_metadata ||=
|
|
100
|
+
SharedHelpers.in_a_temporary_directory do
|
|
101
|
+
write_temporary_dependency_files
|
|
102
|
+
|
|
103
|
+
# Elm package install outputs a preview of the actions to be
|
|
104
|
+
# performed. We can use this preview to calculate whether it
|
|
105
|
+
# would do anything funny
|
|
106
|
+
command = "yes n | elm19 install #{dependency.name}"
|
|
107
|
+
response = run_shell_command(command)
|
|
108
|
+
|
|
109
|
+
CliParser.decode_install_preview(response)
|
|
110
|
+
rescue SharedHelpers::HelperSubprocessFailed => error
|
|
111
|
+
# 5) We bump our dep but elm blows up
|
|
112
|
+
handle_elm_errors(error)
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def run_shell_command(command)
|
|
117
|
+
raw_response = nil
|
|
118
|
+
IO.popen(command, err: %i(child out)) do |process|
|
|
119
|
+
raw_response = process.read
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Raise an error with the output from the shell session if Elm
|
|
123
|
+
# returns a non-zero status
|
|
124
|
+
return raw_response if $CHILD_STATUS.success?
|
|
125
|
+
|
|
126
|
+
raise SharedHelpers::HelperSubprocessFailed.new(
|
|
127
|
+
raw_response,
|
|
128
|
+
command
|
|
129
|
+
)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def handle_elm_errors(error)
|
|
133
|
+
if error.message.include?("OLD DEPENDENCIES") ||
|
|
134
|
+
error.message.include?("BAD JSON")
|
|
135
|
+
raise Dependabot::DependencyFileNotResolvable, error.message
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# Raise any unrecognised errors
|
|
139
|
+
raise error
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def write_temporary_dependency_files
|
|
143
|
+
dependency_files.each do |file|
|
|
144
|
+
path = file.name
|
|
145
|
+
FileUtils.mkdir_p(Pathname.new(path).dirname)
|
|
146
|
+
|
|
147
|
+
File.write(path, updated_elm_json_content(file.content))
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def updated_elm_json_content(content)
|
|
152
|
+
json = JSON.parse(content)
|
|
153
|
+
|
|
154
|
+
# Delete the dependency from the elm.json, so that we can use
|
|
155
|
+
# `elm install <dependency_name>` to generate the install plan
|
|
156
|
+
%w(dependencies test-dependencies).each do |type|
|
|
157
|
+
if json.dig(type, dependency.name)
|
|
158
|
+
json[type].delete(dependency.name)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
%w(direct indirect).each do |category|
|
|
162
|
+
if json.dig(type, category, dependency.name)
|
|
163
|
+
json[type][category].delete(dependency.name)
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
json["source-directories"] = []
|
|
169
|
+
|
|
170
|
+
JSON.dump(json)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def original_dependency_details
|
|
174
|
+
@original_dependency_details ||=
|
|
175
|
+
FileParsers::Elm::ElmPackage.new(
|
|
176
|
+
dependency_files: dependency_files,
|
|
177
|
+
source: nil
|
|
178
|
+
).parse
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def current_version
|
|
182
|
+
return unless dependency.version
|
|
183
|
+
|
|
184
|
+
version_class.new(dependency.version)
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
def version_class
|
|
188
|
+
Utils::Elm::Version
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
def requirement_class
|
|
192
|
+
Utils::Elm::Requirement
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
end
|