Skip to content

Commit 3e9c1ec

Browse files
a-crateclaude
andauthored
cpio: add FromLayers for multi-layer CPIO archives (#2216)
Extract recordsFromLayer helper and add FromLayers function that converts multiple container layers into a single CPIO archive with a shared dedup writer. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent de34d75 commit 3e9c1ec

1 file changed

Lines changed: 19 additions & 3 deletions

File tree

pkg/cpio/layer.go

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,24 @@ import (
2626

2727
// FromLayer converts a container layer to CPIO format.
2828
func FromLayer(layer v1.Layer, dest io.Writer) error {
29+
return FromLayers([]v1.Layer{layer}, dest)
30+
}
31+
32+
// FromLayers converts multiple container layers to a single CPIO archive.
33+
func FromLayers(layers []v1.Layer, dest io.Writer) error {
34+
w := cpio.NewDedupWriter(cpio.Newc.Writer(dest))
35+
36+
for _, layer := range layers {
37+
if err := recordsFromLayer(layer, w); err != nil {
38+
return err
39+
}
40+
}
41+
42+
return w.WriteRecord(cpio.TrailerRecord)
43+
}
44+
45+
// recordsFromLayer reads tar entries from a layer and writes them as CPIO records.
46+
func recordsFromLayer(layer v1.Layer, w cpio.RecordWriter) error {
2947
// Open the filesystem layer to walk through the file.
3048
u, err := layer.Uncompressed()
3149
if err != nil {
@@ -35,8 +53,6 @@ func FromLayer(layer v1.Layer, dest io.Writer) error {
3553

3654
tarReader := tar.NewReader(u)
3755

38-
w := cpio.NewDedupWriter(cpio.Newc.Writer(dest))
39-
4056
// Iterate through the tar archive entries
4157
for {
4258
header, err := tarReader.Next()
@@ -95,5 +111,5 @@ func FromLayer(layer v1.Layer, dest io.Writer) error {
95111
}
96112
}
97113

98-
return w.WriteRecord(cpio.TrailerRecord)
114+
return nil
99115
}

0 commit comments

Comments
 (0)