diff --git a/util/sync/filesystem.go b/util/sync/filesystem.go index 3a4522b6..3ed94ef4 100644 --- a/util/sync/filesystem.go +++ b/util/sync/filesystem.go @@ -27,9 +27,18 @@ func NewFilesystemTarget(cfg *FilesystemTargetConfig) *FilesystemTarget { } func (t *FilesystemTarget) Inventory() ([]*Object, error) { - if _, err := os.Stat(t.cfg.Root); os.IsNotExist(err) { + fi, err := os.Stat(t.cfg.Root) + if os.IsNotExist(err) { return nil, nil } + if err != nil { + return nil, err + } + + if !fi.IsDir() { + return []*Object{{Path: t.cfg.Root, Size: fi.Size(), Modified: fi.ModTime()}}, nil + } + t.tree = nil if err := fs.WalkDir(t.root, ".", t.recurse); err != nil { return nil, err @@ -37,6 +46,10 @@ func (t *FilesystemTarget) Inventory() ([]*Object, error) { return t.tree, nil } +func (t *FilesystemTarget) IsDir() bool { + return true +} + func (t *FilesystemTarget) recurse(path string, d fs.DirEntry, err error) error { if err != nil { return err diff --git a/util/sync/model.go b/util/sync/model.go index 8fca5ca0..b1a6b043 100644 --- a/util/sync/model.go +++ b/util/sync/model.go @@ -15,6 +15,7 @@ type Object struct { type Target interface { Inventory() ([]*Object, error) + IsDir() bool ReadStream(path string) (io.ReadCloser, error) WriteStream(path string, stream io.Reader, mode os.FileMode) error SetModificationTime(path string, mtime time.Time) error diff --git a/util/sync/synchronizer.go b/util/sync/synchronizer.go index 36ba78fc..082325fa 100644 --- a/util/sync/synchronizer.go +++ b/util/sync/synchronizer.go @@ -33,18 +33,18 @@ func Synchronize(src, dst Target) error { } } - for _, target := range copyList { - ss, err := src.ReadStream(target.Path) + for _, copyPath := range copyList { + ss, err := src.ReadStream(copyPath.Path) if err != nil { return err } - if err := dst.WriteStream(target.Path, ss, os.ModePerm); err != nil { + if err := dst.WriteStream(copyPath.Path, ss, os.ModePerm); err != nil { return err } - if err := dst.SetModificationTime(target.Path, target.Modified); err != nil { + if err := dst.SetModificationTime(copyPath.Path, copyPath.Modified); err != nil { return err } - logrus.Infof("=> %v", target.Path) + logrus.Infof("=> %v", copyPath.Path) } return nil diff --git a/util/sync/webdav.go b/util/sync/webdav.go index efc45879..61e07e47 100644 --- a/util/sync/webdav.go +++ b/util/sync/webdav.go @@ -20,7 +20,9 @@ type WebDAVTargetConfig struct { } type WebDAVTarget struct { - c *webdavClient.Client + cfg *WebDAVTargetConfig + c *webdavClient.Client + isDir bool } func NewWebDAVTarget(cfg *WebDAVTargetConfig) (*WebDAVTarget, error) { @@ -31,10 +33,21 @@ func NewWebDAVTarget(cfg *WebDAVTargetConfig) (*WebDAVTarget, error) { if err := c.Connect(); err != nil { return nil, errors.Wrap(err, "error connecting to webdav target") } - return &WebDAVTarget{c: c}, nil + return &WebDAVTarget{cfg: cfg, c: c}, nil } func (t *WebDAVTarget) Inventory() ([]*Object, error) { + fi, err := t.c.Stat("") + if !fi.IsDir() { + t.isDir = false + return []*Object{{ + Path: fi.Name(), + Size: fi.Size(), + Modified: fi.ModTime(), + }}, nil + } + + t.isDir = true tree, err := t.recurse("", nil) if err != nil { return nil, err @@ -42,6 +55,10 @@ func (t *WebDAVTarget) Inventory() ([]*Object, error) { return tree, nil } +func (t *WebDAVTarget) IsDir() bool { + return t.isDir +} + func (t *WebDAVTarget) recurse(path string, tree []*Object) ([]*Object, error) { files, err := t.c.ReadDir(path) if err != nil { @@ -69,7 +86,10 @@ func (t *WebDAVTarget) recurse(path string, tree []*Object) ([]*Object, error) { } func (t *WebDAVTarget) ReadStream(path string) (io.ReadCloser, error) { - return t.c.ReadStream(path) + if t.isDir { + return t.c.ReadStream(path) + } + return t.c.ReadStream("") } func (t *WebDAVTarget) WriteStream(path string, stream io.Reader, mode os.FileMode) error {