Class: Dependabot::Vcpkg::Package::VersionsDatabase

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/dependabot/vcpkg/package/versions_database.rb

Overview

Reads the vcpkg registry's versions database from the checkout the updater image ships.

versions/<letter>-/<port>.json lists every published version of a port, newest first, along with the scheme it was published under. versions/baseline.json at a given commit gives the version floor that commit sets for every port.

See https://learn.microsoft.com/vcpkg/users/versioning.concepts#acquiring-port-versions

Defined Under Namespace

Classes: PortVersion

Constant Summary collapse

COMMIT_HEADER_PATTERN =
/\A[0-9a-f]{40}\t(?<date>\S+)\z/
ADDED_GIT_TREE_PATTERN =
/\A\+\s*"git-tree":\s*"(?<git_tree>[0-9a-f]{40})"/

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(repository_path: Vcpkg.repository_path) ⇒ VersionsDatabase

Returns a new instance of VersionsDatabase.



34
35
36
37
38
39
40
41
42
# File 'lib/dependabot/vcpkg/package/versions_database.rb', line 34

def initialize(repository_path: Vcpkg.repository_path)
  @repository_path = repository_path
  @port_versions = T.let({}, T::Hash[String, T::Array[PortVersion]])
  @baselines = T.let({}, T::Hash[String, T::Hash[String, Dependabot::Vcpkg::Version]])
  @release_dates = T.let({}, T::Hash[String, T::Hash[String, Time]])
  @release_tags = T.let(nil, T.nilable(T::Array[String]))
  @registry_ref = T.let(nil, T.nilable(String))
  @fetched = T.let(false, T::Boolean)
end

Instance Attribute Details

#repository_pathObject (readonly)

Returns the value of attribute repository_path.



45
46
47
# File 'lib/dependabot/vcpkg/package/versions_database.rb', line 45

def repository_path
  @repository_path
end

Instance Method Details

#ancestor?(ancestor:, descendant:) ⇒ Boolean

Returns:

  • (Boolean)


90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/dependabot/vcpkg/package/versions_database.rb', line 90

def ancestor?(ancestor:, descendant:)
  fetch_registry
  return false unless available?

  Dependabot::SharedHelpers.run_shell_command(
    "git merge-base --is-ancestor #{ancestor} #{descendant}",
    cwd: repository_path
  )
  true
rescue Dependabot::SharedHelpers::HelperSubprocessFailed
  false
end

#available?Boolean

Returns:

  • (Boolean)


48
49
50
# File 'lib/dependabot/vcpkg/package/versions_database.rb', line 48

def available?
  File.directory?(File.join(repository_path, ".git"))
end

#baseline_version_for(port:, ref:) ⇒ Object



60
61
62
# File 'lib/dependabot/vcpkg/package/versions_database.rb', line 60

def baseline_version_for(port:, ref:)
  baseline_versions(ref)[port]
end

#baseline_versions(ref) ⇒ Object



65
66
67
# File 'lib/dependabot/vcpkg/package/versions_database.rb', line 65

def baseline_versions(ref)
  @baselines[ref] ||= read_baseline_versions(ref)
end

#commit_sha_for(ref) ⇒ Object



83
84
85
# File 'lib/dependabot/vcpkg/package/versions_database.rb', line 83

def commit_sha_for(ref)
  run_git("rev-list", "-n", "1", ref)&.strip
end

#registry_refObject



106
107
108
109
110
111
# File 'lib/dependabot/vcpkg/package/versions_database.rb', line 106

def registry_ref
  @registry_ref ||= begin
    remote_ref = "origin/#{VCPKG_DEFAULT_BASELINE_DEFAULT_BRANCH}"
    ref_exists?(remote_ref) ? remote_ref : "HEAD"
  end
end

#release_dates_for(port) ⇒ Object



78
79
80
# File 'lib/dependabot/vcpkg/package/versions_database.rb', line 78

def release_dates_for(port)
  @release_dates[port] ||= read_release_dates(port)
end

#release_tagsObject



71
72
73
# File 'lib/dependabot/vcpkg/package/versions_database.rb', line 71

def release_tags
  @release_tags ||= read_release_tags
end

#versions_for(port) ⇒ Object



54
55
56
# File 'lib/dependabot/vcpkg/package/versions_database.rb', line 54

def versions_for(port)
  @port_versions[port] ||= read_port_versions(port)
end