Class: Gitlab::GitalyClient::DiffStitcher

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/gitlab/gitaly_client/diff_stitcher.rb

Instance Method Summary collapse

Constructor Details

#initialize(rpc_response) ⇒ DiffStitcher

Returns a new instance of DiffStitcher.


8
9
10
# File 'lib/gitlab/gitaly_client/diff_stitcher.rb', line 8

def initialize(rpc_response)
  @rpc_response = rpc_response
end

Instance Method Details

#eachObject


12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/gitlab/gitaly_client/diff_stitcher.rb', line 12

def each
  current_diff = nil

  @rpc_response.each do |diff_msg|
    if current_diff.nil?
      diff_params = diff_msg.to_h.slice(*GitalyClient::Diff::ATTRS)
      # gRPC uses frozen strings by default, and we need to have an unfrozen string as it
      # gets processed further down the line. So we unfreeze the first chunk of the patch
      # in case it's the only chunk we receive for this diff.
      diff_params[:patch] = diff_msg.raw_patch_data.dup

      current_diff = GitalyClient::Diff.new(diff_params)
    else
      current_diff.patch = "#{current_diff.patch}#{diff_msg.raw_patch_data}"
    end

    if diff_msg.end_of_patch
      yield current_diff
      current_diff = nil
    end
  end
end