|
4 | 4 | package aflow |
5 | 5 |
|
6 | 6 | import ( |
| 7 | + "encoding/json" |
7 | 8 | "fmt" |
8 | 9 | "maps" |
9 | 10 | "os" |
@@ -88,7 +89,11 @@ func (c *Cache) Create(typ, desc string, populate func(string) error) (string, e |
88 | 89 | if err != nil { |
89 | 90 | return "", err |
90 | 91 | } |
91 | | - if err := osutil.WriteFile(metaFile, []byte(desc)); err != nil { |
| 92 | + meta := cacheMeta{ |
| 93 | + Description: desc, |
| 94 | + DiskUsage: size, |
| 95 | + } |
| 96 | + if err := osutil.WriteJSON(metaFile, meta); err != nil { |
92 | 97 | os.RemoveAll(dir) |
93 | 98 | return "", err |
94 | 99 | } |
@@ -135,26 +140,42 @@ func (c *Cache) init() error { |
135 | 140 | } |
136 | 141 | for _, dir := range dirs { |
137 | 142 | metaFile := filepath.Join(dir, cacheMetaFile) |
138 | | - if !osutil.IsExist(metaFile) { |
139 | | - if err := osutil.RemoveAll(dir); err != nil { |
| 143 | + data, err := os.ReadFile(metaFile) |
| 144 | + if err != nil { |
| 145 | + if os.IsNotExist(err) { |
| 146 | + // Incomplete cache dir. |
| 147 | + if err := osutil.RemoveAll(dir); err != nil { |
| 148 | + return err |
| 149 | + } |
| 150 | + continue |
| 151 | + } |
| 152 | + return err |
| 153 | + } |
| 154 | + var meta cacheMeta |
| 155 | + if err := json.Unmarshal(data, &meta); err != nil { |
| 156 | + // Assume the old format that contained just the description. |
| 157 | + // This code can be removed after 2027-06-01, |
| 158 | + // and the code above can use osutil.ReadJSON. |
| 159 | + size, err := osutil.DiskUsage(dir) |
| 160 | + if err != nil { |
| 161 | + return err |
| 162 | + } |
| 163 | + meta.Description = string(data) |
| 164 | + meta.DiskUsage = size |
| 165 | + if err := osutil.WriteJSON(metaFile, meta); err != nil { |
140 | 166 | return err |
141 | 167 | } |
142 | | - continue |
143 | 168 | } |
144 | 169 | stat, err := os.Stat(metaFile) |
145 | 170 | if err != nil { |
146 | 171 | return err |
147 | 172 | } |
148 | | - size, err := osutil.DiskUsage(dir) |
149 | | - if err != nil { |
150 | | - return err |
151 | | - } |
152 | 173 | c.entries[dir] = &cacheEntry{ |
153 | 174 | dir: dir, |
154 | | - size: size, |
| 175 | + size: meta.DiskUsage, |
155 | 176 | lastUsed: stat.ModTime(), |
156 | 177 | } |
157 | | - c.currentSize += size |
| 178 | + c.currentSize += meta.DiskUsage |
158 | 179 | } |
159 | 180 | c.mu.Lock() |
160 | 181 | defer c.mu.Unlock() |
@@ -198,4 +219,9 @@ func (c *Cache) logf(msg string, args ...any) { |
198 | 219 | } |
199 | 220 | } |
200 | 221 |
|
| 222 | +type cacheMeta struct { |
| 223 | + Description string |
| 224 | + DiskUsage uint64 |
| 225 | +} |
| 226 | + |
201 | 227 | const cacheMetaFile = "aflow-meta" |
0 commit comments