dependabot-vcpkg 0.321.2
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/lib/dependabot/vcpkg/file_fetcher.rb +52 -0
- data/lib/dependabot/vcpkg/file_parser.rb +107 -0
- data/lib/dependabot/vcpkg/file_updater.rb +79 -0
- data/lib/dependabot/vcpkg/language.rb +29 -0
- data/lib/dependabot/vcpkg/metadata_finder.rb +54 -0
- data/lib/dependabot/vcpkg/package/package_details_fetcher.rb +96 -0
- data/lib/dependabot/vcpkg/package_manager.rb +29 -0
- data/lib/dependabot/vcpkg/requirement.rb +24 -0
- data/lib/dependabot/vcpkg/update_checker/latest_version_finder.rb +43 -0
- data/lib/dependabot/vcpkg/update_checker.rb +79 -0
- data/lib/dependabot/vcpkg/version.rb +16 -0
- data/lib/dependabot/vcpkg.rb +43 -0
- metadata +277 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 38707063662244331a728d6c97e056a2023c50320ab12effc358dadd9e08c60c
|
4
|
+
data.tar.gz: 3eb780be16ca540a85c21671f0d606e065c25ab123e4e2142c4448da8133895d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 06dad0ca7ee38a208a615193689009df102d24a840fe69b46e313d73ec819271a3817ceea6af21957fbc2bb71533289b33ca9f7285150da04f3c3396e8938cc4
|
7
|
+
data.tar.gz: 6c9b880041357bd2094b6a0dbbe44533281a6c356546dd840b4a0c6a9186a56c0cd90aa61cedb1d7b4b5d3a5e4d98311c2f099f709092257d71fefba13affee2
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# typed: strong
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "sorbet-runtime"
|
5
|
+
|
6
|
+
require "dependabot/file_fetchers"
|
7
|
+
require "dependabot/file_fetchers/base"
|
8
|
+
|
9
|
+
require "dependabot/vcpkg"
|
10
|
+
|
11
|
+
module Dependabot
|
12
|
+
module Vcpkg
|
13
|
+
class FileFetcher < Dependabot::FileFetchers::Base
|
14
|
+
extend T::Sig
|
15
|
+
|
16
|
+
sig { override.params(filenames: T::Array[String]).returns(T::Boolean) }
|
17
|
+
def self.required_files_in?(filenames)
|
18
|
+
filenames.include?(VCPKG_JSON_FILENAME)
|
19
|
+
end
|
20
|
+
|
21
|
+
sig { override.returns(String) }
|
22
|
+
def self.required_files_message
|
23
|
+
"Repo must contain a vcpkg.json file."
|
24
|
+
end
|
25
|
+
|
26
|
+
sig { override.returns(T::Array[Dependabot::DependencyFile]) }
|
27
|
+
def fetch_files
|
28
|
+
[vcpkg_manifest, vcpkg_configuration].compact
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
sig { returns(T.nilable(Dependabot::DependencyFile)) }
|
34
|
+
def vcpkg_manifest
|
35
|
+
@vcpkg_manifest ||= T.let(
|
36
|
+
fetch_file_if_present(VCPKG_JSON_FILENAME),
|
37
|
+
T.nilable(Dependabot::DependencyFile)
|
38
|
+
)
|
39
|
+
end
|
40
|
+
|
41
|
+
sig { returns(T.nilable(Dependabot::DependencyFile)) }
|
42
|
+
def vcpkg_configuration
|
43
|
+
@vcpkg_configuration ||= T.let(
|
44
|
+
fetch_file_if_present(VCPKG_CONFIGURATION_JSON_FILENAME),
|
45
|
+
T.nilable(Dependabot::DependencyFile)
|
46
|
+
)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
Dependabot::FileFetchers.register("vcpkg", Dependabot::Vcpkg::FileFetcher)
|
@@ -0,0 +1,107 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "sorbet-runtime"
|
5
|
+
|
6
|
+
require "dependabot/dependency"
|
7
|
+
require "dependabot/file_parsers"
|
8
|
+
require "dependabot/file_parsers/base"
|
9
|
+
|
10
|
+
require "dependabot/vcpkg"
|
11
|
+
require "dependabot/vcpkg/language"
|
12
|
+
require "dependabot/vcpkg/package_manager"
|
13
|
+
|
14
|
+
module Dependabot
|
15
|
+
module Vcpkg
|
16
|
+
class FileParser < Dependabot::FileParsers::Base
|
17
|
+
extend T::Sig
|
18
|
+
|
19
|
+
require "dependabot/file_parsers/base/dependency_set"
|
20
|
+
|
21
|
+
sig { override.returns(T::Array[Dependabot::Dependency]) }
|
22
|
+
def parse
|
23
|
+
dependency_set = DependencySet.new
|
24
|
+
|
25
|
+
dependency_files.filter_map { |file| parse_dependency_file(file) }
|
26
|
+
.each { |dependency| dependency_set << dependency }
|
27
|
+
|
28
|
+
dependency_set.dependencies
|
29
|
+
end
|
30
|
+
|
31
|
+
sig { override.returns(Ecosystem) }
|
32
|
+
def ecosystem
|
33
|
+
@ecosystem ||= T.let(
|
34
|
+
Ecosystem.new(
|
35
|
+
name: ECOSYSTEM,
|
36
|
+
package_manager: package_manager,
|
37
|
+
language: language
|
38
|
+
),
|
39
|
+
T.nilable(Ecosystem)
|
40
|
+
)
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
sig { override.void }
|
46
|
+
def check_required_files
|
47
|
+
return if dependency_files.any? { |f| f.name == VCPKG_JSON_FILENAME }
|
48
|
+
|
49
|
+
raise Dependabot::DependencyFileNotFound, VCPKG_JSON_FILENAME
|
50
|
+
end
|
51
|
+
|
52
|
+
sig { params(dependency_file: Dependabot::DependencyFile).returns(T.nilable(Dependabot::Dependency)) }
|
53
|
+
def parse_dependency_file(dependency_file)
|
54
|
+
return unless dependency_file.content
|
55
|
+
|
56
|
+
case dependency_file.name
|
57
|
+
when VCPKG_JSON_FILENAME then parse_vcpkg_json(dependency_file)
|
58
|
+
when VCPKG_CONFIGURATION_JSON_FILENAME then nil # TODO
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
sig { params(dependency_file: Dependabot::DependencyFile).returns(T.nilable(Dependabot::Dependency)) }
|
63
|
+
def parse_vcpkg_json(dependency_file)
|
64
|
+
contents = T.must(dependency_file.content)
|
65
|
+
|
66
|
+
parsed_json = JSON.parse(contents)
|
67
|
+
baseline = parsed_json["builtin-baseline"]
|
68
|
+
return unless baseline
|
69
|
+
|
70
|
+
build_baseline_dependency(baseline: baseline, file: dependency_file)
|
71
|
+
rescue JSON::ParserError
|
72
|
+
raise Dependabot::DependencyFileNotParseable, T.must(dependency_files.first).path
|
73
|
+
end
|
74
|
+
|
75
|
+
sig { params(baseline: String, file: Dependabot::DependencyFile).returns(Dependabot::Dependency) }
|
76
|
+
def build_baseline_dependency(baseline:, file:)
|
77
|
+
Dependabot::Dependency.new(
|
78
|
+
name: VCPKG_DEFAULT_BASELINE_DEPENDENCY_NAME,
|
79
|
+
version: baseline,
|
80
|
+
package_manager: "vcpkg",
|
81
|
+
requirements: [{
|
82
|
+
requirement: nil,
|
83
|
+
groups: [],
|
84
|
+
source: {
|
85
|
+
type: "git",
|
86
|
+
url: VCPKG_DEFAULT_BASELINE_URL,
|
87
|
+
ref: VCPKG_DEFAULT_BASELINE_DEFAULT_BRANCH
|
88
|
+
},
|
89
|
+
file: file.name
|
90
|
+
}]
|
91
|
+
)
|
92
|
+
end
|
93
|
+
|
94
|
+
sig { returns(Ecosystem::VersionManager) }
|
95
|
+
def package_manager
|
96
|
+
@package_manager ||= T.let(PackageManager.new, T.nilable(Dependabot::Vcpkg::PackageManager))
|
97
|
+
end
|
98
|
+
|
99
|
+
sig { returns(Ecosystem::VersionManager) }
|
100
|
+
def language
|
101
|
+
@language ||= T.let(Language.new, T.nilable(Dependabot::Vcpkg::Language))
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
Dependabot::FileParsers.register("vcpkg", Dependabot::Vcpkg::FileParser)
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "json"
|
5
|
+
require "sorbet-runtime"
|
6
|
+
|
7
|
+
require "dependabot/file_updaters"
|
8
|
+
require "dependabot/file_updaters/base"
|
9
|
+
require "dependabot/vcpkg"
|
10
|
+
|
11
|
+
module Dependabot
|
12
|
+
module Vcpkg
|
13
|
+
class FileUpdater < Dependabot::FileUpdaters::Base
|
14
|
+
extend T::Sig
|
15
|
+
|
16
|
+
sig { override.returns(T::Array[Regexp]) }
|
17
|
+
def self.updated_files_regex
|
18
|
+
[
|
19
|
+
/#{VCPKG_JSON_FILENAME}$/o
|
20
|
+
]
|
21
|
+
end
|
22
|
+
|
23
|
+
sig { override.returns(T::Array[Dependabot::DependencyFile]) }
|
24
|
+
def updated_dependency_files
|
25
|
+
vcpkg_json_file = get_original_file(VCPKG_JSON_FILENAME)
|
26
|
+
return [] unless vcpkg_json_file
|
27
|
+
|
28
|
+
return [] unless file_changed?(vcpkg_json_file)
|
29
|
+
|
30
|
+
[updated_file(
|
31
|
+
file: vcpkg_json_file,
|
32
|
+
content: updated_vcpkg_json_content(vcpkg_json_file)
|
33
|
+
)]
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
sig { override.void }
|
39
|
+
def check_required_files
|
40
|
+
return if get_original_file(VCPKG_JSON_FILENAME)
|
41
|
+
|
42
|
+
raise Dependabot::DependencyFileNotFound, VCPKG_JSON_FILENAME
|
43
|
+
end
|
44
|
+
|
45
|
+
sig { params(file: Dependabot::DependencyFile).returns(String) }
|
46
|
+
def updated_vcpkg_json_content(file)
|
47
|
+
content = T.must(file.content)
|
48
|
+
|
49
|
+
parsed_content = JSON.parse(content)
|
50
|
+
|
51
|
+
# Find the baseline dependency and update it
|
52
|
+
dependencies
|
53
|
+
.find { |dep| dep.name == VCPKG_DEFAULT_BASELINE_DEPENDENCY_NAME }
|
54
|
+
&.then { |dep| update_baseline_in_content(parsed_content, dep, file.name) }
|
55
|
+
|
56
|
+
JSON.pretty_generate(parsed_content)
|
57
|
+
rescue JSON::ParserError
|
58
|
+
raise Dependabot::DependencyFileNotParseable, file.path
|
59
|
+
end
|
60
|
+
|
61
|
+
sig { params(content: T::Hash[String, T.untyped], dependency: Dependabot::Dependency, filename: String).void }
|
62
|
+
def update_baseline_in_content(content, dependency, filename)
|
63
|
+
# Find the requirement for this specific file
|
64
|
+
requirement = dependency.requirements.find { |r| r[:file] == filename }
|
65
|
+
return unless requirement
|
66
|
+
|
67
|
+
# Extract and validate the new baseline
|
68
|
+
case requirement[:source]
|
69
|
+
in { ref: String => new_baseline }
|
70
|
+
content["builtin-baseline"] = new_baseline
|
71
|
+
else
|
72
|
+
# Skip if source doesn't have the expected structure
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
Dependabot::FileUpdaters.register("vcpkg", Dependabot::Vcpkg::FileUpdater)
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# typed: strong
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "sorbet-runtime"
|
5
|
+
|
6
|
+
require "dependabot/ecosystem"
|
7
|
+
|
8
|
+
module Dependabot
|
9
|
+
module Vcpkg
|
10
|
+
class Language < Dependabot::Ecosystem::VersionManager
|
11
|
+
extend T::Sig
|
12
|
+
|
13
|
+
sig { void }
|
14
|
+
def initialize
|
15
|
+
super(name: LANGUAGE)
|
16
|
+
end
|
17
|
+
|
18
|
+
sig { override.returns(T::Boolean) }
|
19
|
+
def deprecated?
|
20
|
+
false
|
21
|
+
end
|
22
|
+
|
23
|
+
sig { override.returns(T::Boolean) }
|
24
|
+
def unsupported?
|
25
|
+
false
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "dependabot/metadata_finders"
|
5
|
+
require "dependabot/metadata_finders/base"
|
6
|
+
|
7
|
+
module Dependabot
|
8
|
+
module Vcpkg
|
9
|
+
class MetadataFinder < Dependabot::MetadataFinders::Base
|
10
|
+
extend T::Sig
|
11
|
+
|
12
|
+
sig { override.returns(T.nilable(String)) }
|
13
|
+
def homepage_url
|
14
|
+
# For individual VCPKG packages, try to find their specific homepage
|
15
|
+
# If the dependency has a specific source URL, use that
|
16
|
+
return source_url if source&.url != VCPKG_DEFAULT_BASELINE_URL.chomp(".git")
|
17
|
+
|
18
|
+
# For the main VCPKG baseline dependency, return the VCPKG homepage
|
19
|
+
if dependency.name == VCPKG_DEFAULT_BASELINE_DEPENDENCY_NAME
|
20
|
+
"https://vcpkg.io"
|
21
|
+
else
|
22
|
+
# For individual packages, try to construct their VCPKG page URL
|
23
|
+
"https://vcpkg.io/en/package/#{dependency.name}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
sig { override.returns(T.nilable(Dependabot::Source)) }
|
30
|
+
def look_up_source
|
31
|
+
# Check if this is a Git dependency with a specific source
|
32
|
+
info = dependency.requirements.filter_map { |r| r[:source] }.first
|
33
|
+
|
34
|
+
url =
|
35
|
+
if info.nil?
|
36
|
+
VCPKG_DEFAULT_BASELINE_URL
|
37
|
+
else
|
38
|
+
info[:url] || info.fetch("url", VCPKG_DEFAULT_BASELINE_URL)
|
39
|
+
end
|
40
|
+
Source.from_url(url)
|
41
|
+
end
|
42
|
+
|
43
|
+
sig { override.returns(T.nilable(String)) }
|
44
|
+
def suggested_changelog_url
|
45
|
+
# For the main VCPKG baseline dependency, point to releases
|
46
|
+
return unless dependency.name == VCPKG_DEFAULT_BASELINE_DEPENDENCY_NAME
|
47
|
+
|
48
|
+
"#{VCPKG_DEFAULT_BASELINE_URL}/releases"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
Dependabot::MetadataFinders.register("vcpkg", Dependabot::Vcpkg::MetadataFinder)
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "sorbet-runtime"
|
5
|
+
require "uri"
|
6
|
+
|
7
|
+
require "dependabot/git_commit_checker"
|
8
|
+
require "dependabot/package/package_details"
|
9
|
+
require "dependabot/registry_client"
|
10
|
+
require "dependabot/update_checkers/base"
|
11
|
+
|
12
|
+
require "dependabot/vcpkg/version"
|
13
|
+
|
14
|
+
module Dependabot
|
15
|
+
module Vcpkg
|
16
|
+
module Package
|
17
|
+
class PackageDetailsFetcher
|
18
|
+
extend T::Sig
|
19
|
+
|
20
|
+
sig do
|
21
|
+
params(
|
22
|
+
dependency: Dependabot::Dependency
|
23
|
+
).void
|
24
|
+
end
|
25
|
+
def initialize(dependency:)
|
26
|
+
@dependency = dependency
|
27
|
+
end
|
28
|
+
|
29
|
+
sig { returns(Dependabot::Dependency) }
|
30
|
+
attr_reader :dependency
|
31
|
+
|
32
|
+
sig { returns(T.nilable(Dependabot::Package::PackageDetails)) }
|
33
|
+
def fetch
|
34
|
+
return unless git_dependency?
|
35
|
+
|
36
|
+
Dependabot::GitCommitChecker.new(
|
37
|
+
dependency: dependency,
|
38
|
+
credentials: []
|
39
|
+
).local_tags_for_allowed_versions
|
40
|
+
.map { |tag_info| create_package_release(tag_info) }
|
41
|
+
.reverse
|
42
|
+
.uniq(&:version)
|
43
|
+
.then do |releases|
|
44
|
+
Dependabot::Package::PackageDetails.new(
|
45
|
+
dependency: dependency,
|
46
|
+
releases: releases
|
47
|
+
)
|
48
|
+
end
|
49
|
+
rescue Dependabot::GitDependenciesNotReachable
|
50
|
+
# Fallback to empty releases if git repo is not reachable
|
51
|
+
Dependabot::Package::PackageDetails.new(
|
52
|
+
dependency: dependency,
|
53
|
+
releases: []
|
54
|
+
)
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
sig { returns(T::Boolean) }
|
60
|
+
def git_dependency?
|
61
|
+
dependency.source_details(allowed_types: ["git"]) in { type: "git" }
|
62
|
+
end
|
63
|
+
|
64
|
+
sig { params(tag_info: T::Hash[Symbol, T.untyped]).returns(Dependabot::Package::PackageRelease) }
|
65
|
+
def create_package_release(tag_info)
|
66
|
+
Dependabot::Package::PackageRelease.new(
|
67
|
+
version: Version.new(tag_info.fetch(:tag)),
|
68
|
+
tag: tag_info.fetch(:tag),
|
69
|
+
url: dependency.source_details&.dig(:url),
|
70
|
+
released_at: extract_release_date(tag_info.fetch(:tag)),
|
71
|
+
details: {
|
72
|
+
"commit_sha" => tag_info.fetch(:commit_sha),
|
73
|
+
"tag_sha" => tag_info.fetch(:tag_sha)
|
74
|
+
}
|
75
|
+
)
|
76
|
+
end
|
77
|
+
|
78
|
+
sig { params(tag_name: String).returns(T.nilable(Time)) }
|
79
|
+
def extract_release_date(tag_name)
|
80
|
+
# Extract date from vcpkg tag format like "2025.06.13"
|
81
|
+
# Use pattern matching for cleaner validation and extraction
|
82
|
+
case tag_name.gsub(/^v?/, "")
|
83
|
+
in /^(?<year>\d{4})\.(?<month>\d{2})\.(?<day>\d{2})$/
|
84
|
+
begin
|
85
|
+
Time.new($~[:year].to_i, $~[:month].to_i, $~[:day].to_i)
|
86
|
+
rescue ArgumentError
|
87
|
+
nil
|
88
|
+
end
|
89
|
+
else
|
90
|
+
nil
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# typed: strong
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "sorbet-runtime"
|
5
|
+
|
6
|
+
require "dependabot/ecosystem"
|
7
|
+
|
8
|
+
module Dependabot
|
9
|
+
module Vcpkg
|
10
|
+
class PackageManager < Dependabot::Ecosystem::VersionManager
|
11
|
+
extend T::Sig
|
12
|
+
|
13
|
+
sig { void }
|
14
|
+
def initialize
|
15
|
+
super(name: PACKAGE_MANAGER)
|
16
|
+
end
|
17
|
+
|
18
|
+
sig { override.returns(T::Boolean) }
|
19
|
+
def deprecated?
|
20
|
+
false
|
21
|
+
end
|
22
|
+
|
23
|
+
sig { override.returns(T::Boolean) }
|
24
|
+
def unsupported?
|
25
|
+
false
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# typed: strong
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "sorbet-runtime"
|
5
|
+
|
6
|
+
require "dependabot/requirement"
|
7
|
+
require "dependabot/utils"
|
8
|
+
|
9
|
+
module Dependabot
|
10
|
+
module Vcpkg
|
11
|
+
class Requirement < Dependabot::Requirement
|
12
|
+
extend T::Sig
|
13
|
+
|
14
|
+
# Vcpkg requirements are simple strings, so we can just return a single
|
15
|
+
# requirement object for the given string.
|
16
|
+
sig { override.params(requirement_string: T.nilable(String)).returns(T::Array[Dependabot::Requirement]) }
|
17
|
+
def self.requirements_array(requirement_string)
|
18
|
+
[new(requirement_string)]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
Dependabot::Utils.register_requirement_class("vcpkg", Dependabot::Vcpkg::Requirement)
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "sorbet-runtime"
|
5
|
+
|
6
|
+
require "dependabot/update_checkers/base"
|
7
|
+
require "dependabot/package/package_latest_version_finder"
|
8
|
+
|
9
|
+
require "dependabot/vcpkg/package/package_details_fetcher"
|
10
|
+
require "dependabot/vcpkg/requirement"
|
11
|
+
require "dependabot/vcpkg/version"
|
12
|
+
|
13
|
+
module Dependabot
|
14
|
+
module Vcpkg
|
15
|
+
class UpdateChecker < Dependabot::UpdateCheckers::Base
|
16
|
+
class LatestVersionFinder < Dependabot::Package::PackageLatestVersionFinder
|
17
|
+
extend T::Sig
|
18
|
+
|
19
|
+
sig { override.returns(T.nilable(Dependabot::Package::PackageDetails)) }
|
20
|
+
def package_details
|
21
|
+
@package_details ||= T.let(
|
22
|
+
Package::PackageDetailsFetcher.new(dependency: dependency).fetch,
|
23
|
+
T.nilable(Dependabot::Package::PackageDetails)
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
sig { returns(T.nilable(String)) }
|
28
|
+
def latest_tag
|
29
|
+
available_versions
|
30
|
+
&.then { |releases| filter_by_cooldown(releases) }
|
31
|
+
&.max_by(&:version)
|
32
|
+
&.details
|
33
|
+
&.[]("tag_sha")
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
sig { override.returns(T::Boolean) }
|
39
|
+
def cooldown_enabled? = Dependabot::Experiments.enabled?(:enable_cooldown_for_vcpkg)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# typed: strong
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "sorbet-runtime"
|
5
|
+
|
6
|
+
require "dependabot/errors"
|
7
|
+
require "dependabot/update_checkers"
|
8
|
+
require "dependabot/update_checkers/base"
|
9
|
+
|
10
|
+
module Dependabot
|
11
|
+
module Vcpkg
|
12
|
+
class UpdateChecker < Dependabot::UpdateCheckers::Base
|
13
|
+
extend T::Sig
|
14
|
+
|
15
|
+
require_relative "update_checker/latest_version_finder"
|
16
|
+
|
17
|
+
sig { override.returns(T.nilable(T.any(String, Dependabot::Version))) }
|
18
|
+
def latest_version
|
19
|
+
@latest_version ||= T.let(
|
20
|
+
latest_version_finder.latest_tag,
|
21
|
+
T.nilable(T.any(String, Dependabot::Version))
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Vcpkg baselines don't have resolvability issues since we're dealing with
|
26
|
+
# git tags from the official repository, so these methods delegate to latest_version
|
27
|
+
sig { override.returns(T.nilable(T.any(String, Dependabot::Version))) }
|
28
|
+
def latest_resolvable_version = latest_version
|
29
|
+
|
30
|
+
sig { override.returns(T.nilable(T.any(String, Dependabot::Version))) }
|
31
|
+
def latest_resolvable_version_with_no_unlock = latest_version
|
32
|
+
|
33
|
+
sig { override.returns(T::Array[T::Hash[Symbol, T.untyped]]) }
|
34
|
+
def updated_requirements
|
35
|
+
return dependency.requirements unless latest_version
|
36
|
+
|
37
|
+
dependency.requirements.filter_map do |requirement|
|
38
|
+
source = T.cast(requirement[:source], T.nilable(T::Hash[Symbol, T.untyped]))
|
39
|
+
|
40
|
+
if source
|
41
|
+
requirement.merge(source: source.merge(ref: latest_version.to_s))
|
42
|
+
else
|
43
|
+
requirement
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
# Vcpkg doesn't support full unlocking since dependencies are tracked via baselines
|
51
|
+
sig { override.returns(T::Boolean) }
|
52
|
+
def latest_version_resolvable_with_full_unlock? = false
|
53
|
+
|
54
|
+
sig { override.returns(T::Array[Dependabot::Dependency]) }
|
55
|
+
def updated_dependencies_after_full_unlock
|
56
|
+
raise NotImplementedError, "Vcpkg doesn't support full unlock operations"
|
57
|
+
end
|
58
|
+
|
59
|
+
sig { returns(LatestVersionFinder) }
|
60
|
+
def latest_version_finder
|
61
|
+
@latest_version_finder ||= T.let(
|
62
|
+
LatestVersionFinder.new(
|
63
|
+
dependency: dependency,
|
64
|
+
dependency_files: dependency_files,
|
65
|
+
credentials: credentials,
|
66
|
+
ignored_versions: ignored_versions,
|
67
|
+
security_advisories: security_advisories,
|
68
|
+
cooldown_options: update_cooldown,
|
69
|
+
raise_on_ignored: raise_on_ignored,
|
70
|
+
options: options
|
71
|
+
),
|
72
|
+
T.nilable(LatestVersionFinder)
|
73
|
+
)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
Dependabot::UpdateCheckers.register("vcpkg", Dependabot::Vcpkg::UpdateChecker)
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# typed: strong
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "sorbet-runtime"
|
5
|
+
|
6
|
+
require "dependabot/utils"
|
7
|
+
require "dependabot/version"
|
8
|
+
|
9
|
+
module Dependabot
|
10
|
+
module Vcpkg
|
11
|
+
class Version < Dependabot::Version
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
Dependabot::Utils.register_version_class("vcpkg", Dependabot::Vcpkg::Version)
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# typed: strong
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
# These all need to be required so the various classes can be registered in a
|
5
|
+
# lookup table of package manager names to concrete classes.
|
6
|
+
require "dependabot/vcpkg/language"
|
7
|
+
require "dependabot/vcpkg/package_manager"
|
8
|
+
require "dependabot/vcpkg/file_fetcher"
|
9
|
+
require "dependabot/vcpkg/file_parser"
|
10
|
+
require "dependabot/vcpkg/update_checker"
|
11
|
+
require "dependabot/vcpkg/file_updater"
|
12
|
+
require "dependabot/vcpkg/metadata_finder"
|
13
|
+
require "dependabot/vcpkg/requirement"
|
14
|
+
require "dependabot/vcpkg/version"
|
15
|
+
|
16
|
+
require "dependabot/pull_request_creator/labeler"
|
17
|
+
Dependabot::PullRequestCreator::Labeler
|
18
|
+
.register_label_details("vcpkg", name: "vcpkg_package_manager", colour: "512BD4")
|
19
|
+
|
20
|
+
require "dependabot/dependency"
|
21
|
+
Dependabot::Dependency.register_production_check("vcpkg", ->(_) { true })
|
22
|
+
|
23
|
+
module Dependabot
|
24
|
+
module Vcpkg
|
25
|
+
ECOSYSTEM = "vcpkg"
|
26
|
+
|
27
|
+
PACKAGE_MANAGER = "vcpkg"
|
28
|
+
|
29
|
+
LANGUAGE = "cpp"
|
30
|
+
|
31
|
+
# See: https://learn.microsoft.com/vcpkg/reference/vcpkg-json
|
32
|
+
VCPKG_JSON_FILENAME = "vcpkg.json"
|
33
|
+
|
34
|
+
# See: https://learn.microsoft.com/vcpkg/reference/vcpkg-configuration-json
|
35
|
+
VCPKG_CONFIGURATION_JSON_FILENAME = "vcpkg-configuration.json"
|
36
|
+
|
37
|
+
VCPKG_DEFAULT_BASELINE_DEPENDENCY_NAME = "github.com/microsoft/vcpkg"
|
38
|
+
|
39
|
+
VCPKG_DEFAULT_BASELINE_URL = "https://github.com/microsoft/vcpkg.git"
|
40
|
+
|
41
|
+
VCPKG_DEFAULT_BASELINE_DEFAULT_BRANCH = "master"
|
42
|
+
end
|
43
|
+
end
|
metadata
ADDED
@@ -0,0 +1,277 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dependabot-vcpkg
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.321.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dependabot
|
8
|
+
bindir: bin
|
9
|
+
cert_chain: []
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
11
|
+
dependencies:
|
12
|
+
- !ruby/object:Gem::Dependency
|
13
|
+
name: dependabot-common
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
15
|
+
requirements:
|
16
|
+
- - '='
|
17
|
+
- !ruby/object:Gem::Version
|
18
|
+
version: 0.321.2
|
19
|
+
type: :runtime
|
20
|
+
prerelease: false
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
requirements:
|
23
|
+
- - '='
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: 0.321.2
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: debug
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - "~>"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '1.9'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '1.9'
|
40
|
+
- !ruby/object:Gem::Dependency
|
41
|
+
name: gpgme
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '2.0'
|
47
|
+
type: :development
|
48
|
+
prerelease: false
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '2.0'
|
54
|
+
- !ruby/object:Gem::Dependency
|
55
|
+
name: rake
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '13.2'
|
61
|
+
type: :development
|
62
|
+
prerelease: false
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '13.2'
|
68
|
+
- !ruby/object:Gem::Dependency
|
69
|
+
name: rspec
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '3.12'
|
75
|
+
type: :development
|
76
|
+
prerelease: false
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '3.12'
|
82
|
+
- !ruby/object:Gem::Dependency
|
83
|
+
name: rspec-its
|
84
|
+
requirement: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '1.3'
|
89
|
+
type: :development
|
90
|
+
prerelease: false
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '1.3'
|
96
|
+
- !ruby/object:Gem::Dependency
|
97
|
+
name: rspec-sorbet
|
98
|
+
requirement: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '1.9'
|
103
|
+
type: :development
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '1.9'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: rubocop
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - "~>"
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '1.67'
|
117
|
+
type: :development
|
118
|
+
prerelease: false
|
119
|
+
version_requirements: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - "~>"
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '1.67'
|
124
|
+
- !ruby/object:Gem::Dependency
|
125
|
+
name: rubocop-performance
|
126
|
+
requirement: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - "~>"
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '1.22'
|
131
|
+
type: :development
|
132
|
+
prerelease: false
|
133
|
+
version_requirements: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - "~>"
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: '1.22'
|
138
|
+
- !ruby/object:Gem::Dependency
|
139
|
+
name: rubocop-rspec
|
140
|
+
requirement: !ruby/object:Gem::Requirement
|
141
|
+
requirements:
|
142
|
+
- - "~>"
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: '2.29'
|
145
|
+
type: :development
|
146
|
+
prerelease: false
|
147
|
+
version_requirements: !ruby/object:Gem::Requirement
|
148
|
+
requirements:
|
149
|
+
- - "~>"
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '2.29'
|
152
|
+
- !ruby/object:Gem::Dependency
|
153
|
+
name: rubocop-sorbet
|
154
|
+
requirement: !ruby/object:Gem::Requirement
|
155
|
+
requirements:
|
156
|
+
- - "~>"
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '0.8'
|
159
|
+
type: :development
|
160
|
+
prerelease: false
|
161
|
+
version_requirements: !ruby/object:Gem::Requirement
|
162
|
+
requirements:
|
163
|
+
- - "~>"
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0.8'
|
166
|
+
- !ruby/object:Gem::Dependency
|
167
|
+
name: simplecov
|
168
|
+
requirement: !ruby/object:Gem::Requirement
|
169
|
+
requirements:
|
170
|
+
- - "~>"
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: '0.22'
|
173
|
+
type: :development
|
174
|
+
prerelease: false
|
175
|
+
version_requirements: !ruby/object:Gem::Requirement
|
176
|
+
requirements:
|
177
|
+
- - "~>"
|
178
|
+
- !ruby/object:Gem::Version
|
179
|
+
version: '0.22'
|
180
|
+
- !ruby/object:Gem::Dependency
|
181
|
+
name: turbo_tests
|
182
|
+
requirement: !ruby/object:Gem::Requirement
|
183
|
+
requirements:
|
184
|
+
- - "~>"
|
185
|
+
- !ruby/object:Gem::Version
|
186
|
+
version: '2.2'
|
187
|
+
type: :development
|
188
|
+
prerelease: false
|
189
|
+
version_requirements: !ruby/object:Gem::Requirement
|
190
|
+
requirements:
|
191
|
+
- - "~>"
|
192
|
+
- !ruby/object:Gem::Version
|
193
|
+
version: '2.2'
|
194
|
+
- !ruby/object:Gem::Dependency
|
195
|
+
name: vcr
|
196
|
+
requirement: !ruby/object:Gem::Requirement
|
197
|
+
requirements:
|
198
|
+
- - "~>"
|
199
|
+
- !ruby/object:Gem::Version
|
200
|
+
version: '6.1'
|
201
|
+
type: :development
|
202
|
+
prerelease: false
|
203
|
+
version_requirements: !ruby/object:Gem::Requirement
|
204
|
+
requirements:
|
205
|
+
- - "~>"
|
206
|
+
- !ruby/object:Gem::Version
|
207
|
+
version: '6.1'
|
208
|
+
- !ruby/object:Gem::Dependency
|
209
|
+
name: webmock
|
210
|
+
requirement: !ruby/object:Gem::Requirement
|
211
|
+
requirements:
|
212
|
+
- - "~>"
|
213
|
+
- !ruby/object:Gem::Version
|
214
|
+
version: '3.18'
|
215
|
+
type: :development
|
216
|
+
prerelease: false
|
217
|
+
version_requirements: !ruby/object:Gem::Requirement
|
218
|
+
requirements:
|
219
|
+
- - "~>"
|
220
|
+
- !ruby/object:Gem::Version
|
221
|
+
version: '3.18'
|
222
|
+
- !ruby/object:Gem::Dependency
|
223
|
+
name: webrick
|
224
|
+
requirement: !ruby/object:Gem::Requirement
|
225
|
+
requirements:
|
226
|
+
- - "~>"
|
227
|
+
- !ruby/object:Gem::Version
|
228
|
+
version: '1.9'
|
229
|
+
type: :development
|
230
|
+
prerelease: false
|
231
|
+
version_requirements: !ruby/object:Gem::Requirement
|
232
|
+
requirements:
|
233
|
+
- - "~>"
|
234
|
+
- !ruby/object:Gem::Version
|
235
|
+
version: '1.9'
|
236
|
+
description: dependabot-vcpkg provides support for managing VCPKG projects via Dependabot.
|
237
|
+
email: opensource@github.com
|
238
|
+
executables: []
|
239
|
+
extensions: []
|
240
|
+
extra_rdoc_files: []
|
241
|
+
files:
|
242
|
+
- lib/dependabot/vcpkg.rb
|
243
|
+
- lib/dependabot/vcpkg/file_fetcher.rb
|
244
|
+
- lib/dependabot/vcpkg/file_parser.rb
|
245
|
+
- lib/dependabot/vcpkg/file_updater.rb
|
246
|
+
- lib/dependabot/vcpkg/language.rb
|
247
|
+
- lib/dependabot/vcpkg/metadata_finder.rb
|
248
|
+
- lib/dependabot/vcpkg/package/package_details_fetcher.rb
|
249
|
+
- lib/dependabot/vcpkg/package_manager.rb
|
250
|
+
- lib/dependabot/vcpkg/requirement.rb
|
251
|
+
- lib/dependabot/vcpkg/update_checker.rb
|
252
|
+
- lib/dependabot/vcpkg/update_checker/latest_version_finder.rb
|
253
|
+
- lib/dependabot/vcpkg/version.rb
|
254
|
+
homepage: https://github.com/dependabot/dependabot-core
|
255
|
+
licenses:
|
256
|
+
- MIT
|
257
|
+
metadata:
|
258
|
+
bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
|
259
|
+
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.321.2
|
260
|
+
rdoc_options: []
|
261
|
+
require_paths:
|
262
|
+
- lib
|
263
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
264
|
+
requirements:
|
265
|
+
- - ">="
|
266
|
+
- !ruby/object:Gem::Version
|
267
|
+
version: 3.3.0
|
268
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
269
|
+
requirements:
|
270
|
+
- - ">="
|
271
|
+
- !ruby/object:Gem::Version
|
272
|
+
version: 3.3.0
|
273
|
+
requirements: []
|
274
|
+
rubygems_version: 3.6.9
|
275
|
+
specification_version: 4
|
276
|
+
summary: Provides Dependabot support for the VCPKG package manager.
|
277
|
+
test_files: []
|