drive: don't list trashed files when removing a directory into the trash - fixes #9681
purgeCheck listed a directory's children with includeAll set, so the Drive API returned trashed children as well as live ones. The only thing that came of that was the trashedFiles flag, which is used solely to decide whether to trash the directory or delete it permanently, and when use_trash is on the directory gets trashed either way. That made the common case pay for nothing: after trashing N files in a directory, removing the now empty directory paged through all N trashed entries, about one API call and pacer delay per 1000, instead of running a single query that returns nothing. Ask the server to filter out trashed children when the directory is going to be trashed anyway. Hard deletes still enumerate them, since there the distinction decides whether the directory can be removed permanently (#1040), and --drive-trashed-only is left alone because it deliberately lists trashed items.
This commit is contained in:
committed by
Nick Craig-Wood
parent
3f9d583cff
commit
065af89635
@@ -2766,7 +2766,12 @@ func (f *Fs) purgeCheck(ctx context.Context, dir string, check bool) error {
|
||||
}
|
||||
trashedFiles := false
|
||||
if check {
|
||||
found, err := f.list(ctx, []string{directoryID}, "", false, false, f.opt.TrashedOnly, true, func(item *drive.File) bool {
|
||||
// trashedFiles is only consulted to decide between trashing and hard deleting
|
||||
// below, so when the directory is going to be trashed anyway there is no reason
|
||||
// to enumerate trashed children: let the server filter them out instead of
|
||||
// paging through them. Hard deletes still need to see them (#1040).
|
||||
includeAll := !f.opt.UseTrash || f.opt.TrashedOnly
|
||||
found, err := f.list(ctx, []string{directoryID}, "", false, false, f.opt.TrashedOnly, includeAll, func(item *drive.File) bool {
|
||||
if !item.Trashed {
|
||||
fs.Debugf(dir, "Rmdir: contains file: %q", item.Name)
|
||||
return true
|
||||
|
||||
Reference in New Issue
Block a user