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  }