(ctx context.Context, staticSetBlobref blob.Ref, fetcher blob.Fetcher)
| 101 | } |
| 102 | |
| 103 | func staticSet(ctx context.Context, staticSetBlobref blob.Ref, fetcher blob.Fetcher) ([]blob.Ref, error) { |
| 104 | rsc, _, err := fetcher.Fetch(ctx, staticSetBlobref) |
| 105 | if err != nil { |
| 106 | return nil, fmt.Errorf("schema/dirreader: fetching schema blob %s: %v", staticSetBlobref, err) |
| 107 | } |
| 108 | defer rsc.Close() |
| 109 | ss, err := parseSuperset(rsc) |
| 110 | if err != nil { |
| 111 | return nil, fmt.Errorf("schema/dirreader: decoding schema blob %s: %v", staticSetBlobref, err) |
| 112 | } |
| 113 | if ss.Type != "static-set" { |
| 114 | return nil, fmt.Errorf("schema/dirreader: expected \"static-set\" schema blob for %s, got %q", staticSetBlobref, ss.Type) |
| 115 | } |
| 116 | var members []blob.Ref |
| 117 | if len(ss.Members) > 0 { |
| 118 | // We have fileRefs or dirRefs in ss.Members, so we are either in the static-set |
| 119 | // of a small directory, or one of the "leaf" subsets of a large directory spread. |
| 120 | for _, member := range ss.Members { |
| 121 | if !member.Valid() { |
| 122 | return nil, fmt.Errorf("schema/dirreader: invalid (static-set member) blobref referred by \"static-set\" schema blob %v", staticSetBlobref) |
| 123 | } |
| 124 | members = append(members, member) |
| 125 | } |
| 126 | return members, nil |
| 127 | } |
| 128 | // We are either at the top static-set of a large directory, or in a "non-leaf" |
| 129 | // subset of a large directory. |
| 130 | for _, toMerge := range ss.MergeSets { |
| 131 | if !toMerge.Valid() { |
| 132 | return nil, fmt.Errorf("schema/dirreader: invalid (static-set subset) blobref referred by \"static-set\" schema blob %v", staticSetBlobref) |
| 133 | } |
| 134 | // TODO(mpl): do it concurrently |
| 135 | subset, err := staticSet(ctx, toMerge, fetcher) |
| 136 | if err != nil { |
| 137 | return nil, fmt.Errorf("schema/dirreader: could not get members of %q, subset of %v: %v", toMerge, staticSetBlobref, err) |
| 138 | } |
| 139 | members = append(members, subset...) |
| 140 | } |
| 141 | return members, nil |
| 142 | } |
| 143 | |
| 144 | // Readdir implements the Directory interface. |
| 145 | func (dr *DirReader) Readdir(ctx context.Context, n int) (entries []DirectoryEntry, err error) { |
no test coverage detected