Fix layout detection

This commit is contained in:
Alexander Neumann 2017-04-02 19:18:03 +02:00
parent 50dfa64a54
commit f7c4b3a922
2 changed files with 24 additions and 10 deletions

View File

@ -6,6 +6,7 @@ import (
"path/filepath" "path/filepath"
"regexp" "regexp"
"restic" "restic"
"restic/debug"
"restic/errors" "restic/errors"
"restic/fs" "restic/fs"
) )
@ -140,28 +141,36 @@ func DetectLayout(repo Filesystem, dir string) (Layout, error) {
} }
if foundKeysFile && foundDataFile && !foundKeyFile && !foundDataSubdirFile { if foundKeysFile && foundDataFile && !foundKeyFile && !foundDataSubdirFile {
return &CloudLayout{}, nil debug.Log("found cloud layout at %v", dir)
return &CloudLayout{
Path: dir,
Join: repo.Join,
}, nil
} }
if foundKeysFile && foundDataSubdirFile && !foundKeyFile && !foundDataFile { if foundKeysFile && foundDataSubdirFile && !foundKeyFile && !foundDataFile {
return &DefaultLayout{}, nil debug.Log("found default layout at %v", dir)
return &DefaultLayout{
Path: dir,
Join: repo.Join,
}, nil
} }
if foundKeyFile && foundDataFile && !foundKeysFile && !foundDataSubdirFile { if foundKeyFile && foundDataFile && !foundKeysFile && !foundDataSubdirFile {
return &S3Layout{}, nil debug.Log("found s3 layout at %v", dir)
return &S3Layout{
Path: dir,
Join: repo.Join,
}, nil
} }
return nil, errors.New("auto-detecting the filesystem layout failed") return nil, errors.New("auto-detecting the filesystem layout failed")
} }
// ParseLayout parses the config string and returns a Layout. When layout is // ParseLayout parses the config string and returns a Layout. When layout is
// the empty string, DetectLayout is used. If repo is nil, an instance of LocalFilesystem // the empty string, DetectLayout is used.
// is used.
func ParseLayout(repo Filesystem, layout, path string) (l Layout, err error) { func ParseLayout(repo Filesystem, layout, path string) (l Layout, err error) {
if repo == nil { debug.Log("parse layout string %q for backend at %v", layout, path)
repo = &LocalFilesystem{}
}
switch layout { switch layout {
case "default": case "default":
l = &DefaultLayout{ l = &DefaultLayout{

View File

@ -271,7 +271,7 @@ func TestParseLayout(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.layoutName, func(t *testing.T) { t.Run(test.layoutName, func(t *testing.T) {
layout, err := ParseLayout(nil, test.layoutName, filepath.Join(path, "repo")) layout, err := ParseLayout(&LocalFilesystem{}, test.layoutName, filepath.Join(path, "repo"))
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -280,6 +280,11 @@ func TestParseLayout(t *testing.T) {
t.Fatal("wanted some layout, but detect returned nil") t.Fatal("wanted some layout, but detect returned nil")
} }
// test that the functions work (and don't panic)
_ = layout.Dirname(restic.Handle{Type: restic.DataFile})
_ = layout.Filename(restic.Handle{Type: restic.DataFile, Name: "1234"})
_ = layout.Paths()
layoutName := fmt.Sprintf("%T", layout) layoutName := fmt.Sprintf("%T", layout)
if layoutName != test.want { if layoutName != test.want {
t.Fatalf("want layout %v, got %v", test.want, layoutName) t.Fatalf("want layout %v, got %v", test.want, layoutName)