Class: Dependabot::Swift::UpdateChecker::XcodeVersionResolver

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/dependabot/swift/update_checker/xcode_version_resolver.rb

Overview

Resolves versions for Xcode-only SwiftPM projects (no Package.swift).

Unlike the classic VersionResolver which relies on swift package update, this resolver uses GitCommitChecker to find the latest available version from git tags, since we cannot run the Swift CLI without a manifest.

Instance Method Summary collapse

Constructor Details

#initialize(dependency:, git_commit_checker:, security_advisories:) ⇒ XcodeVersionResolver

Returns a new instance of XcodeVersionResolver.



30
31
32
33
34
# File 'lib/dependabot/swift/update_checker/xcode_version_resolver.rb', line 30

def initialize(dependency:, git_commit_checker:, security_advisories:)
  @dependency = dependency
  @git_commit_checker = git_commit_checker
  @security_advisories = security_advisories
end

Instance Method Details

#latest_resolvable_versionObject



37
38
39
40
41
42
43
44
45
# File 'lib/dependabot/swift/update_checker/xcode_version_resolver.rb', line 37

def latest_resolvable_version
  tag = latest_resolvable_version_tag
  return nil unless tag

  version = tag_version(tag)
  return nil unless version

  Version.new(version)
end

#latest_resolvable_version_tagObject



50
51
52
53
54
55
# File 'lib/dependabot/swift/update_checker/xcode_version_resolver.rb', line 50

def latest_resolvable_version_tag
  @latest_resolvable_version_tag ||= T.let(
    compute_latest_resolvable_version_tag,
    T.nilable(T::Hash[Symbol, Object])
  )
end

#lowest_security_fix_versionObject



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/dependabot/swift/update_checker/xcode_version_resolver.rb', line 58

def lowest_security_fix_version
  return nil unless version_pinned?

  tags = git_commit_checker.local_tags_for_allowed_versions
  relevant_versions = Dependabot::UpdateCheckers::VersionFilters.filter_vulnerable_versions(
    tags.filter_map { |tag| tag_version(tag) },
    security_advisories
  )
  relevant_tags = tags.select { |tag| (version = tag_version(tag)) && relevant_versions.include?(version) }
  relevant_tags = filter_lower_tags(relevant_tags)

  lowest_tag = relevant_tags.min_by { |tag| T.must(tag_version(tag)) }
  return nil unless lowest_tag

  Version.new(T.must(tag_version(lowest_tag)))
end

#version_pinned?Boolean

Returns:

  • (Boolean)


76
77
78
79
80
# File 'lib/dependabot/swift/update_checker/xcode_version_resolver.rb', line 76

def version_pinned?
  return false unless dependency.version

  Version.correct?(dependency.version)
end