lib/versioner: Restore for all versioners, cross-device support (#5514)
* lib/versioner: Restore for all versioners, cross-device support Fixes #4631 Fixes #4586 Fixes #1634 Fixes #5338 Fixes #5419
This commit is contained in:
committed by
GitHub
parent
2984d40641
commit
0ca1f26ff8
@@ -7,6 +7,7 @@
|
||||
package osutil_test
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
@@ -192,7 +193,7 @@ func TestInWritableDirWindowsRename(t *testing.T) {
|
||||
}
|
||||
|
||||
rename := func(path string) error {
|
||||
return osutil.Rename(fs, path, path+"new")
|
||||
return osutil.RenameOrCopy(fs, fs, path, path+"new")
|
||||
}
|
||||
|
||||
for _, path := range []string{"testdata/windows/ro/readonly", "testdata/windows/ro", "testdata/windows"} {
|
||||
@@ -268,3 +269,79 @@ func TestIsDeleted(t *testing.T) {
|
||||
testFs.Chmod("inacc", 0777)
|
||||
os.RemoveAll("testdata")
|
||||
}
|
||||
|
||||
func TestRenameOrCopy(t *testing.T) {
|
||||
mustTempDir := func() string {
|
||||
t.Helper()
|
||||
tmpDir, err := ioutil.TempDir("", "")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
return tmpDir
|
||||
}
|
||||
sameFs := fs.NewFilesystem(fs.FilesystemTypeBasic, mustTempDir())
|
||||
tests := []struct {
|
||||
src fs.Filesystem
|
||||
dst fs.Filesystem
|
||||
file string
|
||||
}{
|
||||
{
|
||||
src: sameFs,
|
||||
dst: sameFs,
|
||||
file: "file",
|
||||
},
|
||||
{
|
||||
src: fs.NewFilesystem(fs.FilesystemTypeBasic, mustTempDir()),
|
||||
dst: fs.NewFilesystem(fs.FilesystemTypeBasic, mustTempDir()),
|
||||
file: "file",
|
||||
},
|
||||
{
|
||||
src: fs.NewFilesystem(fs.FilesystemTypeFake, `fake://fake/?files=1&seed=42`),
|
||||
dst: fs.NewFilesystem(fs.FilesystemTypeBasic, mustTempDir()),
|
||||
file: osutil.NativeFilename(`05/7a/4d52f284145b9fe8`),
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
content := test.src.URI()
|
||||
if _, err := test.src.Lstat(test.file); err != nil {
|
||||
if !fs.IsNotExist(err) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if fd, err := test.src.Create(test.file); err != nil {
|
||||
t.Fatal(err)
|
||||
} else {
|
||||
if _, err := fd.Write([]byte(test.src.URI())); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
_ = fd.Close()
|
||||
}
|
||||
} else {
|
||||
fd, err := test.src.Open(test.file)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
buf, err := ioutil.ReadAll(fd)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
_ = fd.Close()
|
||||
content = string(buf)
|
||||
}
|
||||
|
||||
err := osutil.RenameOrCopy(test.src, test.dst, test.file, "new")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if fd, err := test.dst.Open("new"); err != nil {
|
||||
t.Fatal(err)
|
||||
} else {
|
||||
if buf, err := ioutil.ReadAll(fd); err != nil {
|
||||
t.Fatal(err)
|
||||
} else if string(buf) != content {
|
||||
t.Fatalf("expected %s got %s", content, string(buf))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user