internal/pkg: expand single directory tarball
All checks were successful
Test / Create distribution (push) Successful in 43s
Test / Sandbox (push) Successful in 2m34s
Test / Hakurei (push) Successful in 3m36s
Test / ShareFS (push) Successful in 3m41s
Test / Hpkg (push) Successful in 4m24s
Test / Sandbox (race detector) (push) Successful in 4m57s
Test / Hakurei (race detector) (push) Successful in 5m51s
Test / Flake checks (push) Successful in 1m35s
All checks were successful
Test / Create distribution (push) Successful in 43s
Test / Sandbox (push) Successful in 2m34s
Test / Hakurei (push) Successful in 3m36s
Test / ShareFS (push) Successful in 3m41s
Test / Hpkg (push) Successful in 4m24s
Test / Sandbox (race detector) (push) Successful in 4m57s
Test / Hakurei (race detector) (push) Successful in 5m51s
Test / Flake checks (push) Successful in 1m35s
This enables much cleaner use of their output without giving up any meaningful data. Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
@@ -202,6 +202,7 @@ func TestFlatten(t *testing.T) {
|
|||||||
"identifier": {Mode: fs.ModeDir | 0700},
|
"identifier": {Mode: fs.ModeDir | 0700},
|
||||||
"identifier/-P_1iw6yVq_letMHncqcExSE0bYcDhYI5OdY6b1wKASf-Corufvj__XTBUq2Qd2a": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/yJlSb2A3jxaMLuKqwp1GwHOguAHddS9MjygF9ICEeegKfRvgLPdPmNh8mva47f8o")},
|
"identifier/-P_1iw6yVq_letMHncqcExSE0bYcDhYI5OdY6b1wKASf-Corufvj__XTBUq2Qd2a": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/yJlSb2A3jxaMLuKqwp1GwHOguAHddS9MjygF9ICEeegKfRvgLPdPmNh8mva47f8o")},
|
||||||
|
|
||||||
|
"temp": {Mode: fs.ModeDir | 0700},
|
||||||
"work": {Mode: fs.ModeDir | 0700},
|
"work": {Mode: fs.ModeDir | 0700},
|
||||||
}, []pkg.FlatEntry{
|
}, []pkg.FlatEntry{
|
||||||
{Mode: fs.ModeDir | 0700, Path: "."},
|
{Mode: fs.ModeDir | 0700, Path: "."},
|
||||||
@@ -222,8 +223,45 @@ func TestFlatten(t *testing.T) {
|
|||||||
{Mode: fs.ModeDir | 0700, Path: "identifier"},
|
{Mode: fs.ModeDir | 0700, Path: "identifier"},
|
||||||
{Mode: fs.ModeSymlink | 0777, Path: "identifier/-P_1iw6yVq_letMHncqcExSE0bYcDhYI5OdY6b1wKASf-Corufvj__XTBUq2Qd2a", Data: []byte("../checksum/yJlSb2A3jxaMLuKqwp1GwHOguAHddS9MjygF9ICEeegKfRvgLPdPmNh8mva47f8o")},
|
{Mode: fs.ModeSymlink | 0777, Path: "identifier/-P_1iw6yVq_letMHncqcExSE0bYcDhYI5OdY6b1wKASf-Corufvj__XTBUq2Qd2a", Data: []byte("../checksum/yJlSb2A3jxaMLuKqwp1GwHOguAHddS9MjygF9ICEeegKfRvgLPdPmNh8mva47f8o")},
|
||||||
|
|
||||||
|
{Mode: fs.ModeDir | 0700, Path: "temp"},
|
||||||
{Mode: fs.ModeDir | 0700, Path: "work"},
|
{Mode: fs.ModeDir | 0700, Path: "work"},
|
||||||
}, pkg.MustDecode("lmVlYEGNFkwGVpzzS8KYjGBVB6FCyPtk9ViX88zen0GgTKLgGqO6eFxb4dpcP6bR")},
|
}, pkg.MustDecode("d14kfTvK8uyYIrMq-NUPGGIGmYKcFytmrsvEu5oXibVfmxhu7Y_dAt3rXpsHVSPM")},
|
||||||
|
|
||||||
|
{"sample tar expand step unpack", fstest.MapFS{
|
||||||
|
".": {Mode: fs.ModeDir | 0700},
|
||||||
|
|
||||||
|
"libedac.so": {Mode: fs.ModeSymlink | 0777, Data: []byte("/proc/nonexistent/libedac.so")},
|
||||||
|
}, []pkg.FlatEntry{
|
||||||
|
{Mode: fs.ModeDir | 0700, Path: "."},
|
||||||
|
|
||||||
|
{Mode: fs.ModeSymlink | 0777, Path: "libedac.so", Data: []byte("/proc/nonexistent/libedac.so")},
|
||||||
|
}, pkg.MustDecode("rY9_cYWgGWgGI2efznu9RP6bPnjM6I5CHFY2nGysnlbPDdOx_iIaiGKYesmMARwC")},
|
||||||
|
|
||||||
|
{"sample tar expand", fstest.MapFS{
|
||||||
|
".": {Mode: fs.ModeDir | 0700},
|
||||||
|
|
||||||
|
"checksum": {Mode: fs.ModeDir | 0700},
|
||||||
|
"checksum/rY9_cYWgGWgGI2efznu9RP6bPnjM6I5CHFY2nGysnlbPDdOx_iIaiGKYesmMARwC": {Mode: fs.ModeDir | 0500},
|
||||||
|
"checksum/rY9_cYWgGWgGI2efznu9RP6bPnjM6I5CHFY2nGysnlbPDdOx_iIaiGKYesmMARwC/libedac.so": {Mode: fs.ModeSymlink | 0777, Data: []byte("/proc/nonexistent/libedac.so")},
|
||||||
|
|
||||||
|
"identifier": {Mode: fs.ModeDir | 0700},
|
||||||
|
"identifier/-P_1iw6yVq_letMHncqcExSE0bYcDhYI5OdY6b1wKASf-Corufvj__XTBUq2Qd2a": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/rY9_cYWgGWgGI2efznu9RP6bPnjM6I5CHFY2nGysnlbPDdOx_iIaiGKYesmMARwC")},
|
||||||
|
|
||||||
|
"temp": {Mode: fs.ModeDir | 0700},
|
||||||
|
"work": {Mode: fs.ModeDir | 0700},
|
||||||
|
}, []pkg.FlatEntry{
|
||||||
|
{Mode: fs.ModeDir | 0700, Path: "."},
|
||||||
|
|
||||||
|
{Mode: fs.ModeDir | 0700, Path: "checksum"},
|
||||||
|
{Mode: fs.ModeDir | 0500, Path: "checksum/rY9_cYWgGWgGI2efznu9RP6bPnjM6I5CHFY2nGysnlbPDdOx_iIaiGKYesmMARwC"},
|
||||||
|
{Mode: fs.ModeSymlink | 0777, Path: "checksum/rY9_cYWgGWgGI2efznu9RP6bPnjM6I5CHFY2nGysnlbPDdOx_iIaiGKYesmMARwC/libedac.so", Data: []byte("/proc/nonexistent/libedac.so")},
|
||||||
|
|
||||||
|
{Mode: fs.ModeDir | 0700, Path: "identifier"},
|
||||||
|
{Mode: fs.ModeSymlink | 0777, Path: "identifier/-P_1iw6yVq_letMHncqcExSE0bYcDhYI5OdY6b1wKASf-Corufvj__XTBUq2Qd2a", Data: []byte("../checksum/rY9_cYWgGWgGI2efznu9RP6bPnjM6I5CHFY2nGysnlbPDdOx_iIaiGKYesmMARwC")},
|
||||||
|
|
||||||
|
{Mode: fs.ModeDir | 0700, Path: "temp"},
|
||||||
|
{Mode: fs.ModeDir | 0700, Path: "work"},
|
||||||
|
}, pkg.MustDecode("tqrqx8Ig_l9jjDywovatvg3btS-6hf182Ofzpjcrj2148NhobE_Xb7wrYptZoXFD")},
|
||||||
}
|
}
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
t.Run(tc.name, func(t *testing.T) {
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
|||||||
@@ -108,6 +108,10 @@ func (a *tarArtifact) Cure(work, temp *check.Absolute, loadData CacheDataFunc) (
|
|||||||
}
|
}
|
||||||
var madeDirectories []dirTargetPerm
|
var madeDirectories []dirTargetPerm
|
||||||
|
|
||||||
|
if err = os.MkdirAll(temp.String(), 0700); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
var header *tar.Header
|
var header *tar.Header
|
||||||
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() {
|
||||||
@@ -125,7 +129,7 @@ func (a *tarArtifact) Cure(work, temp *check.Absolute, loadData CacheDataFunc) (
|
|||||||
case tar.TypeReg:
|
case tar.TypeReg:
|
||||||
var f *os.File
|
var f *os.File
|
||||||
if f, err = os.OpenFile(
|
if f, err = os.OpenFile(
|
||||||
work.Append(header.Name).String(),
|
temp.Append(header.Name).String(),
|
||||||
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 {
|
||||||
@@ -142,7 +146,7 @@ func (a *tarArtifact) Cure(work, temp *check.Absolute, loadData CacheDataFunc) (
|
|||||||
case tar.TypeLink:
|
case tar.TypeLink:
|
||||||
if err = os.Link(
|
if err = os.Link(
|
||||||
header.Linkname,
|
header.Linkname,
|
||||||
work.Append(header.Name).String(),
|
temp.Append(header.Name).String(),
|
||||||
); err != nil {
|
); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -151,14 +155,14 @@ func (a *tarArtifact) Cure(work, temp *check.Absolute, loadData CacheDataFunc) (
|
|||||||
case tar.TypeSymlink:
|
case tar.TypeSymlink:
|
||||||
if err = os.Symlink(
|
if err = os.Symlink(
|
||||||
header.Linkname,
|
header.Linkname,
|
||||||
work.Append(header.Name).String(),
|
temp.Append(header.Name).String(),
|
||||||
); err != nil {
|
); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
|
|
||||||
case tar.TypeDir:
|
case tar.TypeDir:
|
||||||
pathname := work.Append(header.Name)
|
pathname := temp.Append(header.Name)
|
||||||
madeDirectories = append(madeDirectories, dirTargetPerm{
|
madeDirectories = append(madeDirectories, dirTargetPerm{
|
||||||
path: pathname,
|
path: pathname,
|
||||||
mode: header.FileInfo().Mode(),
|
mode: header.FileInfo().Mode(),
|
||||||
@@ -185,14 +189,29 @@ func (a *tarArtifact) Cure(work, temp *check.Absolute, loadData CacheDataFunc) (
|
|||||||
if errors.Is(err, io.EOF) {
|
if errors.Is(err, io.EOF) {
|
||||||
err = nil
|
err = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
for _, e := range madeDirectories {
|
for _, e := range madeDirectories {
|
||||||
if err = os.Chmod(e.path.String(), e.mode&0500); err != nil {
|
if err = os.Chmod(e.path.String(), e.mode&0500); err != nil {
|
||||||
return
|
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
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,23 +17,48 @@ import (
|
|||||||
func TestTar(t *testing.T) {
|
func TestTar(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
testdataFsys := fstest.MapFS{
|
checkWithCache(t, []cacheTestCase{
|
||||||
".": {Mode: fs.ModeDir | 0700},
|
{"http", nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
|
||||||
|
checkTarHTTP(t, base, c, fstest.MapFS{
|
||||||
|
".": {Mode: fs.ModeDir | 0700},
|
||||||
|
|
||||||
"checksum": {Mode: fs.ModeDir | 0700},
|
"checksum": {Mode: fs.ModeDir | 0700},
|
||||||
"checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP": {Mode: fs.ModeDir | 0700},
|
"checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP": {Mode: fs.ModeDir | 0700},
|
||||||
"checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP/check": {Mode: 0400, Data: []byte{0, 0}},
|
"checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP/check": {Mode: 0400, Data: []byte{0, 0}},
|
||||||
"checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP/lib": {Mode: fs.ModeDir | 0700},
|
"checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP/lib": {Mode: fs.ModeDir | 0700},
|
||||||
"checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP/lib/pkgconfig": {Mode: fs.ModeDir | 0700},
|
"checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP/lib/pkgconfig": {Mode: fs.ModeDir | 0700},
|
||||||
"checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP/lib/libedac.so": {Mode: 01000000777, Data: []byte("/proc/nonexistent/libedac.so")},
|
"checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP/lib/libedac.so": {Mode: fs.ModeSymlink | 0777, Data: []byte("/proc/nonexistent/libedac.so")},
|
||||||
|
|
||||||
"identifier": {Mode: fs.ModeDir | 0700},
|
"identifier": {Mode: fs.ModeDir | 0700},
|
||||||
"identifier/HnySzeLQvSBZuTUcvfmLEX_OmH4yJWWH788NxuLuv7kVn8_uPM6Ks4rqFWM2NZJY": {Mode: 01000000777, Data: []byte("../checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP")},
|
"identifier/HnySzeLQvSBZuTUcvfmLEX_OmH4yJWWH788NxuLuv7kVn8_uPM6Ks4rqFWM2NZJY": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP")},
|
||||||
"identifier/Zx5ZG9BAwegNT3zQwCySuI2ktCXxNgxirkGLFjW4FW06PtojYVaCdtEw8yuntPLa": {Mode: 01000000777, Data: []byte("../checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP")},
|
"identifier/Zx5ZG9BAwegNT3zQwCySuI2ktCXxNgxirkGLFjW4FW06PtojYVaCdtEw8yuntPLa": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP")},
|
||||||
|
|
||||||
"work": {Mode: fs.ModeDir | 0700},
|
"work": {Mode: fs.ModeDir | 0700},
|
||||||
}
|
}, pkg.MustDecode(
|
||||||
|
"yJlSb2A3jxaMLuKqwp1GwHOguAHddS9MjygF9ICEeegKfRvgLPdPmNh8mva47f8o",
|
||||||
|
))
|
||||||
|
}, pkg.MustDecode("d14kfTvK8uyYIrMq-NUPGGIGmYKcFytmrsvEu5oXibVfmxhu7Y_dAt3rXpsHVSPM")},
|
||||||
|
|
||||||
|
{"http expand", nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
|
||||||
|
checkTarHTTP(t, base, c, fstest.MapFS{
|
||||||
|
".": {Mode: fs.ModeDir | 0700},
|
||||||
|
|
||||||
|
"lib": {Mode: fs.ModeDir | 0700},
|
||||||
|
"lib/libedac.so": {Mode: fs.ModeSymlink | 0777, Data: []byte("/proc/nonexistent/libedac.so")},
|
||||||
|
}, pkg.MustDecode(
|
||||||
|
"rY9_cYWgGWgGI2efznu9RP6bPnjM6I5CHFY2nGysnlbPDdOx_iIaiGKYesmMARwC",
|
||||||
|
))
|
||||||
|
}, pkg.MustDecode("tqrqx8Ig_l9jjDywovatvg3btS-6hf182Ofzpjcrj2148NhobE_Xb7wrYptZoXFD")},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkTarHTTP(
|
||||||
|
t *testing.T,
|
||||||
|
base *check.Absolute,
|
||||||
|
c *pkg.Cache,
|
||||||
|
testdataFsys fs.FS,
|
||||||
|
wantChecksum pkg.Checksum,
|
||||||
|
) {
|
||||||
var testdata string
|
var testdata string
|
||||||
{
|
{
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
@@ -68,47 +93,40 @@ func TestTar(t *testing.T) {
|
|||||||
"testdata": {Data: []byte(testdata), Mode: 0400},
|
"testdata": {Data: []byte(testdata), Mode: 0400},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
checkWithCache(t, []cacheTestCase{
|
wantIdent := func() pkg.ID {
|
||||||
{"http", nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
|
h := sha512.New384()
|
||||||
wantIdent := func() pkg.ID {
|
h.Write([]byte{byte(pkg.KindTar), 0, 0, 0, 0, 0, 0, 0})
|
||||||
h := sha512.New384()
|
h.Write([]byte{pkg.TarGzip, 0, 0, 0, 0, 0, 0, 0})
|
||||||
h.Write([]byte{byte(pkg.KindTar), 0, 0, 0, 0, 0, 0, 0})
|
h.Write([]byte{byte(pkg.KindHTTPGet), 0, 0, 0, 0, 0, 0, 0})
|
||||||
h.Write([]byte{pkg.TarGzip, 0, 0, 0, 0, 0, 0, 0})
|
httpIdent := pkg.KindHTTPGet.Ident([]byte("file:///testdata"))
|
||||||
h.Write([]byte{byte(pkg.KindHTTPGet), 0, 0, 0, 0, 0, 0, 0})
|
h.Write(httpIdent[:])
|
||||||
httpIdent := pkg.KindHTTPGet.Ident([]byte("file:///testdata"))
|
return pkg.ID(h.Sum(nil))
|
||||||
h.Write(httpIdent[:])
|
}()
|
||||||
return pkg.ID(h.Sum(nil))
|
|
||||||
}()
|
|
||||||
|
|
||||||
a := pkg.NewHTTPGetTar(
|
a := pkg.NewHTTPGetTar(
|
||||||
t.Context(),
|
t.Context(),
|
||||||
&client,
|
&client,
|
||||||
"file:///testdata",
|
"file:///testdata",
|
||||||
testdataChecksum,
|
testdataChecksum,
|
||||||
pkg.TarGzip,
|
pkg.TarGzip,
|
||||||
)
|
)
|
||||||
|
|
||||||
if id := pkg.Ident(a); id != wantIdent {
|
if id := pkg.Ident(a); id != wantIdent {
|
||||||
t.Fatalf("Ident: %s, want %s", pkg.Encode(id), pkg.Encode(wantIdent))
|
t.Fatalf("Ident: %s, want %s", pkg.Encode(id), pkg.Encode(wantIdent))
|
||||||
}
|
}
|
||||||
|
|
||||||
wantPathname := base.Append(
|
wantPathname := base.Append(
|
||||||
"identifier",
|
"identifier",
|
||||||
pkg.Encode(wantIdent),
|
pkg.Encode(wantIdent),
|
||||||
)
|
)
|
||||||
wantChecksum := pkg.MustDecode(
|
if pathname, checksum, err := c.Cure(a); err != nil {
|
||||||
"yJlSb2A3jxaMLuKqwp1GwHOguAHddS9MjygF9ICEeegKfRvgLPdPmNh8mva47f8o",
|
t.Fatalf("Cure: error = %v", err)
|
||||||
)
|
} else if !pathname.Is(wantPathname) {
|
||||||
if pathname, checksum, err := c.Cure(a); err != nil {
|
t.Fatalf("Cure: %q, want %q", pathname, wantPathname)
|
||||||
t.Fatalf("Cure: error = %v", err)
|
} else if checksum != wantChecksum {
|
||||||
} else if !pathname.Is(wantPathname) {
|
t.Fatalf("Cure: %v", &pkg.ChecksumMismatchError{
|
||||||
t.Fatalf("Cure: %q, want %q", pathname, wantPathname)
|
Got: checksum,
|
||||||
} else if checksum != wantChecksum {
|
Want: wantChecksum,
|
||||||
t.Fatalf("Cure: %v", &pkg.ChecksumMismatchError{
|
})
|
||||||
Got: checksum,
|
}
|
||||||
Want: wantChecksum,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}, pkg.MustDecode("lmVlYEGNFkwGVpzzS8KYjGBVB6FCyPtk9ViX88zen0GgTKLgGqO6eFxb4dpcP6bR")},
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user