patch_delta

in lib/grit/git-ruby/internal/pack.rb [344:377]


        def patch_delta(base, delta)
          src_size, pos = patch_delta_header_size(delta, 0)
          if src_size != base.size
            raise PackFormatError, 'invalid delta data'
          end

          dest_size, pos = patch_delta_header_size(delta, pos)
          dest = ""
          while pos < delta.size
            c = delta.getord(pos)
            pos += 1
            if c & 0x80 != 0
              pos -= 1
              cp_off = cp_size = 0
              cp_off = delta.getord(pos += 1) if c & 0x01 != 0
              cp_off |= delta.getord(pos += 1) << 8 if c & 0x02 != 0
              cp_off |= delta.getord(pos += 1) << 16 if c & 0x04 != 0
              cp_off |= delta.getord(pos += 1) << 24 if c & 0x08 != 0
              cp_size = delta.getord(pos += 1) if c & 0x10 != 0
              cp_size |= delta.getord(pos += 1) << 8 if c & 0x20 != 0
              cp_size |= delta.getord(pos += 1) << 16 if c & 0x40 != 0
              cp_size = 0x10000 if cp_size == 0
              pos += 1
              dest << base[cp_off,cp_size]
            elsif c != 0
              dest << delta[pos,c]
              pos += c
            else
              raise PackFormatError, 'invalid delta data'
            end
          end
          dest
        end