for when the drive source is a file instead of a directory (#438)

This commit is contained in:
Michael Quigley 2023-12-15 12:10:35 -05:00
parent cbb69373f4
commit 103b60c2c2
No known key found for this signature in database
GPG Key ID: 9B60314A9DD20A62
4 changed files with 43 additions and 9 deletions

View File

@ -27,9 +27,18 @@ func NewFilesystemTarget(cfg *FilesystemTargetConfig) *FilesystemTarget {
} }
func (t *FilesystemTarget) Inventory() ([]*Object, error) { 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 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 t.tree = nil
if err := fs.WalkDir(t.root, ".", t.recurse); err != nil { if err := fs.WalkDir(t.root, ".", t.recurse); err != nil {
return nil, err return nil, err
@ -37,6 +46,10 @@ func (t *FilesystemTarget) Inventory() ([]*Object, error) {
return t.tree, nil return t.tree, nil
} }
func (t *FilesystemTarget) IsDir() bool {
return true
}
func (t *FilesystemTarget) recurse(path string, d fs.DirEntry, err error) error { func (t *FilesystemTarget) recurse(path string, d fs.DirEntry, err error) error {
if err != nil { if err != nil {
return err return err

View File

@ -15,6 +15,7 @@ type Object struct {
type Target interface { type Target interface {
Inventory() ([]*Object, error) Inventory() ([]*Object, error)
IsDir() bool
ReadStream(path string) (io.ReadCloser, error) ReadStream(path string) (io.ReadCloser, error)
WriteStream(path string, stream io.Reader, mode os.FileMode) error WriteStream(path string, stream io.Reader, mode os.FileMode) error
SetModificationTime(path string, mtime time.Time) error SetModificationTime(path string, mtime time.Time) error

View File

@ -33,18 +33,18 @@ func Synchronize(src, dst Target) error {
} }
} }
for _, target := range copyList { for _, copyPath := range copyList {
ss, err := src.ReadStream(target.Path) ss, err := src.ReadStream(copyPath.Path)
if err != nil { if err != nil {
return err 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 return err
} }
if err := dst.SetModificationTime(target.Path, target.Modified); err != nil { if err := dst.SetModificationTime(copyPath.Path, copyPath.Modified); err != nil {
return err return err
} }
logrus.Infof("=> %v", target.Path) logrus.Infof("=> %v", copyPath.Path)
} }
return nil return nil

View File

@ -20,7 +20,9 @@ type WebDAVTargetConfig struct {
} }
type WebDAVTarget struct { type WebDAVTarget struct {
c *webdavClient.Client cfg *WebDAVTargetConfig
c *webdavClient.Client
isDir bool
} }
func NewWebDAVTarget(cfg *WebDAVTargetConfig) (*WebDAVTarget, error) { func NewWebDAVTarget(cfg *WebDAVTargetConfig) (*WebDAVTarget, error) {
@ -31,10 +33,21 @@ func NewWebDAVTarget(cfg *WebDAVTargetConfig) (*WebDAVTarget, error) {
if err := c.Connect(); err != nil { if err := c.Connect(); err != nil {
return nil, errors.Wrap(err, "error connecting to webdav target") 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) { 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) tree, err := t.recurse("", nil)
if err != nil { if err != nil {
return nil, err return nil, err
@ -42,6 +55,10 @@ func (t *WebDAVTarget) Inventory() ([]*Object, error) {
return tree, nil return tree, nil
} }
func (t *WebDAVTarget) IsDir() bool {
return t.isDir
}
func (t *WebDAVTarget) recurse(path string, tree []*Object) ([]*Object, error) { func (t *WebDAVTarget) recurse(path string, tree []*Object) ([]*Object, error) {
files, err := t.c.ReadDir(path) files, err := t.c.ReadDir(path)
if err != nil { 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) { 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 { func (t *WebDAVTarget) WriteStream(path string, stream io.Reader, mode os.FileMode) error {