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
}