mirror of
https://github.com/rclone/rclone.git
synced 2024-11-22 20:59:10 +08:00
vfs: fix applying modtime for an open Write Handle
The symptom of this was that the time set when the file was open was lost. This was causing one of the mount tests to fail too.
This commit is contained in:
parent
85e0b87c99
commit
0175332987
|
@ -5,6 +5,7 @@ import (
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/ncw/rclone/fs"
|
"github.com/ncw/rclone/fs"
|
||||||
"github.com/ncw/rclone/fstest"
|
"github.com/ncw/rclone/fstest"
|
||||||
|
@ -562,3 +563,27 @@ func TestRWFileHandleOpenTests(t *testing.T) {
|
||||||
testRWFileHandleOpenTest(t, vfs, &test)
|
testRWFileHandleOpenTest(t, vfs, &test)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// tests mod time on open files
|
||||||
|
func TestRWFileModTimeWithOpenWriters(t *testing.T) {
|
||||||
|
r := fstest.NewRun(t)
|
||||||
|
defer r.Finalise()
|
||||||
|
vfs, fh := rwHandleCreateWriteOnly(t, r)
|
||||||
|
|
||||||
|
mtime := time.Date(2012, 11, 18, 17, 32, 31, 0, time.UTC)
|
||||||
|
|
||||||
|
_, err := fh.Write([]byte{104, 105})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
err = fh.Node().SetModTime(mtime)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
err = fh.Close()
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
info, err := vfs.Stat("file1")
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// avoid errors because of timezone differences
|
||||||
|
assert.Equal(t, info.ModTime().Unix(), mtime.Unix())
|
||||||
|
}
|
||||||
|
|
|
@ -181,7 +181,10 @@ func (fh *WriteFileHandle) close() (err error) {
|
||||||
}
|
}
|
||||||
fh.closed = true
|
fh.closed = true
|
||||||
// leave writer open until file is transferred
|
// leave writer open until file is transferred
|
||||||
defer fh.file.delWriter(fh, false)
|
defer func() {
|
||||||
|
fh.file.delWriter(fh, false)
|
||||||
|
fh.file.finishWriterClose()
|
||||||
|
}()
|
||||||
// If file not opened and not safe to truncate then then leave file intact
|
// If file not opened and not safe to truncate then then leave file intact
|
||||||
if !fh.opened && !fh.safeToTruncate() {
|
if !fh.opened && !fh.safeToTruncate() {
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -3,6 +3,7 @@ package vfs
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/ncw/rclone/fs"
|
"github.com/ncw/rclone/fs"
|
||||||
"github.com/ncw/rclone/fstest"
|
"github.com/ncw/rclone/fstest"
|
||||||
|
@ -214,3 +215,27 @@ func TestWriteFileHandleRelease(t *testing.T) {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.True(t, fh.closed)
|
assert.True(t, fh.closed)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// tests mod time on open files
|
||||||
|
func TestWriteFileModTimeWithOpenWriters(t *testing.T) {
|
||||||
|
r := fstest.NewRun(t)
|
||||||
|
defer r.Finalise()
|
||||||
|
vfs, fh := writeHandleCreate(t, r)
|
||||||
|
|
||||||
|
mtime := time.Date(2012, 11, 18, 17, 32, 31, 0, time.UTC)
|
||||||
|
|
||||||
|
_, err := fh.Write([]byte{104, 105})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
err = fh.Node().SetModTime(mtime)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
err = fh.Close()
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
info, err := vfs.Stat("file1")
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// avoid errors because of timezone differences
|
||||||
|
assert.Equal(t, info.ModTime().Unix(), mtime.Unix())
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user