forked from TrueCloudLab/rclone
move: delete source directory after successful move - fixes #1642
This commit is contained in:
parent
8c8abfd6dc
commit
c65734ee69
3 changed files with 37 additions and 2 deletions
24
fs/sync.go
24
fs/sync.go
|
@ -36,6 +36,8 @@ type syncCopyMove struct {
|
||||||
dstFilesResult chan error // error result of dst listing
|
dstFilesResult chan error // error result of dst listing
|
||||||
dstEmptyDirsMu sync.Mutex // protect dstEmptyDirs
|
dstEmptyDirsMu sync.Mutex // protect dstEmptyDirs
|
||||||
dstEmptyDirs []DirEntry // potentially empty directories
|
dstEmptyDirs []DirEntry // potentially empty directories
|
||||||
|
srcEmptyDirsMu sync.Mutex // protect srcEmptyDirs
|
||||||
|
srcEmptyDirs []DirEntry // potentially empty directories
|
||||||
checkerWg sync.WaitGroup // wait for checkers
|
checkerWg sync.WaitGroup // wait for checkers
|
||||||
toBeChecked ObjectPairChan // checkers channel
|
toBeChecked ObjectPairChan // checkers channel
|
||||||
transfersWg sync.WaitGroup // wait for transfers
|
transfersWg sync.WaitGroup // wait for transfers
|
||||||
|
@ -694,6 +696,20 @@ func (s *syncCopyMove) run() error {
|
||||||
s.processError(deleteEmptyDirectories(s.fdst, s.dstEmptyDirs))
|
s.processError(deleteEmptyDirectories(s.fdst, s.dstEmptyDirs))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if DoMove, delete fsrc directory after
|
||||||
|
if s.DoMove {
|
||||||
|
//first delete any subdirectories in fsrc
|
||||||
|
s.processError(deleteEmptyDirectories(s.fsrc, s.srcEmptyDirs))
|
||||||
|
//delete fsrc dir
|
||||||
|
s.processError(func() error {
|
||||||
|
err := TryRmdir(s.fsrc, "")
|
||||||
|
if err != nil {
|
||||||
|
Debugf(logDirName(s.fsrc, ""), "Failed to Rmdir: %v", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}())
|
||||||
|
}
|
||||||
return s.currentError()
|
return s.currentError()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -747,6 +763,10 @@ func (s *syncCopyMove) SrcOnly(src DirEntry) (recurse bool) {
|
||||||
}
|
}
|
||||||
case Directory:
|
case Directory:
|
||||||
// Do the same thing to the entire contents of the directory
|
// Do the same thing to the entire contents of the directory
|
||||||
|
// Record the directory for deletion
|
||||||
|
s.srcEmptyDirsMu.Lock()
|
||||||
|
s.srcEmptyDirs = append(s.srcEmptyDirs, src)
|
||||||
|
s.srcEmptyDirsMu.Unlock()
|
||||||
return true
|
return true
|
||||||
default:
|
default:
|
||||||
panic("Bad object in DirEntries")
|
panic("Bad object in DirEntries")
|
||||||
|
@ -774,6 +794,10 @@ func (s *syncCopyMove) Match(dst, src DirEntry) (recurse bool) {
|
||||||
// Do the same thing to the entire contents of the directory
|
// Do the same thing to the entire contents of the directory
|
||||||
_, ok := dst.(Directory)
|
_, ok := dst.(Directory)
|
||||||
if ok {
|
if ok {
|
||||||
|
// Record the src directory for deletion
|
||||||
|
s.srcEmptyDirsMu.Lock()
|
||||||
|
s.srcEmptyDirs = append(s.srcEmptyDirs, src)
|
||||||
|
s.srcEmptyDirsMu.Unlock()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// FIXME src is dir, dst is file
|
// FIXME src is dir, dst is file
|
||||||
|
|
|
@ -824,7 +824,7 @@ func testServerSideMove(t *testing.T, r *fstest.Run, withFilter bool) {
|
||||||
if withFilter {
|
if withFilter {
|
||||||
fstest.CheckItems(t, r.Fremote, file2)
|
fstest.CheckItems(t, r.Fremote, file2)
|
||||||
} else {
|
} else {
|
||||||
fstest.CheckItems(t, r.Fremote)
|
fstest.CheckRootDir(t, r.Fremote, false)
|
||||||
}
|
}
|
||||||
fstest.CheckItems(t, FremoteMove, file2, file1, file3u)
|
fstest.CheckItems(t, FremoteMove, file2, file1, file3u)
|
||||||
|
|
||||||
|
@ -843,7 +843,7 @@ func testServerSideMove(t *testing.T, r *fstest.Run, withFilter bool) {
|
||||||
fstest.CheckItems(t, FremoteMove, file2)
|
fstest.CheckItems(t, FremoteMove, file2)
|
||||||
} else {
|
} else {
|
||||||
fstest.CheckItems(t, FremoteMove2, file2, file1, file3u)
|
fstest.CheckItems(t, FremoteMove2, file2, file1, file3u)
|
||||||
fstest.CheckItems(t, FremoteMove)
|
fstest.CheckRootDir(t, FremoteMove, false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -262,6 +262,7 @@ func CheckListingWithPrecision(t *testing.T, f fs.Fs, items []Item, expectedDirs
|
||||||
if err != nil && err != fs.ErrorDirNotFound {
|
if err != nil && err != fs.ErrorDirNotFound {
|
||||||
t.Fatalf("Error listing: %v", err)
|
t.Fatalf("Error listing: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
gotListing = makeListingFromObjects(objs)
|
gotListing = makeListingFromObjects(objs)
|
||||||
listingOK = wantListing1 == gotListing || wantListing2 == gotListing
|
listingOK = wantListing1 == gotListing || wantListing2 == gotListing
|
||||||
if listingOK && (expectedDirs == nil || len(dirs) == len(expectedDirs)) {
|
if listingOK && (expectedDirs == nil || len(dirs) == len(expectedDirs)) {
|
||||||
|
@ -320,6 +321,16 @@ func CheckItems(t *testing.T, f fs.Fs, items ...Item) {
|
||||||
CheckListingWithPrecision(t, f, items, nil, fs.Config.ModifyWindow)
|
CheckListingWithPrecision(t, f, items, nil, fs.Config.ModifyWindow)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CheckRootDir checks the fs to see if the root dir exists or not
|
||||||
|
func CheckRootDir(t *testing.T, f fs.Fs, shouldExist bool) {
|
||||||
|
_, _, err := fs.WalkGetAll(f, "", true, -1)
|
||||||
|
if shouldExist {
|
||||||
|
require.NoError(t, err)
|
||||||
|
} else {
|
||||||
|
assert.EqualError(t, err, fs.ErrorDirNotFound.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Time parses a time string or logs a fatal error
|
// Time parses a time string or logs a fatal error
|
||||||
func Time(timeString string) time.Time {
|
func Time(timeString string) time.Time {
|
||||||
t, err := time.Parse(time.RFC3339Nano, timeString)
|
t, err := time.Parse(time.RFC3339Nano, timeString)
|
||||||
|
|
Loading…
Add table
Reference in a new issue