aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pkg/aflow/cache.go46
1 files changed, 36 insertions, 10 deletions
diff --git a/pkg/aflow/cache.go b/pkg/aflow/cache.go
index fe60e5358..a3eb8005e 100644
--- a/pkg/aflow/cache.go
+++ b/pkg/aflow/cache.go
@@ -4,6 +4,7 @@
package aflow
import (
+ "encoding/json"
"fmt"
"maps"
"os"
@@ -88,7 +89,11 @@ func (c *Cache) Create(typ, desc string, populate func(string) error) (string, e
if err != nil {
return "", err
}
- if err := osutil.WriteFile(metaFile, []byte(desc)); err != nil {
+ meta := cacheMeta{
+ Description: desc,
+ DiskUsage: size,
+ }
+ if err := osutil.WriteJSON(metaFile, meta); err != nil {
os.RemoveAll(dir)
return "", err
}
@@ -135,26 +140,42 @@ func (c *Cache) init() error {
}
for _, dir := range dirs {
metaFile := filepath.Join(dir, cacheMetaFile)
- if !osutil.IsExist(metaFile) {
- if err := osutil.RemoveAll(dir); err != nil {
+ data, err := os.ReadFile(metaFile)
+ if err != nil {
+ if os.IsNotExist(err) {
+ // Incomplete cache dir.
+ if err := osutil.RemoveAll(dir); err != nil {
+ return err
+ }
+ continue
+ }
+ return err
+ }
+ var meta cacheMeta
+ if err := json.Unmarshal(data, &meta); err != nil {
+ // Assume the old format that contained just the description.
+ // This code can be removed after 2027-06-01,
+ // and the code above can use osutil.ReadJSON.
+ size, err := osutil.DiskUsage(dir)
+ if err != nil {
+ return err
+ }
+ meta.Description = string(data)
+ meta.DiskUsage = size
+ if err := osutil.WriteJSON(metaFile, meta); err != nil {
return err
}
- continue
}
stat, err := os.Stat(metaFile)
if err != nil {
return err
}
- size, err := osutil.DiskUsage(dir)
- if err != nil {
- return err
- }
c.entries[dir] = &cacheEntry{
dir: dir,
- size: size,
+ size: meta.DiskUsage,
lastUsed: stat.ModTime(),
}
- c.currentSize += size
+ c.currentSize += meta.DiskUsage
}
c.mu.Lock()
defer c.mu.Unlock()
@@ -198,4 +219,9 @@ func (c *Cache) logf(msg string, args ...any) {
}
}
+type cacheMeta struct {
+ Description string
+ DiskUsage uint64
+}
+
const cacheMetaFile = "aflow-meta"