dropbox: make setting mod time on existing files work properly

This is a fix left over from the v2 conversion.  Dropbox ignores the
client modification on an incoming file if it was identical to the
existing file.  This change deletes the existing file first before
re-uploading the new one.
This commit is contained in:
Nick Craig-Wood 2017-06-13 13:58:39 +01:00
parent 740b3f6ae2
commit 68333d34a1
5 changed files with 30 additions and 22 deletions

View File

@ -125,7 +125,7 @@ func (f *File) applyPendingModTime() error {
switch err { switch err {
case nil: case nil:
fs.Debugf(f.o, "File.applyPendingModTime OK") fs.Debugf(f.o, "File.applyPendingModTime OK")
case fs.ErrorCantSetModTime: case fs.ErrorCantSetModTime, fs.ErrorCantSetModTimeWithoutDelete:
// do nothing, in order to not break "touch somefile" if it exists already // do nothing, in order to not break "touch somefile" if it exists already
default: default:
fs.Errorf(f.o, "File.applyPendingModTime error: %v", err) fs.Errorf(f.o, "File.applyPendingModTime error: %v", err)

View File

@ -810,9 +810,9 @@ func (o *Object) ModTime() time.Time {
// Commits the datastore // Commits the datastore
func (o *Object) SetModTime(modTime time.Time) error { func (o *Object) SetModTime(modTime time.Time) error {
// Dropbox doesn't have a way of doing this so returning this // Dropbox doesn't have a way of doing this so returning this
// error will cause the file to be re-uploaded to set the // error will cause the file to be deleted first then
// time. // re-uploaded to set the time.
return fs.ErrorCantSetModTime return fs.ErrorCantSetModTimeWithoutDelete
} }
// Storable returns whether this object is storable // Storable returns whether this object is storable

View File

@ -36,6 +36,7 @@ var (
ErrorCantDirMove = errors.New("can't move directory - incompatible remotes") ErrorCantDirMove = errors.New("can't move directory - incompatible remotes")
ErrorDirExists = errors.New("can't copy directory - destination already exists") ErrorDirExists = errors.New("can't copy directory - destination already exists")
ErrorCantSetModTime = errors.New("can't set modified time") ErrorCantSetModTime = errors.New("can't set modified time")
ErrorCantSetModTimeWithoutDelete = errors.New("can't set modified time without deleting existing object")
ErrorDirNotFound = errors.New("directory not found") ErrorDirNotFound = errors.New("directory not found")
ErrorObjectNotFound = errors.New("object not found") ErrorObjectNotFound = errors.New("object not found")
ErrorLevelNotSupported = errors.New("level value not supported") ErrorLevelNotSupported = errors.New("level value not supported")

View File

@ -183,7 +183,14 @@ func equal(src, dst Object, sizeOnly, checkSum bool) bool {
// mtime of the dst object here // mtime of the dst object here
err := dst.SetModTime(srcModTime) err := dst.SetModTime(srcModTime)
if err == ErrorCantSetModTime { if err == ErrorCantSetModTime {
Debugf(src, "src and dst identical but can't set mod time without re-uploading") Debugf(dst, "src and dst identical but can't set mod time without re-uploading")
return false
} else if err == ErrorCantSetModTimeWithoutDelete {
Debugf(dst, "src and dst identical but can't set mod time without deleting and re-uploading")
err = dst.Remove()
if err != nil {
Errorf(dst, "failed to delete before re-upload: %v", err)
}
return false return false
} else if err != nil { } else if err != nil {
Stats.Error() Stats.Error()

View File

@ -672,7 +672,7 @@ func TestObjectSetModTime(t *testing.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)
err := obj.SetModTime(newModTime) err := obj.SetModTime(newModTime)
if err == fs.ErrorCantSetModTime { if err == fs.ErrorCantSetModTime || err == fs.ErrorCantSetModTimeWithoutDelete {
t.Log(err) t.Log(err)
return return
} }