mirror of
https://github.com/rclone/rclone.git
synced 2025-01-10 00:08:44 +01:00
box: factor directory listing and cleanup listing into one function #5545
This commit is contained in:
parent
b61912b4c8
commit
e18ae5da09
@ -345,7 +345,7 @@ func (f *Fs) readMetaDataForPath(ctx context.Context, path string) (info *api.It
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
found, err := f.listAll(ctx, directoryID, false, true, func(item *api.Item) bool {
|
found, err := f.listAll(ctx, directoryID, false, true, true, func(item *api.Item) bool {
|
||||||
if strings.EqualFold(item.Name, leaf) {
|
if strings.EqualFold(item.Name, leaf) {
|
||||||
info = item
|
info = item
|
||||||
return true
|
return true
|
||||||
@ -520,7 +520,7 @@ func (f *Fs) NewObject(ctx context.Context, remote string) (fs.Object, error) {
|
|||||||
// FindLeaf finds a directory of name leaf in the folder with ID pathID
|
// FindLeaf finds a directory of name leaf in the folder with ID pathID
|
||||||
func (f *Fs) FindLeaf(ctx context.Context, pathID, leaf string) (pathIDOut string, found bool, err error) {
|
func (f *Fs) FindLeaf(ctx context.Context, pathID, leaf string) (pathIDOut string, found bool, err error) {
|
||||||
// Find the leaf in pathID
|
// Find the leaf in pathID
|
||||||
found, err = f.listAll(ctx, pathID, true, false, func(item *api.Item) bool {
|
found, err = f.listAll(ctx, pathID, true, false, true, func(item *api.Item) bool {
|
||||||
if strings.EqualFold(item.Name, leaf) {
|
if strings.EqualFold(item.Name, leaf) {
|
||||||
pathIDOut = item.ID
|
pathIDOut = item.ID
|
||||||
return true
|
return true
|
||||||
@ -576,7 +576,7 @@ type listAllFn func(*api.Item) bool
|
|||||||
// Lists the directory required calling the user function on each item found
|
// Lists the directory required calling the user function on each item found
|
||||||
//
|
//
|
||||||
// If the user fn ever returns true then it early exits with found = true
|
// If the user fn ever returns true then it early exits with found = true
|
||||||
func (f *Fs) listAll(ctx context.Context, dirID string, directoriesOnly bool, filesOnly bool, fn listAllFn) (found bool, err error) {
|
func (f *Fs) listAll(ctx context.Context, dirID string, directoriesOnly bool, filesOnly bool, activeOnly bool, fn listAllFn) (found bool, err error) {
|
||||||
opts := rest.Opts{
|
opts := rest.Opts{
|
||||||
Method: "GET",
|
Method: "GET",
|
||||||
Path: "/folders/" + dirID + "/items",
|
Path: "/folders/" + dirID + "/items",
|
||||||
@ -614,7 +614,7 @@ OUTER:
|
|||||||
fs.Debugf(f, "Ignoring %q - unknown type %q", item.Name, item.Type)
|
fs.Debugf(f, "Ignoring %q - unknown type %q", item.Name, item.Type)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if item.ItemStatus != api.ItemStatusActive {
|
if activeOnly && item.ItemStatus != api.ItemStatusActive {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
item.Name = f.opt.Enc.ToStandardName(item.Name)
|
item.Name = f.opt.Enc.ToStandardName(item.Name)
|
||||||
@ -646,7 +646,7 @@ func (f *Fs) List(ctx context.Context, dir string) (entries fs.DirEntries, err e
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
var iErr error
|
var iErr error
|
||||||
_, err = f.listAll(ctx, directoryID, false, false, func(info *api.Item) bool {
|
_, err = f.listAll(ctx, directoryID, false, false, true, func(info *api.Item) bool {
|
||||||
remote := path.Join(dir, info.Name)
|
remote := path.Join(dir, info.Name)
|
||||||
if info.Type == api.ItemTypeFolder {
|
if info.Type == api.ItemTypeFolder {
|
||||||
// cache the directory ID for later lookups
|
// cache the directory ID for later lookups
|
||||||
@ -1101,32 +1101,7 @@ func (f *Fs) deletePermanently(ctx context.Context, itemType, id string) error {
|
|||||||
// CleanUp empties the trash
|
// CleanUp empties the trash
|
||||||
func (f *Fs) CleanUp(ctx context.Context) (err error) {
|
func (f *Fs) CleanUp(ctx context.Context) (err error) {
|
||||||
var deleteErrors = 0
|
var deleteErrors = 0
|
||||||
opts := rest.Opts{
|
_, err = f.listAll(ctx, "trash", false, false, false, func(item *api.Item) bool {
|
||||||
Method: "GET",
|
|
||||||
Path: "/folders/trash/items",
|
|
||||||
Parameters: url.Values{
|
|
||||||
"fields": []string{"type", "id"},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
opts.Parameters.Set("limit", strconv.Itoa(f.opt.ListChunk))
|
|
||||||
opts.Parameters.Set("usemarker", "true")
|
|
||||||
var marker *string
|
|
||||||
for {
|
|
||||||
if marker != nil {
|
|
||||||
opts.Parameters.Set("marker", *marker)
|
|
||||||
}
|
|
||||||
|
|
||||||
var result api.FolderItems
|
|
||||||
var resp *http.Response
|
|
||||||
err = f.pacer.Call(func() (bool, error) {
|
|
||||||
resp, err = f.srv.CallJSON(ctx, &opts, nil, &result)
|
|
||||||
return shouldRetry(ctx, resp, err)
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return errors.Wrap(err, "couldn't list trash")
|
|
||||||
}
|
|
||||||
for i := range result.Entries {
|
|
||||||
item := &result.Entries[i]
|
|
||||||
if item.Type == api.ItemTypeFolder || item.Type == api.ItemTypeFile {
|
if item.Type == api.ItemTypeFolder || item.Type == api.ItemTypeFile {
|
||||||
err := f.deletePermanently(ctx, item.Type, item.ID)
|
err := f.deletePermanently(ctx, item.Type, item.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -1135,18 +1110,13 @@ func (f *Fs) CleanUp(ctx context.Context) (err error) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
fs.Debugf(f, "Ignoring %q - unknown type %q", item.Name, item.Type)
|
fs.Debugf(f, "Ignoring %q - unknown type %q", item.Name, item.Type)
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
marker = result.NextMarker
|
|
||||||
if marker == nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
return false
|
||||||
|
})
|
||||||
if deleteErrors != 0 {
|
if deleteErrors != 0 {
|
||||||
return errors.Errorf("failed to delete %d trash items", deleteErrors)
|
return errors.Errorf("failed to delete %d trash items", deleteErrors)
|
||||||
}
|
}
|
||||||
return nil
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// DirCacheFlush resets the directory cache - used in testing as an
|
// DirCacheFlush resets the directory cache - used in testing as an
|
||||||
|
Loading…
Reference in New Issue
Block a user