You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

pointer_scanner_gogit.go 1.2KB

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