mirror of
https://github.com/rclone/rclone.git
synced 2025-08-13 15:37:26 +02:00
sync: overlap check is now filter-sensitive
Previously, the overlap check was based on simple prefix checks of the source and destination paths. Now it actually checks whether the destination is excluded via any filter rule or a "--exclude-if-present"-file.
This commit is contained in:
@ -1442,6 +1442,61 @@ func TestSyncOverlap(t *testing.T) {
|
||||
checkErr(Sync(ctx, FremoteSync, FremoteSync, false))
|
||||
}
|
||||
|
||||
// Test a sync with filtered overlap
|
||||
func TestSyncOverlapWithFilter(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
r := fstest.NewRun(t)
|
||||
defer r.Finalise()
|
||||
|
||||
fi, err := filter.NewFilter(nil)
|
||||
require.NoError(t, err)
|
||||
require.NoError(t, fi.Add(false, "/rclone-sync-test/"))
|
||||
require.NoError(t, fi.Add(false, "*/layer2/"))
|
||||
fi.Opt.ExcludeFile = ".ignore"
|
||||
ctx = filter.ReplaceConfig(ctx, fi)
|
||||
|
||||
subRemoteName := r.FremoteName + "/rclone-sync-test"
|
||||
FremoteSync, err := fs.NewFs(ctx, subRemoteName)
|
||||
require.NoError(t, FremoteSync.Mkdir(ctx, ""))
|
||||
require.NoError(t, err)
|
||||
|
||||
subRemoteName2 := r.FremoteName + "/rclone-sync-test-include/layer2"
|
||||
FremoteSync2, err := fs.NewFs(ctx, subRemoteName2)
|
||||
require.NoError(t, FremoteSync2.Mkdir(ctx, ""))
|
||||
require.NoError(t, err)
|
||||
|
||||
subRemoteName3 := r.FremoteName + "/rclone-sync-test-ignore-file"
|
||||
FremoteSync3, err := fs.NewFs(ctx, subRemoteName3)
|
||||
require.NoError(t, FremoteSync3.Mkdir(ctx, ""))
|
||||
require.NoError(t, err)
|
||||
r.WriteObject(context.Background(), "/rclone-sync-test-ignore-file/.ignore", "-", t1)
|
||||
|
||||
checkErr := func(err error) {
|
||||
require.Error(t, err)
|
||||
assert.True(t, fserrors.IsFatalError(err))
|
||||
assert.Equal(t, fs.ErrorOverlapping.Error(), err.Error())
|
||||
}
|
||||
|
||||
checkNoErr := func(err error) {
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
checkNoErr(Sync(ctx, FremoteSync, r.Fremote, false))
|
||||
checkErr(Sync(ctx, r.Fremote, FremoteSync, false))
|
||||
checkErr(Sync(ctx, r.Fremote, r.Fremote, false))
|
||||
checkErr(Sync(ctx, FremoteSync, FremoteSync, false))
|
||||
|
||||
checkNoErr(Sync(ctx, FremoteSync2, r.Fremote, false))
|
||||
checkErr(Sync(ctx, r.Fremote, FremoteSync2, false))
|
||||
checkErr(Sync(ctx, r.Fremote, r.Fremote, false))
|
||||
checkErr(Sync(ctx, FremoteSync2, FremoteSync2, false))
|
||||
|
||||
checkNoErr(Sync(ctx, FremoteSync3, r.Fremote, false))
|
||||
checkErr(Sync(ctx, r.Fremote, FremoteSync3, false))
|
||||
checkErr(Sync(ctx, r.Fremote, r.Fremote, false))
|
||||
checkErr(Sync(ctx, FremoteSync3, FremoteSync3, false))
|
||||
}
|
||||
|
||||
// Test with CompareDest set
|
||||
func TestSyncCompareDest(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
|
Reference in New Issue
Block a user