func()

in internal/gitaly/gitaly.go [301:350]


func (gc *GitalyClient) bulkIndex(ctx context.Context, revisions []string, pathsByBlobID map[string][]string, put PutFunc) error {
	if len(revisions) == 0 {
		return nil
	}
	listBlobsRequest := &pb.ListBlobsRequest{
		Repository: gc.repository,
		Revisions:  revisions,
		BytesLimit: gc.limitFileSize,
	}
	ctx, cancel := context.WithCancel(ctx)
	defer cancel()
	blobsStream, err := gc.blobServiceClient.ListBlobs(ctx, listBlobsRequest)
	if err != nil {
		return fmt.Errorf("ListBlobs: %w", err)
	}

	streamStart := true
	var data []byte
	var oid string
	var size int64

	for {
		listblobsResponse, err := blobsStream.Recv()
		if err == io.EOF { //nolint:errorlint
			if err = gc.buildFilesForOid(pathsByBlobID[oid], oid, data, size, put); err != nil {
				return err
			}
			break
		}
		if err != nil {
			return fmt.Errorf("ListBlobs.Recv: %w", err)
		}

		for _, blob := range listblobsResponse.GetBlobs() {
			if !streamStart && blob.Oid != "" {
				if err = gc.buildFilesForOid(pathsByBlobID[oid], oid, data, size, put); err != nil {
					return err
				}
				data = nil
			}
			streamStart = false
			data = append(data, blob.Data...)
			if blob.Oid != "" {
				oid = blob.Oid
				size = blob.Size
			}
		}
	}
	return nil
}