MCPcopy Create free account
hub / github.com/containers/image / NewImageSource

Method NewImageSource

tarball/tarball_src.go:44–214  ·  view source on GitHub ↗
(ctx context.Context, sys *types.SystemContext)

Source from the content-addressed store, hash-verified

42}
43
44func (r *tarballReference) NewImageSource(ctx context.Context, sys *types.SystemContext) (types.ImageSource, error) {
45 // Pick up the layer comment from the configuration's history list, if one is set.
46 comment := "imported from tarball"
47 if len(r.config.History) > 0 && r.config.History[0].Comment != "" {
48 comment = r.config.History[0].Comment
49 }
50
51 // Gather up the digests, sizes, and history information for all of the files.
52 blobs := map[digest.Digest]tarballBlob{}
53 diffIDs := []digest.Digest{}
54 created := time.Time{}
55 history := []imgspecv1.History{}
56 layerDescriptors := []imgspecv1.Descriptor{}
57 for _, filename := range r.filenames {
58 var reader io.Reader
59 var blobTime time.Time
60 var blob tarballBlob
61 if filename == "-" {
62 reader = bytes.NewReader(r.stdin)
63 blobTime = time.Now()
64 blob = tarballBlob{
65 contents: r.stdin,
66 size: int64(len(r.stdin)),
67 }
68 } else {
69 file, err := os.Open(filename)
70 if err != nil {
71 return nil, err
72 }
73 defer file.Close()
74 reader = file
75 fileinfo, err := file.Stat()
76 if err != nil {
77 return nil, fmt.Errorf("error reading size of %q: %w", filename, err)
78 }
79 blobTime = fileinfo.ModTime()
80 blob = tarballBlob{
81 filename: filename,
82 size: fileinfo.Size(),
83 }
84 }
85
86 // Set up to digest the file as it is.
87 blobIDdigester := digest.Canonical.Digester()
88 reader = io.TeeReader(reader, blobIDdigester.Hash())
89
90 var layerType string
91 var diffIDdigester digest.Digester
92 // If necessary, digest the file after we decompress it.
93 if err := func() error { // A scope for defer
94 format, decompressor, reader, err := compression.DetectCompressionFormat(reader)
95 if err != nil {
96 return err
97 }
98 if decompressor != nil {
99 uncompressed, err := decompressor(reader)
100 if err != nil {
101 return err

Callers

nothing calls this directly

Calls 12

DigestMethod · 0.95
DetectCompressionFormatFunction · 0.92
PropertyMethodsFunction · 0.92
NoGetBlobAtFunction · 0.92
AddCompatFunction · 0.92
ModTimeMethod · 0.80
OpenMethod · 0.65
CloseMethod · 0.65
SizeMethod · 0.65
NameMethod · 0.65
DigestMethod · 0.65
CloneMethod · 0.65

Tested by

no test coverage detected