mirror of
https://github.com/rclone/rclone.git
synced 2024-11-30 04:23:48 +08:00
b2: Enable mod time syncing - fixes #348
This commit is contained in:
parent
414b35ea56
commit
cb22583212
2
b2/b2.go
2
b2/b2.go
|
@ -615,7 +615,7 @@ func (f *Fs) Rmdir() error {
|
||||||
|
|
||||||
// Precision of the remote
|
// Precision of the remote
|
||||||
func (f *Fs) Precision() time.Duration {
|
func (f *Fs) Precision() time.Duration {
|
||||||
return fs.ModTimeNotSupported
|
return time.Second
|
||||||
}
|
}
|
||||||
|
|
||||||
// deleteByID deletes a file version given Name and ID
|
// deleteByID deletes a file version given Name and ID
|
||||||
|
|
|
@ -96,9 +96,10 @@ The modified time is stored as metadata on the object as
|
||||||
in the Backblaze standard. Other tools should be able to use this as
|
in the Backblaze standard. Other tools should be able to use this as
|
||||||
a modified time.
|
a modified time.
|
||||||
|
|
||||||
Modified times are set on upload, read on download and shown in
|
Modified times are used in syncing and are fully supported except in
|
||||||
listings. They are not used in syncing as unfortunately B2 doesn't
|
the case of updating a modification time on an existing object. In
|
||||||
have an API method to set them independently of doing an upload.
|
this case the object will be uploaded again as B2 doesn't have an API
|
||||||
|
method to set the modification time independent of doing an upload.
|
||||||
|
|
||||||
### SHA1 checksums ###
|
### SHA1 checksums ###
|
||||||
|
|
||||||
|
@ -124,6 +125,3 @@ the old versions will be deleted.
|
||||||
Here are [some notes I made on the backblaze
|
Here are [some notes I made on the backblaze
|
||||||
API](https://gist.github.com/ncw/166dabf352b399f1cc1c) while
|
API](https://gist.github.com/ncw/166dabf352b399f1cc1c) while
|
||||||
integrating it with rclone which detail the changes I'd like to see.
|
integrating it with rclone which detail the changes I'd like to see.
|
||||||
With a couple of small tweaks Backblaze could enable rclone to not
|
|
||||||
make a temporary copy of files when doing cloud to cloud copies and
|
|
||||||
fully support modification times.
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ Here is an overview of the major features of each cloud storage system.
|
||||||
| Amazon Cloud Drive | MD5 | No | Yes | No |
|
| Amazon Cloud Drive | MD5 | No | Yes | No |
|
||||||
| Microsoft One Drive | SHA1 | Yes | Yes | No |
|
| Microsoft One Drive | SHA1 | Yes | Yes | No |
|
||||||
| Hubic | MD5 | Yes | No | No |
|
| Hubic | MD5 | Yes | No | No |
|
||||||
| Backblaze B2 | SHA1 | Partial | No | No |
|
| Backblaze B2 | SHA1 | Yes | No | No |
|
||||||
| Yandex Disk | MD5 | Yes | No | No |
|
| Yandex Disk | MD5 | Yes | No | No |
|
||||||
| The local filesystem | All | Yes | Depends | No |
|
| The local filesystem | All | Yes | Depends | No |
|
||||||
|
|
||||||
|
@ -49,9 +49,6 @@ default, though the MD5SUM can be checked with the `--checksum` flag.
|
||||||
All cloud storage systems support some kind of date on the object and
|
All cloud storage systems support some kind of date on the object and
|
||||||
these will be set when transferring from the cloud storage system.
|
these will be set when transferring from the cloud storage system.
|
||||||
|
|
||||||
Backblaze B2 preserves file modification times on files uploaded and
|
|
||||||
downloaded, but doesn't use them to decide which objects to sync.
|
|
||||||
|
|
||||||
### Case Insensitive ###
|
### Case Insensitive ###
|
||||||
|
|
||||||
If a cloud storage systems is case sensitive then it is possible to
|
If a cloud storage systems is case sensitive then it is possible to
|
||||||
|
@ -78,4 +75,5 @@ systems.
|
||||||
If a cloud storage system allows duplicate files then it can have two
|
If a cloud storage system allows duplicate files then it can have two
|
||||||
objects with the same name.
|
objects with the same name.
|
||||||
|
|
||||||
This confuses rclone greatly when syncing.
|
This confuses rclone greatly when syncing - use the `rclone dedupe`
|
||||||
|
command to rename or remove duplicates.
|
||||||
|
|
|
@ -146,7 +146,10 @@ func Equal(src, dst Object) bool {
|
||||||
// Size and hash the same but mtime different so update the
|
// Size and hash the same but mtime different so update the
|
||||||
// mtime of the dst object here
|
// mtime of the dst object here
|
||||||
err := dst.SetModTime(srcModTime)
|
err := dst.SetModTime(srcModTime)
|
||||||
if err != nil {
|
if err == ErrorCantSetModTime {
|
||||||
|
Debug(src, "src and dst identical but can't set mod time without re-uploading")
|
||||||
|
return false
|
||||||
|
} else if err != nil {
|
||||||
Stats.Error()
|
Stats.Error()
|
||||||
ErrorLog(dst, "Failed to read set modification time: %s", err)
|
ErrorLog(dst, "Failed to read set modification time: %s", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -497,7 +497,13 @@ func TestObjectSetModTime(t *testing.T) {
|
||||||
skipIfNotOk(t)
|
skipIfNotOk(t)
|
||||||
newModTime := fstest.Time("2011-12-13T14:15:16.999999999Z")
|
newModTime := fstest.Time("2011-12-13T14:15:16.999999999Z")
|
||||||
obj := findObject(t, file1.Path)
|
obj := findObject(t, file1.Path)
|
||||||
obj.SetModTime(newModTime)
|
err := obj.SetModTime(newModTime)
|
||||||
|
if err == fs.ErrorCantSetModTime {
|
||||||
|
t.Log(err)
|
||||||
|
return
|
||||||
|
} else if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
file1.ModTime = newModTime
|
file1.ModTime = newModTime
|
||||||
file1.CheckModTime(t, obj, obj.ModTime(), remote.Precision())
|
file1.CheckModTime(t, obj, obj.ModTime(), remote.Precision())
|
||||||
// And make a new object and read it from there too
|
// And make a new object and read it from there too
|
||||||
|
|
Loading…
Reference in New Issue
Block a user