From 1b52f8d2a5f95905e3ce9b6e843e6242cae8683c Mon Sep 17 00:00:00 2001 From: ishuah Date: Wed, 6 Mar 2019 11:43:46 +0300 Subject: [PATCH] copy/sync/move: add --create-empty-src-dirs flag - fixes #2869 --- cmd/copy/copy.go | 7 +- cmd/copyto/copyto.go | 2 +- cmd/move/move.go | 4 +- cmd/moveto/moveto.go | 2 +- cmd/sync/sync.go | 7 +- fs/sync/rc.go | 10 ++- fs/sync/sync.go | 30 ++++---- fs/sync/sync_test.go | 164 ++++++++++++++++++++++++++++--------------- 8 files changed, 149 insertions(+), 77 deletions(-) diff --git a/cmd/copy/copy.go b/cmd/copy/copy.go index 3e758d1e9..325671f04 100644 --- a/cmd/copy/copy.go +++ b/cmd/copy/copy.go @@ -7,8 +7,13 @@ import ( "github.com/spf13/cobra" ) +var ( + createEmptySrcDirs = false +) + func init() { cmd.Root.AddCommand(commandDefintion) + commandDefintion.Flags().BoolVarP(&createEmptySrcDirs, "create-empty-src-dirs", "", createEmptySrcDirs, "Create empty source dirs on destination after copy") } var commandDefintion = &cobra.Command{ @@ -69,7 +74,7 @@ changed recently very efficiently like this: fsrc, srcFileName, fdst := cmd.NewFsSrcFileDst(args) cmd.Run(true, true, command, func() error { if srcFileName == "" { - return sync.CopyDir(fdst, fsrc) + return sync.CopyDir(fdst, fsrc, createEmptySrcDirs) } return operations.CopyFile(fdst, fsrc, srcFileName, srcFileName) }) diff --git a/cmd/copyto/copyto.go b/cmd/copyto/copyto.go index 2cd9e3e25..50f110a60 100644 --- a/cmd/copyto/copyto.go +++ b/cmd/copyto/copyto.go @@ -48,7 +48,7 @@ destination. fsrc, srcFileName, fdst, dstFileName := cmd.NewFsSrcDstFiles(args) cmd.Run(true, true, command, func() error { if srcFileName == "" { - return sync.CopyDir(fdst, fsrc) + return sync.CopyDir(fdst, fsrc, false) } return operations.CopyFile(fdst, fsrc, dstFileName, srcFileName) }) diff --git a/cmd/move/move.go b/cmd/move/move.go index e70caf6ff..15a9411d8 100644 --- a/cmd/move/move.go +++ b/cmd/move/move.go @@ -10,11 +10,13 @@ import ( // Globals var ( deleteEmptySrcDirs = false + createEmptySrcDirs = false ) func init() { cmd.Root.AddCommand(commandDefintion) commandDefintion.Flags().BoolVarP(&deleteEmptySrcDirs, "delete-empty-src-dirs", "", deleteEmptySrcDirs, "Delete empty source dirs after move") + commandDefintion.Flags().BoolVarP(&createEmptySrcDirs, "create-empty-src-dirs", "", createEmptySrcDirs, "Create empty source dirs on destination after move") } var commandDefintion = &cobra.Command{ @@ -52,7 +54,7 @@ can speed transfers up greatly. fsrc, srcFileName, fdst := cmd.NewFsSrcFileDst(args) cmd.Run(true, true, command, func() error { if srcFileName == "" { - return sync.MoveDir(fdst, fsrc, deleteEmptySrcDirs) + return sync.MoveDir(fdst, fsrc, deleteEmptySrcDirs, createEmptySrcDirs) } return operations.MoveFile(fdst, fsrc, srcFileName, srcFileName) }) diff --git a/cmd/moveto/moveto.go b/cmd/moveto/moveto.go index 61e900c4d..8a45bd0c5 100644 --- a/cmd/moveto/moveto.go +++ b/cmd/moveto/moveto.go @@ -52,7 +52,7 @@ transfer. cmd.Run(true, true, command, func() error { if srcFileName == "" { - return sync.MoveDir(fdst, fsrc, false) + return sync.MoveDir(fdst, fsrc, false, false) } return operations.MoveFile(fdst, fsrc, dstFileName, srcFileName) }) diff --git a/cmd/sync/sync.go b/cmd/sync/sync.go index d98326a3c..1d2e80572 100644 --- a/cmd/sync/sync.go +++ b/cmd/sync/sync.go @@ -6,8 +6,13 @@ import ( "github.com/spf13/cobra" ) +var ( + createEmptySrcDirs = false +) + func init() { cmd.Root.AddCommand(commandDefintion) + commandDefintion.Flags().BoolVarP(&createEmptySrcDirs, "create-empty-src-dirs", "", createEmptySrcDirs, "Create empty source dirs on destination after sync") } var commandDefintion = &cobra.Command{ @@ -39,7 +44,7 @@ go there. cmd.CheckArgs(2, 2, command, args) fsrc, fdst := cmd.NewFsSrcDst(args) cmd.Run(true, true, command, func() error { - return sync.Sync(fdst, fsrc) + return sync.Sync(fdst, fsrc, createEmptySrcDirs) }) }, } diff --git a/fs/sync/rc.go b/fs/sync/rc.go index 0a7255c1b..8bbf1a11b 100644 --- a/fs/sync/rc.go +++ b/fs/sync/rc.go @@ -39,17 +39,21 @@ func rcSyncCopyMove(in rc.Params, name string) (out rc.Params, err error) { if err != nil { return nil, err } + createEmptySrcDirs, err := in.GetBool("createEmptySrcDirs") + if rc.NotErrParamNotFound(err) { + return nil, err + } switch name { case "sync": - return nil, Sync(dstFs, srcFs) + return nil, Sync(dstFs, srcFs, createEmptySrcDirs) case "copy": - return nil, CopyDir(dstFs, srcFs) + return nil, CopyDir(dstFs, srcFs, createEmptySrcDirs) case "move": deleteEmptySrcDirs, err := in.GetBool("deleteEmptySrcDirs") if rc.NotErrParamNotFound(err) { return nil, err } - return nil, MoveDir(dstFs, srcFs, deleteEmptySrcDirs) + return nil, MoveDir(dstFs, srcFs, deleteEmptySrcDirs, createEmptySrcDirs) } panic("unknown rcSyncCopyMove type") } diff --git a/fs/sync/sync.go b/fs/sync/sync.go index c11a01428..0d73a7631 100644 --- a/fs/sync/sync.go +++ b/fs/sync/sync.go @@ -24,6 +24,7 @@ type syncCopyMove struct { fsrc fs.Fs deleteMode fs.DeleteMode // how we are doing deletions DoMove bool + copyEmptySrcDirs bool deleteEmptySrcDirs bool dir string // internal state @@ -63,7 +64,7 @@ type syncCopyMove struct { suffix string // suffix to add to files placed in backupDir } -func newSyncCopyMove(fdst, fsrc fs.Fs, deleteMode fs.DeleteMode, DoMove bool, deleteEmptySrcDirs bool) (*syncCopyMove, error) { +func newSyncCopyMove(fdst, fsrc fs.Fs, deleteMode fs.DeleteMode, DoMove bool, deleteEmptySrcDirs bool, copyEmptySrcDirs bool) (*syncCopyMove, error) { if (deleteMode != fs.DeleteModeOff || DoMove) && operations.Overlapping(fdst, fsrc) { return nil, fserrors.FatalError(fs.ErrorOverlapping) } @@ -72,6 +73,7 @@ func newSyncCopyMove(fdst, fsrc fs.Fs, deleteMode fs.DeleteMode, DoMove bool, de fsrc: fsrc, deleteMode: deleteMode, DoMove: DoMove, + copyEmptySrcDirs: copyEmptySrcDirs, deleteEmptySrcDirs: deleteEmptySrcDirs, dir: "", srcFilesChan: make(chan fs.Object, fs.Config.Checkers+fs.Config.Transfers), @@ -689,7 +691,9 @@ func (s *syncCopyMove) run() error { s.stopTransfers() s.stopDeleters() - s.processError(copyEmptyDirectories(s.fdst, s.srcEmptyDirs)) + if s.copyEmptySrcDirs { + s.processError(copyEmptyDirectories(s.fdst, s.srcEmptyDirs)) + } // Delete files after if s.deleteMode == fs.DeleteModeAfter { @@ -852,7 +856,7 @@ func (s *syncCopyMove) Match(dst, src fs.DirEntry) (recurse bool) { // If DoMove is true then files will be moved instead of copied // // dir is the start directory, "" for root -func runSyncCopyMove(fdst, fsrc fs.Fs, deleteMode fs.DeleteMode, DoMove bool, deleteEmptySrcDirs bool) error { +func runSyncCopyMove(fdst, fsrc fs.Fs, deleteMode fs.DeleteMode, DoMove bool, deleteEmptySrcDirs bool, copyEmptySrcDirs bool) error { if deleteMode != fs.DeleteModeOff && DoMove { return fserrors.FatalError(errors.New("can't delete and move at the same time")) } @@ -862,7 +866,7 @@ func runSyncCopyMove(fdst, fsrc fs.Fs, deleteMode fs.DeleteMode, DoMove bool, de return fserrors.FatalError(errors.New("can't use --delete-before with --track-renames")) } // only delete stuff during in this pass - do, err := newSyncCopyMove(fdst, fsrc, fs.DeleteModeOnly, false, deleteEmptySrcDirs) + do, err := newSyncCopyMove(fdst, fsrc, fs.DeleteModeOnly, false, deleteEmptySrcDirs, copyEmptySrcDirs) if err != nil { return err } @@ -873,7 +877,7 @@ func runSyncCopyMove(fdst, fsrc fs.Fs, deleteMode fs.DeleteMode, DoMove bool, de // Next pass does a copy only deleteMode = fs.DeleteModeOff } - do, err := newSyncCopyMove(fdst, fsrc, deleteMode, DoMove, deleteEmptySrcDirs) + do, err := newSyncCopyMove(fdst, fsrc, deleteMode, DoMove, deleteEmptySrcDirs, copyEmptySrcDirs) if err != nil { return err } @@ -881,22 +885,22 @@ func runSyncCopyMove(fdst, fsrc fs.Fs, deleteMode fs.DeleteMode, DoMove bool, de } // Sync fsrc into fdst -func Sync(fdst, fsrc fs.Fs) error { - return runSyncCopyMove(fdst, fsrc, fs.Config.DeleteMode, false, false) +func Sync(fdst, fsrc fs.Fs, copyEmptySrcDirs bool) error { + return runSyncCopyMove(fdst, fsrc, fs.Config.DeleteMode, false, false, copyEmptySrcDirs) } // CopyDir copies fsrc into fdst -func CopyDir(fdst, fsrc fs.Fs) error { - return runSyncCopyMove(fdst, fsrc, fs.DeleteModeOff, false, false) +func CopyDir(fdst, fsrc fs.Fs, copyEmptySrcDirs bool) error { + return runSyncCopyMove(fdst, fsrc, fs.DeleteModeOff, false, false, copyEmptySrcDirs) } // moveDir moves fsrc into fdst -func moveDir(fdst, fsrc fs.Fs, deleteEmptySrcDirs bool) error { - return runSyncCopyMove(fdst, fsrc, fs.DeleteModeOff, true, deleteEmptySrcDirs) +func moveDir(fdst, fsrc fs.Fs, deleteEmptySrcDirs bool, copyEmptySrcDirs bool) error { + return runSyncCopyMove(fdst, fsrc, fs.DeleteModeOff, true, deleteEmptySrcDirs, copyEmptySrcDirs) } // MoveDir moves fsrc into fdst -func MoveDir(fdst, fsrc fs.Fs, deleteEmptySrcDirs bool) error { +func MoveDir(fdst, fsrc fs.Fs, deleteEmptySrcDirs bool, copyEmptySrcDirs bool) error { if operations.Same(fdst, fsrc) { fs.Errorf(fdst, "Nothing to do as source and destination are the same") return nil @@ -924,5 +928,5 @@ func MoveDir(fdst, fsrc fs.Fs, deleteEmptySrcDirs bool) error { } // Otherwise move the files one by one - return moveDir(fdst, fsrc, deleteEmptySrcDirs) + return moveDir(fdst, fsrc, deleteEmptySrcDirs, copyEmptySrcDirs) } diff --git a/fs/sync/sync_test.go b/fs/sync/sync_test.go index ab013cc81..c7218118b 100644 --- a/fs/sync/sync_test.go +++ b/fs/sync/sync_test.go @@ -40,7 +40,7 @@ func TestCopyWithDryRun(t *testing.T) { r.Mkdir(r.Fremote) fs.Config.DryRun = true - err := CopyDir(r.Fremote, r.Flocal) + err := CopyDir(r.Fremote, r.Flocal, false) fs.Config.DryRun = false require.NoError(t, err) @@ -55,7 +55,7 @@ func TestCopy(t *testing.T) { file1 := r.WriteFile("sub dir/hello world", "hello world", t1) r.Mkdir(r.Fremote) - err := CopyDir(r.Fremote, r.Flocal) + err := CopyDir(r.Fremote, r.Flocal, false) require.NoError(t, err) fstest.CheckItems(t, r.Flocal, file1) @@ -72,7 +72,7 @@ func TestCopyNoTraverse(t *testing.T) { file1 := r.WriteFile("sub dir/hello world", "hello world", t1) - err := CopyDir(r.Fremote, r.Flocal) + err := CopyDir(r.Fremote, r.Flocal, false) require.NoError(t, err) fstest.CheckItems(t, r.Flocal, file1) @@ -90,7 +90,7 @@ func TestSyncNoTraverse(t *testing.T) { file1 := r.WriteFile("sub dir/hello world", "hello world", t1) accounting.Stats.ResetCounters() - err := Sync(r.Fremote, r.Flocal) + err := Sync(r.Fremote, r.Flocal, false) require.NoError(t, err) fstest.CheckItems(t, r.Flocal, file1) @@ -108,7 +108,7 @@ func TestCopyWithDepth(t *testing.T) { fs.Config.MaxDepth = 1 defer func() { fs.Config.MaxDepth = -1 }() - err := CopyDir(r.Fremote, r.Flocal) + err := CopyDir(r.Fremote, r.Flocal, false) require.NoError(t, err) fstest.CheckItems(t, r.Flocal, file1, file2) @@ -136,7 +136,7 @@ func TestCopyWithFilesFrom(t *testing.T) { } defer unpatch() - err = CopyDir(r.Fremote, r.Flocal) + err = CopyDir(r.Fremote, r.Flocal, false) require.NoError(t, err) unpatch() @@ -153,7 +153,59 @@ func TestCopyEmptyDirectories(t *testing.T) { require.NoError(t, err) r.Mkdir(r.Fremote) - err = CopyDir(r.Fremote, r.Flocal) + err = CopyDir(r.Fremote, r.Flocal, true) + require.NoError(t, err) + + fstest.CheckListingWithPrecision( + t, + r.Fremote, + []fstest.Item{ + file1, + }, + []string{ + "sub dir", + "sub dir2", + }, + fs.GetModifyWindow(r.Fremote), + ) +} + +// Test move empty directories +func TestMoveEmptyDirectories(t *testing.T) { + r := fstest.NewRun(t) + defer r.Finalise() + file1 := r.WriteFile("sub dir/hello world", "hello world", t1) + err := operations.Mkdir(r.Flocal, "sub dir2") + require.NoError(t, err) + r.Mkdir(r.Fremote) + + err = MoveDir(r.Fremote, r.Flocal, false, true) + require.NoError(t, err) + + fstest.CheckListingWithPrecision( + t, + r.Fremote, + []fstest.Item{ + file1, + }, + []string{ + "sub dir", + "sub dir2", + }, + fs.GetModifyWindow(r.Fremote), + ) +} + +// Test sync empty directories +func TestSyncEmptyDirectories(t *testing.T) { + r := fstest.NewRun(t) + defer r.Finalise() + file1 := r.WriteFile("sub dir/hello world", "hello world", t1) + err := operations.Mkdir(r.Flocal, "sub dir2") + require.NoError(t, err) + r.Mkdir(r.Fremote) + + err = Sync(r.Fremote, r.Flocal, true) require.NoError(t, err) fstest.CheckListingWithPrecision( @@ -182,7 +234,7 @@ func TestServerSideCopy(t *testing.T) { defer finaliseCopy() t.Logf("Server side copy (if possible) %v -> %v", r.Fremote, FremoteCopy) - err = CopyDir(FremoteCopy, r.Fremote) + err = CopyDir(FremoteCopy, r.Fremote, false) require.NoError(t, err) fstest.CheckItems(t, FremoteCopy, file1) @@ -200,7 +252,7 @@ func TestCopyAfterDelete(t *testing.T) { err := operations.Mkdir(r.Flocal, "") require.NoError(t, err) - err = CopyDir(r.Fremote, r.Flocal) + err = CopyDir(r.Fremote, r.Flocal, false) require.NoError(t, err) fstest.CheckItems(t, r.Flocal) @@ -214,7 +266,7 @@ func TestCopyRedownload(t *testing.T) { file1 := r.WriteObject("sub dir/hello world", "hello world", t1) fstest.CheckItems(t, r.Fremote, file1) - err := CopyDir(r.Flocal, r.Fremote) + err := CopyDir(r.Flocal, r.Fremote, false) require.NoError(t, err) // Test with combined precision of local and remote as we copied it there and back @@ -234,7 +286,7 @@ func TestSyncBasedOnCheckSum(t *testing.T) { fstest.CheckItems(t, r.Flocal, file1) accounting.Stats.ResetCounters() - err := Sync(r.Fremote, r.Flocal) + err := Sync(r.Fremote, r.Flocal, false) require.NoError(t, err) // We should have transferred exactly one file. @@ -246,7 +298,7 @@ func TestSyncBasedOnCheckSum(t *testing.T) { fstest.CheckItems(t, r.Flocal, file2) accounting.Stats.ResetCounters() - err = Sync(r.Fremote, r.Flocal) + err = Sync(r.Fremote, r.Flocal, false) require.NoError(t, err) // We should have transferred no files @@ -268,7 +320,7 @@ func TestSyncSizeOnly(t *testing.T) { fstest.CheckItems(t, r.Flocal, file1) accounting.Stats.ResetCounters() - err := Sync(r.Fremote, r.Flocal) + err := Sync(r.Fremote, r.Flocal, false) require.NoError(t, err) // We should have transferred exactly one file. @@ -280,7 +332,7 @@ func TestSyncSizeOnly(t *testing.T) { fstest.CheckItems(t, r.Flocal, file2) accounting.Stats.ResetCounters() - err = Sync(r.Fremote, r.Flocal) + err = Sync(r.Fremote, r.Flocal, false) require.NoError(t, err) // We should have transferred no files @@ -302,7 +354,7 @@ func TestSyncIgnoreSize(t *testing.T) { fstest.CheckItems(t, r.Flocal, file1) accounting.Stats.ResetCounters() - err := Sync(r.Fremote, r.Flocal) + err := Sync(r.Fremote, r.Flocal, false) require.NoError(t, err) // We should have transferred exactly one file. @@ -314,7 +366,7 @@ func TestSyncIgnoreSize(t *testing.T) { fstest.CheckItems(t, r.Flocal, file2) accounting.Stats.ResetCounters() - err = Sync(r.Fremote, r.Flocal) + err = Sync(r.Fremote, r.Flocal, false) require.NoError(t, err) // We should have transferred no files @@ -330,7 +382,7 @@ func TestSyncIgnoreTimes(t *testing.T) { fstest.CheckItems(t, r.Fremote, file1) accounting.Stats.ResetCounters() - err := Sync(r.Fremote, r.Flocal) + err := Sync(r.Fremote, r.Flocal, false) require.NoError(t, err) // We should have transferred exactly 0 files because the @@ -341,7 +393,7 @@ func TestSyncIgnoreTimes(t *testing.T) { defer func() { fs.Config.IgnoreTimes = false }() accounting.Stats.ResetCounters() - err = Sync(r.Fremote, r.Flocal) + err = Sync(r.Fremote, r.Flocal, false) require.NoError(t, err) // We should have transferred exactly one file even though the @@ -361,7 +413,7 @@ func TestSyncIgnoreExisting(t *testing.T) { defer func() { fs.Config.IgnoreExisting = false }() accounting.Stats.ResetCounters() - err := Sync(r.Fremote, r.Flocal) + err := Sync(r.Fremote, r.Flocal, false) require.NoError(t, err) fstest.CheckItems(t, r.Flocal, file1) fstest.CheckItems(t, r.Fremote, file1) @@ -369,7 +421,7 @@ func TestSyncIgnoreExisting(t *testing.T) { // Change everything r.WriteFile("existing", "newpotatoes", t2) accounting.Stats.ResetCounters() - err = Sync(r.Fremote, r.Flocal) + err = Sync(r.Fremote, r.Flocal, false) require.NoError(t, err) // Items should not change fstest.CheckItems(t, r.Fremote, file1) @@ -417,7 +469,7 @@ func TestSyncIgnoreErrors(t *testing.T) { accounting.Stats.ResetCounters() fs.CountError(nil) - assert.NoError(t, Sync(r.Fremote, r.Flocal)) + assert.NoError(t, Sync(r.Fremote, r.Flocal, false)) fstest.CheckListingWithPrecision( t, @@ -460,7 +512,7 @@ func TestSyncAfterChangingModtimeOnly(t *testing.T) { defer func() { fs.Config.DryRun = false }() accounting.Stats.ResetCounters() - err := Sync(r.Fremote, r.Flocal) + err := Sync(r.Fremote, r.Flocal, false) require.NoError(t, err) fstest.CheckItems(t, r.Flocal, file1) @@ -469,7 +521,7 @@ func TestSyncAfterChangingModtimeOnly(t *testing.T) { fs.Config.DryRun = false accounting.Stats.ResetCounters() - err = Sync(r.Fremote, r.Flocal) + err = Sync(r.Fremote, r.Flocal, false) require.NoError(t, err) fstest.CheckItems(t, r.Flocal, file1) @@ -497,7 +549,7 @@ func TestSyncAfterChangingModtimeOnlyWithNoUpdateModTime(t *testing.T) { fstest.CheckItems(t, r.Fremote, file2) accounting.Stats.ResetCounters() - err := Sync(r.Fremote, r.Flocal) + err := Sync(r.Fremote, r.Flocal, false) require.NoError(t, err) fstest.CheckItems(t, r.Flocal, file1) @@ -518,7 +570,7 @@ func TestSyncDoesntUpdateModtime(t *testing.T) { fstest.CheckItems(t, r.Fremote, file2) accounting.Stats.ResetCounters() - err := Sync(r.Fremote, r.Flocal) + err := Sync(r.Fremote, r.Flocal, false) require.NoError(t, err) fstest.CheckItems(t, r.Flocal, file1) @@ -538,7 +590,7 @@ func TestSyncAfterAddingAFile(t *testing.T) { fstest.CheckItems(t, r.Fremote, file1) accounting.Stats.ResetCounters() - err := Sync(r.Fremote, r.Flocal) + err := Sync(r.Fremote, r.Flocal, false) require.NoError(t, err) fstest.CheckItems(t, r.Flocal, file1, file2) fstest.CheckItems(t, r.Fremote, file1, file2) @@ -553,7 +605,7 @@ func TestSyncAfterChangingFilesSizeOnly(t *testing.T) { fstest.CheckItems(t, r.Flocal, file2) accounting.Stats.ResetCounters() - err := Sync(r.Fremote, r.Flocal) + err := Sync(r.Fremote, r.Flocal, false) require.NoError(t, err) fstest.CheckItems(t, r.Flocal, file2) fstest.CheckItems(t, r.Fremote, file2) @@ -576,7 +628,7 @@ func TestSyncAfterChangingContentsOnly(t *testing.T) { fstest.CheckItems(t, r.Flocal, file2) accounting.Stats.ResetCounters() - err := Sync(r.Fremote, r.Flocal) + err := Sync(r.Fremote, r.Flocal, false) require.NoError(t, err) fstest.CheckItems(t, r.Flocal, file2) fstest.CheckItems(t, r.Fremote, file2) @@ -592,7 +644,7 @@ func TestSyncAfterRemovingAFileAndAddingAFileDryRun(t *testing.T) { fs.Config.DryRun = true accounting.Stats.ResetCounters() - err := Sync(r.Fremote, r.Flocal) + err := Sync(r.Fremote, r.Flocal, false) fs.Config.DryRun = false require.NoError(t, err) @@ -611,7 +663,7 @@ func TestSyncAfterRemovingAFileAndAddingAFile(t *testing.T) { fstest.CheckItems(t, r.Flocal, file1, file3) accounting.Stats.ResetCounters() - err := Sync(r.Fremote, r.Flocal) + err := Sync(r.Fremote, r.Flocal, false) require.NoError(t, err) fstest.CheckItems(t, r.Flocal, file1, file3) fstest.CheckItems(t, r.Fremote, file1, file3) @@ -657,7 +709,7 @@ func TestSyncAfterRemovingAFileAndAddingAFileSubDir(t *testing.T) { ) accounting.Stats.ResetCounters() - err := Sync(r.Fremote, r.Flocal) + err := Sync(r.Fremote, r.Flocal, false) require.NoError(t, err) fstest.CheckListingWithPrecision( @@ -727,7 +779,7 @@ func TestSyncAfterRemovingAFileAndAddingAFileSubDirWithErrors(t *testing.T) { accounting.Stats.ResetCounters() fs.CountError(nil) - err := Sync(r.Fremote, r.Flocal) + err := Sync(r.Fremote, r.Flocal, false) assert.Equal(t, fs.ErrorNotDeleting, err) fstest.CheckListingWithPrecision( @@ -804,7 +856,7 @@ func TestCopyDeleteBefore(t *testing.T) { fstest.CheckItems(t, r.Flocal, file2) accounting.Stats.ResetCounters() - err := CopyDir(r.Fremote, r.Flocal) + err := CopyDir(r.Fremote, r.Flocal, false) require.NoError(t, err) fstest.CheckItems(t, r.Fremote, file1, file2) @@ -827,14 +879,14 @@ func TestSyncWithExclude(t *testing.T) { }() accounting.Stats.ResetCounters() - err := Sync(r.Fremote, r.Flocal) + err := Sync(r.Fremote, r.Flocal, false) require.NoError(t, err) fstest.CheckItems(t, r.Fremote, file2, file1) // Now sync the other way round and check enormous doesn't get // deleted as it is excluded from the sync accounting.Stats.ResetCounters() - err = Sync(r.Flocal, r.Fremote) + err = Sync(r.Flocal, r.Fremote, false) require.NoError(t, err) fstest.CheckItems(t, r.Flocal, file2, file1, file3) } @@ -857,14 +909,14 @@ func TestSyncWithExcludeAndDeleteExcluded(t *testing.T) { }() accounting.Stats.ResetCounters() - err := Sync(r.Fremote, r.Flocal) + err := Sync(r.Fremote, r.Flocal, false) require.NoError(t, err) fstest.CheckItems(t, r.Fremote, file2) // Check sync the other way round to make sure enormous gets // deleted even though it is excluded accounting.Stats.ResetCounters() - err = Sync(r.Flocal, r.Fremote) + err = Sync(r.Flocal, r.Fremote, false) require.NoError(t, err) fstest.CheckItems(t, r.Flocal, file2) } @@ -899,7 +951,7 @@ func TestSyncWithUpdateOlder(t *testing.T) { }() accounting.Stats.ResetCounters() - err := Sync(r.Fremote, r.Flocal) + err := Sync(r.Fremote, r.Flocal, false) require.NoError(t, err) fstest.CheckItems(t, r.Fremote, oneO, twoF, threeO, fourF, fiveF) } @@ -923,7 +975,7 @@ func TestSyncWithTrackRenames(t *testing.T) { f2 := r.WriteFile("yam", "Yam Content", t2) accounting.Stats.ResetCounters() - require.NoError(t, Sync(r.Fremote, r.Flocal)) + require.NoError(t, Sync(r.Fremote, r.Flocal, false)) fstest.CheckItems(t, r.Fremote, f1, f2) fstest.CheckItems(t, r.Flocal, f1, f2) @@ -932,7 +984,7 @@ func TestSyncWithTrackRenames(t *testing.T) { f2 = r.RenameFile(f2, "yaml") accounting.Stats.ResetCounters() - require.NoError(t, Sync(r.Fremote, r.Flocal)) + require.NoError(t, Sync(r.Fremote, r.Flocal, false)) fstest.CheckItems(t, r.Fremote, f1, f2) @@ -969,7 +1021,7 @@ func testServerSideMove(t *testing.T, r *fstest.Run, withFilter, testDeleteEmpty // Do server side move accounting.Stats.ResetCounters() - err = MoveDir(FremoteMove, r.Fremote, testDeleteEmptyDirs) + err = MoveDir(FremoteMove, r.Fremote, testDeleteEmptyDirs, false) require.NoError(t, err) if withFilter { @@ -996,7 +1048,7 @@ func testServerSideMove(t *testing.T, r *fstest.Run, withFilter, testDeleteEmpty // Move it back to a new empty remote, dst does not exist this time accounting.Stats.ResetCounters() - err = MoveDir(FremoteMove2, FremoteMove, testDeleteEmptyDirs) + err = MoveDir(FremoteMove2, FremoteMove, testDeleteEmptyDirs, false) require.NoError(t, err) if withFilter { @@ -1021,7 +1073,7 @@ func TestMoveWithDeleteEmptySrcDirs(t *testing.T) { r.Mkdir(r.Fremote) // run move with --delete-empty-src-dirs - err := MoveDir(r.Fremote, r.Flocal, true) + err := MoveDir(r.Fremote, r.Flocal, true, false) require.NoError(t, err) fstest.CheckListingWithPrecision( @@ -1041,7 +1093,7 @@ func TestMoveWithoutDeleteEmptySrcDirs(t *testing.T) { file2 := r.WriteFile("nested/sub dir/file", "nested", t1) r.Mkdir(r.Fremote) - err := MoveDir(r.Fremote, r.Flocal, false) + err := MoveDir(r.Fremote, r.Flocal, false, false) require.NoError(t, err) fstest.CheckListingWithPrecision( @@ -1102,7 +1154,7 @@ func TestServerSideMoveOverlap(t *testing.T) { fstest.CheckItems(t, r.Fremote, file1) // Subdir move with no filters should return ErrorCantMoveOverlapping - err = MoveDir(FremoteMove, r.Fremote, false) + err = MoveDir(FremoteMove, r.Fremote, false, false) assert.EqualError(t, err, fs.ErrorOverlapping.Error()) // Now try with a filter which should also fail with ErrorCantMoveOverlapping @@ -1110,7 +1162,7 @@ func TestServerSideMoveOverlap(t *testing.T) { defer func() { filter.Active.Opt.MinSize = -1 }() - err = MoveDir(FremoteMove, r.Fremote, false) + err = MoveDir(FremoteMove, r.Fremote, false, false) assert.EqualError(t, err, fs.ErrorOverlapping.Error()) } @@ -1129,10 +1181,10 @@ func TestSyncOverlap(t *testing.T) { assert.Equal(t, fs.ErrorOverlapping.Error(), err.Error()) } - checkErr(Sync(FremoteSync, r.Fremote)) - checkErr(Sync(r.Fremote, FremoteSync)) - checkErr(Sync(r.Fremote, r.Fremote)) - checkErr(Sync(FremoteSync, FremoteSync)) + checkErr(Sync(FremoteSync, r.Fremote, false)) + checkErr(Sync(r.Fremote, FremoteSync, false)) + checkErr(Sync(r.Fremote, r.Fremote, false)) + checkErr(Sync(FremoteSync, FremoteSync, false)) } // Test with BackupDir set @@ -1167,7 +1219,7 @@ func testSyncBackupDir(t *testing.T, suffix string) { require.NoError(t, err) accounting.Stats.ResetCounters() - err = Sync(fdst, r.Flocal) + err = Sync(fdst, r.Flocal, false) require.NoError(t, err) // one should be moved to the backup dir and the new one installed @@ -1188,7 +1240,7 @@ func testSyncBackupDir(t *testing.T, suffix string) { // This should delete three and overwrite one again, checking // the files got overwritten correctly in backup-dir accounting.Stats.ResetCounters() - err = Sync(fdst, r.Flocal) + err = Sync(fdst, r.Flocal, false) require.NoError(t, err) // one should be moved to the backup dir and the new one installed @@ -1225,7 +1277,7 @@ func TestSyncUTFNorm(t *testing.T) { fstest.CheckItems(t, r.Fremote, file2) accounting.Stats.ResetCounters() - err := Sync(r.Fremote, r.Flocal) + err := Sync(r.Fremote, r.Flocal, false) require.NoError(t, err) // We should have transferred exactly one file, but kept the @@ -1251,7 +1303,7 @@ func TestSyncImmutable(t *testing.T) { // Should succeed accounting.Stats.ResetCounters() - err := Sync(r.Fremote, r.Flocal) + err := Sync(r.Fremote, r.Flocal, false) require.NoError(t, err) fstest.CheckItems(t, r.Flocal, file1) fstest.CheckItems(t, r.Fremote, file1) @@ -1263,7 +1315,7 @@ func TestSyncImmutable(t *testing.T) { // Should fail with ErrorImmutableModified and not modify local or remote files accounting.Stats.ResetCounters() - err = Sync(r.Fremote, r.Flocal) + err = Sync(r.Fremote, r.Flocal, false) assert.EqualError(t, err, fs.ErrorImmutableModified.Error()) fstest.CheckItems(t, r.Flocal, file2) fstest.CheckItems(t, r.Fremote, file1) @@ -1299,6 +1351,6 @@ func TestAbort(t *testing.T) { accounting.Stats.ResetCounters() - err := Sync(r.Fremote, r.Flocal) + err := Sync(r.Fremote, r.Flocal, false) assert.Equal(t, accounting.ErrorMaxTransferLimitReached, err) }