diff --git a/etcd/fs/fs_test.go b/etcd/fs/fs_test.go index 0c0879f5..541ff39e 100644 --- a/etcd/fs/fs_test.go +++ b/etcd/fs/fs_test.go @@ -227,3 +227,59 @@ func TestFs3(t *testing.T) { } t.Logf("tree2: \n%s", tree2) } + +func TestFs4(t *testing.T) { + etcdClient := &etcd.ClientEtcd{ + Seeds: []string{"localhost:2379"}, // endpoints + } + + if err := etcdClient.Connect(); err != nil { + t.Logf("client connection error: %+v", err) + return + } + defer etcdClient.Destroy() + + etcdFs := &etcdfs.Fs{ + Client: etcdClient.GetClient(), + Metadata: superblock, + DataPrefix: etcdfs.DefaultDataPrefix, + } + + etcdFs.Mkdir("/tmp", umask) + etcdFs.Mkdir("/tmp/foo", umask) + etcdFs.Mkdir("/tmp/foo/bar", umask) + + tree, err := util.FsTree(etcdFs, "/") + if err != nil { + t.Errorf("tree error: %+v", err) + return + } + t.Logf("tree: \n%s", tree) + + var memFs = afero.NewMemMapFs() + + if err := util.CopyFs(etcdFs, memFs, "/tmp/foo/bar", "/", false); err != nil { + t.Errorf("CopyFs error: %+v", err) + return + } + if err := util.CopyFs(etcdFs, memFs, "/tmp/foo/bar", "/baz/", false); err != nil { + t.Errorf("CopyFs error: %+v", err) + return + } + + tree2, err := util.FsTree(memFs, "/") + if err != nil { + t.Errorf("tree2 error: %+v", err) + return + } + t.Logf("tree2: \n%s", tree2) + + if _, err := memFs.Stat("/bar"); err != nil { + t.Errorf("Stat error: %+v", err) + return + } + if _, err := memFs.Stat("/baz/bar"); err != nil { + t.Errorf("Stat error: %+v", err) + return + } +} diff --git a/util/afero.go b/util/afero.go index b50445b0..3b69dd85 100644 --- a/util/afero.go +++ b/util/afero.go @@ -22,6 +22,7 @@ import ( "io" "os" "path" + "path/filepath" "github.com/spf13/afero" ) @@ -100,10 +101,7 @@ func CopyFs(srcFs, dstFs afero.Fs, src, dst string, force bool) error { } //perm := info.Perm() perm := info.Mode() // TODO: is this correct? - p := name - if dst != "/" { - p = path.Join(dst, name) // relative dest in dst - } + p := path.Join(dst, filepath.Base(name)) if info.IsDir() { err := dstFs.Mkdir(p, perm) if os.IsExist(err) && (name == "/" || force) {