Skip to content

Commit

Permalink
filesystem target (#438)
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelquigley committed Nov 27, 2023
1 parent 0832f28 commit 57c5a99
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 3 deletions.
22 changes: 19 additions & 3 deletions cmd/zrok/copyFrom.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,19 +26,35 @@ func newCopyFromCommand() *copyFromCommand {
}

func (cmd *copyFromCommand) run(_ *cobra.Command, args []string) {
t, err := sync.NewWebDAVTarget(&sync.WebDAVTargetConfig{
target := "."
if len(args) == 2 {
target = args[1]
}

t := sync.NewFilesystemTarget(&sync.FilesystemTargetConfig{
Root: target,
})
destTree, err := t.Inventory()
if err != nil {
panic(err)
}
for _, f := range destTree {
logrus.Infof("<- %v [%v, %v, %v]", f.Path, f.Size, f.Modified, f.ETag)
}

s, err := sync.NewWebDAVTarget(&sync.WebDAVTargetConfig{
URL: args[0],
Username: "",
Password: "",
})
if err != nil {
panic(err)
}
tree, err := t.Inventory()
srcTree, err := s.Inventory()
if err != nil {
panic(err)
}
for _, f := range tree {
for _, f := range srcTree {
logrus.Infof("-> %v [%v, %v, %v]", f.Path, f.Size, f.Modified, f.ETag)
}
}
54 changes: 54 additions & 0 deletions util/sync/filesystem.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package sync

import (
"context"
"fmt"
"golang.org/x/net/webdav"
"io/fs"
"os"
)

type FilesystemTargetConfig struct {
Root string
}

type FilesystemTarget struct {
root fs.FS
tree []*Object
}

func NewFilesystemTarget(cfg *FilesystemTargetConfig) *FilesystemTarget {
root := os.DirFS(cfg.Root)
return &FilesystemTarget{root: root}
}

func (t *FilesystemTarget) Inventory() ([]*Object, error) {
t.tree = nil
if err := fs.WalkDir(t.root, ".", t.recurse); err != nil {
return nil, err
}
return t.tree, nil
}

func (t *FilesystemTarget) recurse(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
if !d.IsDir() {
fi, err := d.Info()
if err != nil {
return err
}
etag := ""
if v, ok := fi.(webdav.ETager); ok {
etag, err = v.ETag(context.Background())
if err != nil {
return err
}
} else {
etag = fmt.Sprintf(`"%x%x"`, fi.ModTime().UnixNano(), fi.Size())
}
t.tree = append(t.tree, &Object{path, fi.Size(), fi.ModTime(), etag})
}
return nil
}

0 comments on commit 57c5a99

Please sign in to comment.