MCPcopy
hub / github.com/perkeep/perkeep / populateFile

Method populateFile

pkg/index/receive.go:491–598  ·  view source on GitHub ↗

b: the parsed file schema blob mm: keys to populate

(ctx context.Context, fetcher blob.Fetcher, b *schema.Blob, mm *mutationMap)

Source from the content-addressed store, hash-verified

489// b: the parsed file schema blob
490// mm: keys to populate
491func (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)

Callers 1

Calls 15

CloseMethod · 0.95
hasErrNotExistMethod · 0.95
MIMETypeFromReaderFunction · 0.92
MIMETypeByExtensionFunction · 0.92
NewHashFunction · 0.92
RefFromHashFunction · 0.92
DecodeConfigFunction · 0.92
FileTimeFunction · 0.92
readPrefixOrFileFunction · 0.85
indexEXIFFunction · 0.85
indexMusicFunction · 0.85
HasPrefixMethod · 0.80

Tested by

no test coverage detected