diff options
| author | Ophestra <cat@gensokyo.uk> | 2026-01-05 01:42:29 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2026-01-05 01:43:23 +0900 |
| commit | b98d27f773d74059e92bd5d4169e1347eeb4a6d9 (patch) | |
| tree | 35f97260c84b0873f7dad44a5540dd70fb61232f /internal/pkg/tar.go | |
| parent | f3aa31e401e58ea20aa0c0fd09b55f237bbfb54a (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.go | 31 |
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 } |
