b: the parsed file schema blob mm: keys to populate
(ctx context.Context, fetcher blob.Fetcher, b *schema.Blob, mm *mutationMap)
| 489 | // b: the parsed file schema blob |
| 490 | // mm: keys to populate |
| 491 | func (ix *Index) populateFile(ctx context.Context, fetcher blob.Fetcher, b *schema.Blob, mm *mutationMap) (err error) { |
| 492 | var times []time.Time // all creation or mod times seen; may be zero |
| 493 | times = append(times, b.ModTime()) |
| 494 | |
| 495 | blobRef := b.BlobRef() |
| 496 | tf := &trackErrorsFetcher{f: fetcher.(*missTrackFetcher)} |
| 497 | fr, err := b.NewFileReader(tf) |
| 498 | if err != nil { |
| 499 | return err |
| 500 | } |
| 501 | defer fr.Close() |
| 502 | mimeType, mr := magic.MIMETypeFromReader(fr) |
| 503 | if mimeType == "" { |
| 504 | mimeType = magic.MIMETypeByExtension(filepath.Ext(b.FileName())) |
| 505 | } |
| 506 | |
| 507 | h := blob.NewHash() |
| 508 | var copyDest io.Writer = h |
| 509 | var imageBuf *keepFirstN // or nil |
| 510 | if strings.HasPrefix(mimeType, "image/") { |
| 511 | imageBuf = &keepFirstN{N: 512 << 10} |
| 512 | copyDest = io.MultiWriter(copyDest, imageBuf) |
| 513 | } |
| 514 | size, err := io.Copy(copyDest, mr) |
| 515 | if err != nil { |
| 516 | if tf.hasErrNotExist() { |
| 517 | return errMissingDep |
| 518 | } |
| 519 | return err |
| 520 | } |
| 521 | wholeRef := blob.RefFromHash(h) |
| 522 | |
| 523 | if imageBuf != nil { |
| 524 | var conf images.Config |
| 525 | decodeConfig := func(r filePrefixReader) error { |
| 526 | conf, err = images.DecodeConfig(r) |
| 527 | return err |
| 528 | } |
| 529 | if err := readPrefixOrFile(imageBuf.Bytes, fetcher, b, decodeConfig); err == nil { |
| 530 | mm.Set(keyImageSize.Key(blobRef), keyImageSize.Val(fmt.Sprint(conf.Width), fmt.Sprint(conf.Height))) |
| 531 | } else if debugEnv { |
| 532 | log.Printf("index: WARNING: image decodeConfig: %v", err) |
| 533 | } |
| 534 | |
| 535 | exifData := imageBuf.Bytes |
| 536 | if conf.HEICEXIF != nil { |
| 537 | exifData = conf.HEICEXIF |
| 538 | } |
| 539 | var ft time.Time |
| 540 | fileTime := func(r filePrefixReader) error { |
| 541 | ft, err = schema.FileTime(r) |
| 542 | return err |
| 543 | } |
| 544 | |
| 545 | if err = readPrefixOrFile(exifData, fetcher, b, fileTime); err == nil { |
| 546 | times = append(times, ft) |
| 547 | } else if debugEnv { |
| 548 | log.Printf("index: WARNING: image fileTime: %v", err) |
no test coverage detected