NeedFolderFiles returns paginated list of currently needed files in progress, queued, and to be queued on next puller iteration.
(folder string, page, perpage int)
| 995 | // NeedFolderFiles returns paginated list of currently needed files in |
| 996 | // progress, queued, and to be queued on next puller iteration. |
| 997 | func (m *model) NeedFolderFiles(folder string, page, perpage int) ([]protocol.FileInfo, []protocol.FileInfo, []protocol.FileInfo, error) { |
| 998 | m.mut.RLock() |
| 999 | runner, runnerOk := m.folderRunners.Get(folder) |
| 1000 | cfg, cfgOK := m.folderCfgs[folder] |
| 1001 | m.mut.RUnlock() |
| 1002 | |
| 1003 | if !cfgOK { |
| 1004 | return nil, nil, nil, ErrFolderMissing |
| 1005 | } |
| 1006 | |
| 1007 | var progress, queued, rest []protocol.FileInfo |
| 1008 | var seen map[string]struct{} |
| 1009 | |
| 1010 | p := newPager(page, perpage) |
| 1011 | |
| 1012 | if runnerOk { |
| 1013 | progressNames, queuedNames, skipped := runner.Jobs(page, perpage) |
| 1014 | |
| 1015 | progress = make([]protocol.FileInfo, len(progressNames)) |
| 1016 | queued = make([]protocol.FileInfo, len(queuedNames)) |
| 1017 | seen = make(map[string]struct{}, len(progressNames)+len(queuedNames)) |
| 1018 | |
| 1019 | for i, name := range progressNames { |
| 1020 | if f, ok, err := m.sdb.GetGlobalFile(folder, name); err == nil && ok { |
| 1021 | progress[i] = f |
| 1022 | seen[name] = struct{}{} |
| 1023 | } |
| 1024 | } |
| 1025 | |
| 1026 | for i, name := range queuedNames { |
| 1027 | if f, ok, err := m.sdb.GetGlobalFile(folder, name); err == nil && ok { |
| 1028 | queued[i] = f |
| 1029 | seen[name] = struct{}{} |
| 1030 | } |
| 1031 | } |
| 1032 | |
| 1033 | p.get -= len(seen) |
| 1034 | if p.get == 0 { |
| 1035 | return progress, queued, nil, nil |
| 1036 | } |
| 1037 | p.toSkip -= skipped |
| 1038 | } |
| 1039 | |
| 1040 | if p.get > 0 { |
| 1041 | rest = make([]protocol.FileInfo, 0, p.get) |
| 1042 | it, errFn := m.sdb.AllNeededGlobalFiles(folder, protocol.LocalDeviceID, config.PullOrderAlphabetic, 0, 0) |
| 1043 | for f := range it { |
| 1044 | if cfg.IgnoreDelete && f.IsDeleted() { |
| 1045 | continue |
| 1046 | } |
| 1047 | |
| 1048 | if p.skip() { |
| 1049 | continue |
| 1050 | } |
| 1051 | if _, ok := seen[f.Name]; !ok { |
| 1052 | rest = append(rest, f) |
| 1053 | p.get-- |
| 1054 | } |
nothing calls this directly
no test coverage detected