restic: ignore filenames which are not IDs when expanding a prefix

Some backends generate additional files for each existing file, e.g.

1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef.sha256

For some commands this leads to an "multiple IDs with prefix" error when
trying to reference a snapshot.
This commit is contained in:
Michael Eischer 2022-09-27 20:03:46 +02:00
parent d6575f53ca
commit 5d3c5b9e50
2 changed files with 18 additions and 0 deletions

View file

@ -0,0 +1,9 @@
Enhancement: Ignore additional files in repository
Some commands like `find` and `restore` could become confused by additional
files in the repository. This could cause restic to fail with an `multiple IDs
with prefix "12345678" found` error. These commands now ignore additional
files.
https://github.com/restic/restic/pull/3943
https://forum.restic.net/t/which-protocol-should-i-choose-for-remote-linux-backups/5446/17

View file

@ -3,6 +3,8 @@ package restic
import ( import (
"context" "context"
"fmt" "fmt"
"github.com/restic/restic/internal/debug"
) )
// A MultipleIDMatchesError is returned by Find() when multiple IDs with a // A MultipleIDMatchesError is returned by Find() when multiple IDs with a
@ -31,6 +33,13 @@ func Find(ctx context.Context, be Lister, t FileType, prefix string) (string, er
defer cancel() defer cancel()
err := be.List(ctx, t, func(fi FileInfo) error { err := be.List(ctx, t, func(fi FileInfo) error {
// ignore filename which are not an id
_, err := ParseID(fi.Name)
if err != nil {
debug.Log("unable to parse %v as an ID", fi.Name)
return nil
}
if len(fi.Name) >= len(prefix) && prefix == fi.Name[:len(prefix)] { if len(fi.Name) >= len(prefix) && prefix == fi.Name[:len(prefix)] {
if match == "" { if match == "" {
match = fi.Name match = fi.Name