(ctx context.Context, fn content.WalkFunc, fs ...string)
| 149 | } |
| 150 | |
| 151 | func (cs *contentStore) Walk(ctx context.Context, fn content.WalkFunc, fs ...string) error { |
| 152 | ns, err := namespaces.NamespaceRequired(ctx) |
| 153 | if err != nil { |
| 154 | return err |
| 155 | } |
| 156 | |
| 157 | filter, err := filters.ParseAll(fs...) |
| 158 | if err != nil { |
| 159 | return err |
| 160 | } |
| 161 | |
| 162 | // TODO: Batch results to keep from reading all info into memory |
| 163 | var infos []content.Info |
| 164 | if err := view(ctx, cs.db, func(tx *bolt.Tx) error { |
| 165 | bkt := getBlobsBucket(tx, ns) |
| 166 | if bkt == nil { |
| 167 | return nil |
| 168 | } |
| 169 | |
| 170 | return bkt.ForEach(func(k, v []byte) error { |
| 171 | dgst, err := digest.Parse(string(k)) |
| 172 | if err != nil { |
| 173 | // Not a digest, skip |
| 174 | return nil |
| 175 | } |
| 176 | bbkt := bkt.Bucket(k) |
| 177 | if bbkt == nil { |
| 178 | return nil |
| 179 | } |
| 180 | info := content.Info{ |
| 181 | Digest: dgst, |
| 182 | } |
| 183 | if err := readInfo(&info, bkt.Bucket(k)); err != nil { |
| 184 | return err |
| 185 | } |
| 186 | if filter.Match(content.AdaptInfo(info)) { |
| 187 | infos = append(infos, info) |
| 188 | } |
| 189 | return nil |
| 190 | }) |
| 191 | }); err != nil { |
| 192 | return err |
| 193 | } |
| 194 | |
| 195 | for _, info := range infos { |
| 196 | if err := fn(info); err != nil { |
| 197 | return err |
| 198 | } |
| 199 | } |
| 200 | |
| 201 | return nil |
| 202 | } |
| 203 | |
| 204 | func (cs *contentStore) Delete(ctx context.Context, dgst digest.Digest) error { |
| 205 | ns, err := namespaces.NamespaceRequired(ctx) |
nothing calls this directly
no test coverage detected