diff --git a/src/restic/archiver.go b/src/restic/archiver.go index 007bfa993..737801ee5 100644 --- a/src/restic/archiver.go +++ b/src/restic/archiver.go @@ -621,12 +621,23 @@ func unique(items []string) []string { return items } +// baseNameSlice allows sorting paths by basename. +// +// Snapshots have contents sorted by basename, but we receive full paths. +// For the archivePipe to advance them in pairs, we traverse the given +// paths in the same order as the snapshot. +type baseNameSlice []string + +func (p baseNameSlice) Len() int { return len(p) } +func (p baseNameSlice) Less(i, j int) bool { return filepath.Base(p[i]) < filepath.Base(p[j]) } +func (p baseNameSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + // Snapshot creates a snapshot of the given paths. If parentID is set, this is // used to compare the files to the ones archived at the time this snapshot was // taken. func (arch *Archiver) Snapshot(p *Progress, paths []string, parentID *backend.ID) (*Snapshot, backend.ID, error) { paths = unique(paths) - sort.Strings(paths) + sort.Sort(baseNameSlice(paths)) debug.Log("Archiver.Snapshot", "start for %v", paths)