code.gitea.io/gitea@v1.19.3/modules/lfs/pointer_scanner_gogit.go (about) 1 // Copyright 2021 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 //go:build gogit 5 6 package lfs 7 8 import ( 9 "context" 10 "fmt" 11 12 "code.gitea.io/gitea/modules/git" 13 14 "github.com/go-git/go-git/v5/plumbing/object" 15 ) 16 17 // SearchPointerBlobs scans the whole repository for LFS pointer files 18 func SearchPointerBlobs(ctx context.Context, repo *git.Repository, pointerChan chan<- PointerBlob, errChan chan<- error) { 19 gitRepo := repo.GoGitRepo() 20 21 err := func() error { 22 blobs, err := gitRepo.BlobObjects() 23 if err != nil { 24 return fmt.Errorf("lfs.SearchPointerBlobs BlobObjects: %w", err) 25 } 26 27 return blobs.ForEach(func(blob *object.Blob) error { 28 select { 29 case <-ctx.Done(): 30 return ctx.Err() 31 default: 32 } 33 34 if blob.Size > blobSizeCutoff { 35 return nil 36 } 37 38 reader, err := blob.Reader() 39 if err != nil { 40 return fmt.Errorf("lfs.SearchPointerBlobs blob.Reader: %w", err) 41 } 42 defer reader.Close() 43 44 pointer, _ := ReadPointer(reader) 45 if pointer.IsValid() { 46 pointerChan <- PointerBlob{Hash: blob.Hash.String(), Pointer: pointer} 47 } 48 49 return nil 50 }) 51 }() 52 if err != nil { 53 select { 54 case <-ctx.Done(): 55 default: 56 errChan <- err 57 } 58 } 59 60 close(pointerChan) 61 close(errChan) 62 }