in internal/mode/advanced/git/gitaly.go [166:227]
func (gc *gitalyClient) EachFileChange(put PutFunc, del DelFunc) error {
request := &pb.GetRawChangesRequest{
Repository: gc.repository,
FromRevision: gc.FromHash,
ToRevision: gc.ToHash,
}
stream, err := gc.repositoryServiceClient.GetRawChanges(gc.ctx, request)
if err != nil {
return fmt.Errorf("could not call rpc.GetRawChanges: %w", err)
}
for {
c, err := stream.Recv()
if errors.Is(err, io.EOF) {
break
}
if err != nil {
return fmt.Errorf("%v.GetRawChanges, %w", c, err)
}
for _, change := range c.RawChanges {
// TODO: We just skip submodules from indexing now just to mirror the go-git
// implementation but it can be not that expensive to implement with gitaly actually so some
// investigation is required here
if change.OldMode == SubmoduleFileMode || change.NewMode == SubmoduleFileMode {
continue
}
switch change.Operation.String() {
case "DELETED", "RENAMED":
path := string(change.OldPathBytes)
logkit.WithFields(
logkit.Fields{
"operation": "DELETE",
"path": path,
},
).Debug("Indexing blob change")
if err = del(path); err != nil {
return err
}
}
switch change.Operation.String() {
case "ADDED", "RENAMED", "MODIFIED", "COPIED":
file, err := gc.gitalyBuildFile(change, string(change.NewPathBytes))
if err != nil {
return err
}
logkit.WithFields(
logkit.Fields{
"operation": "PUT",
"path": file.Path,
},
).Debug("Indexing blob change")
if err = put(file, gc.FromHash, gc.ToHash); err != nil {
return err
}
}
}
}
return nil
}