74 lines
1.8 KiB
Go
74 lines
1.8 KiB
Go
package vault
|
|
|
|
import "rawmark/internal/i18n"
|
|
|
|
type CleanupResult struct {
|
|
Deleted []TrashItem `json:"deleted"`
|
|
Skipped []CleanupSkip `json:"skipped"`
|
|
}
|
|
type CleanupSkip struct {
|
|
Path string `json:"path"`
|
|
Reason string `json:"reason"`
|
|
Cause error `json:"-"`
|
|
}
|
|
|
|
// CleanupImages rescans references under the write lock; the derived index never authorizes deletion.
|
|
func (v *Vault) CleanupImages(paths []string) (CleanupResult, error) {
|
|
result := CleanupResult{Deleted: []TrashItem{}, Skipped: []CleanupSkip{}}
|
|
v.mu.Lock()
|
|
defer v.mu.Unlock()
|
|
entries, err := v.Tree()
|
|
if err != nil {
|
|
return result, err
|
|
}
|
|
references := map[string]bool{}
|
|
for _, entry := range entries {
|
|
if entry.Dir || !IsNote(entry.Path) {
|
|
continue
|
|
}
|
|
content, _, err := v.Read(entry.Path)
|
|
if err != nil {
|
|
return result, err
|
|
}
|
|
metadata := Analyze(entry.Path, content)
|
|
if len(metadata.Warnings) > 0 {
|
|
return result, i18n.New("w_invalid_metadata_in_s_478c93", ErrInvalidPath, entry.Path, metadata.Diagnostics[0])
|
|
}
|
|
for _, ref := range metadata.Assets {
|
|
references[ref.Target] = true
|
|
}
|
|
}
|
|
seen := map[string]bool{}
|
|
for _, p := range paths {
|
|
if seen[p] {
|
|
continue
|
|
}
|
|
seen[p] = true
|
|
var reason error
|
|
switch {
|
|
case !IsImage(p):
|
|
reason = i18n.New("image_not_file")
|
|
case references[p]:
|
|
reason = i18n.New("image_in_use")
|
|
default:
|
|
info, err := v.Stat(p)
|
|
if err != nil {
|
|
reason = err
|
|
} else if !info.Mode().IsRegular() {
|
|
reason = i18n.New("image_not_file")
|
|
}
|
|
}
|
|
if reason != nil {
|
|
result.Skipped = append(result.Skipped, CleanupSkip{p, reason.Error(), reason})
|
|
continue
|
|
}
|
|
item, err := v.deleteLocked(p)
|
|
if err != nil {
|
|
result.Skipped = append(result.Skipped, CleanupSkip{p, err.Error(), err})
|
|
continue
|
|
}
|
|
result.Deleted = append(result.Deleted, item)
|
|
}
|
|
return result, nil
|
|
}
|