Skip to content

Commit fbce901

Browse files
committed
chore: executor: DoCacheProbe: remove fake verbiage
1 parent 0a73fcd commit fbce901

File tree

16 files changed

+1446
-39
lines changed

16 files changed

+1446
-39
lines changed

go.sum

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,8 @@ github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7
9494
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY=
9595
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5 h1:81KE7vaZzrl7yHBYHVEzYB8sypz11NMOZ40YlWvPxsU=
9696
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5/go.mod h1:LIt2rg7Mcgn09Ygbdh/RdIm0rQ+3BNkbP1gyVMFtRK0=
97-
github.com/aws/aws-sdk-go-v2/service/ecr v1.24.5 h1:wLPDAUFT50NEXGXpywRU3AA74pg35RJjWol/68ruvQQ=
98-
github.com/aws/aws-sdk-go-v2/service/ecr v1.24.5/go.mod h1:AOHmGMoPtSY9Zm2zBuwUJQBisIvYAZeA1n7b6f4e880=
9997
github.com/aws/aws-sdk-go-v2/service/ecr v1.27.4 h1:Qr9W21mzWT3RhfYn9iAux7CeRIdbnTAqmiOlASqQgZI=
10098
github.com/aws/aws-sdk-go-v2/service/ecr v1.27.4/go.mod h1:if7ybzzjOmDB8pat9FE35AHTY6ZxlYSy3YviSmFZv8c=
101-
github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.21.5 h1:PQp21GBlGNaQ+AVJAB8w2KTmLx0DkFS2fDET2Iy3+f0=
102-
github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.21.5/go.mod h1:WMntdAol8KgeYsa5sDZPsRTXs4jVZIMYu0eQVVIQxnc=
10399
github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.23.4 h1:aNuiieMaS2IHxqAsTdM/pjHyY1aoaDLBGLqpNnFMMqk=
104100
github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.23.4/go.mod h1:8pvvNAklmq+hKmqyvFoMRg0bwg9sdGOvdwximmKiKP0=
105101
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs=
@@ -120,8 +116,6 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.28.6 h1:cwIxeBttqPN3qkaAjcEcsh8NYr8n
120116
github.com/aws/aws-sdk-go-v2/service/sts v1.28.6/go.mod h1:FZf1/nKNEkHdGGJP/cI2MoIMquumuRK6ol3QQJNDxmw=
121117
github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q=
122118
github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E=
123-
github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20231213181459-b0fcec718dc6 h1:PlJRmqKlSlEUlwem1c3zdPaEMtJc/ktnV7naD5Qvsx4=
124-
github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20231213181459-b0fcec718dc6/go.mod h1:08sPJIlDHu4HwQ1xScPgsBWezvM6U10ghGKBJu0mowA=
125119
github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20240419161514-af205d85bb44 h1:oNDkocd5/+6jUuxyz07jQWnKhgpNtKQoZSXKMb7emqQ=
126120
github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20240419161514-af205d85bb44/go.mod h1:2nlYPkG0rFrODp6R875pk/kOnB8Ivj3+onhzk2mO57g=
127121
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
@@ -184,14 +178,10 @@ github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK
184178
github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
185179
github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI=
186180
github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
187-
github.com/docker/cli v26.0.0+incompatible h1:90BKrx1a1HKYpSnnBFR6AgDq/FqkHxwlUyzJVPxD30I=
188-
github.com/docker/cli v26.0.0+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
189181
github.com/docker/cli v26.1.0+incompatible h1:+nwRy8Ocd8cYNQ60mozDDICICD8aoFGtlPXifX/UQ3Y=
190182
github.com/docker/cli v26.1.0+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
191183
github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8=
192184
github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
193-
github.com/docker/docker v26.0.2+incompatible h1:yGVmKUFGgcxA6PXWAokO0sQL22BrQ67cgVjko8tGdXE=
194-
github.com/docker/docker v26.0.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
195185
github.com/docker/docker v26.1.0+incompatible h1:W1G9MPNbskA6VZWL7b3ZljTh0pXI68FpINx0GKaOdaM=
196186
github.com/docker/docker v26.1.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
197187
github.com/docker/docker-credential-helpers v0.8.1 h1:j/eKUktUltBtMzKqmfLB0PAgqYyMHOp5vfsD1807oKo=
@@ -408,9 +398,6 @@ github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU=
408398
github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w=
409399
github.com/otiai10/mint v1.5.1 h1:XaPLeE+9vGbuyEHem1JNk3bYc7KKqyI/na0/mLd/Kks=
410400
github.com/otiai10/mint v1.5.1/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM=
411-
github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
412-
github.com/pelletier/go-toml/v2 v2.2.0 h1:QLgLl2yMN7N+ruc31VynXs1vhMZa7CeHHejIeBAsoHo=
413-
github.com/pelletier/go-toml/v2 v2.2.0/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
414401
github.com/pelletier/go-toml/v2 v2.2.1 h1:9TA9+T8+8CUCO2+WYnDLCgrYi9+omqKXyjDtosvtEhg=
415402
github.com/pelletier/go-toml/v2 v2.2.1/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
416403
github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4=
@@ -542,8 +529,6 @@ golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU
542529
golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
543530
golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
544531
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
545-
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw=
546-
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ=
547532
golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f h1:99ci1mjWVBWwJiEKYY6jWa4d2nTQVIEhZIptnrVb1XY=
548533
golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f/go.mod h1:/lliqkxwWAhPjf5oSOIJup2XcqJaw8RGS6k3TGEc7GI=
549534
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -554,8 +539,6 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
554539
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
555540
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
556541
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
557-
golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic=
558-
golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
559542
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
560543
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
561544
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -651,8 +634,6 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
651634
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
652635
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
653636
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
654-
golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw=
655-
golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc=
656637
golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY=
657638
golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg=
658639
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

pkg/commands/cache.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,6 @@ func (c caching) Layer() v1.Layer {
3333
return c.layer
3434
}
3535

36-
type FakeExecuteCommand interface {
37-
FakeExecuteCommand(*v1.Config, *dockerfile.BuildArgs) error
36+
type CachedExecuteCommand interface {
37+
CachedExecuteCommand(*v1.Config, *dockerfile.BuildArgs) error
3838
}

pkg/commands/copy.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ func (cr *CachingCopyCommand) ExecuteCommand(config *v1.Config, buildArgs *docke
206206
return nil
207207
}
208208

209-
func (cr *CachingCopyCommand) FakeExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error {
209+
func (cr *CachingCopyCommand) CachedExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error {
210210
logrus.Infof("Found cached layer, faking extraction to filesystem")
211211
var err error
212212

pkg/commands/run.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ func (cr *CachingRunCommand) ExecuteCommand(config *v1.Config, buildArgs *docker
256256
return nil
257257
}
258258

259-
func (cr *CachingRunCommand) FakeExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error {
259+
func (cr *CachingRunCommand) CachedExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error {
260260
logrus.Infof("Found cached layer, faking extraction to filesystem")
261261
var err error
262262

pkg/executor/build.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -495,15 +495,15 @@ func (s *stageBuilder) probeCache() error {
495495
}
496496
}()
497497

498-
if c, ok := command.(commands.FakeExecuteCommand); ok {
499-
if err := c.FakeExecuteCommand(&s.cf.Config, s.args); err != nil {
500-
return errors.Wrap(err, "failed to execute fake command")
498+
if c, ok := command.(commands.CachedExecuteCommand); ok {
499+
if err := c.CachedExecuteCommand(&s.cf.Config, s.args); err != nil {
500+
return errors.Wrap(err, "failed to execute cached command")
501501
}
502502
} else {
503503
switch command.(type) {
504504
case *commands.UserCommand:
505505
default:
506-
return errors.Errorf("uncached command %T is not supported in fake build", command)
506+
return errors.Errorf("uncached command %T encountered when probing cache", command)
507507
}
508508
if err := command.ExecuteCommand(&s.cf.Config, s.args); err != nil {
509509
return errors.Wrap(err, "failed to execute command")
@@ -977,7 +977,7 @@ func DoCacheProbe(opts *config.KanikoOptions) (v1.Image, error) {
977977

978978
args = sb.args
979979
if err := sb.probeCache(); err != nil {
980-
return nil, errors.Wrap(err, "error fake building stage")
980+
return nil, errors.Wrap(err, "error probing build cache")
981981
}
982982

983983
reviewConfig(stage, &sb.cf.Config)

pkg/executor/cache_probe_test.go

Lines changed: 65 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,16 @@ package executor
1818

1919
import (
2020
"fmt"
21+
"net/http/httptest"
22+
"net/url"
2123
"os"
2224
"path/filepath"
2325
"strings"
2426
"testing"
2527
"time"
2628

29+
"github.com/google/go-containerregistry/pkg/registry"
30+
2731
"github.com/GoogleContainerTools/kaniko/pkg/config"
2832
"github.com/GoogleContainerTools/kaniko/pkg/constants"
2933
"github.com/GoogleContainerTools/kaniko/testutil"
@@ -37,8 +41,7 @@ func TestDoCacheProbe(t *testing.T) {
3741
COPY foo/bar.txt copied/
3842
`
3943
os.WriteFile(filepath.Join(testDir, "workspace", "Dockerfile"), []byte(dockerFile), 0755)
40-
// Populate the cache by doing an initial build
41-
cacheDir := t.TempDir()
44+
regCache := setupCacheRegistry(t)
4245
opts := &config.KanikoOptions{
4346
DockerfilePath: filepath.Join(testDir, "workspace", "Dockerfile"),
4447
SrcContext: filepath.Join(testDir, "workspace"),
@@ -49,10 +52,10 @@ COPY foo/bar.txt copied/
4952
},
5053
CacheCopyLayers: true,
5154
CacheRunLayers: true,
52-
CacheRepo: "oci:/" + cacheDir,
55+
CacheRepo: regCache + "/test",
5356
}
5457
_, err := DoCacheProbe(opts)
55-
if err == nil || !strings.Contains(err.Error(), "not supported in fake build") {
58+
if err == nil || !strings.Contains(err.Error(), "uncached command") {
5659
t.Errorf("unexpected error, got %v", err)
5760
}
5861
})
@@ -64,7 +67,7 @@ COPY foo/bar.txt copied/
6467
COPY foo/bar.txt copied/
6568
`
6669
os.WriteFile(filepath.Join(testDir, "workspace", "Dockerfile"), []byte(dockerFile), 0755)
67-
cacheDir := t.TempDir()
70+
regCache := setupCacheRegistry(t)
6871
opts := &config.KanikoOptions{
6972
DockerfilePath: filepath.Join(testDir, "workspace", "Dockerfile"),
7073
SrcContext: filepath.Join(testDir, "workspace"),
@@ -75,8 +78,9 @@ COPY foo/bar.txt copied/
7578
},
7679
CacheCopyLayers: true,
7780
CacheRunLayers: true,
78-
CacheRepo: "oci:/" + cacheDir,
81+
CacheRepo: regCache + "/test",
7982
}
83+
// Populate the cache by doing an initial build
8084
_, err := DoBuild(opts)
8185
testutil.CheckNoError(t, err)
8286
opts.Reproducible = true
@@ -91,18 +95,18 @@ COPY foo/bar.txt copied/
9195
COPY foo/bar.txt copied/
9296
`
9397
os.WriteFile(filepath.Join(testDir, "workspace", "Dockerfile"), []byte(dockerFile), 0755)
94-
cacheDir := t.TempDir()
98+
regCache := setupCacheRegistry(t)
9599
opts := &config.KanikoOptions{
96100
DockerfilePath: filepath.Join(testDir, "workspace", "Dockerfile"),
97101
SrcContext: filepath.Join(testDir, "workspace"),
98-
SnapshotMode: constants.SnapshotModeFull,
102+
SnapshotMode: constants.SnapshotModeRedo,
99103
Cache: true,
100104
CacheOptions: config.CacheOptions{
101105
CacheTTL: time.Hour,
102106
},
103107
CacheCopyLayers: true,
104108
CacheRunLayers: true,
105-
CacheRepo: "oci:/" + cacheDir,
109+
CacheRepo: regCache + "/test",
106110
}
107111
_, err := DoBuild(opts)
108112
testutil.CheckNoError(t, err)
@@ -115,10 +119,61 @@ COPY foo/baz.txt copied/
115119
`
116120
os.WriteFile(filepath.Join(testDir, "workspace", "Dockerfile"), []byte(dockerFile), 0755)
117121
_, err = DoCacheProbe(opts)
118-
if err == nil || !strings.Contains(err.Error(), "not supported in fake build") {
122+
if err == nil || !strings.Contains(err.Error(), "uncached command") {
119123
t.Errorf("unexpected error, got %v", err)
120124
}
121125
})
126+
127+
t.Run("MultiStage", func(t *testing.T) {
128+
t.Skip("TODO: https://github.com/coder/envbuilder/issues/230")
129+
testDir, fn := setupMultistageTests(t)
130+
defer fn()
131+
dockerFile := `
132+
FROM scratch as first
133+
COPY foo/bam.txt copied/
134+
ENV test test
135+
136+
From scratch as second
137+
COPY --from=first copied/bam.txt output/bam.txt`
138+
os.WriteFile(filepath.Join(testDir, "workspace", "Dockerfile"), []byte(dockerFile), 0755)
139+
regCache := setupCacheRegistry(t)
140+
opts := &config.KanikoOptions{
141+
DockerfilePath: filepath.Join(testDir, "workspace", "Dockerfile"),
142+
SrcContext: filepath.Join(testDir, "workspace"),
143+
SnapshotMode: constants.SnapshotModeRedo,
144+
Cache: true,
145+
CacheOptions: config.CacheOptions{
146+
CacheTTL: time.Hour,
147+
},
148+
CacheCopyLayers: true,
149+
CacheRunLayers: true,
150+
CacheRepo: regCache + "/test",
151+
}
152+
_, err := DoBuild(opts)
153+
testutil.CheckNoError(t, err)
154+
os.WriteFile(filepath.Join(testDir, "workspace", "Dockerfile"), []byte(dockerFile), 0755)
155+
opts.Reproducible = true
156+
_, err = DoCacheProbe(opts)
157+
testutil.CheckNoError(t, err)
158+
// Check Image has one layer bam.txt
159+
files, err := readDirectory(filepath.Join(testDir, "output"))
160+
if err != nil {
161+
t.Fatal(err)
162+
}
163+
testutil.CheckDeepEqual(t, 1, len(files))
164+
testutil.CheckDeepEqual(t, files[0].Name(), "bam.txt")
165+
})
166+
}
167+
168+
func setupCacheRegistry(t *testing.T) string {
169+
t.Helper()
170+
tempDir := t.TempDir()
171+
testReg := registry.New(registry.WithBlobHandler(registry.NewDiskBlobHandler(tempDir)))
172+
regSrv := httptest.NewServer(testReg)
173+
t.Cleanup(func() { regSrv.Close() })
174+
regSrvURL, err := url.Parse(regSrv.URL)
175+
testutil.CheckNoError(t, err)
176+
return fmt.Sprintf("localhost:%s", regSrvURL.Port())
122177
}
123178

124179
func setupCacheProbeTests(t *testing.T) (string, func()) {

pkg/executor/copy_multistage_test.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,6 @@ COPY --from=first / output/`
169169
testutil.CheckDeepEqual(t, "bam.link", files[0].Name())
170170
testutil.CheckDeepEqual(t, "bam.txt", files[1].Name())
171171
})
172-
173172
}
174173

175174
func setupMultistageTests(t *testing.T) (string, func()) {

vendor/github.com/google/go-containerregistry/internal/httptest/httptest.go

Lines changed: 104 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)