// 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 func (f *Fs) listAll(dirID string, directoriesOnly bool, filesOnly bool, fn listAllFn) (found bool, err error) { // Top parameter asks for bigger pages of data // https://dev.onedrive.com/odata/optional-query-parameters.htm opts := rest.Opts{ Method: "GET", Path: "/drive/items/" + dirID + "/children?top=1000", } OUTER: for { var result api.ListChildrenResponse var resp *http.Response err = f.pacer.Call(func() (bool, error) { resp, err = f.srv.CallJSON(&opts, nil, &result) return shouldRetry(resp, err) }) if err != nil { fs.Stats.Error() fs.ErrorLog(f, "Couldn't list files: %v", err) break } if len(result.Value) == 0 { break } for i := range result.Value { item := &result.Value[i] isFolder := item.Folder != nil if isFolder { if filesOnly { continue } } else { if directoriesOnly { continue } } if item.Deleted != nil { continue } item.Name = restoreReservedChars(item.Name) if fn(item) { found = true break OUTER } } if result.NextLink == "" { break } opts.Path = result.NextLink opts.Absolute = true } return }