rclone/fs
nielash b4216648e4 bisync: full support for comparing checksum, size, modtime - fixes #5679 fixes #5683 fixes #5684 fixes #5675
Before this change, bisync could only detect changes based on modtime, and
would refuse to run if either path lacked modtime support. This made bisync
unavailable for many of rclone's backends. Additionally, bisync did not account
for the Fs's precision when comparing modtimes, meaning that they could only be
reliably compared within the same side -- not against the opposite side. Size
and checksum (even when available) were ignored completely for deltas.

After this change, bisync now fully supports comparing based on any combination
of size, modtime, and checksum, lifting the prior restriction on backends
without modtime support. The comparison logic considers the backend's
precision, hash types, and other features as appropriate.

The comparison features optionally use a new --compare flag (which takes any
combination of size,modtime,checksum) and even supports some combinations not
otherwise supported in `sync` (like comparing all three at the same time.) By
default (without the --compare flag), bisync inherits the same comparison
options as `sync` (that is: size and modtime by default, unless modified with
flags such as --checksum or --size-only.) If the --compare flag is set, it will
override these defaults.

If --compare includes checksum and both remotes support checksums but have no
hash types in common with each other, checksums will be considered only for
comparisons within the same side (to determine what has changed since the prior
sync), but not for comparisons against the opposite side. If one side supports
checksums and the other does not, checksums will only be considered on the side
that supports them. When comparing with checksum and/or size without modtime,
bisync cannot determine whether a file is newer or older -- only whether it is
changed or unchanged. (If it is changed on both sides, bisync still does the
standard equality-check to avoid declaring a sync conflict unless it absolutely
has to.)

Also included are some new flags to customize the checksum comparison behavior
on backends where hashes are slow or unavailable. --no-slow-hash and
--slow-hash-sync-only allow selectively ignoring checksums on backends such as
local where they are slow. --download-hash allows computing them by downloading
when (and only when) they're otherwise not available. Of course, this option
probably won't be practical with large files, but may be a good option for
syncing small-but-important files with maximum accuracy (for example, a source
code repo on a crypt remote.) An additional advantage over methods like
cryptcheck is that the original file is not required for comparison (for
example, --download-hash can be used to bisync two different crypt remotes with
different passwords.)

Additionally, all of the above are now considered during the final --check-sync
for much-improved accuracy (before this change, it only compared filenames!)

Many other details are explained in the included docs.
2024-01-20 16:08:06 -05:00
..
accounting stats: fix race between ResetCounters and stopAverageLoop called from time.AfterFunc 2024-01-17 10:23:50 +00:00
asyncreader Replace deprecated ioutil 2022-11-07 11:41:47 +00:00
cache cache: fix backends shutting down when in use when used via the rc 2023-06-13 15:48:20 +01:00
chunkedreader build: add package comments to silence revive linter 2022-08-28 13:43:51 +02:00
chunksize azureblob,b2,s3: fix chunksize calculations producing too many parts 2022-08-09 12:57:38 +01:00
config sync: --fix-case flag to rename case insensitive dest - fixes #4854 2024-01-20 14:50:08 -05:00
dirtree dirtree: fix performance with large directories of directories and --fast-list 2023-07-03 14:09:21 +01:00
driveletter build: add package comments to silence revive linter 2022-08-28 13:43:51 +02:00
filter docs: group the global flags and make them appear on command and flags pages 2023-08-02 12:53:09 +01:00
fserrors Fix lint issues reported by staticcheck 2022-06-13 21:13:50 +02:00
fshttp fs/fshttp: fix --contimeout being ignored 2023-11-24 17:53:33 +00:00
fspath fspath: allow the symbols at and plus in remote names - fixes #6710 2023-01-25 13:37:24 +01:00
hash hash: allow runtime configuration of supported hashes for testing 2023-11-24 11:19:58 +00:00
list Remove github.com/pkg/errors and replace with std library version 2021-11-07 11:53:30 +00:00
log systemd: Fix detection and switch to the coreos package everywhere 2023-12-02 14:17:15 +00:00
logger sync: report list of synced paths to file -- see #7282 2024-01-20 14:50:08 -05:00
march march: Fix excessive parallelism when using --no-traverse 2023-11-20 17:36:31 +00:00
object docs: fix typos found by codespell in docs and code comments 2023-09-23 12:20:01 +01:00
operations bisync: full support for comparing checksum, size, modtime - fixes #5679 fixes #5683 fixes #5684 fixes #5675 2024-01-20 16:08:06 -05:00
rc fs: use atomic types 2023-08-22 12:52:13 +01:00
sync local: fix cleanRootPath on Windows after go1.21.4 stdlib update 2024-01-20 14:50:08 -05:00
walk mockfs: make it so it can be registered as an Fs 2023-04-28 14:31:05 +01:00
backend_config.go fs: fix typos found by codespell 2023-03-25 12:51:04 +01:00
backend_config_test.go fs: add --all to rclone config create/update to ask all the config questions #3455 2021-05-14 14:07:44 +01:00
bits.go fs: fix docs for Bits 2023-10-23 15:43:55 +01:00
bits_test.go fs: add IsSet convenience method to Bits 2023-10-23 15:43:42 +01:00
bwtimetable.go build: reformat comments to pass go1.19 vet 2022-08-05 16:35:41 +01:00
bwtimetable_test.go fs: fix option types printing incorrectly for backend flags 2023-10-03 11:23:58 +01:00
config.go sync: --fix-case flag to rename case insensitive dest - fixes #4854 2024-01-20 14:50:08 -05:00
config_list.go Make flags show up with their proper names, eg SizeSuffix rather than int 2019-02-07 11:57:26 +00:00
config_list_test.go fs: fix tests for *SepList 2018-08-21 10:58:59 +01:00
config_test.go build: add lint ignore comment required for golangci-staticcheck in addition to stand-alone staticcheck 2023-03-26 14:28:15 +02:00
configmap.go config: fix in memory config not saving on the fly backend config 2021-07-20 12:09:38 +01:00
countsuffix.go fs: fix option types printing incorrectly for backend flags 2023-10-03 11:23:58 +01:00
countsuffix_test.go fs: fix option types printing incorrectly for backend flags 2023-10-03 11:23:58 +01:00
cutoffmode.go fs: re-implement CutoffMode, LogLevel, TerminalColorMode with Enum 2023-10-03 15:14:24 +01:00
cutoffmode_test.go fs: re-implement CutoffMode, LogLevel, TerminalColorMode with Enum 2023-10-03 15:14:24 +01:00
daemon_other.go mountlib: correctly daemonize for compatibility with automount - #5593 2021-10-02 23:45:16 +03:00
daemon_unix.go mountlib: correctly daemonize for compatibility with automount - #5593 2021-10-02 23:45:16 +03:00
deletemode.go Break the fs package up into smaller parts. 2018-01-15 17:51:14 +00:00
dir.go fs: Add --default-time flag to control unknown modtime of files/dirs 2023-05-04 15:03:11 +01:00
direntries.go fs: Allow sync of a file and a directory with the same name 2019-06-09 15:57:05 +01:00
direntries_test.go build: fix up package paths after repo move 2019-07-28 18:47:38 +01:00
dump.go fs: implement --metadata-mapper to transform metatadata with a user supplied program 2023-11-18 17:49:35 +00:00
dump_test.go fs: re-implement DumpMode with Bits 2023-10-03 15:24:09 +01:00
enum.go fs: re-implement CutoffMode, LogLevel, TerminalColorMode with Enum 2023-10-03 15:14:24 +01:00
enum_test.go fs: re-implement CutoffMode, LogLevel, TerminalColorMode with Enum 2023-10-03 15:14:24 +01:00
features.go operations: fix overwrite of destination when multi-thread transfer fails 2023-11-24 11:19:58 +00:00
fingerprint.go fs: add Fingerprint to detect changes in an object 2020-06-30 12:01:36 +01:00
fingerprint_test.go mockfs: make it so it can be registered as an Fs 2023-04-28 14:31:05 +01:00
fs.go sync: update docs and error messages to reflect fixes to overlap checks 2022-07-13 16:04:53 +01:00
fs_test.go rclone config redacted: implement support mechanism for showing redacted config 2023-07-07 16:25:14 +01:00
log.go fs: re-implement CutoffMode, LogLevel, TerminalColorMode with Enum 2023-10-03 15:14:24 +01:00
log_test.go fs: fix a typo in a comment 2023-11-16 17:15:00 +00:00
metadata.go fs: implement --metadata-mapper to transform metatadata with a user supplied program 2023-11-18 17:49:35 +00:00
metadata_mapper_code.go fs: implement --metadata-mapper to transform metatadata with a user supplied program 2023-11-18 17:49:35 +00:00
metadata_test.go fs: implement --metadata-mapper to transform metatadata with a user supplied program 2023-11-18 17:49:35 +00:00
mimetype.go Do not override mime types from os defaults 2021-10-18 13:28:22 +01:00
mount_helper.go build: reformat comments to pass go1.19 vet 2022-08-05 16:35:41 +01:00
mount_helper_test.go rclone.mount: ignore _netdev mount argument - FIxes #5808 2022-05-12 20:27:13 +01:00
newfs.go mount: fix mount failure on macOS with on the fly remote 2023-06-23 14:12:03 +01:00
newfs_test.go mount: fix mount failure on macOS with on the fly remote 2023-06-23 14:12:03 +01:00
open_options.go build: fix lint errors when re-enabling revive exported & package-comments 2023-08-29 13:03:13 +01:00
open_options_test.go fs: add --metadata-set flag to specify metadata for uploads 2022-06-29 14:29:36 +01:00
override.go fs: when creating new fs.OverrideRemotes don't layer overrides if not needed 2023-05-09 16:28:10 +01:00
override_dir.go fs: add OverrideDirectory for overriding path of directory 2023-05-14 11:22:57 +01:00
override_dir_test.go fs: add OverrideDirectory for overriding path of directory 2023-05-14 11:22:57 +01:00
override_test.go fs: move operations.NewOverrideRemote to fs.NewOverrideRemote 2022-11-21 08:02:09 +00:00
pacer.go pacer: fix b2 deadlock by defaulting max connections to unlimited 2023-10-01 12:30:26 +01:00
parseduration.go accounting: limit length of ETA string 2023-02-04 17:29:08 +01:00
parseduration_test.go fs: fix option types printing incorrectly for backend flags 2023-10-03 11:23:58 +01:00
parsetime.go rc: fix output of Time values in options/get 2023-05-04 15:04:11 +01:00
parsetime_test.go fs: fix option types printing incorrectly for backend flags 2023-10-03 11:23:58 +01:00
registry.go backend: add description field for all backends 2024-01-03 10:57:59 +00:00
sizesuffix.go fs: fix option types printing incorrectly for backend flags 2023-10-03 11:23:58 +01:00
sizesuffix_test.go fs: fix option types printing incorrectly for backend flags 2023-10-03 11:23:58 +01:00
terminalcolormode.go fs: re-implement CutoffMode, LogLevel, TerminalColorMode with Enum 2023-10-03 15:14:24 +01:00
terminalcolormode_test.go fs: re-implement CutoffMode, LogLevel, TerminalColorMode with Enum 2023-10-03 15:14:24 +01:00
tristate.go fs: fix tristate conversion to JSON 2023-03-27 16:17:49 +01:00
tristate_test.go fs: fix option types printing incorrectly for backend flags 2023-10-03 11:23:58 +01:00
types.go fs: implement optional Metadata interface for Objects #111 2022-06-29 11:21:29 +01:00
version.go Configurable version suffix independent of version number 2022-05-17 12:10:01 +01:00
versioncheck.go build: update to go1.22rc1 and make go1.20 the minimum required version 2024-01-15 16:22:07 +00:00
versionsuffix.go Configurable version suffix independent of version number 2022-05-17 12:10:01 +01:00
versiontag.go Start v1.66.0-DEV development 2023-11-26 17:14:38 +00:00