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) {
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

View File

@ -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

View File

@ -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

View File

@ -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 {