internal/pkg: ensure parent for non-directory entries
All checks were successful
Test / Create distribution (push) Successful in 51s
Test / Sandbox (push) Successful in 2m36s
Test / Hakurei (push) Successful in 3m41s
Test / ShareFS (push) Successful in 3m48s
Test / Hpkg (push) Successful in 4m29s
Test / Sandbox (race detector) (push) Successful in 4m57s
Test / Hakurei (race detector) (push) Successful in 3m12s
Test / Flake checks (push) Successful in 1m38s

This works around streams containing out of order entries.

Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
2026-01-06 05:55:24 +09:00
parent 79adf217f4
commit f6d32e482a

View File

@@ -11,6 +11,7 @@ import (
"io/fs"
"net/http"
"os"
"path"
"hakurei.app/container/check"
)
@@ -128,9 +129,14 @@ func (a *tarArtifact) Cure(c *CureContext) (err error) {
continue
case tar.TypeReg:
p := temp.Append(header.Name).String()
if err = os.MkdirAll(path.Dir(p), 0700); err != nil {
return
}
var f *os.File
if f, err = os.OpenFile(
temp.Append(header.Name).String(),
p,
os.O_CREATE|os.O_EXCL|os.O_WRONLY,
header.FileInfo().Mode()&0400,
); err != nil {
@@ -145,19 +151,21 @@ func (a *tarArtifact) Cure(c *CureContext) (err error) {
break
case tar.TypeLink:
if err = os.Link(
header.Linkname,
temp.Append(header.Name).String(),
); err != nil {
p := temp.Append(header.Name).String()
if err = os.MkdirAll(path.Dir(p), 0700); err != nil {
return
}
if err = os.Link(header.Linkname, p); err != nil {
return
}
break
case tar.TypeSymlink:
if err = os.Symlink(
header.Linkname,
temp.Append(header.Name).String(),
); err != nil {
p := temp.Append(header.Name).String()
if err = os.MkdirAll(path.Dir(p), 0700); err != nil {
return
}
if err = os.Symlink(header.Linkname, p); err != nil {
return
}
break