diff options
| author | Ophestra <cat@gensokyo.uk> | 2026-06-07 01:21:00 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2026-06-07 01:21:00 +0900 |
| commit | e192fca762c2a44743474db33e5c807aab68ce6b (patch) | |
| tree | e731b9a96b9605b3e0dd60f050fe7a5353dc58eb /internal/pkg/pkg.go | |
| parent | 7eafc7b1e4b895d1986280e192aa8d493fff8d96 (diff) | |
internal/pkg: check for unclean shutdown
This avoids running into nasty surprises opening a cache that suffered unclean shutdown due to power loss. All other parts of the cache are not prone to inconsistent state.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/pkg/pkg.go')
| -rw-r--r-- | internal/pkg/pkg.go | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/internal/pkg/pkg.go b/internal/pkg/pkg.go index b8a997d8..9a6d5201 100644 --- a/internal/pkg/pkg.go +++ b/internal/pkg/pkg.go @@ -2443,6 +2443,37 @@ func open( c.unlock = func() {} } + for _, name := range []string{ + dirWork, + dirTemp, + } { + dents, err := os.ReadDir(base.Append(name).String()) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + continue + } + c.unlock() + return nil, err + } + if len(dents) != 0 { + c.unlock() + return nil, fmt.Errorf( + "%s is not empty, scrub likely required", + name, + ) + } + } + + if _, err := os.ReadDir(base.Append( + dirExecScratch, + ).String()); !errors.Is(err, os.ErrNotExist) { + c.unlock() + if err != nil { + return nil, err + } + return nil, errors.New(dirExecScratch + " is present, scrub likely required") + } + variantPath := base.Append(fileVariant).String() if p, err := os.ReadFile(variantPath); err != nil { if !errors.Is(err, os.ErrNotExist) { |
