forked from TrueCloudLab/rclone
flags: remove --no-traverse flag because it is obsolete - fixes #1813
Signed-off-by: Ernest Borowski <er.borowski@gmail.com>
This commit is contained in:
parent
acd55a8f65
commit
5cce74d630
7 changed files with 11 additions and 77 deletions
|
@ -179,8 +179,6 @@ func newFsSrc(remote string) (fs.Fs, string) {
|
||||||
fs.CountError(err)
|
fs.CountError(err)
|
||||||
log.Fatalf("Failed to limit to single file %q: %v", remote, err)
|
log.Fatalf("Failed to limit to single file %q: %v", remote, err)
|
||||||
}
|
}
|
||||||
// Set --no-traverse as only one file
|
|
||||||
fs.Config.NoTraverse = true
|
|
||||||
}
|
}
|
||||||
return f, fileName
|
return f, fileName
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,9 +49,6 @@ If you are familiar with ` + "`rsync`" + `, rclone always works as if you had
|
||||||
written a trailing / - meaning "copy the contents of this directory".
|
written a trailing / - meaning "copy the contents of this directory".
|
||||||
This applies to all commands and whether you are talking about the
|
This applies to all commands and whether you are talking about the
|
||||||
source or destination.
|
source or destination.
|
||||||
|
|
||||||
See the ` + "`--no-traverse`" + ` option for controlling whether rclone lists
|
|
||||||
the destination directory or not.
|
|
||||||
`,
|
`,
|
||||||
Run: func(command *cobra.Command, args []string) {
|
Run: func(command *cobra.Command, args []string) {
|
||||||
cmd.CheckArgs(2, 2, command, args)
|
cmd.CheckArgs(2, 2, command, args)
|
||||||
|
|
|
@ -118,7 +118,7 @@ The file `test.jpg` will be placed inside `/tmp/download`.
|
||||||
|
|
||||||
This is equivalent to specifying
|
This is equivalent to specifying
|
||||||
|
|
||||||
rclone copy --no-traverse --files-from /tmp/files remote: /tmp/download
|
rclone copy --files-from /tmp/files remote: /tmp/download
|
||||||
|
|
||||||
Where `/tmp/files` contains the single line
|
Where `/tmp/files` contains the single line
|
||||||
|
|
||||||
|
@ -691,8 +691,8 @@ If the destination does not support server-side copy or move, rclone
|
||||||
will fall back to the default behaviour and log an error level message
|
will fall back to the default behaviour and log an error level message
|
||||||
to the console.
|
to the console.
|
||||||
|
|
||||||
Note that `--track-renames` is incompatible with `--no-traverse` and
|
Note that `--track-renames` uses extra memory to keep track of all
|
||||||
that it uses extra memory to keep track of all the rename candidates.
|
the rename candidates.
|
||||||
|
|
||||||
Note also that `--track-renames` is incompatible with
|
Note also that `--track-renames` is incompatible with
|
||||||
`--delete-before` and will select `--delete-after` instead of
|
`--delete-before` and will select `--delete-after` instead of
|
||||||
|
@ -957,26 +957,6 @@ This option defaults to `false`.
|
||||||
|
|
||||||
**This should be used only for testing.**
|
**This should be used only for testing.**
|
||||||
|
|
||||||
### --no-traverse ###
|
|
||||||
|
|
||||||
The `--no-traverse` flag controls whether the destination file system
|
|
||||||
is traversed when using the `copy` or `move` commands.
|
|
||||||
`--no-traverse` is not compatible with `sync` and will be ignored if
|
|
||||||
you supply it with `sync`.
|
|
||||||
|
|
||||||
If you are only copying a small number of files and/or have a large
|
|
||||||
number of files on the destination then `--no-traverse` will stop
|
|
||||||
rclone listing the destination and save time.
|
|
||||||
|
|
||||||
However, if you are copying a large number of files, especially if you
|
|
||||||
are doing a copy where lots of the files haven't changed and won't
|
|
||||||
need copying then you shouldn't use `--no-traverse`.
|
|
||||||
|
|
||||||
It can also be used to reduce the memory usage of rclone when copying
|
|
||||||
- `rclone --no-traverse copy src dst` won't load either the source or
|
|
||||||
destination listings into memory so will use the minimum amount of
|
|
||||||
memory.
|
|
||||||
|
|
||||||
Filtering
|
Filtering
|
||||||
---------
|
---------
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,6 @@ type ConfigInfo struct {
|
||||||
MaxDepth int
|
MaxDepth int
|
||||||
IgnoreSize bool
|
IgnoreSize bool
|
||||||
IgnoreChecksum bool
|
IgnoreChecksum bool
|
||||||
NoTraverse bool
|
|
||||||
NoUpdateModTime bool
|
NoUpdateModTime bool
|
||||||
DataRateUnit string
|
DataRateUnit string
|
||||||
BackupDir string
|
BackupDir string
|
||||||
|
|
|
@ -26,6 +26,7 @@ var (
|
||||||
deleteAfter bool
|
deleteAfter bool
|
||||||
bindAddr string
|
bindAddr string
|
||||||
disableFeatures string
|
disableFeatures string
|
||||||
|
noTraverse bool
|
||||||
)
|
)
|
||||||
|
|
||||||
// AddFlags adds the non filing system specific flags to the command
|
// AddFlags adds the non filing system specific flags to the command
|
||||||
|
@ -59,7 +60,7 @@ func AddFlags(flagSet *pflag.FlagSet) {
|
||||||
flags.IntVarP(flagSet, &fs.Config.MaxDepth, "max-depth", "", fs.Config.MaxDepth, "If set limits the recursion depth to this.")
|
flags.IntVarP(flagSet, &fs.Config.MaxDepth, "max-depth", "", fs.Config.MaxDepth, "If set limits the recursion depth to this.")
|
||||||
flags.BoolVarP(flagSet, &fs.Config.IgnoreSize, "ignore-size", "", false, "Ignore size when skipping use mod-time or checksum.")
|
flags.BoolVarP(flagSet, &fs.Config.IgnoreSize, "ignore-size", "", false, "Ignore size when skipping use mod-time or checksum.")
|
||||||
flags.BoolVarP(flagSet, &fs.Config.IgnoreChecksum, "ignore-checksum", "", fs.Config.IgnoreChecksum, "Skip post copy check of checksums.")
|
flags.BoolVarP(flagSet, &fs.Config.IgnoreChecksum, "ignore-checksum", "", fs.Config.IgnoreChecksum, "Skip post copy check of checksums.")
|
||||||
flags.BoolVarP(flagSet, &fs.Config.NoTraverse, "no-traverse", "", fs.Config.NoTraverse, "Don't traverse destination file system on copy.")
|
flags.BoolVarP(flagSet, &noTraverse, "no-traverse", "", noTraverse, "Obsolete - does nothing.")
|
||||||
flags.BoolVarP(flagSet, &fs.Config.NoUpdateModTime, "no-update-modtime", "", fs.Config.NoUpdateModTime, "Don't update destination mod-time if files identical.")
|
flags.BoolVarP(flagSet, &fs.Config.NoUpdateModTime, "no-update-modtime", "", fs.Config.NoUpdateModTime, "Don't update destination mod-time if files identical.")
|
||||||
flags.StringVarP(flagSet, &fs.Config.BackupDir, "backup-dir", "", fs.Config.BackupDir, "Make backups into hierarchy based in DIR.")
|
flags.StringVarP(flagSet, &fs.Config.BackupDir, "backup-dir", "", fs.Config.BackupDir, "Make backups into hierarchy based in DIR.")
|
||||||
flags.StringVarP(flagSet, &fs.Config.Suffix, "suffix", "", fs.Config.Suffix, "Suffix for use with --backup-dir.")
|
flags.StringVarP(flagSet, &fs.Config.Suffix, "suffix", "", fs.Config.Suffix, "Suffix for use with --backup-dir.")
|
||||||
|
@ -105,13 +106,17 @@ func SetFlags() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if noTraverse {
|
||||||
|
fs.Logf(nil, "--no-traverse is obsolete and no longer needed - please remove")
|
||||||
|
}
|
||||||
|
|
||||||
if dumpHeaders {
|
if dumpHeaders {
|
||||||
fs.Config.Dump |= fs.DumpHeaders
|
fs.Config.Dump |= fs.DumpHeaders
|
||||||
fs.Infof(nil, "--dump-headers is obsolete - please use --dump headers instead")
|
fs.Logf(nil, "--dump-headers is obsolete - please use --dump headers instead")
|
||||||
}
|
}
|
||||||
if dumpBodies {
|
if dumpBodies {
|
||||||
fs.Config.Dump |= fs.DumpBodies
|
fs.Config.Dump |= fs.DumpBodies
|
||||||
fs.Infof(nil, "--dump-bodies is obsolete - please use --dump bodies instead")
|
fs.Logf(nil, "--dump-bodies is obsolete - please use --dump bodies instead")
|
||||||
}
|
}
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
|
|
|
@ -28,7 +28,6 @@ type syncCopyMove struct {
|
||||||
// internal state
|
// internal state
|
||||||
ctx context.Context // internal context for controlling go-routines
|
ctx context.Context // internal context for controlling go-routines
|
||||||
cancel func() // cancel the context
|
cancel func() // cancel the context
|
||||||
noTraverse bool // if set don't trafevers the dst
|
|
||||||
deletersWg sync.WaitGroup // for delete before go routine
|
deletersWg sync.WaitGroup // for delete before go routine
|
||||||
deleteFilesCh chan fs.Object // channel to receive deletes if delete before
|
deleteFilesCh chan fs.Object // channel to receive deletes if delete before
|
||||||
trackRenames bool // set if we should do server side renames
|
trackRenames bool // set if we should do server side renames
|
||||||
|
@ -73,7 +72,6 @@ func newSyncCopyMove(fdst, fsrc fs.Fs, deleteMode fs.DeleteMode, DoMove bool, de
|
||||||
srcFilesChan: make(chan fs.Object, fs.Config.Checkers+fs.Config.Transfers),
|
srcFilesChan: make(chan fs.Object, fs.Config.Checkers+fs.Config.Transfers),
|
||||||
srcFilesResult: make(chan error, 1),
|
srcFilesResult: make(chan error, 1),
|
||||||
dstFilesResult: make(chan error, 1),
|
dstFilesResult: make(chan error, 1),
|
||||||
noTraverse: fs.Config.NoTraverse,
|
|
||||||
toBeChecked: make(fs.ObjectPairChan, fs.Config.Transfers),
|
toBeChecked: make(fs.ObjectPairChan, fs.Config.Transfers),
|
||||||
toBeUploaded: make(fs.ObjectPairChan, fs.Config.Transfers),
|
toBeUploaded: make(fs.ObjectPairChan, fs.Config.Transfers),
|
||||||
deleteFilesCh: make(chan fs.Object, fs.Config.Checkers),
|
deleteFilesCh: make(chan fs.Object, fs.Config.Checkers),
|
||||||
|
@ -83,10 +81,6 @@ func newSyncCopyMove(fdst, fsrc fs.Fs, deleteMode fs.DeleteMode, DoMove bool, de
|
||||||
trackRenamesCh: make(chan fs.Object, fs.Config.Checkers),
|
trackRenamesCh: make(chan fs.Object, fs.Config.Checkers),
|
||||||
}
|
}
|
||||||
s.ctx, s.cancel = context.WithCancel(context.Background())
|
s.ctx, s.cancel = context.WithCancel(context.Background())
|
||||||
if s.noTraverse && s.deleteMode != fs.DeleteModeOff {
|
|
||||||
fs.Errorf(nil, "Ignoring --no-traverse with sync")
|
|
||||||
s.noTraverse = false
|
|
||||||
}
|
|
||||||
if s.trackRenames {
|
if s.trackRenames {
|
||||||
// Don't track renames for remotes without server-side move support.
|
// Don't track renames for remotes without server-side move support.
|
||||||
if !operations.CanServerSideMove(fdst) {
|
if !operations.CanServerSideMove(fdst) {
|
||||||
|
@ -103,10 +97,6 @@ func newSyncCopyMove(fdst, fsrc fs.Fs, deleteMode fs.DeleteMode, DoMove bool, de
|
||||||
if s.deleteMode != fs.DeleteModeOff {
|
if s.deleteMode != fs.DeleteModeOff {
|
||||||
s.deleteMode = fs.DeleteModeAfter
|
s.deleteMode = fs.DeleteModeAfter
|
||||||
}
|
}
|
||||||
if s.noTraverse {
|
|
||||||
fs.Errorf(nil, "Ignoring --no-traverse with --track-renames")
|
|
||||||
s.noTraverse = false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// Make Fs for --backup-dir if required
|
// Make Fs for --backup-dir if required
|
||||||
if fs.Config.BackupDir != "" {
|
if fs.Config.BackupDir != "" {
|
||||||
|
|
|
@ -61,41 +61,6 @@ func TestCopy(t *testing.T) {
|
||||||
fstest.CheckItems(t, r.Fremote, file1)
|
fstest.CheckItems(t, r.Fremote, file1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now with --no-traverse
|
|
||||||
func TestCopyNoTraverse(t *testing.T) {
|
|
||||||
r := fstest.NewRun(t)
|
|
||||||
defer r.Finalise()
|
|
||||||
|
|
||||||
fs.Config.NoTraverse = true
|
|
||||||
defer func() { fs.Config.NoTraverse = false }()
|
|
||||||
|
|
||||||
file1 := r.WriteFile("sub dir/hello world", "hello world", t1)
|
|
||||||
|
|
||||||
err := CopyDir(r.Fremote, r.Flocal)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
fstest.CheckItems(t, r.Flocal, file1)
|
|
||||||
fstest.CheckItems(t, r.Fremote, file1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now with --no-traverse
|
|
||||||
func TestSyncNoTraverse(t *testing.T) {
|
|
||||||
r := fstest.NewRun(t)
|
|
||||||
defer r.Finalise()
|
|
||||||
|
|
||||||
fs.Config.NoTraverse = true
|
|
||||||
defer func() { fs.Config.NoTraverse = false }()
|
|
||||||
|
|
||||||
file1 := r.WriteFile("sub dir/hello world", "hello world", t1)
|
|
||||||
|
|
||||||
accounting.Stats.ResetCounters()
|
|
||||||
err := Sync(r.Fremote, r.Flocal)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
fstest.CheckItems(t, r.Flocal, file1)
|
|
||||||
fstest.CheckItems(t, r.Fremote, file1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test copy with depth
|
// Test copy with depth
|
||||||
func TestCopyWithDepth(t *testing.T) {
|
func TestCopyWithDepth(t *testing.T) {
|
||||||
r := fstest.NewRun(t)
|
r := fstest.NewRun(t)
|
||||||
|
|
Loading…
Reference in a new issue