etcd: Use source filepath base in CopyFs destination path
This patch corrects the destination path in CopyFs to use the source's base filepath, instead of the entire source path. Now copying /foo/bar to /baz results in /baz/bar instead of /baz/foo/bar. This commit also adds a test to verify this behaviour.
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user