mirror of
https://github.com/rclone/rclone.git
synced 2025-01-13 20:38:12 +02:00
delete,rmdirs: make --rmdirs obey the filters
See: https://forum.rclone.org/t/a-problem-with-rclone-delete-from-list/22143
This commit is contained in:
parent
7db68b72f1
commit
4b5fe3adad
@ -26,6 +26,7 @@ import (
|
|||||||
"github.com/rclone/rclone/fs/accounting"
|
"github.com/rclone/rclone/fs/accounting"
|
||||||
"github.com/rclone/rclone/fs/cache"
|
"github.com/rclone/rclone/fs/cache"
|
||||||
"github.com/rclone/rclone/fs/config"
|
"github.com/rclone/rclone/fs/config"
|
||||||
|
"github.com/rclone/rclone/fs/filter"
|
||||||
"github.com/rclone/rclone/fs/fserrors"
|
"github.com/rclone/rclone/fs/fserrors"
|
||||||
"github.com/rclone/rclone/fs/fshttp"
|
"github.com/rclone/rclone/fs/fshttp"
|
||||||
"github.com/rclone/rclone/fs/hash"
|
"github.com/rclone/rclone/fs/hash"
|
||||||
@ -1302,11 +1303,14 @@ func PublicLink(ctx context.Context, f fs.Fs, remote string, expire fs.Duration,
|
|||||||
|
|
||||||
// Rmdirs removes any empty directories (or directories only
|
// Rmdirs removes any empty directories (or directories only
|
||||||
// containing empty directories) under f, including f.
|
// containing empty directories) under f, including f.
|
||||||
|
//
|
||||||
|
// Rmdirs obeys the filters
|
||||||
func Rmdirs(ctx context.Context, f fs.Fs, dir string, leaveRoot bool) error {
|
func Rmdirs(ctx context.Context, f fs.Fs, dir string, leaveRoot bool) error {
|
||||||
ci := fs.GetConfig(ctx)
|
ci := fs.GetConfig(ctx)
|
||||||
|
fi := filter.GetConfig(ctx)
|
||||||
dirEmpty := make(map[string]bool)
|
dirEmpty := make(map[string]bool)
|
||||||
dirEmpty[dir] = !leaveRoot
|
dirEmpty[dir] = !leaveRoot
|
||||||
err := walk.Walk(ctx, f, dir, true, ci.MaxDepth, func(dirPath string, entries fs.DirEntries, err error) error {
|
err := walk.Walk(ctx, f, dir, false, ci.MaxDepth, func(dirPath string, entries fs.DirEntries, err error) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = fs.CountError(err)
|
err = fs.CountError(err)
|
||||||
fs.Errorf(f, "Failed to list %q: %v", dirPath, err)
|
fs.Errorf(f, "Failed to list %q: %v", dirPath, err)
|
||||||
@ -1353,7 +1357,12 @@ func Rmdirs(ctx context.Context, f fs.Fs, dir string, leaveRoot bool) error {
|
|||||||
sort.Strings(toDelete)
|
sort.Strings(toDelete)
|
||||||
for i := len(toDelete) - 1; i >= 0; i-- {
|
for i := len(toDelete) - 1; i >= 0; i-- {
|
||||||
dir := toDelete[i]
|
dir := toDelete[i]
|
||||||
err := TryRmdir(ctx, f, dir)
|
// If a filter matches the directory then that
|
||||||
|
// directory is a candidate for deletion
|
||||||
|
if !fi.Include(dir+"/", 0, time.Now()) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
err = TryRmdir(ctx, f, dir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = fs.CountError(err)
|
err = fs.CountError(err)
|
||||||
fs.Errorf(dir, "Failed to rmdir: %v", err)
|
fs.Errorf(dir, "Failed to rmdir: %v", err)
|
||||||
|
@ -651,6 +651,46 @@ func TestRmdirsLeaveRoot(t *testing.T) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRmdirsWithFilter(t *testing.T) {
|
||||||
|
ctx := context.Background()
|
||||||
|
ctx, fi := filter.AddConfig(ctx)
|
||||||
|
require.NoError(t, fi.AddRule("+ /A1/B1/**"))
|
||||||
|
require.NoError(t, fi.AddRule("- *"))
|
||||||
|
r := fstest.NewRun(t)
|
||||||
|
defer r.Finalise()
|
||||||
|
r.Mkdir(ctx, r.Fremote)
|
||||||
|
|
||||||
|
r.ForceMkdir(ctx, r.Fremote)
|
||||||
|
|
||||||
|
require.NoError(t, operations.Mkdir(ctx, r.Fremote, "A1"))
|
||||||
|
require.NoError(t, operations.Mkdir(ctx, r.Fremote, "A1/B1"))
|
||||||
|
require.NoError(t, operations.Mkdir(ctx, r.Fremote, "A1/B1/C1"))
|
||||||
|
|
||||||
|
fstest.CheckListingWithPrecision(
|
||||||
|
t,
|
||||||
|
r.Fremote,
|
||||||
|
[]fstest.Item{},
|
||||||
|
[]string{
|
||||||
|
"A1",
|
||||||
|
"A1/B1",
|
||||||
|
"A1/B1/C1",
|
||||||
|
},
|
||||||
|
fs.GetModifyWindow(ctx, r.Fremote),
|
||||||
|
)
|
||||||
|
|
||||||
|
require.NoError(t, operations.Rmdirs(ctx, r.Fremote, "", false))
|
||||||
|
|
||||||
|
fstest.CheckListingWithPrecision(
|
||||||
|
t,
|
||||||
|
r.Fremote,
|
||||||
|
[]fstest.Item{},
|
||||||
|
[]string{
|
||||||
|
"A1",
|
||||||
|
},
|
||||||
|
fs.GetModifyWindow(ctx, r.Fremote),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
func TestCopyURL(t *testing.T) {
|
func TestCopyURL(t *testing.T) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
ci := fs.GetConfig(ctx)
|
ci := fs.GetConfig(ctx)
|
||||||
|
Loading…
Reference in New Issue
Block a user