diff options
| author | Ophestra <cat@gensokyo.uk> | 2026-01-19 20:10:51 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2026-01-19 21:29:56 +0900 |
| commit | d933234784bf3bd511869d55fb145dc1d9601ce1 (patch) | |
| tree | a898f3c84b35155e0154b95c56016cd866b26228 /internal/pkg/exec.go | |
| parent | 1c49c75f95855a6b75689f1962dc918ed67c2ccc (diff) | |
internal/pkg: make checksum available to cure
This enables deduplication by value as implemented in execArtifact.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/pkg/exec.go')
| -rw-r--r-- | internal/pkg/exec.go | 42 |
1 files changed, 32 insertions, 10 deletions
diff --git a/internal/pkg/exec.go b/internal/pkg/exec.go index f8131855..a4ade28b 100644 --- a/internal/pkg/exec.go +++ b/internal/pkg/exec.go @@ -13,6 +13,7 @@ import ( "strconv" "syscall" "time" + "unique" "hakurei.app/container" "hakurei.app/container/check" @@ -37,6 +38,31 @@ type ExecPath struct { W bool } +// layers returns pathnames collected from A deduplicated by checksum. +func (p *ExecPath) layers(f *FContext) []*check.Absolute { + msg := f.GetMessage() + + layers := make([]*check.Absolute, 0, len(p.A)) + checksums := make(map[unique.Handle[Checksum]]struct{}, len(p.A)) + for i := range p.A { + d := p.A[len(p.A)-1-i] + pathname, checksum := f.GetArtifact(d) + if _, ok := checksums[checksum]; ok { + if msg.IsVerbose() { + msg.Verbosef( + "promoted layer %d as %s", + len(p.A)-1-i, reportName(d, f.cache.Ident(d)), + ) + } + continue + } + checksums[checksum] = struct{}{} + layers = append(layers, pathname) + } + slices.Reverse(layers) + return layers +} + // Path returns a populated [ExecPath]. func Path(pathname *check.Absolute, writable bool, a ...Artifact) ExecPath { return ExecPath{pathname, a, writable} @@ -299,11 +325,6 @@ func (a *execArtifact) cure(f *FContext, hostNet bool) (err error) { temp, work := f.GetTempDir(), f.GetWorkDir() for i, b := range a.paths { - layers := make([]*check.Absolute, len(b.A)) - for j, d := range b.A { - layers[j] = f.Pathname(d) - } - if i == overlayWorkIndex { if err = os.MkdirAll(work.String(), 0700); err != nil { return @@ -316,7 +337,7 @@ func (a *execArtifact) cure(f *FContext, hostNet bool) (err error) { AbsWork, work, tempWork, - layers..., + b.layers(f)..., ) continue } @@ -333,11 +354,12 @@ func (a *execArtifact) cure(f *FContext, hostNet bool) (err error) { if err = os.MkdirAll(tempWork.String(), 0700); err != nil { return } - z.Overlay(b.P, tempUpper, tempWork, layers...) - } else if len(layers) == 1 { - z.Bind(layers[0], b.P, 0) + z.Overlay(b.P, tempUpper, tempWork, b.layers(f)...) + } else if len(b.A) == 1 { + pathname, _ := f.GetArtifact(b.A[0]) + z.Bind(pathname, b.P, 0) } else { - z.OverlayReadonly(b.P, layers...) + z.OverlayReadonly(b.P, b.layers(f)...) } } if overlayWorkIndex < 0 { |
