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,177 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "dependabot/metadata_finders/base"
|
|
4
|
+
|
|
5
|
+
module Dependabot
|
|
6
|
+
module MetadataFinders
|
|
7
|
+
class Base
|
|
8
|
+
class ChangelogPruner
|
|
9
|
+
attr_reader :dependency, :changelog_text
|
|
10
|
+
|
|
11
|
+
def initialize(dependency:, changelog_text:)
|
|
12
|
+
@dependency = dependency
|
|
13
|
+
@changelog_text = changelog_text
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def includes_new_version?
|
|
17
|
+
!new_version_changelog_line.nil?
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
|
21
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
|
22
|
+
def pruned_text
|
|
23
|
+
changelog_lines = changelog_text.split("\n")
|
|
24
|
+
|
|
25
|
+
slice_range =
|
|
26
|
+
if old_version_changelog_line && new_version_changelog_line
|
|
27
|
+
if old_version_changelog_line < new_version_changelog_line
|
|
28
|
+
Range.new(old_version_changelog_line, -1)
|
|
29
|
+
else
|
|
30
|
+
Range.new(new_version_changelog_line,
|
|
31
|
+
old_version_changelog_line - 1)
|
|
32
|
+
end
|
|
33
|
+
elsif old_version_changelog_line
|
|
34
|
+
return if old_version_changelog_line.zero?
|
|
35
|
+
|
|
36
|
+
# Assumes changelog is in descending order
|
|
37
|
+
Range.new(0, old_version_changelog_line - 1)
|
|
38
|
+
elsif new_version_changelog_line
|
|
39
|
+
# Assumes changelog is in descending order
|
|
40
|
+
Range.new(new_version_changelog_line, -1)
|
|
41
|
+
else
|
|
42
|
+
return unless changelog_contains_relevant_versions?
|
|
43
|
+
|
|
44
|
+
# If the changelog contains any relevant versions, return it in
|
|
45
|
+
# full. We could do better here by fully parsing the changelog
|
|
46
|
+
Range.new(0, -1)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
changelog_lines.slice(slice_range).join("\n").sub(/\n*\z/, "")
|
|
50
|
+
end
|
|
51
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
|
52
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
def old_version_changelog_line
|
|
57
|
+
old_version = git_source? ? previous_ref : dependency.previous_version
|
|
58
|
+
return nil unless old_version
|
|
59
|
+
|
|
60
|
+
changelog_line_for_version(old_version)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def new_version_changelog_line
|
|
64
|
+
return nil unless new_version
|
|
65
|
+
|
|
66
|
+
changelog_line_for_version(new_version)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
|
70
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
|
71
|
+
def changelog_line_for_version(version)
|
|
72
|
+
raise "No changelog text" unless changelog_text
|
|
73
|
+
return nil unless version
|
|
74
|
+
|
|
75
|
+
version = version.gsub(/^v/, "")
|
|
76
|
+
escaped_version = Regexp.escape(version)
|
|
77
|
+
|
|
78
|
+
changelog_lines = changelog_text.split("\n")
|
|
79
|
+
|
|
80
|
+
changelog_lines.find_index.with_index do |line, index|
|
|
81
|
+
next false unless line.match?(/(?<!\.)#{escaped_version}(?![.\-])/)
|
|
82
|
+
next false if line.match?(/#{escaped_version}\.\./)
|
|
83
|
+
next true if line.start_with?("#", "!", "==")
|
|
84
|
+
next true if line.match?(/^v?#{escaped_version}:?/)
|
|
85
|
+
next true if line.match?(/^[\+\*\-] (version )?#{escaped_version}/i)
|
|
86
|
+
next true if line.match?(/^\d{4}-\d{2}-\d{2}/)
|
|
87
|
+
next true if changelog_lines[index + 1]&.match?(/^[=\-\+]{3,}\s*$/)
|
|
88
|
+
|
|
89
|
+
false
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
|
93
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
|
94
|
+
|
|
95
|
+
def changelog_contains_relevant_versions?
|
|
96
|
+
# Assume the changelog is relevant if we can't parse the new version
|
|
97
|
+
return true unless version_class.correct?(dependency.version)
|
|
98
|
+
|
|
99
|
+
# Assume the changelog is relevant if it mentions the new version
|
|
100
|
+
# anywhere
|
|
101
|
+
return true if changelog_text.include?(dependency.version)
|
|
102
|
+
|
|
103
|
+
# Otherwise check if any intermediate versions are included in headers
|
|
104
|
+
versions_in_changelog_headers.any? do |version|
|
|
105
|
+
next false unless version <= version_class.new(dependency.version)
|
|
106
|
+
next true unless dependency.previous_version
|
|
107
|
+
next true unless version_class.correct?(dependency.previous_version)
|
|
108
|
+
|
|
109
|
+
version > version_class.new(dependency.previous_version)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def versions_in_changelog_headers
|
|
114
|
+
changelog_lines = changelog_text.split("\n")
|
|
115
|
+
header_lines =
|
|
116
|
+
changelog_lines.select.with_index do |line, index|
|
|
117
|
+
next true if line.start_with?("#", "!")
|
|
118
|
+
next true if line.match?(/^v?\d\.\d/)
|
|
119
|
+
next true if changelog_lines[index + 1]&.match?(/^[=-]+\s*$/)
|
|
120
|
+
|
|
121
|
+
false
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
versions = []
|
|
125
|
+
header_lines.each do |line|
|
|
126
|
+
cleaned_line = line.gsub(/^[^0-9]*/, "").gsub(/[\s,:].*/, "")
|
|
127
|
+
next if cleaned_line.empty? || !version_class.correct?(cleaned_line)
|
|
128
|
+
|
|
129
|
+
versions << version_class.new(cleaned_line)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
versions
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def new_version
|
|
136
|
+
@new_version ||= git_source? ? new_ref : dependency.version
|
|
137
|
+
@new_version&.gsub(/^v/, "")
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def previous_ref
|
|
141
|
+
dependency.previous_requirements.map do |r|
|
|
142
|
+
r.dig(:source, "ref") || r.dig(:source, :ref)
|
|
143
|
+
end.compact.first
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def new_ref
|
|
147
|
+
dependency.requirements.map do |r|
|
|
148
|
+
r.dig(:source, "ref") || r.dig(:source, :ref)
|
|
149
|
+
end.compact.first
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def ref_changed?
|
|
153
|
+
previous_ref && new_ref && previous_ref != new_ref
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# TODO: Refactor me so that Composer doesn't need to be special cased
|
|
157
|
+
def git_source?
|
|
158
|
+
# Special case Composer, which uses git as a source but handles tags
|
|
159
|
+
# internally
|
|
160
|
+
return false if dependency.package_manager == "composer"
|
|
161
|
+
|
|
162
|
+
requirements = dependency.requirements
|
|
163
|
+
sources = requirements.map { |r| r.fetch(:source) }.uniq.compact
|
|
164
|
+
return false if sources.empty?
|
|
165
|
+
raise "Multiple sources! #{sources.join(', ')}" if sources.count > 1
|
|
166
|
+
|
|
167
|
+
source_type = sources.first[:type] || sources.first.fetch("type")
|
|
168
|
+
source_type == "git"
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def version_class
|
|
172
|
+
Utils.version_class_for_package_manager(dependency.package_manager)
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
end
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "dependabot/clients/github_with_retries"
|
|
4
|
+
require "dependabot/clients/gitlab"
|
|
5
|
+
require "dependabot/clients/bitbucket"
|
|
6
|
+
require "dependabot/shared_helpers"
|
|
7
|
+
require "dependabot/metadata_finders/base"
|
|
8
|
+
|
|
9
|
+
module Dependabot
|
|
10
|
+
module MetadataFinders
|
|
11
|
+
class Base
|
|
12
|
+
class CommitsFinder
|
|
13
|
+
attr_reader :source, :dependency, :credentials
|
|
14
|
+
|
|
15
|
+
def initialize(source:, dependency:, credentials:)
|
|
16
|
+
@source = source
|
|
17
|
+
@dependency = dependency
|
|
18
|
+
@credentials = credentials
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def commits_url
|
|
22
|
+
return unless source
|
|
23
|
+
return if source.provider == "azure" # TODO: Fetch Azure commits
|
|
24
|
+
|
|
25
|
+
path =
|
|
26
|
+
case source.provider
|
|
27
|
+
when "github" then github_compare_path(new_tag, previous_tag)
|
|
28
|
+
when "bitbucket" then bitbucket_compare_path(new_tag, previous_tag)
|
|
29
|
+
when "gitlab" then gitlab_compare_path(new_tag, previous_tag)
|
|
30
|
+
else raise "Unexpected source provider '#{source.provider}'"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
"#{source.url}/#{path}"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
|
37
|
+
def commits
|
|
38
|
+
return [] unless source
|
|
39
|
+
return [] unless new_tag && previous_tag
|
|
40
|
+
|
|
41
|
+
case source.provider
|
|
42
|
+
when "github" then fetch_github_commits
|
|
43
|
+
when "bitbucket" then fetch_bitbucket_commits
|
|
44
|
+
when "gitlab" then fetch_gitlab_commits
|
|
45
|
+
when "azure" then [] # TODO: Fetch Azure commits
|
|
46
|
+
else raise "Unexpected source provider '#{source.provider}'"
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
|
50
|
+
|
|
51
|
+
def new_tag
|
|
52
|
+
new_version = dependency.version
|
|
53
|
+
|
|
54
|
+
if git_source?(dependency.requirements) then new_version
|
|
55
|
+
else
|
|
56
|
+
tags = dependency_tags.
|
|
57
|
+
select { |t| t =~ version_regex(new_version) }
|
|
58
|
+
tags.find { |t| t.include?(dependency.name) } || tags.first
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
private
|
|
63
|
+
|
|
64
|
+
def previous_tag
|
|
65
|
+
previous_version = dependency.previous_version
|
|
66
|
+
|
|
67
|
+
if git_source?(dependency.previous_requirements)
|
|
68
|
+
previous_version || previous_ref
|
|
69
|
+
else
|
|
70
|
+
tags = dependency_tags.
|
|
71
|
+
select { |t| t =~ version_regex(previous_version) }
|
|
72
|
+
tags.find { |t| t.include?(dependency.name) } || tags.first
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# TODO: Refactor me so that Composer doesn't need to be special cased
|
|
77
|
+
def git_source?(requirements)
|
|
78
|
+
# Special case Composer, which uses git as a source but handles tags
|
|
79
|
+
# internally
|
|
80
|
+
return false if dependency.package_manager == "composer"
|
|
81
|
+
|
|
82
|
+
sources = requirements.map { |r| r.fetch(:source) }.uniq.compact
|
|
83
|
+
return false if sources.empty?
|
|
84
|
+
raise "Multiple sources! #{sources.join(', ')}" if sources.count > 1
|
|
85
|
+
|
|
86
|
+
source_type = sources.first[:type] || sources.first.fetch("type")
|
|
87
|
+
source_type == "git"
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def previous_ref
|
|
91
|
+
return unless git_source?(dependency.previous_requirements)
|
|
92
|
+
|
|
93
|
+
dependency.previous_requirements.map do |r|
|
|
94
|
+
r.dig(:source, "ref") || r.dig(:source, :ref)
|
|
95
|
+
end.compact.first
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def version_regex(version)
|
|
99
|
+
/(?:[^0-9\.]|\A)#{Regexp.escape(version || "unknown")}\z/
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def dependency_tags
|
|
103
|
+
@dependency_tags ||= fetch_dependency_tags
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def fetch_dependency_tags
|
|
107
|
+
return [] unless source
|
|
108
|
+
|
|
109
|
+
case source.provider
|
|
110
|
+
when "github"
|
|
111
|
+
github_client.tags(source.repo, per_page: 100).map(&:name)
|
|
112
|
+
when "bitbucket"
|
|
113
|
+
bitbucket_client.tags(source.repo).map { |tag| tag["name"] }
|
|
114
|
+
when "gitlab"
|
|
115
|
+
gitlab_client.tags(source.repo).map(&:name)
|
|
116
|
+
when "azure"
|
|
117
|
+
[] # TODO: Fetch Azure tags
|
|
118
|
+
else raise "Unexpected source provider '#{source.provider}'"
|
|
119
|
+
end
|
|
120
|
+
rescue Octokit::NotFound, Gitlab::Error::NotFound,
|
|
121
|
+
Dependabot::Clients::Bitbucket::NotFound
|
|
122
|
+
[]
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def github_compare_path(new_tag, previous_tag)
|
|
126
|
+
if new_tag && previous_tag
|
|
127
|
+
"compare/#{previous_tag}...#{new_tag}"
|
|
128
|
+
elsif new_tag
|
|
129
|
+
"commits/#{new_tag}"
|
|
130
|
+
else
|
|
131
|
+
"commits"
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def bitbucket_compare_path(new_tag, previous_tag)
|
|
136
|
+
if new_tag && previous_tag
|
|
137
|
+
"branches/compare/#{new_tag}..#{previous_tag}"
|
|
138
|
+
elsif new_tag
|
|
139
|
+
"commits/tag/#{new_tag}"
|
|
140
|
+
else
|
|
141
|
+
"commits"
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def gitlab_compare_path(new_tag, previous_tag)
|
|
146
|
+
if new_tag && previous_tag
|
|
147
|
+
"compare/#{previous_tag}...#{new_tag}"
|
|
148
|
+
elsif new_tag
|
|
149
|
+
"commits/#{new_tag}"
|
|
150
|
+
else
|
|
151
|
+
"commits/master"
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def fetch_github_commits
|
|
156
|
+
commits =
|
|
157
|
+
github_client.compare(source.repo, previous_tag, new_tag).commits
|
|
158
|
+
return [] unless commits
|
|
159
|
+
|
|
160
|
+
commits.map do |commit|
|
|
161
|
+
{
|
|
162
|
+
message: commit.commit.message,
|
|
163
|
+
sha: commit.sha,
|
|
164
|
+
html_url: commit.html_url
|
|
165
|
+
}
|
|
166
|
+
end
|
|
167
|
+
rescue Octokit::NotFound
|
|
168
|
+
[]
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def fetch_bitbucket_commits
|
|
172
|
+
bitbucket_client.
|
|
173
|
+
compare(source.repo, previous_tag, new_tag).
|
|
174
|
+
map do |commit|
|
|
175
|
+
{
|
|
176
|
+
message: commit.dig("summary", "raw"),
|
|
177
|
+
sha: commit["hash"],
|
|
178
|
+
html_url: commit.dig("links", "html", "href")
|
|
179
|
+
}
|
|
180
|
+
end
|
|
181
|
+
rescue Dependabot::Clients::Bitbucket::NotFound
|
|
182
|
+
[]
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def fetch_gitlab_commits
|
|
186
|
+
gitlab_client.
|
|
187
|
+
compare(source.repo, previous_tag, new_tag).
|
|
188
|
+
commits.
|
|
189
|
+
map do |commit|
|
|
190
|
+
{
|
|
191
|
+
message: commit["message"],
|
|
192
|
+
sha: commit["id"],
|
|
193
|
+
html_url: "#{source.url}/commit/#{commit['id']}"
|
|
194
|
+
}
|
|
195
|
+
end
|
|
196
|
+
rescue Gitlab::Error::NotFound
|
|
197
|
+
[]
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def gitlab_client
|
|
201
|
+
@gitlab_client ||= Dependabot::Clients::Gitlab.
|
|
202
|
+
for_gitlab_dot_com(credentials: credentials)
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def github_client
|
|
206
|
+
@github_client ||= Dependabot::Clients::GithubWithRetries.
|
|
207
|
+
for_github_dot_com(credentials: credentials)
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
def bitbucket_client
|
|
211
|
+
@bitbucket_client ||= Dependabot::Clients::Bitbucket.
|
|
212
|
+
for_bitbucket_dot_org(credentials: credentials)
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
end
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "dependabot/clients/github_with_retries"
|
|
4
|
+
require "dependabot/clients/gitlab"
|
|
5
|
+
require "dependabot/metadata_finders/base"
|
|
6
|
+
require "dependabot/utils"
|
|
7
|
+
|
|
8
|
+
module Dependabot
|
|
9
|
+
module MetadataFinders
|
|
10
|
+
class Base
|
|
11
|
+
class ReleaseFinder
|
|
12
|
+
attr_reader :dependency, :credentials, :source
|
|
13
|
+
|
|
14
|
+
def initialize(source:, dependency:, credentials:)
|
|
15
|
+
@source = source
|
|
16
|
+
@dependency = dependency
|
|
17
|
+
@credentials = credentials
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def releases_url
|
|
21
|
+
return unless source
|
|
22
|
+
|
|
23
|
+
case source.provider
|
|
24
|
+
when "github" then "#{source.url}/releases"
|
|
25
|
+
when "gitlab" then "#{source.url}/tags"
|
|
26
|
+
when "bitbucket" then nil
|
|
27
|
+
when "azure" then "#{source.url}/tags"
|
|
28
|
+
else raise "Unexpected repo provider '#{source.provider}'"
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def releases_text
|
|
33
|
+
return unless relevant_releases.any?
|
|
34
|
+
return if relevant_releases.all? { |r| r.body.nil? || r.body == "" }
|
|
35
|
+
|
|
36
|
+
relevant_releases.map { |r| serialize_release(r) }.join("\n\n")
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
private
|
|
40
|
+
|
|
41
|
+
def all_dep_releases
|
|
42
|
+
releases = all_releases
|
|
43
|
+
dep_prefix = dependency.name.downcase
|
|
44
|
+
|
|
45
|
+
releases_with_dependency_name =
|
|
46
|
+
releases.
|
|
47
|
+
reject { |r| r.tag_name.nil? }.
|
|
48
|
+
select { |r| r.tag_name.downcase.include?(dep_prefix) }
|
|
49
|
+
|
|
50
|
+
return releases unless releases_with_dependency_name.any?
|
|
51
|
+
|
|
52
|
+
releases_with_dependency_name
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def all_releases
|
|
56
|
+
@all_releases ||= fetch_dependency_releases
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def relevant_releases
|
|
60
|
+
releases = releases_since_previous_version
|
|
61
|
+
|
|
62
|
+
# Sometimes we can't filter the releases properly (if they're
|
|
63
|
+
# prefixed by a number that gets confused with the version). In this
|
|
64
|
+
# case, the best we can do is return nil.
|
|
65
|
+
return [] unless releases.any?
|
|
66
|
+
|
|
67
|
+
if updated_release && version_class.correct?(dependency.version)
|
|
68
|
+
releases = filter_releases_using_updated_release(releases)
|
|
69
|
+
filter_releases_using_updated_version(releases, conservative: true)
|
|
70
|
+
elsif updated_release
|
|
71
|
+
filter_releases_using_updated_release(releases)
|
|
72
|
+
elsif version_class.correct?(dependency.version)
|
|
73
|
+
filter_releases_using_updated_version(releases, conservative: false)
|
|
74
|
+
else
|
|
75
|
+
[updated_release].compact
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def releases_since_previous_version
|
|
80
|
+
previous_version = dependency.previous_version
|
|
81
|
+
return [updated_release].compact unless previous_version
|
|
82
|
+
|
|
83
|
+
if previous_release && version_class.correct?(previous_version)
|
|
84
|
+
releases = filter_releases_using_previous_release(all_dep_releases)
|
|
85
|
+
filter_releases_using_previous_version(releases, conservative: true)
|
|
86
|
+
elsif previous_release
|
|
87
|
+
filter_releases_using_previous_release(all_dep_releases)
|
|
88
|
+
elsif version_class.correct?(previous_version)
|
|
89
|
+
filter_releases_using_previous_version(
|
|
90
|
+
all_dep_releases,
|
|
91
|
+
conservative: false
|
|
92
|
+
)
|
|
93
|
+
else
|
|
94
|
+
[updated_release].compact
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def filter_releases_using_previous_release(releases)
|
|
99
|
+
releases.first(releases.index(previous_release))
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def filter_releases_using_updated_release(releases)
|
|
103
|
+
releases[releases.index(updated_release)..-1]
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def filter_releases_using_previous_version(releases, conservative:)
|
|
107
|
+
previous_version = version_class.new(dependency.previous_version)
|
|
108
|
+
|
|
109
|
+
releases.reject do |release|
|
|
110
|
+
cleaned_tag = release.tag_name.gsub(/^[^0-9]*/, "")
|
|
111
|
+
cleaned_name = release.name&.gsub(/^[^0-9]*/, "")
|
|
112
|
+
|
|
113
|
+
tag_version = [cleaned_tag, cleaned_name].compact.reject(&:empty?).
|
|
114
|
+
select { |nm| version_class.correct?(nm) }.
|
|
115
|
+
map { |nm| version_class.new(nm) }.max
|
|
116
|
+
|
|
117
|
+
next conservative unless tag_version
|
|
118
|
+
|
|
119
|
+
# Reject any releases that are less than the previous version
|
|
120
|
+
# (e.g., if two major versions are being maintained)
|
|
121
|
+
tag_version <= previous_version
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def filter_releases_using_updated_version(releases, conservative:)
|
|
126
|
+
updated_version = version_class.new(dependency.version)
|
|
127
|
+
|
|
128
|
+
releases.reject do |release|
|
|
129
|
+
cleaned_tag = release.tag_name.gsub(/^[^0-9]*/, "")
|
|
130
|
+
cleaned_name = release.name&.gsub(/^[^0-9]*/, "")
|
|
131
|
+
|
|
132
|
+
tag_version = [cleaned_tag, cleaned_name].compact.reject(&:empty?).
|
|
133
|
+
select { |nm| version_class.correct?(nm) }.
|
|
134
|
+
map { |nm| version_class.new(nm) }.min
|
|
135
|
+
|
|
136
|
+
next conservative unless tag_version
|
|
137
|
+
|
|
138
|
+
# Reject any releases that are greater than the updated version
|
|
139
|
+
# (e.g., if two major versions are being maintained)
|
|
140
|
+
tag_version > updated_version
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def updated_release
|
|
145
|
+
release_for_version(dependency.version)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def previous_release
|
|
149
|
+
release_for_version(dependency.previous_version)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def release_for_version(version)
|
|
153
|
+
return nil unless version
|
|
154
|
+
|
|
155
|
+
release_regex = version_regex(version)
|
|
156
|
+
# Doing two loops looks inefficient, but it ensures consistency
|
|
157
|
+
all_dep_releases.find { |r| release_regex.match?(r.tag_name.to_s) } ||
|
|
158
|
+
all_dep_releases.find { |r| release_regex.match?(r.name.to_s) }
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def serialize_release(release)
|
|
162
|
+
rel = release
|
|
163
|
+
title = "## #{rel.name.to_s != '' ? rel.name : rel.tag_name}\n"
|
|
164
|
+
body = if rel.body.to_s.gsub(/\n*\z/m, "") == ""
|
|
165
|
+
"No release notes provided."
|
|
166
|
+
else
|
|
167
|
+
rel.body.gsub(/\n*\z/m, "")
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
release_body_includes_title?(rel) ? body : title + body
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def release_body_includes_title?(release)
|
|
174
|
+
title = release.name.to_s != "" ? release.name : release.tag_name
|
|
175
|
+
release.body.to_s.match?(/\A\s*\#*\s*#{Regexp.quote(title)}/m)
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def version_regex(version)
|
|
179
|
+
/(?:[^0-9\.]|\A)#{Regexp.escape(version || "unknown")}\z/
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def version_class
|
|
183
|
+
Utils.version_class_for_package_manager(dependency.package_manager)
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def fetch_dependency_releases
|
|
187
|
+
return [] unless source
|
|
188
|
+
|
|
189
|
+
case source.provider
|
|
190
|
+
when "github" then fetch_github_releases
|
|
191
|
+
when "bitbucket" then [] # Bitbucket doesn't support releases
|
|
192
|
+
when "gitlab" then fetch_gitlab_releases
|
|
193
|
+
when "azure" then [] # Azure can't list API for annotated tags
|
|
194
|
+
else raise "Unexpected repo provider '#{source.provider}'"
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def fetch_github_releases
|
|
199
|
+
releases = github_client.releases(source.repo, per_page: 100)
|
|
200
|
+
|
|
201
|
+
# Remove any releases without a tag name. These are draft releases and
|
|
202
|
+
# aren't yet associated with a tag, so shouldn't be used.
|
|
203
|
+
releases = releases.reject { |r| r.tag_name.nil? }
|
|
204
|
+
|
|
205
|
+
clean_release_names =
|
|
206
|
+
releases.map { |r| r.tag_name.gsub(/^[^0-9\.]*/, "") }
|
|
207
|
+
|
|
208
|
+
if clean_release_names.all? { |nm| version_class.correct?(nm) }
|
|
209
|
+
releases.sort_by do |r|
|
|
210
|
+
version_class.new(r.tag_name.gsub(/^[^0-9\.]*/, ""))
|
|
211
|
+
end.reverse
|
|
212
|
+
else
|
|
213
|
+
releases.sort_by(&:id).reverse
|
|
214
|
+
end
|
|
215
|
+
rescue Octokit::NotFound
|
|
216
|
+
[]
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def fetch_gitlab_releases
|
|
220
|
+
releases =
|
|
221
|
+
gitlab_client.
|
|
222
|
+
tags(source.repo).
|
|
223
|
+
select(&:release).
|
|
224
|
+
sort_by { |r| r.commit.authored_date }.
|
|
225
|
+
reverse
|
|
226
|
+
|
|
227
|
+
releases.map do |tag|
|
|
228
|
+
OpenStruct.new(
|
|
229
|
+
name: tag.name,
|
|
230
|
+
tag_name: tag.release.tag_name,
|
|
231
|
+
body: tag.release.description,
|
|
232
|
+
html_url: "#{source.url}/tags/#{tag.name}"
|
|
233
|
+
)
|
|
234
|
+
end
|
|
235
|
+
rescue Gitlab::Error::NotFound
|
|
236
|
+
[]
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
def gitlab_client
|
|
240
|
+
@gitlab_client ||= Dependabot::Clients::Gitlab.
|
|
241
|
+
for_gitlab_dot_com(credentials: credentials)
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
def github_client
|
|
245
|
+
@github_client ||= Dependabot::Clients::GithubWithRetries.
|
|
246
|
+
for_github_dot_com(credentials: credentials)
|
|
247
|
+
end
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
end
|