internal/pkg: expand single directory tarball
All checks were successful
Test / Create distribution (push) Successful in 43s
Test / Sandbox (push) Successful in 2m34s
Test / Hakurei (push) Successful in 3m36s
Test / ShareFS (push) Successful in 3m41s
Test / Hpkg (push) Successful in 4m24s
Test / Sandbox (race detector) (push) Successful in 4m57s
Test / Hakurei (race detector) (push) Successful in 5m51s
Test / Flake checks (push) Successful in 1m35s

This enables much cleaner use of their output without giving up any meaningful data.

Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
2026-01-05 01:42:29 +09:00
parent f3aa31e401
commit b98d27f773
3 changed files with 135 additions and 60 deletions

View File

@@ -108,6 +108,10 @@ func (a *tarArtifact) Cure(work, temp *check.Absolute, loadData CacheDataFunc) (
}
var madeDirectories []dirTargetPerm
if err = os.MkdirAll(temp.String(), 0700); err != nil {
return
}
var header *tar.Header
r := tar.NewReader(tr)
for header, err = r.Next(); err == nil; header, err = r.Next() {
@@ -125,7 +129,7 @@ func (a *tarArtifact) Cure(work, temp *check.Absolute, loadData CacheDataFunc) (
case tar.TypeReg:
var f *os.File
if f, err = os.OpenFile(
work.Append(header.Name).String(),
temp.Append(header.Name).String(),
os.O_CREATE|os.O_EXCL|os.O_WRONLY,
header.FileInfo().Mode()&0400,
); err != nil {
@@ -142,7 +146,7 @@ func (a *tarArtifact) Cure(work, temp *check.Absolute, loadData CacheDataFunc) (
case tar.TypeLink:
if err = os.Link(
header.Linkname,
work.Append(header.Name).String(),
temp.Append(header.Name).String(),
); err != nil {
return
}
@@ -151,14 +155,14 @@ func (a *tarArtifact) Cure(work, temp *check.Absolute, loadData CacheDataFunc) (
case tar.TypeSymlink:
if err = os.Symlink(
header.Linkname,
work.Append(header.Name).String(),
temp.Append(header.Name).String(),
); err != nil {
return
}
break
case tar.TypeDir:
pathname := work.Append(header.Name)
pathname := temp.Append(header.Name)
madeDirectories = append(madeDirectories, dirTargetPerm{
path: pathname,
mode: header.FileInfo().Mode(),
@@ -185,14 +189,29 @@ func (a *tarArtifact) Cure(work, temp *check.Absolute, loadData CacheDataFunc) (
if errors.Is(err, io.EOF) {
err = nil
}
if err == nil {
for _, e := range madeDirectories {
if err = os.Chmod(e.path.String(), e.mode&0500); err != nil {
return
}
}
err = os.Chmod(work.String(), 0500)
} else {
return
}
var entries []os.DirEntry
if entries, err = os.ReadDir(temp.String()); err != nil {
return
}
if len(entries) == 1 && entries[0].IsDir() {
p := temp.Append(entries[0].Name())
if err = os.Chmod(p.String(), 0700); err != nil {
return
}
err = os.Rename(p.String(), work.String())
} else {
err = os.Rename(temp.String(), work.String())
}
return
}