internal/pkg: ensure parent for non-directory entries
All checks were successful
Test / Create distribution (push) Successful in 51s
Test / Sandbox (push) Successful in 2m36s
Test / Hakurei (push) Successful in 3m41s
Test / ShareFS (push) Successful in 3m48s
Test / Hpkg (push) Successful in 4m29s
Test / Sandbox (race detector) (push) Successful in 4m57s
Test / Hakurei (race detector) (push) Successful in 3m12s
Test / Flake checks (push) Successful in 1m38s
All checks were successful
Test / Create distribution (push) Successful in 51s
Test / Sandbox (push) Successful in 2m36s
Test / Hakurei (push) Successful in 3m41s
Test / ShareFS (push) Successful in 3m48s
Test / Hpkg (push) Successful in 4m29s
Test / Sandbox (race detector) (push) Successful in 4m57s
Test / Hakurei (race detector) (push) Successful in 3m12s
Test / Flake checks (push) Successful in 1m38s
This works around streams containing out of order entries. Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
@@ -11,6 +11,7 @@ import (
|
|||||||
"io/fs"
|
"io/fs"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
"path"
|
||||||
|
|
||||||
"hakurei.app/container/check"
|
"hakurei.app/container/check"
|
||||||
)
|
)
|
||||||
@@ -128,9 +129,14 @@ func (a *tarArtifact) Cure(c *CureContext) (err error) {
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
case tar.TypeReg:
|
case tar.TypeReg:
|
||||||
|
p := temp.Append(header.Name).String()
|
||||||
|
if err = os.MkdirAll(path.Dir(p), 0700); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
var f *os.File
|
var f *os.File
|
||||||
if f, err = os.OpenFile(
|
if f, err = os.OpenFile(
|
||||||
temp.Append(header.Name).String(),
|
p,
|
||||||
os.O_CREATE|os.O_EXCL|os.O_WRONLY,
|
os.O_CREATE|os.O_EXCL|os.O_WRONLY,
|
||||||
header.FileInfo().Mode()&0400,
|
header.FileInfo().Mode()&0400,
|
||||||
); err != nil {
|
); err != nil {
|
||||||
@@ -145,19 +151,21 @@ func (a *tarArtifact) Cure(c *CureContext) (err error) {
|
|||||||
break
|
break
|
||||||
|
|
||||||
case tar.TypeLink:
|
case tar.TypeLink:
|
||||||
if err = os.Link(
|
p := temp.Append(header.Name).String()
|
||||||
header.Linkname,
|
if err = os.MkdirAll(path.Dir(p), 0700); err != nil {
|
||||||
temp.Append(header.Name).String(),
|
return
|
||||||
); err != nil {
|
}
|
||||||
|
if err = os.Link(header.Linkname, p); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
|
|
||||||
case tar.TypeSymlink:
|
case tar.TypeSymlink:
|
||||||
if err = os.Symlink(
|
p := temp.Append(header.Name).String()
|
||||||
header.Linkname,
|
if err = os.MkdirAll(path.Dir(p), 0700); err != nil {
|
||||||
temp.Append(header.Name).String(),
|
return
|
||||||
); err != nil {
|
}
|
||||||
|
if err = os.Symlink(header.Linkname, p); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
|
|||||||
Reference in New Issue
Block a user