File tree Expand file tree Collapse file tree 3 files changed +86
-6
lines changed Expand file tree Collapse file tree 3 files changed +86
-6
lines changed Original file line number Diff line number Diff line change @@ -16,13 +16,15 @@ package layout
1616
1717import (
1818 "archive/tar"
19+ "encoding/json"
1920 "errors"
2021 "fmt"
2122 "io"
2223 "os"
2324 "strings"
2425
2526 "github.com/opencontainers/image-spec/image/cas"
27+ "github.com/opencontainers/image-spec/image/structure"
2628)
2729
2830// TarEngine is a cas.Engine backed by a tar file.
@@ -31,11 +33,40 @@ type TarEngine struct {
3133}
3234
3335// GetTarEngine returns a TarEngine.
34- func GetTarEngine (file ReadSeekCloser ) (engine cas.Engine , err error ) {
35- engine = & TarEngine {
36+ func GetTarEngine (file ReadSeekCloser ) (eng cas.Engine , err error ) {
37+ engine : = & TarEngine {
3638 reader : file ,
3739 }
38- return engine , nil
40+
41+ _ , err = engine .reader .Seek (0 , os .SEEK_SET )
42+ if err != nil {
43+ return nil , err
44+ }
45+
46+ tarReader := tar .NewReader (engine .reader )
47+ for {
48+ header , err := tarReader .Next ()
49+ if err == io .EOF {
50+ return nil , errors .New ("oci-layout not found" )
51+ }
52+ if err != nil {
53+ return nil , err
54+ }
55+
56+ if header .Name == "./oci-layout" {
57+ decoder := json .NewDecoder (tarReader )
58+ var version structure.ImageLayoutVersion
59+ err = decoder .Decode (& version )
60+ if err != nil {
61+ return nil , err
62+ }
63+ if version .Version != "1.0.0" {
64+ return nil , fmt .Errorf ("unrecognized imageLayoutVersion: %q" , version .Version )
65+ }
66+
67+ return engine , nil
68+ }
69+ }
3970}
4071
4172// Put adds a new blob to the store.
Original file line number Diff line number Diff line change @@ -34,12 +34,40 @@ type TarEngine struct {
3434}
3535
3636// GetTarEngine returns a TarEngine.
37- func GetTarEngine (file casLayout.ReadSeekCloser ) (engine refs.Engine , err error ) {
38- engine = & TarEngine {
37+ func GetTarEngine (file casLayout.ReadSeekCloser ) (eng refs.Engine , err error ) {
38+ engine : = & TarEngine {
3939 reader : file ,
4040 }
4141
42- return engine , nil
42+ _ , err = engine .reader .Seek (0 , os .SEEK_SET )
43+ if err != nil {
44+ return nil , err
45+ }
46+
47+ tarReader := tar .NewReader (engine .reader )
48+ for {
49+ header , err := tarReader .Next ()
50+ if err == io .EOF {
51+ return nil , errors .New ("oci-layout not found" )
52+ }
53+ if err != nil {
54+ return nil , err
55+ }
56+
57+ if header .Name == "./oci-layout" {
58+ decoder := json .NewDecoder (tarReader )
59+ var version structure.ImageLayoutVersion
60+ err = decoder .Decode (& version )
61+ if err != nil {
62+ return nil , err
63+ }
64+ if version .Version != "1.0.0" {
65+ return nil , fmt .Errorf ("unrecognized imageLayoutVersion: %q" , version .Version )
66+ }
67+
68+ return engine , nil
69+ }
70+ }
4371}
4472
4573// Put adds a new reference to the store.
Original file line number Diff line number Diff line change 1+ // Copyright 2016 The Linux Foundation
2+ //
3+ // Licensed under the Apache License, Version 2.0 (the "License");
4+ // you may not use this file except in compliance with the License.
5+ // You may obtain a copy of the License at
6+ //
7+ // http://www.apache.org/licenses/LICENSE-2.0
8+ //
9+ // Unless required by applicable law or agreed to in writing, software
10+ // distributed under the License is distributed on an "AS IS" BASIS,
11+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+ // See the License for the specific language governing permissions and
13+ // limitations under the License.
14+
15+ package structure
16+
17+ // ImageLayoutVersion represents the oci-version content for the image
18+ // layout format.
19+ type ImageLayoutVersion struct {
20+ Version string `json:"imageLayoutVersion"`
21+ }
You can’t perform that action at this time.
0 commit comments