forked from TrueCloudLab/rclone
s3: fix --s3-versions when copying a single object
Before this change, if --s3-versions was enabled, then copying a single object from a subdirectory would fail. This was due to an incorrect comparison in the NewFs code. This fixes the change and introduces a new unit tests.
This commit is contained in:
parent
3cb7734eac
commit
c917d2d5b4
2 changed files with 21 additions and 4 deletions
|
@ -2758,7 +2758,8 @@ func (f *Fs) getMetaDataListing(ctx context.Context, wantRemote string) (info *s
|
||||||
if isDirectory {
|
if isDirectory {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if wantRemote != gotRemote {
|
// compare the base name only since the listing will have a prefix
|
||||||
|
if path.Base(wantRemote) != path.Base(gotRemote) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
info = object
|
info = object
|
||||||
|
|
|
@ -6,12 +6,16 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"crypto/md5"
|
"crypto/md5"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"path"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws"
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
"github.com/aws/aws-sdk-go/service/s3"
|
"github.com/aws/aws-sdk-go/service/s3"
|
||||||
"github.com/rclone/rclone/fs"
|
"github.com/rclone/rclone/fs"
|
||||||
|
"github.com/rclone/rclone/fs/cache"
|
||||||
|
"github.com/rclone/rclone/fs/fspath"
|
||||||
"github.com/rclone/rclone/fs/hash"
|
"github.com/rclone/rclone/fs/hash"
|
||||||
"github.com/rclone/rclone/fstest"
|
"github.com/rclone/rclone/fstest"
|
||||||
"github.com/rclone/rclone/fstest/fstests"
|
"github.com/rclone/rclone/fstest/fstests"
|
||||||
|
@ -250,7 +254,7 @@ func (f *Fs) InternalTestVersions(t *testing.T) {
|
||||||
time.Sleep(2 * time.Second)
|
time.Sleep(2 * time.Second)
|
||||||
|
|
||||||
// Create an object
|
// Create an object
|
||||||
const fileName = "test-versions.txt"
|
const fileName = "versions/test-versions.txt"
|
||||||
contents := random.String(100)
|
contents := random.String(100)
|
||||||
item := fstest.NewItem(fileName, contents, fstest.Time("2001-05-06T04:05:06.499999999Z"))
|
item := fstest.NewItem(fileName, contents, fstest.Time("2001-05-06T04:05:06.499999999Z"))
|
||||||
obj := fstests.PutTestContents(ctx, t, f, &item, contents, true)
|
obj := fstests.PutTestContents(ctx, t, f, &item, contents, true)
|
||||||
|
@ -280,7 +284,7 @@ func (f *Fs) InternalTestVersions(t *testing.T) {
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// Read the contents
|
// Read the contents
|
||||||
entries, err := f.List(ctx, "")
|
entries, err := f.List(ctx, "versions")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
tests := 0
|
tests := 0
|
||||||
var fileNameVersion string
|
var fileNameVersion string
|
||||||
|
@ -295,12 +299,24 @@ func (f *Fs) InternalTestVersions(t *testing.T) {
|
||||||
t.Run("ReadVersion", func(t *testing.T) {
|
t.Run("ReadVersion", func(t *testing.T) {
|
||||||
assert.Equal(t, contents, fstests.ReadObject(ctx, t, entry.(fs.Object), -1))
|
assert.Equal(t, contents, fstests.ReadObject(ctx, t, entry.(fs.Object), -1))
|
||||||
})
|
})
|
||||||
|
t.Run("NewFs", func(t *testing.T) {
|
||||||
|
// Check we can find the object with NewFs
|
||||||
|
fPath := fs.ConfigString(f)
|
||||||
|
fPath = strings.Replace(fPath, ":", ",versions=true:", 1)
|
||||||
|
subFPath := fspath.JoinRootPath(fPath, entry.Remote())
|
||||||
|
subF, err := cache.Get(ctx, subFPath)
|
||||||
|
require.Equal(t, fs.ErrorIsFile, err, "Remote %q didn't find a file", subFPath)
|
||||||
|
require.NotNil(t, subF)
|
||||||
|
o, err := subF.NewObject(ctx, path.Base(entry.Remote()))
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Equal(t, contents, fstests.ReadObject(ctx, t, o, -1))
|
||||||
|
})
|
||||||
assert.WithinDuration(t, obj.(*Object).lastModified, versionTime, time.Second, "object time must be with 1 second of version time")
|
assert.WithinDuration(t, obj.(*Object).lastModified, versionTime, time.Second, "object time must be with 1 second of version time")
|
||||||
fileNameVersion = remote
|
fileNameVersion = remote
|
||||||
tests++
|
tests++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assert.Equal(t, 2, tests, "object missing from listing")
|
assert.Equal(t, 2, tests, "object missing from listing: %v", entries)
|
||||||
|
|
||||||
// Check we can read the object with a version suffix
|
// Check we can read the object with a version suffix
|
||||||
t.Run("NewObject", func(t *testing.T) {
|
t.Run("NewObject", func(t *testing.T) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue