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,280 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "dependabot/git_commit_checker"
|
|
4
|
+
require "dependabot/update_checkers/base"
|
|
5
|
+
require "dependabot/shared_helpers"
|
|
6
|
+
|
|
7
|
+
module Dependabot
|
|
8
|
+
module UpdateCheckers
|
|
9
|
+
module JavaScript
|
|
10
|
+
class NpmAndYarn < Dependabot::UpdateCheckers::Base
|
|
11
|
+
require_relative "npm_and_yarn/requirements_updater"
|
|
12
|
+
require_relative "npm_and_yarn/library_detector"
|
|
13
|
+
require_relative "npm_and_yarn/latest_version_finder"
|
|
14
|
+
require_relative "npm_and_yarn/version_resolver"
|
|
15
|
+
require_relative "npm_and_yarn/subdependency_version_resolver"
|
|
16
|
+
|
|
17
|
+
def latest_version
|
|
18
|
+
@latest_version ||=
|
|
19
|
+
if git_dependency?
|
|
20
|
+
latest_version_for_git_dependency
|
|
21
|
+
else
|
|
22
|
+
latest_version_details&.fetch(:version)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def latest_resolvable_version
|
|
27
|
+
return unless latest_version
|
|
28
|
+
|
|
29
|
+
@latest_resolvable_version ||=
|
|
30
|
+
if dependency.top_level?
|
|
31
|
+
version_resolver.latest_resolvable_version
|
|
32
|
+
else
|
|
33
|
+
# If the dependency is indirect its version is constrained by the
|
|
34
|
+
# requirements placed on it by dependencies lower down the tree
|
|
35
|
+
subdependency_version_resolver.latest_resolvable_version
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def latest_resolvable_version_with_no_unlock
|
|
40
|
+
return latest_resolvable_version unless dependency.top_level?
|
|
41
|
+
|
|
42
|
+
if git_dependency?
|
|
43
|
+
return latest_resolvable_version_with_no_unlock_for_git_dependency
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
latest_version_finder.latest_resolvable_version_with_no_unlock
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def updated_requirements
|
|
50
|
+
resolvable_version =
|
|
51
|
+
if latest_resolvable_version.is_a?(version_class)
|
|
52
|
+
latest_resolvable_version.to_s
|
|
53
|
+
elsif latest_resolvable_version.nil?
|
|
54
|
+
nil
|
|
55
|
+
else
|
|
56
|
+
latest_version_details&.fetch(:version, nil)&.to_s
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
@updated_requirements ||=
|
|
60
|
+
RequirementsUpdater.new(
|
|
61
|
+
requirements: dependency.requirements,
|
|
62
|
+
updated_source: updated_source,
|
|
63
|
+
latest_version:
|
|
64
|
+
latest_version_details&.fetch(:version, nil)&.to_s,
|
|
65
|
+
latest_resolvable_version: resolvable_version,
|
|
66
|
+
update_strategy: requirements_update_strategy
|
|
67
|
+
).updated_requirements
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def requirements_update_strategy
|
|
71
|
+
# If passed in as an option (in the base class) honour that option
|
|
72
|
+
if @requirements_update_strategy
|
|
73
|
+
return @requirements_update_strategy.to_sym
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Otherwise, widen ranges for libraries and bump versions for apps
|
|
77
|
+
library? ? :widen_ranges : :bump_versions
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
private
|
|
81
|
+
|
|
82
|
+
def latest_version_resolvable_with_full_unlock?
|
|
83
|
+
return unless latest_version
|
|
84
|
+
|
|
85
|
+
# No support for full unlocks for subdependencies yet
|
|
86
|
+
return false unless dependency.top_level?
|
|
87
|
+
|
|
88
|
+
version_resolver.latest_version_resolvable_with_full_unlock?
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def updated_dependencies_after_full_unlock
|
|
92
|
+
version_resolver.dependency_updates_from_full_unlock.
|
|
93
|
+
map { |update_details| build_updated_dependency(update_details) }
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def build_updated_dependency(update_details)
|
|
97
|
+
original_dep = update_details.fetch(:dependency)
|
|
98
|
+
|
|
99
|
+
Dependency.new(
|
|
100
|
+
name: original_dep.name,
|
|
101
|
+
version: update_details.fetch(:version).to_s,
|
|
102
|
+
requirements: RequirementsUpdater.new(
|
|
103
|
+
requirements: original_dep.requirements,
|
|
104
|
+
updated_source: original_dep == dependency ? updated_source : nil,
|
|
105
|
+
latest_version: update_details[:version].to_s,
|
|
106
|
+
latest_resolvable_version: update_details[:version].to_s,
|
|
107
|
+
update_strategy: requirements_update_strategy
|
|
108
|
+
).updated_requirements,
|
|
109
|
+
previous_version: original_dep.version,
|
|
110
|
+
previous_requirements: original_dep.requirements,
|
|
111
|
+
package_manager: original_dep.package_manager
|
|
112
|
+
)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def latest_resolvable_version_with_no_unlock_for_git_dependency
|
|
116
|
+
reqs = dependency.requirements.map do |r|
|
|
117
|
+
next if r.fetch(:requirement).nil?
|
|
118
|
+
|
|
119
|
+
requirement_class.requirements_array(r.fetch(:requirement))
|
|
120
|
+
end.compact
|
|
121
|
+
|
|
122
|
+
return dependency.version if git_commit_checker.pinned?
|
|
123
|
+
|
|
124
|
+
# TODO: Really we should get a tag that satisfies the semver req
|
|
125
|
+
return dependency.version if reqs.any?
|
|
126
|
+
|
|
127
|
+
git_commit_checker.head_commit_for_current_branch
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def latest_version_for_git_dependency
|
|
131
|
+
@latest_version_for_git_dependency ||=
|
|
132
|
+
begin
|
|
133
|
+
latest_release = latest_version_finder.
|
|
134
|
+
latest_version_details_from_registry
|
|
135
|
+
|
|
136
|
+
# If there's been a release that includes the current pinned ref
|
|
137
|
+
# or that the current branch is behind, we switch to that release.
|
|
138
|
+
if git_branch_or_ref_in_release?(latest_release&.fetch(:version))
|
|
139
|
+
latest_release.fetch(:version)
|
|
140
|
+
else
|
|
141
|
+
latest_git_version_details[:sha]
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def should_switch_source_from_git_to_registry?
|
|
147
|
+
return false unless git_dependency?
|
|
148
|
+
return false if latest_version_for_git_dependency.nil?
|
|
149
|
+
|
|
150
|
+
version_class.correct?(latest_version_for_git_dependency)
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def git_branch_or_ref_in_release?(release)
|
|
154
|
+
return false unless release
|
|
155
|
+
|
|
156
|
+
git_commit_checker.branch_or_ref_in_release?(release)
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def latest_version_details
|
|
160
|
+
@latest_version_details ||=
|
|
161
|
+
if git_dependency? && !should_switch_source_from_git_to_registry?
|
|
162
|
+
latest_git_version_details
|
|
163
|
+
else
|
|
164
|
+
latest_version_finder.latest_version_details_from_registry
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def latest_version_finder
|
|
169
|
+
@latest_version_finder ||=
|
|
170
|
+
LatestVersionFinder.new(
|
|
171
|
+
dependency: dependency,
|
|
172
|
+
credentials: credentials,
|
|
173
|
+
dependency_files: dependency_files,
|
|
174
|
+
ignored_versions: ignored_versions
|
|
175
|
+
)
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def version_resolver
|
|
179
|
+
@version_resolver ||=
|
|
180
|
+
VersionResolver.new(
|
|
181
|
+
dependency: dependency,
|
|
182
|
+
credentials: credentials,
|
|
183
|
+
dependency_files: dependency_files,
|
|
184
|
+
latest_allowable_version: latest_version,
|
|
185
|
+
latest_version_finder: latest_version_finder
|
|
186
|
+
)
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def subdependency_version_resolver
|
|
190
|
+
@subdependency_version_resolver ||=
|
|
191
|
+
SubdependencyVersionResolver.new(
|
|
192
|
+
dependency: dependency,
|
|
193
|
+
credentials: credentials,
|
|
194
|
+
dependency_files: dependency_files,
|
|
195
|
+
ignored_versions: ignored_versions
|
|
196
|
+
)
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def git_dependency?
|
|
200
|
+
git_commit_checker.git_dependency?
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
def latest_git_version_details
|
|
204
|
+
semver_req =
|
|
205
|
+
dependency.requirements.
|
|
206
|
+
find { |req| req.dig(:source, :type) == "git" }&.
|
|
207
|
+
fetch(:requirement)
|
|
208
|
+
|
|
209
|
+
# If there was a semver requirement provided or the dependency was
|
|
210
|
+
# pinned to a version, look for the latest tag
|
|
211
|
+
if semver_req || git_commit_checker.pinned_ref_looks_like_version?
|
|
212
|
+
latest_tag = git_commit_checker.local_tag_for_latest_version
|
|
213
|
+
return {
|
|
214
|
+
sha: latest_tag&.fetch(:commit_sha),
|
|
215
|
+
version: latest_tag&.fetch(:tag)&.gsub(/^[^\d]*/, "")
|
|
216
|
+
}
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
# Otherwise, if the gem isn't pinned, the latest version is just the
|
|
220
|
+
# latest commit for the specified branch.
|
|
221
|
+
unless git_commit_checker.pinned?
|
|
222
|
+
return { sha: git_commit_checker.head_commit_for_current_branch }
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
# If the dependency is pinned to a tag that doesn't look like a
|
|
226
|
+
# version then there's nothing we can do.
|
|
227
|
+
{ sha: dependency.version }
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
def updated_source
|
|
231
|
+
# Never need to update source, unless a git_dependency
|
|
232
|
+
return dependency_source_details unless git_dependency?
|
|
233
|
+
|
|
234
|
+
# Source becomes `nil` if switching to default rubygems
|
|
235
|
+
return nil if should_switch_source_from_git_to_registry?
|
|
236
|
+
|
|
237
|
+
# Update the git tag if updating a pinned version
|
|
238
|
+
if git_commit_checker.pinned_ref_looks_like_version? &&
|
|
239
|
+
!git_commit_checker.local_tag_for_latest_version.nil?
|
|
240
|
+
new_tag = git_commit_checker.local_tag_for_latest_version
|
|
241
|
+
return dependency_source_details.merge(ref: new_tag.fetch(:tag))
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
# Otherwise return the original source
|
|
245
|
+
dependency_source_details
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
def library?
|
|
249
|
+
return true unless dependency.version
|
|
250
|
+
return true if dependency_files.any? { |f| f.name == "lerna.json" }
|
|
251
|
+
|
|
252
|
+
@library =
|
|
253
|
+
LibraryDetector.new(package_json_file: package_json).library?
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
def dependency_source_details
|
|
257
|
+
sources =
|
|
258
|
+
dependency.requirements.map { |r| r.fetch(:source) }.uniq.compact
|
|
259
|
+
|
|
260
|
+
raise "Multiple sources! #{sources.join(', ')}" if sources.count > 1
|
|
261
|
+
|
|
262
|
+
sources.first
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
def package_json
|
|
266
|
+
@package_json ||=
|
|
267
|
+
dependency_files.find { |f| f.name == "package.json" }
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
def git_commit_checker
|
|
271
|
+
@git_commit_checker ||=
|
|
272
|
+
GitCommitChecker.new(
|
|
273
|
+
dependency: dependency,
|
|
274
|
+
credentials: credentials
|
|
275
|
+
)
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
end
|
|
279
|
+
end
|
|
280
|
+
end
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "excon"
|
|
4
|
+
require "dependabot/update_checkers/java_script/npm_and_yarn"
|
|
5
|
+
require "dependabot/update_checkers/java_script/npm_and_yarn/registry_finder"
|
|
6
|
+
require "dependabot/utils/java_script/version"
|
|
7
|
+
require "dependabot/utils/java_script/requirement"
|
|
8
|
+
require "dependabot/shared_helpers"
|
|
9
|
+
require "dependabot/errors"
|
|
10
|
+
|
|
11
|
+
module Dependabot
|
|
12
|
+
module UpdateCheckers
|
|
13
|
+
module JavaScript
|
|
14
|
+
class NpmAndYarn
|
|
15
|
+
class LatestVersionFinder
|
|
16
|
+
class RegistryError < StandardError; end
|
|
17
|
+
|
|
18
|
+
def initialize(dependency:, credentials:, dependency_files:,
|
|
19
|
+
ignored_versions:)
|
|
20
|
+
@dependency = dependency
|
|
21
|
+
@credentials = credentials
|
|
22
|
+
@dependency_files = dependency_files
|
|
23
|
+
@ignored_versions = ignored_versions
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def latest_version_details_from_registry
|
|
27
|
+
return nil unless npm_details&.fetch("dist-tags", nil)
|
|
28
|
+
|
|
29
|
+
dist_tag_version = version_from_dist_tags(npm_details)
|
|
30
|
+
return { version: dist_tag_version } if dist_tag_version
|
|
31
|
+
return nil if specified_dist_tag_requirement?
|
|
32
|
+
|
|
33
|
+
{ version: version_from_versions_array }
|
|
34
|
+
rescue Excon::Error::Socket, Excon::Error::Timeout
|
|
35
|
+
raise if dependency_registry == "registry.npmjs.org"
|
|
36
|
+
# Custom registries can be flaky. We don't want to make that
|
|
37
|
+
# our problem, so we quietly return `nil` here.
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def latest_resolvable_version_with_no_unlock
|
|
41
|
+
return unless npm_details
|
|
42
|
+
|
|
43
|
+
if specified_dist_tag_requirement?
|
|
44
|
+
return version_from_dist_tags(npm_details)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
reqs = dependency.requirements.map do |r|
|
|
48
|
+
Utils::JavaScript::Requirement.
|
|
49
|
+
requirements_array(r.fetch(:requirement))
|
|
50
|
+
end.compact
|
|
51
|
+
|
|
52
|
+
possible_versions.
|
|
53
|
+
find do |version|
|
|
54
|
+
reqs.all? { |r| r.any? { |opt| opt.satisfied_by?(version) } } &&
|
|
55
|
+
!yanked?(version)
|
|
56
|
+
end
|
|
57
|
+
rescue Excon::Error::Socket, Excon::Error::Timeout
|
|
58
|
+
raise if dependency_registry == "registry.npmjs.org"
|
|
59
|
+
# Sometimes custom registries are flaky. We don't want to make that
|
|
60
|
+
# our problem, so we quietly return `nil` here.
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def possible_versions
|
|
64
|
+
npm_details.fetch("versions", {}).
|
|
65
|
+
reject { |_, details| details["deprecated"] }.
|
|
66
|
+
keys.map { |v| version_class.new(v) }.
|
|
67
|
+
reject { |v| v.prerelease? && !related_to_current_pre?(v) }.
|
|
68
|
+
reject { |v| ignore_reqs.any? { |r| r.satisfied_by?(v) } }.
|
|
69
|
+
sort.reverse
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def possible_versions_with_details
|
|
73
|
+
npm_details.fetch("versions", {}).
|
|
74
|
+
reject { |_, details| details["deprecated"] }.
|
|
75
|
+
transform_keys { |k| version_class.new(k) }.
|
|
76
|
+
reject { |k, _| k.prerelease? && !related_to_current_pre?(k) }.
|
|
77
|
+
reject { |k, _| ignore_reqs.any? { |r| r.satisfied_by?(k) } }.
|
|
78
|
+
sort_by(&:first).reverse
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
private
|
|
82
|
+
|
|
83
|
+
attr_reader :dependency, :credentials, :dependency_files,
|
|
84
|
+
:ignored_versions
|
|
85
|
+
|
|
86
|
+
def version_from_dist_tags(npm_details)
|
|
87
|
+
dist_tags = npm_details["dist-tags"].keys
|
|
88
|
+
|
|
89
|
+
# Check if a dist tag was specified as a requirement. If it was, and
|
|
90
|
+
# it exists, use it.
|
|
91
|
+
dist_tag_req = dependency.requirements.
|
|
92
|
+
find { |r| dist_tags.include?(r[:requirement]) }&.
|
|
93
|
+
fetch(:requirement)
|
|
94
|
+
|
|
95
|
+
if dist_tag_req
|
|
96
|
+
tag_vers =
|
|
97
|
+
version_class.new(npm_details["dist-tags"][dist_tag_req])
|
|
98
|
+
return tag_vers unless yanked?(tag_vers)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Use the latest dist tag unless there's a reason not to
|
|
102
|
+
return nil unless npm_details["dist-tags"]["latest"]
|
|
103
|
+
|
|
104
|
+
latest = version_class.new(npm_details["dist-tags"]["latest"])
|
|
105
|
+
|
|
106
|
+
wants_latest_dist_tag?(latest) ? latest : nil
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def related_to_current_pre?(version)
|
|
110
|
+
current_version = dependency.version
|
|
111
|
+
if current_version &&
|
|
112
|
+
version_class.correct?(current_version) &&
|
|
113
|
+
version_class.new(current_version).prerelease? &&
|
|
114
|
+
version_class.new(current_version).release == version.release
|
|
115
|
+
return true
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
dependency.requirements.any? do |req|
|
|
119
|
+
next unless req[:requirement]&.match?(/\d-[A-Za-z]/)
|
|
120
|
+
|
|
121
|
+
Utils::JavaScript::Requirement.
|
|
122
|
+
requirements_array(req.fetch(:requirement)).
|
|
123
|
+
any? do |r|
|
|
124
|
+
r.requirements.any? { |a| a.last.release == version.release }
|
|
125
|
+
end
|
|
126
|
+
rescue Gem::Requirement::BadRequirementError
|
|
127
|
+
false
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def specified_dist_tag_requirement?
|
|
132
|
+
dependency.requirements.any? do |req|
|
|
133
|
+
next false if req[:requirement].nil?
|
|
134
|
+
|
|
135
|
+
req[:requirement].match?(/^[A-Za-z]/)
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def wants_latest_dist_tag?(latest_version)
|
|
140
|
+
ver = latest_version
|
|
141
|
+
return false if related_to_current_pre?(ver) ^ ver.prerelease?
|
|
142
|
+
return false if current_version_greater_than?(ver)
|
|
143
|
+
return false if current_requirement_greater_than?(ver)
|
|
144
|
+
return false if ignore_reqs.any? { |r| r.satisfied_by?(ver) }
|
|
145
|
+
return false if yanked?(ver)
|
|
146
|
+
|
|
147
|
+
true
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def current_version_greater_than?(version)
|
|
151
|
+
return false unless dependency.version
|
|
152
|
+
return false unless version_class.correct?(dependency.version)
|
|
153
|
+
|
|
154
|
+
version_class.new(dependency.version) > version
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def current_requirement_greater_than?(version)
|
|
158
|
+
dependency.requirements.any? do |req|
|
|
159
|
+
next false unless req[:requirement]
|
|
160
|
+
|
|
161
|
+
req_version = req[:requirement].sub(/^\^|~|>=?/, "")
|
|
162
|
+
next false unless version_class.correct?(req_version)
|
|
163
|
+
|
|
164
|
+
version_class.new(req_version) > version
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def version_from_versions_array
|
|
169
|
+
possible_versions.find { |version| !yanked?(version) }
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def yanked?(version)
|
|
173
|
+
@yanked ||= {}
|
|
174
|
+
return @yanked[version] if @yanked.key?(version)
|
|
175
|
+
|
|
176
|
+
@yanked[version] =
|
|
177
|
+
begin
|
|
178
|
+
version_not_found =
|
|
179
|
+
Excon.get(
|
|
180
|
+
dependency_url + "/#{version}",
|
|
181
|
+
SharedHelpers.excon_defaults.merge(
|
|
182
|
+
headers: registry_auth_headers,
|
|
183
|
+
idempotent: true
|
|
184
|
+
)
|
|
185
|
+
).status == 404
|
|
186
|
+
version_not_found && version_endpoint_working?
|
|
187
|
+
rescue Excon::Error::Timeout
|
|
188
|
+
# Give the benefit of the doubt if the registry is playing up
|
|
189
|
+
false
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def version_endpoint_working?
|
|
194
|
+
return true if dependency_registry == "registry.npmjs.org"
|
|
195
|
+
|
|
196
|
+
if defined?(@version_endpoint_working)
|
|
197
|
+
return @version_endpoint_working
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
@version_endpoint_working =
|
|
201
|
+
begin
|
|
202
|
+
Excon.get(
|
|
203
|
+
dependency_url + "/latest",
|
|
204
|
+
SharedHelpers.excon_defaults.merge(
|
|
205
|
+
headers: registry_auth_headers,
|
|
206
|
+
idempotent: true
|
|
207
|
+
)
|
|
208
|
+
).status < 400
|
|
209
|
+
rescue Excon::Error::Timeout
|
|
210
|
+
# Give the benefit of the doubt if the registry is playing up
|
|
211
|
+
true
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
def npm_details
|
|
216
|
+
return @npm_details if @npm_details_lookup_attempted
|
|
217
|
+
|
|
218
|
+
@npm_details_lookup_attempted = true
|
|
219
|
+
@npm_details ||=
|
|
220
|
+
begin
|
|
221
|
+
npm_response = fetch_npm_response
|
|
222
|
+
|
|
223
|
+
check_npm_response(npm_response)
|
|
224
|
+
JSON.parse(npm_response.body)
|
|
225
|
+
rescue JSON::ParserError, Excon::Error::Timeout,
|
|
226
|
+
RegistryError => error
|
|
227
|
+
retry_count ||= 0
|
|
228
|
+
retry_count += 1
|
|
229
|
+
raise_npm_details_error(error) if retry_count > 2
|
|
230
|
+
sleep(rand(3.0..10.0)) && retry
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
def fetch_npm_response
|
|
235
|
+
response = Excon.get(
|
|
236
|
+
dependency_url,
|
|
237
|
+
SharedHelpers.excon_defaults.merge(
|
|
238
|
+
headers: registry_auth_headers,
|
|
239
|
+
idempotent: true
|
|
240
|
+
)
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
return response unless response.status == 500
|
|
244
|
+
return response unless registry_auth_headers["Authorization"]
|
|
245
|
+
|
|
246
|
+
auth = registry_auth_headers["Authorization"]
|
|
247
|
+
return response unless auth.start_with?("Basic")
|
|
248
|
+
|
|
249
|
+
decoded_token = Base64.decode64(auth.gsub("Basic ", ""))
|
|
250
|
+
return unless decoded_token.include?(":")
|
|
251
|
+
|
|
252
|
+
username, password = decoded_token.split(":")
|
|
253
|
+
Excon.get(
|
|
254
|
+
dependency_url,
|
|
255
|
+
SharedHelpers.excon_defaults.merge(
|
|
256
|
+
user: username,
|
|
257
|
+
password: password,
|
|
258
|
+
idempotent: true
|
|
259
|
+
)
|
|
260
|
+
)
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
def check_npm_response(npm_response)
|
|
264
|
+
return if git_dependency?
|
|
265
|
+
|
|
266
|
+
if private_dependency_not_reachable?(npm_response)
|
|
267
|
+
raise PrivateSourceAuthenticationFailure, dependency_registry
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
status = npm_response.status
|
|
271
|
+
return if status.to_s.start_with?("2")
|
|
272
|
+
|
|
273
|
+
# Ignore 404s from the registry for updates where a lockfile doesn't
|
|
274
|
+
# need to be generated. The 404 won't cause problems later.
|
|
275
|
+
return if status == 404 && dependency.version.nil?
|
|
276
|
+
|
|
277
|
+
msg = "Got #{status} response with body #{npm_response.body}"
|
|
278
|
+
raise RegistryError, msg
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
def raise_npm_details_error(error)
|
|
282
|
+
raise if dependency_registry == "registry.npmjs.org"
|
|
283
|
+
raise unless error.is_a?(Excon::Error::Timeout)
|
|
284
|
+
|
|
285
|
+
raise PrivateSourceTimedOut, dependency_registry
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
def private_dependency_not_reachable?(npm_response)
|
|
289
|
+
# Check whether this dependency is (likely to be) private
|
|
290
|
+
if dependency_registry == "registry.npmjs.org" &&
|
|
291
|
+
!dependency.name.start_with?("@")
|
|
292
|
+
return false
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
[401, 402, 403, 404].include?(npm_response.status)
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
def dependency_url
|
|
299
|
+
registry_finder.dependency_url
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
def dependency_registry
|
|
303
|
+
registry_finder.registry
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
def registry_auth_headers
|
|
307
|
+
registry_finder.auth_headers
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
def registry_finder
|
|
311
|
+
@registry_finder ||=
|
|
312
|
+
RegistryFinder.new(
|
|
313
|
+
dependency: dependency,
|
|
314
|
+
credentials: credentials,
|
|
315
|
+
npmrc_file: dependency_files.
|
|
316
|
+
find { |f| f.name.end_with?(".npmrc") },
|
|
317
|
+
yarnrc_file: dependency_files.
|
|
318
|
+
find { |f| f.name.end_with?(".yarnrc") }
|
|
319
|
+
)
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
def ignore_reqs
|
|
323
|
+
ignored_versions.
|
|
324
|
+
map { |req| Utils::JavaScript::Requirement.new(req.split(",")) }
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
def version_class
|
|
328
|
+
Utils::JavaScript::Version
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
# TODO: Remove need for me
|
|
332
|
+
def git_dependency?
|
|
333
|
+
GitCommitChecker.new(
|
|
334
|
+
dependency: dependency,
|
|
335
|
+
credentials: credentials
|
|
336
|
+
).git_dependency?
|
|
337
|
+
end
|
|
338
|
+
end
|
|
339
|
+
end
|
|
340
|
+
end
|
|
341
|
+
end
|
|
342
|
+
end
|