aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/pkg/tar.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-01-13 00:23:14 +0900
committerOphestra <cat@gensokyo.uk>2026-01-13 00:33:13 +0900
commit156dd767ef46abff8c98c7b48804166cae7c0896 (patch)
tree78d747c74392c83fe445003c572453305665aa60 /internal/pkg/tar.go
parent5fe166a4a74339440647b09d416c5d0784a6c3ee (diff)
internal/pkg: remove typeflag promotion loop
Expanding this enables sharing of code common between types. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/pkg/tar.go')
-rw-r--r--internal/pkg/tar.go122
1 files changed, 53 insertions, 69 deletions
diff --git a/internal/pkg/tar.go b/internal/pkg/tar.go
index 0aa8e3bf..eda41401 100644
--- a/internal/pkg/tar.go
+++ b/internal/pkg/tar.go
@@ -11,7 +11,6 @@ import (
"io/fs"
"net/http"
"os"
- "path"
"hakurei.app/container/check"
)
@@ -142,81 +141,66 @@ func (a *tarArtifact) Cure(t *TContext) (err error) {
r := tar.NewReader(tr)
for header, err = r.Next(); err == nil; header, err = r.Next() {
typeflag := header.Typeflag
- for {
- switch typeflag {
- case 0:
- if len(header.Name) > 0 && header.Name[len(header.Name)-1] == '/' {
- typeflag = tar.TypeDir
- } else {
- typeflag = tar.TypeReg
- }
- 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(
- p,
- os.O_CREATE|os.O_EXCL|os.O_WRONLY,
- header.FileInfo().Mode()&0500,
- ); err != nil {
- return
- }
- if _, err = io.Copy(f, r); err != nil {
- _ = f.Close()
- return
- } else if err = f.Close(); err != nil {
- return
- }
- break
-
- case tar.TypeLink:
- 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
+ if typeflag == 0 {
+ if len(header.Name) > 0 && header.Name[len(header.Name)-1] == '/' {
+ typeflag = tar.TypeDir
+ } else {
+ typeflag = tar.TypeReg
+ }
+ }
- case tar.TypeSymlink:
- 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
+ pathname := temp.Append(header.Name)
+ if typeflag >= '0' && typeflag <= '9' && typeflag != tar.TypeDir {
+ if err = os.MkdirAll(pathname.Dir().String(), 0700); err != nil {
+ return
+ }
+ }
- case tar.TypeDir:
- pathname := temp.Append(header.Name)
- madeDirectories = append(madeDirectories, dirTargetPerm{
- path: pathname,
- mode: header.FileInfo().Mode(),
- })
- if err = os.MkdirAll(
- pathname.String(),
- 0700,
- ); err != nil {
- return
- }
- break
+ switch typeflag {
+ case tar.TypeReg:
+ var f *os.File
+ if f, err = os.OpenFile(
+ pathname.String(),
+ os.O_CREATE|os.O_EXCL|os.O_WRONLY,
+ header.FileInfo().Mode()&0500,
+ ); err != nil {
+ return
+ }
+ if _, err = io.Copy(f, r); err != nil {
+ _ = f.Close()
+ return
+ } else if err = f.Close(); err != nil {
+ return
+ }
+ break
- case tar.TypeXGlobalHeader:
- // ignore
- break
+ case tar.TypeLink:
+ if err = os.Link(header.Linkname, pathname.String()); err != nil {
+ return
+ }
+ break
- default:
- return DisallowedTypeflagError(typeflag)
+ case tar.TypeSymlink:
+ if err = os.Symlink(header.Linkname, pathname.String()); err != nil {
+ return
}
+ break
+ case tar.TypeDir:
+ madeDirectories = append(madeDirectories, dirTargetPerm{
+ path: pathname,
+ mode: header.FileInfo().Mode(),
+ })
+ if err = os.MkdirAll(pathname.String(), 0700); err != nil {
+ return
+ }
break
+
+ case tar.TypeXGlobalHeader:
+ continue // ignore
+
+ default:
+ return DisallowedTypeflagError(typeflag)
}
}
if errors.Is(err, io.EOF) {