mirror of
https://codeberg.org/forgejo-aneksajo/forgejo-aneksajo.git
synced 2025-04-21 05:36:43 +02:00
Invalidate outdated annex UUID cache entries (#60)
The previous implementation could lead to errors e.g. when a repository was removed and a new one with a new UUID was created under the same name. This now checks the validity of the retrieved cache entry every time and invalidates the cache if necessary. Reviewed-on: https://codeberg.org/forgejo-aneksajo/forgejo-aneksajo/pulls/60 Co-authored-by: Matthias Riße <m.risse@fz-juelich.de> Co-committed-by: Matthias Riße <m.risse@fz-juelich.de>
This commit is contained in:
parent
efe77599e6
commit
0ee62840ff
1 changed files with 35 additions and 1 deletions
|
@ -131,7 +131,7 @@ func updateUUID2RepoPathCache() error {
|
|||
})
|
||||
}
|
||||
|
||||
func UUID2RepoPath(uuid string) (string, error) {
|
||||
func repoPathFromUUIDCache(uuid string) (string, error) {
|
||||
if repoPath, ok := uuid2repoPathCache[uuid]; ok {
|
||||
return repoPath, nil
|
||||
}
|
||||
|
@ -144,3 +144,37 @@ func UUID2RepoPath(uuid string) (string, error) {
|
|||
}
|
||||
return "", fmt.Errorf("no repository known for UUID '%s'", uuid)
|
||||
}
|
||||
|
||||
func checkValidity(uuid, repoPath string) (bool, error) {
|
||||
stdout, _, err := git.NewCommand(git.DefaultContext, "config", "annex.uuid").RunStdString(&git.RunOpts{Dir: repoPath})
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
repoUUID := strings.TrimSpace(stdout)
|
||||
return uuid == repoUUID, nil
|
||||
}
|
||||
|
||||
func removeCachedEntries(uuid, repoPath string) {
|
||||
delete(uuid2repoPathCache, uuid)
|
||||
delete(repoPath2uuidCache, repoPath)
|
||||
}
|
||||
|
||||
func UUID2RepoPath(uuid string) (string, error) {
|
||||
// Get the current cache entry for the UUID
|
||||
repoPath, err := repoPathFromUUIDCache(uuid)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
// Check if it is still up-to-date
|
||||
valid, err := checkValidity(uuid, repoPath)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
if !valid {
|
||||
// If it isn't, remove the cache entry and try again
|
||||
removeCachedEntries(uuid, repoPath)
|
||||
return UUID2RepoPath(uuid)
|
||||
}
|
||||
// Otherwise just return the cached entry
|
||||
return repoPath, nil
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue