internal/pkg: remove typeflag promotion loop
Some checks failed
Test / Create distribution (push) Successful in 47s
Test / ShareFS (push) Failing after 54s
Test / Sandbox (race detector) (push) Failing after 1m10s
Test / Sandbox (push) Failing after 1m13s
Test / Hakurei (push) Failing after 1m30s
Test / Hakurei (race detector) (push) Failing after 1m37s
Test / Hpkg (push) Failing after 1m41s
Test / Flake checks (push) Has been skipped
Some checks failed
Test / Create distribution (push) Successful in 47s
Test / ShareFS (push) Failing after 54s
Test / Sandbox (race detector) (push) Failing after 1m10s
Test / Sandbox (push) Failing after 1m13s
Test / Hakurei (push) Failing after 1m30s
Test / Hakurei (race detector) (push) Failing after 1m37s
Test / Hpkg (push) Failing after 1m41s
Test / Flake checks (push) Has been skipped
Expanding this enables sharing of code common between types. Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
@@ -11,7 +11,7 @@ import (
|
|||||||
"io/fs"
|
"io/fs"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"time"
|
||||||
|
|
||||||
"hakurei.app/container/check"
|
"hakurei.app/container/check"
|
||||||
)
|
)
|
||||||
@@ -142,81 +142,66 @@ func (a *tarArtifact) Cure(t *TContext) (err error) {
|
|||||||
r := tar.NewReader(tr)
|
r := tar.NewReader(tr)
|
||||||
for header, err = r.Next(); err == nil; header, err = r.Next() {
|
for header, err = r.Next(); err == nil; header, err = r.Next() {
|
||||||
typeflag := header.Typeflag
|
typeflag := header.Typeflag
|
||||||
for {
|
if typeflag == 0 {
|
||||||
switch typeflag {
|
if len(header.Name) > 0 && header.Name[len(header.Name)-1] == '/' {
|
||||||
case 0:
|
typeflag = tar.TypeDir
|
||||||
if len(header.Name) > 0 && header.Name[len(header.Name)-1] == '/' {
|
} else {
|
||||||
typeflag = tar.TypeDir
|
typeflag = tar.TypeReg
|
||||||
} 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
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
case tar.TypeXGlobalHeader:
|
|
||||||
// ignore
|
|
||||||
break
|
|
||||||
|
|
||||||
default:
|
|
||||||
return DisallowedTypeflagError(typeflag)
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pathname := temp.Append(header.Name)
|
||||||
|
if typeflag >= '0' && typeflag <= '9' && typeflag != tar.TypeDir {
|
||||||
|
if err = os.MkdirAll(pathname.Dir().String(), 0700); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
break
|
||||||
|
|
||||||
|
case tar.TypeLink:
|
||||||
|
if err = os.Link(header.Linkname, pathname.String()); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
break
|
||||||
|
|
||||||
|
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) {
|
if errors.Is(err, io.EOF) {
|
||||||
|
|||||||
Reference in New Issue
Block a user