func()

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
}