# File lib/grit/git-ruby/internal/pack.rb, line 118 def [](sha1) if obj = @cache[sha1] return obj end offset = find_object(sha1) return nil if !offset @cache[sha1] = obj = parse_object(offset) return obj end
# File lib/grit/git-ruby/internal/pack.rb, line 91 def cache_objects @cache = {} with_packfile do |packfile| each_entry do |sha, offset| data, type = unpack_object(packfile, offset, {:caching => true}) if data @cache[sha] = RawObject.new(OBJ_TYPES[type], data) end end end end
# File lib/grit/git-ruby/internal/pack.rb, line 107 def close # shouldnt be anything open now end
# File lib/grit/git-ruby/internal/pack.rb, line 143 def each_entry with_idx do |idx| if @version == 2 data = read_data_v2(idx) data.each do |sha1, crc, offset| yield sha1, offset end else pos = OffsetStart @size.times do offset = idx[pos,OffsetSize].unpack('N')[0] sha1 = idx[pos+OffsetSize,SHA1Size] pos += EntrySize yield sha1, offset end end end end
# File lib/grit/git-ruby/internal/pack.rb, line 183 def each_sha1 with_idx do |idx| if @version == 2 data = read_data_v2(idx) data.each do |sha1, crc, offset| yield sha1 end else pos = SHA1Start @size.times do sha1 = idx[pos,SHA1Size] pos += EntrySize yield sha1 end end end end
# File lib/grit/git-ruby/internal/pack.rb, line 201 def find_object_in_index(idx, sha1) slot = sha1.getord(0) return nil if !slot first, last = @offsets[slot,2] while first < last mid = (first + last) / 2 if @version == 2 midsha1 = idx[OffsetStart + (mid * SHA1Size), SHA1Size] cmp = midsha1 <=> sha1 if cmp < 0 first = mid + 1 elsif cmp > 0 last = mid else pos = OffsetStart + (@size * (SHA1Size + CrcSize)) + (mid * OffsetSize) offset = idx[pos, OffsetSize].unpack('N')[0] if offset & 0x80000000 > 0 offset &= 0x7fffffff pos = OffsetStart + (@size * (SHA1Size + CrcSize + OffsetSize)) + (offset * ExtendedOffsetSize) words = idx[pos, ExtendedOffsetSize].unpack('NN') offset = (words[0] << 32) | words[1] end return offset end else midsha1 = idx[SHA1Start + mid * EntrySize,SHA1Size] cmp = midsha1 <=> sha1 if cmp < 0 first = mid + 1 elsif cmp > 0 last = mid else pos = OffsetStart + mid * EntrySize offset = idx[pos,OffsetSize].unpack('N')[0] return offset end end end nil end
given an index file, list out the shas that it’s packfile contains
# File lib/grit/git-ruby/internal/pack.rb, line 112 def get_shas shas = [] each_sha1 { |sha| shas << sha.unpack("H*")[0] } shas end
# File lib/grit/git-ruby/internal/pack.rb, line 129 def init_pack with_idx do |idx| @offsets = [0] FanOutCount.times do |i| pos = idx[i * IdxOffsetSize,IdxOffsetSize].unpack('N')[0] if pos < @offsets[i] raise PackFormatError, "pack #@name has discontinuous index #{i}" end @offsets << pos end @size = @offsets[-1] end end
# File lib/grit/git-ruby/internal/pack.rb, line 103 def name @name end
# File lib/grit/git-ruby/internal/pack.rb, line 49 def with_idx(index_file = nil) index_file ||= @name[0...-4] + 'idx' begin idxfile = File.open(index_file, 'rb') rescue Errno::ENOENT => boom # file went away. bail out without yielding. return end # read header sig = idxfile.read(4) ver = idxfile.read(4).unpack("N")[0] if sig == PACK_IDX_SIGNATURE if(ver != 2) raise PackFormatError, "pack #@name has unknown pack file version #{ver}" end @version = 2 else @version = 1 end idx = FileWindow.new(idxfile, @version) yield idx idx.unmap ensure idxfile.close if idxfile end
# File lib/grit/git-ruby/internal/pack.rb, line 79 def with_packfile begin packfile = File.open(@name, 'rb') rescue Errno::ENOENT # file went away. bail out without yielding. return end yield packfile ensure packfile.close if packfile end
# File lib/grit/git-ruby/internal/pack.rb, line 253 def parse_object(offset) obj = nil with_packfile do |packfile| data, type = unpack_object(packfile, offset) obj = RawObject.new(OBJ_TYPES[type], data) end obj end
# File lib/grit/git-ruby/internal/pack.rb, line 40 def initialize(file) if file =~ /\.idx$/ file = file[0...-3] + 'pack' end @name = file @cache = {} init_pack end