aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/pkg/exec.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-01-19 20:10:51 +0900
committerOphestra <cat@gensokyo.uk>2026-01-19 21:29:56 +0900
commitd933234784bf3bd511869d55fb145dc1d9601ce1 (patch)
treea898f3c84b35155e0154b95c56016cd866b26228 /internal/pkg/exec.go
parent1c49c75f95855a6b75689f1962dc918ed67c2ccc (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.go42
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 {