dependabot-docker 0.385.0 → 0.386.0
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 +4 -4
- data/lib/dependabot/docker/file_parser.rb +4 -4
- data/lib/dependabot/docker/metadata_finder.rb +31 -7
- data/lib/dependabot/docker/update_checker.rb +75 -37
- data/lib/dependabot/docker_compose/file_parser.rb +9 -7
- data/lib/dependabot/shared/shared_file_updater.rb +2 -2
- data/lib/dependabot/shared/utils/helpers.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ffe99e23ddb69d7afac96bf33d403c43b104fa4498dc2ad969025db5cc2dc391
|
|
4
|
+
data.tar.gz: '0785c238b7814483f797a6d31642deb80748a718b386be4f188dc32886d7b6c5'
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: bb35d82d30d4764f37e39346ab21907caa08a895fc7c01d13c3d5e31c916a8b7376fef385c38d77e5dd93c230dd8fc9716f1b642642e4230dfa4db16f5e10cb3
|
|
7
|
+
data.tar.gz: a451bc5070ef987e560032f7761cb8a29d349947cb4dc9e4988a9954fd3e554538f56cde67347ab23a5feb6fb2a6da6e7633eba9a4072a8d063689dcd95b03e9
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# typed:
|
|
1
|
+
# typed: strong
|
|
2
2
|
# frozen_string_literal: true
|
|
3
3
|
|
|
4
4
|
require "dependabot/shared/shared_file_parser"
|
|
@@ -120,7 +120,7 @@ module Dependabot
|
|
|
120
120
|
end
|
|
121
121
|
end
|
|
122
122
|
|
|
123
|
-
sig { params(json_object: T::Hash[
|
|
123
|
+
sig { params(json_object: T::Hash[Object, Object]).returns(T::Array[String]) }
|
|
124
124
|
def deep_fetch_images_from_hash(json_object)
|
|
125
125
|
img = json_object.fetch("image", nil)
|
|
126
126
|
|
|
@@ -136,13 +136,13 @@ module Dependabot
|
|
|
136
136
|
images + json_object.values.flat_map { |obj| deep_fetch_images(obj) }
|
|
137
137
|
end
|
|
138
138
|
|
|
139
|
-
sig { params(img_hash: T::Hash[
|
|
139
|
+
sig { params(img_hash: T::Hash[Object, Object]).returns(T::Array[String]) }
|
|
140
140
|
def parse_helm(img_hash)
|
|
141
141
|
tag_value = img_hash.key?("tag") ? img_hash.fetch("tag", nil) : img_hash.fetch("version", nil)
|
|
142
142
|
return [] unless tag_value
|
|
143
143
|
|
|
144
144
|
repo = img_hash.fetch("repository", nil)
|
|
145
|
-
return [] unless repo
|
|
145
|
+
return [] unless repo.is_a?(String)
|
|
146
146
|
|
|
147
147
|
match = tag_value.to_s.match(TAG_WITH_DIGEST)
|
|
148
148
|
return [] unless match
|
|
@@ -11,6 +11,14 @@ module Dependabot
|
|
|
11
11
|
class MetadataFinder < Dependabot::MetadataFinders::Base
|
|
12
12
|
extend T::Sig
|
|
13
13
|
|
|
14
|
+
DockerSource = T.type_alias do
|
|
15
|
+
T::Hash[Symbol, T.nilable(String)]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
ImageDetails = T.type_alias do
|
|
19
|
+
T::Hash[String, Object]
|
|
20
|
+
end
|
|
21
|
+
|
|
14
22
|
private
|
|
15
23
|
|
|
16
24
|
# Finds the repository for the Docker image using OCI annotations.
|
|
@@ -23,8 +31,7 @@ module Dependabot
|
|
|
23
31
|
return unless new_source && new_source[:registry] && (new_source[:tag] || new_source[:digest])
|
|
24
32
|
|
|
25
33
|
details = image_details(new_source)
|
|
26
|
-
image_source = details
|
|
27
|
-
# Return early if the org.opencontainers.image.source label is not present
|
|
34
|
+
image_source = image_label(details, "org.opencontainers.image.source")
|
|
28
35
|
return unless image_source
|
|
29
36
|
|
|
30
37
|
# If we have a tag, return the source directly without additional version metadata
|
|
@@ -39,9 +46,9 @@ module Dependabot
|
|
|
39
46
|
|
|
40
47
|
sig do
|
|
41
48
|
params(
|
|
42
|
-
source:
|
|
49
|
+
source: DockerSource
|
|
43
50
|
).returns(
|
|
44
|
-
|
|
51
|
+
ImageDetails
|
|
45
52
|
)
|
|
46
53
|
end
|
|
47
54
|
def image_details(source)
|
|
@@ -62,18 +69,35 @@ module Dependabot
|
|
|
62
69
|
JSON.parse(output)
|
|
63
70
|
end
|
|
64
71
|
|
|
72
|
+
sig { params(details: ImageDetails).returns(T.nilable(T::Hash[String, Object])) }
|
|
73
|
+
def image_labels(details)
|
|
74
|
+
config = details["config"]
|
|
75
|
+
return unless config.is_a?(Hash)
|
|
76
|
+
|
|
77
|
+
labels = config["Labels"]
|
|
78
|
+
return unless labels.is_a?(Hash)
|
|
79
|
+
|
|
80
|
+
labels
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
sig { params(details: ImageDetails, label: String).returns(T.nilable(String)) }
|
|
84
|
+
def image_label(details, label)
|
|
85
|
+
value = image_labels(details)&.fetch(label, nil)
|
|
86
|
+
value if value.is_a?(String)
|
|
87
|
+
end
|
|
88
|
+
|
|
65
89
|
# Builds a Dependabot::Source object using the OCI image version label.
|
|
66
90
|
#
|
|
67
91
|
# This is used as a fallback when an image is referenced by digest rather than a tag
|
|
68
92
|
sig do
|
|
69
93
|
params(
|
|
70
94
|
image_source: String,
|
|
71
|
-
details:
|
|
95
|
+
details: ImageDetails
|
|
72
96
|
).returns(T.nilable(Dependabot::Source))
|
|
73
97
|
end
|
|
74
98
|
def build_source_from_image_version(image_source, details)
|
|
75
|
-
image_version = details
|
|
76
|
-
revision = details
|
|
99
|
+
image_version = image_label(details, "org.opencontainers.image.version")
|
|
100
|
+
revision = image_label(details, "org.opencontainers.image.revision")
|
|
77
101
|
# Sometimes the versions are not tags (e.g., "24.04")
|
|
78
102
|
# We only want to build a source if the version looks like a tag (starts with "v")
|
|
79
103
|
# This is a safeguard for a first iteration. We may adjust this later based on user feedback.
|
|
@@ -25,7 +25,7 @@ rescue LoadError
|
|
|
25
25
|
class Response
|
|
26
26
|
extend T::Sig
|
|
27
27
|
|
|
28
|
-
sig { returns(T::Hash[
|
|
28
|
+
sig { returns(T::Hash[Symbol, String]) }
|
|
29
29
|
def headers
|
|
30
30
|
{}
|
|
31
31
|
end
|
|
@@ -80,6 +80,18 @@ module Dependabot
|
|
|
80
80
|
# so we cap the attempts to avoid rate limiting or excessive latency.
|
|
81
81
|
MAX_PLATFORM_VALIDATION_ATTEMPTS = T.let(5, Integer)
|
|
82
82
|
|
|
83
|
+
DockerSource = T.type_alias do
|
|
84
|
+
T::Hash[Symbol, T.nilable(String)]
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
ManifestHash = T.type_alias do
|
|
88
|
+
T::Hash[T.any(String, Symbol), Object]
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
ManifestList = T.type_alias do
|
|
92
|
+
T::Array[ManifestHash]
|
|
93
|
+
end
|
|
94
|
+
|
|
83
95
|
# Legacy patterns used when docker_created_timestamp_validation experiment is disabled.
|
|
84
96
|
# The broad alphanumeric regex matches tokens like "alpine3", "ltsc2022", "rc1"
|
|
85
97
|
# and classifies them as version-related, preserving pre-experiment behavior.
|
|
@@ -220,7 +232,7 @@ module Dependabot
|
|
|
220
232
|
digest_requirements.all? { |req| digest_requirement_up_to_date?(req) }
|
|
221
233
|
end
|
|
222
234
|
|
|
223
|
-
sig { params(req:
|
|
235
|
+
sig { params(req: Dependabot::DependencyRequirement).returns(T::Boolean) }
|
|
224
236
|
def digest_requirement_up_to_date?(req)
|
|
225
237
|
source = req.fetch(:source)
|
|
226
238
|
source_digest = source.fetch(:digest)
|
|
@@ -467,8 +479,7 @@ module Dependabot
|
|
|
467
479
|
client.dohead "v2/#{docker_repo_name}/#{endpoint}/#{first_digest}"
|
|
468
480
|
end
|
|
469
481
|
|
|
470
|
-
|
|
471
|
-
published_date = last_modified ? Time.parse(last_modified) : nil
|
|
482
|
+
published_date = published_date_from_response_headers(head_response.headers, tag.name)
|
|
472
483
|
|
|
473
484
|
Dependabot::Package::PackageRelease.new(
|
|
474
485
|
version: release_version_for(tag),
|
|
@@ -489,9 +500,25 @@ module Dependabot
|
|
|
489
500
|
nil
|
|
490
501
|
end
|
|
491
502
|
|
|
503
|
+
sig { params(headers: T::Hash[Symbol, String], tag_name: String).returns(T.nilable(Time)) }
|
|
504
|
+
def published_date_from_response_headers(headers, tag_name)
|
|
505
|
+
last_modified = headers[:last_modified]
|
|
506
|
+
published_date = begin
|
|
507
|
+
Time.parse(last_modified) if last_modified
|
|
508
|
+
rescue ArgumentError, TypeError => e
|
|
509
|
+
Dependabot.logger.info(
|
|
510
|
+
"Invalid Last-Modified header for #{docker_repo_name}:#{tag_name}: #{e.message}"
|
|
511
|
+
)
|
|
512
|
+
nil
|
|
513
|
+
end
|
|
514
|
+
# Fall back to the image config blob's "created" timestamp when Last-Modified
|
|
515
|
+
# is absent (e.g., Docker Hub multi-arch manifest lists).
|
|
516
|
+
published_date || fetch_image_config_created(tag_name)
|
|
517
|
+
end
|
|
518
|
+
|
|
492
519
|
sig do
|
|
493
520
|
params(
|
|
494
|
-
digest_info:
|
|
521
|
+
digest_info: Object,
|
|
495
522
|
tag: Dependabot::Docker::Tag
|
|
496
523
|
).returns(T.nilable(String))
|
|
497
524
|
end
|
|
@@ -505,7 +532,8 @@ module Dependabot
|
|
|
505
532
|
)
|
|
506
533
|
return nil
|
|
507
534
|
end
|
|
508
|
-
digest_info.first&.fetch("digest")
|
|
535
|
+
digest = digest_info.first&.fetch("digest")
|
|
536
|
+
digest if digest.is_a?(String)
|
|
509
537
|
when String
|
|
510
538
|
digest_info
|
|
511
539
|
else
|
|
@@ -518,11 +546,11 @@ module Dependabot
|
|
|
518
546
|
end
|
|
519
547
|
|
|
520
548
|
sig do
|
|
521
|
-
params(
|
|
549
|
+
type_parameters(:Result).params(
|
|
522
550
|
max_attempts: Integer,
|
|
523
551
|
errors: T::Array[T.class_of(StandardError)],
|
|
524
|
-
_blk: T.proc.returns(T.
|
|
525
|
-
).returns(T.
|
|
552
|
+
_blk: T.proc.returns(T.type_parameter(:Result))
|
|
553
|
+
).returns(T.type_parameter(:Result))
|
|
526
554
|
end
|
|
527
555
|
def with_retries(max_attempts: 3, errors: [], &_blk)
|
|
528
556
|
attempt = 0
|
|
@@ -912,7 +940,7 @@ module Dependabot
|
|
|
912
940
|
end
|
|
913
941
|
end
|
|
914
942
|
|
|
915
|
-
sig { returns(T::Array[
|
|
943
|
+
sig { returns(T::Array[Dependabot::DependencyRequirement]) }
|
|
916
944
|
def digest_requirements
|
|
917
945
|
dependency.requirements.select do |requirement|
|
|
918
946
|
requirement.dig(:source, :digest)
|
|
@@ -1027,7 +1055,7 @@ module Dependabot
|
|
|
1027
1055
|
# digest moved; otherwise this is a genuine version/digest change.
|
|
1028
1056
|
sig do
|
|
1029
1057
|
params(
|
|
1030
|
-
source:
|
|
1058
|
+
source: DockerSource,
|
|
1031
1059
|
current_digest: String,
|
|
1032
1060
|
expected_digest: String,
|
|
1033
1061
|
digest_only_refresh: T::Boolean
|
|
@@ -1045,7 +1073,7 @@ module Dependabot
|
|
|
1045
1073
|
# Fails open (returns false) whenever a confident comparison isn't possible.
|
|
1046
1074
|
sig do
|
|
1047
1075
|
params(
|
|
1048
|
-
source:
|
|
1076
|
+
source: DockerSource,
|
|
1049
1077
|
current_digest: String,
|
|
1050
1078
|
candidate_digest: String
|
|
1051
1079
|
).returns(T::Boolean)
|
|
@@ -1109,8 +1137,11 @@ module Dependabot
|
|
|
1109
1137
|
resolved = resolve_platform_manifest(manifest)
|
|
1110
1138
|
return nil unless resolved
|
|
1111
1139
|
|
|
1112
|
-
|
|
1113
|
-
return nil unless
|
|
1140
|
+
config = resolved["config"]
|
|
1141
|
+
return nil unless config.is_a?(Hash)
|
|
1142
|
+
|
|
1143
|
+
config_digest = config["digest"]
|
|
1144
|
+
return nil unless config_digest.is_a?(String)
|
|
1114
1145
|
|
|
1115
1146
|
parse_created_from_config_blob(config_digest)
|
|
1116
1147
|
end
|
|
@@ -1137,13 +1168,11 @@ module Dependabot
|
|
|
1137
1168
|
# Resolves a manifest to a single platform-specific manifest.
|
|
1138
1169
|
# If the manifest is a manifest list (multi-arch), selects the most
|
|
1139
1170
|
# appropriate platform (preferring linux/amd64).
|
|
1140
|
-
sig { params(manifest:
|
|
1171
|
+
sig { params(manifest: ManifestHash).returns(T.nilable(ManifestHash)) }
|
|
1141
1172
|
def resolve_platform_manifest(manifest)
|
|
1142
1173
|
media_type = manifest["mediaType"] || manifest[:mediaType]
|
|
1143
1174
|
|
|
1144
|
-
unless MANIFEST_LIST_TYPES.include?(media_type)
|
|
1145
|
-
return manifest.is_a?(Hash) ? manifest : manifest.to_h
|
|
1146
|
-
end
|
|
1175
|
+
return manifest unless MANIFEST_LIST_TYPES.include?(media_type)
|
|
1147
1176
|
|
|
1148
1177
|
platform_digest = select_platform_digest(manifest)
|
|
1149
1178
|
return nil unless platform_digest
|
|
@@ -1157,19 +1186,25 @@ module Dependabot
|
|
|
1157
1186
|
|
|
1158
1187
|
# Selects the digest of the best platform-specific manifest from a manifest list,
|
|
1159
1188
|
# preferring linux/amd64.
|
|
1160
|
-
sig { params(manifest:
|
|
1189
|
+
sig { params(manifest: ManifestHash).returns(T.nilable(String)) }
|
|
1161
1190
|
def select_platform_digest(manifest)
|
|
1162
1191
|
manifests = manifest["manifests"] || manifest[:manifests] || []
|
|
1192
|
+
return nil unless manifests.is_a?(Array)
|
|
1163
1193
|
return nil if manifests.empty?
|
|
1164
1194
|
|
|
1165
1195
|
selected = find_amd64_manifest(manifests) || manifests.first
|
|
1166
|
-
|
|
1196
|
+
return nil unless selected.is_a?(Hash)
|
|
1197
|
+
|
|
1198
|
+
digest = selected["digest"] || selected[:digest]
|
|
1199
|
+
digest if digest.is_a?(String)
|
|
1167
1200
|
end
|
|
1168
1201
|
|
|
1169
|
-
sig { params(manifests:
|
|
1202
|
+
sig { params(manifests: ManifestList).returns(T.nilable(ManifestHash)) }
|
|
1170
1203
|
def find_amd64_manifest(manifests)
|
|
1171
1204
|
manifests.find do |m|
|
|
1172
1205
|
platform = m["platform"] || m[:platform] || {}
|
|
1206
|
+
next false unless platform.is_a?(Hash)
|
|
1207
|
+
|
|
1173
1208
|
(platform["architecture"] || platform[:architecture]) == "amd64"
|
|
1174
1209
|
end
|
|
1175
1210
|
end
|
|
@@ -1338,7 +1373,7 @@ module Dependabot
|
|
|
1338
1373
|
# array of per-platform manifest entries, or nil for single-platform images
|
|
1339
1374
|
# (not a manifest list). Cached so the platform-inspection methods below
|
|
1340
1375
|
# share a single registry GET per tag.
|
|
1341
|
-
sig { params(tag_name: String).returns(T.nilable(
|
|
1376
|
+
sig { params(tag_name: String).returns(T.nilable(ManifestList)) }
|
|
1342
1377
|
def fetch_manifest_list(tag_name)
|
|
1343
1378
|
return manifest_list_cache[tag_name] if manifest_list_cache.key?(tag_name)
|
|
1344
1379
|
|
|
@@ -1356,7 +1391,7 @@ module Dependabot
|
|
|
1356
1391
|
nil
|
|
1357
1392
|
end
|
|
1358
1393
|
|
|
1359
|
-
sig { params(tag_name: String).returns(T.nilable(
|
|
1394
|
+
sig { params(tag_name: String).returns(T.nilable(ManifestList)) }
|
|
1360
1395
|
def fetch_manifest_list_from_registry(tag_name)
|
|
1361
1396
|
manifest = with_retries(max_attempts: 3, errors: transient_docker_errors) do
|
|
1362
1397
|
docker_registry_client.manifest(docker_repo_name, tag_name)
|
|
@@ -1365,7 +1400,10 @@ module Dependabot
|
|
|
1365
1400
|
media_type = manifest["mediaType"] || manifest[:mediaType]
|
|
1366
1401
|
return nil unless MANIFEST_LIST_TYPES.include?(media_type)
|
|
1367
1402
|
|
|
1368
|
-
manifest["manifests"] || manifest[:manifests] || []
|
|
1403
|
+
manifests = manifest["manifests"] || manifest[:manifests] || []
|
|
1404
|
+
return [] unless manifests.is_a?(Array)
|
|
1405
|
+
|
|
1406
|
+
manifests.grep(Hash)
|
|
1369
1407
|
end
|
|
1370
1408
|
|
|
1371
1409
|
# Fetches a map of platform key (e.g. "linux/amd64") to platform manifest
|
|
@@ -1395,7 +1433,7 @@ module Dependabot
|
|
|
1395
1433
|
collect_platform_digests(manifests)
|
|
1396
1434
|
end
|
|
1397
1435
|
|
|
1398
|
-
sig { params(manifests:
|
|
1436
|
+
sig { params(manifests: ManifestList).returns(T::Hash[String, String]) }
|
|
1399
1437
|
def collect_platform_digests(manifests)
|
|
1400
1438
|
digests = {}
|
|
1401
1439
|
|
|
@@ -1404,7 +1442,7 @@ module Dependabot
|
|
|
1404
1442
|
next unless platform
|
|
1405
1443
|
|
|
1406
1444
|
digest = m["digest"] || m[:digest]
|
|
1407
|
-
next unless digest
|
|
1445
|
+
next unless digest.is_a?(String)
|
|
1408
1446
|
|
|
1409
1447
|
digests[platform_key(platform)] = digest
|
|
1410
1448
|
end
|
|
@@ -1414,7 +1452,7 @@ module Dependabot
|
|
|
1414
1452
|
|
|
1415
1453
|
# Fetches the platform entries from a manifest list for a given tag.
|
|
1416
1454
|
# Returns nil if the tag is a single-platform image (not a manifest list).
|
|
1417
|
-
sig { params(tag_name: String).returns(T.nilable(
|
|
1455
|
+
sig { params(tag_name: String).returns(T.nilable(ManifestList)) }
|
|
1418
1456
|
def fetch_manifest_platforms(tag_name)
|
|
1419
1457
|
return manifest_platforms_cache[tag_name] if manifest_platforms_cache.key?(tag_name)
|
|
1420
1458
|
|
|
@@ -1430,7 +1468,7 @@ module Dependabot
|
|
|
1430
1468
|
nil
|
|
1431
1469
|
end
|
|
1432
1470
|
|
|
1433
|
-
sig { params(tag_name: String).returns(T.nilable(
|
|
1471
|
+
sig { params(tag_name: String).returns(T.nilable(ManifestList)) }
|
|
1434
1472
|
def fetch_manifest_platforms_from_registry(tag_name)
|
|
1435
1473
|
manifests = fetch_manifest_list(tag_name)
|
|
1436
1474
|
return nil unless manifests
|
|
@@ -1452,10 +1490,10 @@ module Dependabot
|
|
|
1452
1490
|
digests
|
|
1453
1491
|
end
|
|
1454
1492
|
|
|
1455
|
-
sig { params(manifest_entry:
|
|
1493
|
+
sig { params(manifest_entry: ManifestHash).returns(T.nilable(ManifestHash)) }
|
|
1456
1494
|
def extract_platform(manifest_entry)
|
|
1457
1495
|
platform = manifest_entry["platform"] || manifest_entry[:platform]
|
|
1458
|
-
return unless platform
|
|
1496
|
+
return unless platform.is_a?(Hash)
|
|
1459
1497
|
|
|
1460
1498
|
os = platform["os"] || platform[:os]
|
|
1461
1499
|
arch = platform["architecture"] || platform[:architecture]
|
|
@@ -1465,7 +1503,7 @@ module Dependabot
|
|
|
1465
1503
|
end
|
|
1466
1504
|
|
|
1467
1505
|
# Builds a normalized string key from a platform hash, e.g. "linux/amd64" or "linux/arm64/v8"
|
|
1468
|
-
sig { params(platform:
|
|
1506
|
+
sig { params(platform: ManifestHash).returns(String) }
|
|
1469
1507
|
def platform_key(platform)
|
|
1470
1508
|
os = platform["os"] || platform[:os]
|
|
1471
1509
|
arch = platform["architecture"] || platform[:architecture]
|
|
@@ -1502,7 +1540,7 @@ module Dependabot
|
|
|
1502
1540
|
collect_platform_timestamps(manifests)
|
|
1503
1541
|
end
|
|
1504
1542
|
|
|
1505
|
-
sig { params(manifests:
|
|
1543
|
+
sig { params(manifests: ManifestList).returns(T::Hash[String, T.nilable(Time)]) }
|
|
1506
1544
|
def collect_platform_timestamps(manifests)
|
|
1507
1545
|
timestamps = {}
|
|
1508
1546
|
|
|
@@ -1511,7 +1549,7 @@ module Dependabot
|
|
|
1511
1549
|
next unless platform
|
|
1512
1550
|
|
|
1513
1551
|
digest = m["digest"] || m[:digest]
|
|
1514
|
-
next unless digest
|
|
1552
|
+
next unless digest.is_a?(String)
|
|
1515
1553
|
|
|
1516
1554
|
key = platform_key(platform)
|
|
1517
1555
|
timestamps[key] = fetch_platform_created_timestamp(digest)
|
|
@@ -1533,11 +1571,11 @@ module Dependabot
|
|
|
1533
1571
|
parse_created_from_config_blob(config_digest)
|
|
1534
1572
|
end
|
|
1535
1573
|
|
|
1536
|
-
sig { returns(T::Hash[String, T.nilable(
|
|
1574
|
+
sig { returns(T::Hash[String, T.nilable(ManifestList)]) }
|
|
1537
1575
|
def manifest_list_cache
|
|
1538
1576
|
@manifest_list_cache ||= T.let(
|
|
1539
1577
|
{},
|
|
1540
|
-
T.nilable(T::Hash[String, T.nilable(
|
|
1578
|
+
T.nilable(T::Hash[String, T.nilable(ManifestList)])
|
|
1541
1579
|
)
|
|
1542
1580
|
end
|
|
1543
1581
|
|
|
@@ -1549,11 +1587,11 @@ module Dependabot
|
|
|
1549
1587
|
)
|
|
1550
1588
|
end
|
|
1551
1589
|
|
|
1552
|
-
sig { returns(T::Hash[String, T.nilable(
|
|
1590
|
+
sig { returns(T::Hash[String, T.nilable(ManifestList)]) }
|
|
1553
1591
|
def manifest_platforms_cache
|
|
1554
1592
|
@manifest_platforms_cache ||= T.let(
|
|
1555
1593
|
{},
|
|
1556
|
-
T.nilable(T::Hash[String, T.nilable(
|
|
1594
|
+
T.nilable(T::Hash[String, T.nilable(ManifestList)])
|
|
1557
1595
|
)
|
|
1558
1596
|
end
|
|
1559
1597
|
|
|
@@ -61,16 +61,18 @@ module Dependabot
|
|
|
61
61
|
|
|
62
62
|
private
|
|
63
63
|
|
|
64
|
-
sig { params(service: T
|
|
64
|
+
sig { params(service: T::Hash[String, Object]).returns(T.nilable(T::Hash[String, T.nilable(String)])) }
|
|
65
65
|
def parse_image_spec(service)
|
|
66
|
-
|
|
66
|
+
image = service["image"]
|
|
67
|
+
return service_image(image) if image.is_a?(String)
|
|
67
68
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
return nil
|
|
69
|
+
build = service["build"]
|
|
70
|
+
if build.is_a?(Hash)
|
|
71
|
+
dockerfile_inline = build["dockerfile_inline"]
|
|
72
|
+
return nil unless dockerfile_inline.is_a?(String)
|
|
73
|
+
return nil if dockerfile_inline.match?(/^FROM\s+\${[^}]+}$/)
|
|
72
74
|
|
|
73
|
-
match = FROM_LINE.match(
|
|
75
|
+
match = FROM_LINE.match(dockerfile_inline)
|
|
74
76
|
return match&.named_captures
|
|
75
77
|
end
|
|
76
78
|
|
|
@@ -232,13 +232,13 @@ module Dependabot
|
|
|
232
232
|
!source[:digest].nil?
|
|
233
233
|
end
|
|
234
234
|
|
|
235
|
-
sig { params(file: Dependabot::DependencyFile).returns(T::Array[
|
|
235
|
+
sig { params(file: Dependabot::DependencyFile).returns(T::Array[Dependabot::DependencyRequirement]) }
|
|
236
236
|
def requirements(file)
|
|
237
237
|
T.must(dependency).requirements
|
|
238
238
|
.select { |r| r[:file] == file.name }
|
|
239
239
|
end
|
|
240
240
|
|
|
241
|
-
sig { params(file: Dependabot::DependencyFile).returns(T.nilable(T::Array[
|
|
241
|
+
sig { params(file: Dependabot::DependencyFile).returns(T.nilable(T::Array[Dependabot::DependencyRequirement])) }
|
|
242
242
|
def previous_requirements(file)
|
|
243
243
|
T.must(dependency).previous_requirements
|
|
244
244
|
&.select { |r| r[:file] == file.name }
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: dependabot-docker
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.386.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Dependabot
|
|
@@ -15,14 +15,14 @@ dependencies:
|
|
|
15
15
|
requirements:
|
|
16
16
|
- - '='
|
|
17
17
|
- !ruby/object:Gem::Version
|
|
18
|
-
version: 0.
|
|
18
|
+
version: 0.386.0
|
|
19
19
|
type: :runtime
|
|
20
20
|
prerelease: false
|
|
21
21
|
version_requirements: !ruby/object:Gem::Requirement
|
|
22
22
|
requirements:
|
|
23
23
|
- - '='
|
|
24
24
|
- !ruby/object:Gem::Version
|
|
25
|
-
version: 0.
|
|
25
|
+
version: 0.386.0
|
|
26
26
|
- !ruby/object:Gem::Dependency
|
|
27
27
|
name: debug
|
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -266,7 +266,7 @@ licenses:
|
|
|
266
266
|
- MIT
|
|
267
267
|
metadata:
|
|
268
268
|
bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
|
|
269
|
-
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.
|
|
269
|
+
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.386.0
|
|
270
270
|
rdoc_options: []
|
|
271
271
|
require_paths:
|
|
272
272
|
- lib
|