aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/pkg/tar.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-01-05 01:42:29 +0900
committerOphestra <cat@gensokyo.uk>2026-01-05 01:43:23 +0900
commitb98d27f773d74059e92bd5d4169e1347eeb4a6d9 (patch)
tree35f97260c84b0873f7dad44a5540dd70fb61232f /internal/pkg/tar.go
parentf3aa31e401e58ea20aa0c0fd09b55f237bbfb54a (diff)
internal/pkg: expand single directory tarball
This enables much cleaner use of their output without giving up any meaningful data. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/pkg/tar.go')
-rw-r--r--internal/pkg/tar.go31
1 files changed, 25 insertions, 6 deletions
diff --git a/internal/pkg/tar.go b/internal/pkg/tar.go
index ac36cf98..f058d24e 100644
--- a/internal/pkg/tar.go
+++ b/internal/pkg/tar.go
@@ -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
}