internal/pkg: destroy unreachable status entries
All checks were successful
Test / Create distribution (push) Successful in 1m28s
Test / Sandbox (push) Successful in 2m39s
Test / ShareFS (push) Successful in 3m39s
Test / Hakurei (push) Successful in 3m52s
Test / Sandbox (race detector) (push) Successful in 8m30s
Test / Hakurei (race detector) (push) Successful in 11m35s
Test / Flake checks (push) Successful in 8m54s

These must be destroyed alongside their corresponding identifier or substitute entries to avoid inconsistent state.

Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
2026-06-02 15:50:30 +09:00
parent 74c18390b4
commit 6c2f7089b6
2 changed files with 30 additions and 15 deletions

View File

@@ -80,6 +80,13 @@ func (c *Cache) Clean(dry, inputs bool, keep ...Artifact) (
destroyedIdents := make([]unique.Handle[ID], 0, len(idents)) destroyedIdents := make([]unique.Handle[ID], 0, len(idents))
for _, pair := range idents { for _, pair := range idents {
if !dry { if !dry {
if err = os.Remove(c.base.Append(
dirStatus,
pair.name,
).String()); err != nil && !errors.Is(err, os.ErrNotExist) {
return destroyedIdents, nil, err
}
if err = os.Remove(c.base.Append( if err = os.Remove(c.base.Append(
dirIdentifier, dirIdentifier,
pair.name, pair.name,
@@ -125,6 +132,13 @@ func (c *Cache) Clean(dry, inputs bool, keep ...Artifact) (
c.msg.Verbosef("destroying substitute %s...", name) c.msg.Verbosef("destroying substitute %s...", name)
if !dry { if !dry {
if err = os.Remove(c.base.Append(
dirStatus,
name,
).String()); err != nil && !errors.Is(err, os.ErrNotExist) {
return destroyedIdents, nil, err
}
if err = os.Remove(c.base.Append( if err = os.Remove(c.base.Append(
dirSubstitute, dirSubstitute,
name, name,

View File

@@ -143,13 +143,6 @@ func TestClean(t *testing.T) {
deps: []pkg.Artifact{ deps: []pkg.Artifact{
pkg.NewFile("destroyed-input", []byte("destroyed")), pkg.NewFile("destroyed-input", []byte("destroyed")),
}, },
cure: func(f *pkg.FContext) error {
p := f.GetWorkDir()
if err := os.MkdirAll(p.String(), 0755); err != nil {
return err
}
return os.WriteFile(p.Append("result").String(), nil, 0444)
},
}), }),
}, []unique.Handle[pkg.Checksum]{ }, []unique.Handle[pkg.Checksum]{
unique.Make(sha512.Sum384([]byte("destroyed"))), unique.Make(sha512.Sum384([]byte("destroyed"))),
@@ -163,6 +156,12 @@ func TestClean(t *testing.T) {
pkg.NewFile("destroyed-input", []byte("destroyed")), pkg.NewFile("destroyed-input", []byte("destroyed")),
}, },
cure: func(f *pkg.FContext) error { cure: func(f *pkg.FContext) error {
if w, err := f.GetStatusWriter(); err != nil {
return err
} else if _, err = w.Write([]byte("destroyed")); err != nil {
return err
}
p := f.GetWorkDir() p := f.GetWorkDir()
if err := os.MkdirAll(p.String(), 0755); err != nil { if err := os.MkdirAll(p.String(), 0755); err != nil {
return err return err
@@ -178,6 +177,12 @@ func TestClean(t *testing.T) {
pkg.NewFile("kept-input", []byte("kept")), pkg.NewFile("kept-input", []byte("kept")),
}, },
cure: func(f *pkg.FContext) error { cure: func(f *pkg.FContext) error {
if w, err := f.GetStatusWriter(); err != nil {
return err
} else if _, err = w.Write([]byte("kept")); err != nil {
return err
}
p := f.GetWorkDir() p := f.GetWorkDir()
if err := os.MkdirAll(p.String(), 0755); err != nil { if err := os.MkdirAll(p.String(), 0755); err != nil {
return err return err
@@ -199,7 +204,10 @@ func TestClean(t *testing.T) {
"lock": {Mode: 0644}, "lock": {Mode: 0644},
"variant": {Mode: 0400}, "variant": {Mode: 0400},
"status": {Mode: fs.ModeDir | 0700},
"status": {Mode: fs.ModeDir | 0700},
"status/4bjS-QjGcSV4nth-W6Vg3-wolKmKgiq4Ld2oRIWcOfy6Wi41XXLAWPoo8FcDx6BH": {Mode: 0400, Data: []byte(statusHeader + "kept")},
"status/xoIGLemzLF227e-w_AJcf_1Sgqh2gs3KFgqvOIWUQE-9P_y2vHBMBytL4GRGQqTb": {Mode: 0400, Data: []byte(statusHeader + "kept")},
"substitute": {Mode: fs.ModeDir | 0700}, "substitute": {Mode: fs.ModeDir | 0700},
"substitute/4bjS-QjGcSV4nth-W6Vg3-wolKmKgiq4Ld2oRIWcOfy6Wi41XXLAWPoo8FcDx6BH": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/CyDnDvF-LaeGPcSW70tPosNCoclByWkTjznUUF1DcgzlIwkN9yzz1ZFME1TlPj6W")}, "substitute/4bjS-QjGcSV4nth-W6Vg3-wolKmKgiq4Ld2oRIWcOfy6Wi41XXLAWPoo8FcDx6BH": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/CyDnDvF-LaeGPcSW70tPosNCoclByWkTjznUUF1DcgzlIwkN9yzz1ZFME1TlPj6W")},
@@ -214,13 +222,6 @@ func TestClean(t *testing.T) {
deps: []pkg.Artifact{ deps: []pkg.Artifact{
pkg.NewFile("destroyed-input", []byte("destroyed")), pkg.NewFile("destroyed-input", []byte("destroyed")),
}, },
cure: func(f *pkg.FContext) error {
p := f.GetWorkDir()
if err := os.MkdirAll(p.String(), 0755); err != nil {
return err
}
return os.WriteFile(p.Append("result").String(), nil, 0444)
},
}), }),
}, []unique.Handle[pkg.Checksum]{ }, []unique.Handle[pkg.Checksum]{
unique.Make(expectsFS{ unique.Make(expectsFS{