bytesHaveSchemaLink reports whether bb is a valid Perkeep schema blob and has target somewhere in a schema field used to represent a Merkle-tree-ish file or directory.
(br blob.Ref, bb []byte, target blob.Ref)
| 313 | // blob and has target somewhere in a schema field used to represent a |
| 314 | // Merkle-tree-ish file or directory. |
| 315 | func bytesHaveSchemaLink(br blob.Ref, bb []byte, target blob.Ref) bool { |
| 316 | // Fast path for no: |
| 317 | if !bytes.Contains(bb, []byte(target.String())) { |
| 318 | return false |
| 319 | } |
| 320 | b, err := schema.BlobFromReader(br, bytes.NewReader(bb)) |
| 321 | if err != nil { |
| 322 | return false |
| 323 | } |
| 324 | typ := b.Type() |
| 325 | switch typ { |
| 326 | case schema.TypeFile, schema.TypeBytes: |
| 327 | for _, bp := range b.ByteParts() { |
| 328 | if bp.BlobRef.Valid() { |
| 329 | if bp.BlobRef == target { |
| 330 | return true |
| 331 | } |
| 332 | } |
| 333 | if bp.BytesRef.Valid() { |
| 334 | if bp.BytesRef == target { |
| 335 | return true |
| 336 | } |
| 337 | } |
| 338 | } |
| 339 | case schema.TypeDirectory: |
| 340 | if d, ok := b.DirectoryEntries(); ok { |
| 341 | return d == target |
| 342 | } |
| 343 | case schema.TypeStaticSet: |
| 344 | for _, m := range b.StaticSetMembers() { |
| 345 | if m == target { |
| 346 | return true |
| 347 | } |
| 348 | } |
| 349 | } |
| 350 | return false |
| 351 | } |
no test coverage detected