git-object-browser 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (146) hide show
  1. data/.gitignore +17 -0
  2. data/.rspec +2 -0
  3. data/Gemfile +13 -0
  4. data/Guardfile +11 -0
  5. data/LICENSE +22 -0
  6. data/README.md +18 -0
  7. data/Rakefile +2 -0
  8. data/bin/git-object-browser +5 -0
  9. data/git-object-browser.gemspec +18 -0
  10. data/htdocs/css/angular-ui.min.css +1 -0
  11. data/htdocs/css/bootstrap-responsive.css +1058 -0
  12. data/htdocs/css/bootstrap-responsive.min.css +9 -0
  13. data/htdocs/css/bootstrap.css +5389 -0
  14. data/htdocs/css/bootstrap.min.css +699 -0
  15. data/htdocs/css/font-awesome-ie7.css +645 -0
  16. data/htdocs/css/font-awesome.css +303 -0
  17. data/htdocs/css/main.css +22 -0
  18. data/htdocs/font/fontawesome-webfont.eot +0 -0
  19. data/htdocs/font/fontawesome-webfont.svg +255 -0
  20. data/htdocs/font/fontawesome-webfont.ttf +0 -0
  21. data/htdocs/font/fontawesome-webfont.woff +0 -0
  22. data/htdocs/img/glyphicons-halflings-white.png +0 -0
  23. data/htdocs/img/glyphicons-halflings.png +0 -0
  24. data/htdocs/index.html +114 -0
  25. data/htdocs/js/main.js +286 -0
  26. data/htdocs/js/vendor/angular-bootstrap-prettify.min.js +41 -0
  27. data/htdocs/js/vendor/angular-bootstrap.min.js +9 -0
  28. data/htdocs/js/vendor/angular-cookies.min.js +7 -0
  29. data/htdocs/js/vendor/angular-loader.min.js +7 -0
  30. data/htdocs/js/vendor/angular-resource.min.js +10 -0
  31. data/htdocs/js/vendor/angular-sanitize.min.js +13 -0
  32. data/htdocs/js/vendor/angular-ui-ieshiv.min.js +7 -0
  33. data/htdocs/js/vendor/angular-ui.min.js +7 -0
  34. data/htdocs/js/vendor/angular.js +14401 -0
  35. data/htdocs/js/vendor/angular.min.js +158 -0
  36. data/htdocs/js/vendor/bootstrap.js +2027 -0
  37. data/htdocs/js/vendor/bootstrap.min.js +6 -0
  38. data/htdocs/js/vendor/html5shiv.js +5 -0
  39. data/htdocs/js/vendor/jquery-1.8.2.min.js +2 -0
  40. data/htdocs/templates/directory.html +25 -0
  41. data/htdocs/templates/file.html +6 -0
  42. data/htdocs/templates/git.html +1 -0
  43. data/htdocs/templates/index.html +44 -0
  44. data/htdocs/templates/index_entry.html +54 -0
  45. data/htdocs/templates/info_refs.html +27 -0
  46. data/htdocs/templates/loading.html +1 -0
  47. data/htdocs/templates/notfound.html +7 -0
  48. data/htdocs/templates/object.html +54 -0
  49. data/htdocs/templates/objects.html +16 -0
  50. data/htdocs/templates/pack_file.html +15 -0
  51. data/htdocs/templates/pack_index.html +38 -0
  52. data/htdocs/templates/packed_object.html +111 -0
  53. data/htdocs/templates/packed_refs.html +27 -0
  54. data/htdocs/templates/ref.html +12 -0
  55. data/lib/git-object-browser.rb +37 -0
  56. data/lib/git-object-browser/dumper.rb +62 -0
  57. data/lib/git-object-browser/index_dumper.rb +77 -0
  58. data/lib/git-object-browser/main.rb +63 -0
  59. data/lib/git-object-browser/models/bindata.rb +68 -0
  60. data/lib/git-object-browser/models/directory.rb +61 -0
  61. data/lib/git-object-browser/models/git_object.rb +127 -0
  62. data/lib/git-object-browser/models/index.rb +77 -0
  63. data/lib/git-object-browser/models/index_entry.rb +95 -0
  64. data/lib/git-object-browser/models/index_reuc_extension.rb +31 -0
  65. data/lib/git-object-browser/models/index_tree_extension.rb +52 -0
  66. data/lib/git-object-browser/models/info_refs.rb +32 -0
  67. data/lib/git-object-browser/models/pack_file.rb +40 -0
  68. data/lib/git-object-browser/models/pack_index.rb +146 -0
  69. data/lib/git-object-browser/models/packed_object.rb +239 -0
  70. data/lib/git-object-browser/models/packed_refs.rb +39 -0
  71. data/lib/git-object-browser/models/plain_file.rb +24 -0
  72. data/lib/git-object-browser/models/ref.rb +32 -0
  73. data/lib/git-object-browser/object_dumper.rb +31 -0
  74. data/lib/git-object-browser/server/git_servlet.rb +209 -0
  75. data/lib/git-object-browser/server/main.rb +31 -0
  76. data/lib/git-object-browser/version.rb +3 -0
  77. data/spec/fixtures/generate_worktree.sh +103 -0
  78. data/spec/fixtures/git/indexes/001 +0 -0
  79. data/spec/fixtures/git/indexes/002-empty-tree-extension +0 -0
  80. data/spec/fixtures/git/plain_file +1 -0
  81. data/spec/fixtures/json/blob.json +9 -0
  82. data/spec/fixtures/json/merge-a.json +48 -0
  83. data/spec/fixtures/json/test3-tag.json +36 -0
  84. data/spec/fixtures/json/tree.json +20 -0
  85. data/spec/fixtures/worktree/_git/COMMIT_EDITMSG +1 -0
  86. data/spec/fixtures/worktree/_git/HEAD +1 -0
  87. data/spec/fixtures/worktree/_git/ORIG_HEAD +1 -0
  88. data/spec/fixtures/worktree/_git/config +11 -0
  89. data/spec/fixtures/worktree/_git/description +1 -0
  90. data/spec/fixtures/worktree/_git/hooks/applypatch-msg.sample +15 -0
  91. data/spec/fixtures/worktree/_git/hooks/commit-msg.sample +24 -0
  92. data/spec/fixtures/worktree/_git/hooks/post-update.sample +8 -0
  93. data/spec/fixtures/worktree/_git/hooks/pre-applypatch.sample +14 -0
  94. data/spec/fixtures/worktree/_git/hooks/pre-commit.sample +50 -0
  95. data/spec/fixtures/worktree/_git/hooks/pre-rebase.sample +169 -0
  96. data/spec/fixtures/worktree/_git/hooks/prepare-commit-msg.sample +36 -0
  97. data/spec/fixtures/worktree/_git/hooks/update.sample +128 -0
  98. data/spec/fixtures/worktree/_git/ignore +3 -0
  99. data/spec/fixtures/worktree/_git/index +0 -0
  100. data/spec/fixtures/worktree/_git/info/exclude +6 -0
  101. data/spec/fixtures/worktree/_git/info/refs +1 -0
  102. data/spec/fixtures/worktree/_git/logs/HEAD +10 -0
  103. data/spec/fixtures/worktree/_git/logs/refs/heads/branch-a +3 -0
  104. data/spec/fixtures/worktree/_git/logs/refs/heads/branch-b +2 -0
  105. data/spec/fixtures/worktree/_git/logs/refs/heads/master +4 -0
  106. data/spec/fixtures/worktree/_git/objects/00/cb8bfeb5b8ce906d39698e4e33b38341f5448f +1 -0
  107. data/spec/fixtures/worktree/_git/objects/07/31f9d4b6fa0475872be6a8ca263096f1d201cf +2 -0
  108. data/spec/fixtures/worktree/_git/objects/1d/3dc60b5a117054e43741d51e599ff31bb15f9f +0 -0
  109. data/spec/fixtures/worktree/_git/objects/26/4e42b1fef5bcb55acec162fdd5a068d79ae551 +0 -0
  110. data/spec/fixtures/worktree/_git/objects/28/3c06ddf1b31c14bb221d41173299e133b7753d +0 -0
  111. data/spec/fixtures/worktree/_git/objects/37/d1632d3f1159dad9cfb58e6c34312ab4355c49 +0 -0
  112. data/spec/fixtures/worktree/_git/objects/3a/2bf444f105c19b13ba5e75e884e10715e95a91 +0 -0
  113. data/spec/fixtures/worktree/_git/objects/40/a061aaf0cd0555449671a11993e4fed11f91a4 +2 -0
  114. data/spec/fixtures/worktree/_git/objects/53/2a1874c26cd19bd4d66e03218ab73e63de4357 +3 -0
  115. data/spec/fixtures/worktree/_git/objects/5b/719b165fde1964fb5a08adaf3b6e4f57ca1ff5 +0 -0
  116. data/spec/fixtures/worktree/_git/objects/61/cae34206bb889bae43ffdd22c17217485178bf +0 -0
  117. data/spec/fixtures/worktree/_git/objects/6c/444ac15f1e3c2a6869bd36ca7e58c39512106f +2 -0
  118. data/spec/fixtures/worktree/_git/objects/93/b714995d24c52180195876058a49c7d7fea0ad +0 -0
  119. data/spec/fixtures/worktree/_git/objects/96/25401ac3e19ef10868c140a76b719ac3f08fcf +0 -0
  120. data/spec/fixtures/worktree/_git/objects/b9/29ed2ab14f7489d5238a06d10d2f2c229a4ab4 +0 -0
  121. data/spec/fixtures/worktree/_git/objects/be/e0d26d33c284ee065e38bd7e81ae4bdc870f89 +4 -0
  122. data/spec/fixtures/worktree/_git/objects/c3/6491256978d26c08cd7aa97eee0f5631f96659 +0 -0
  123. data/spec/fixtures/worktree/_git/objects/d2/34c5e057fe32c676ea67e8cb38f4625ddaeb54 +0 -0
  124. data/spec/fixtures/worktree/_git/objects/df/6b0d2bcc76e6ec0fca20c227104a4f28bac41b +0 -0
  125. data/spec/fixtures/worktree/_git/objects/e5/b6d4317cefa946d77fc91539f1f1e48b60836f +0 -0
  126. data/spec/fixtures/worktree/_git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 +0 -0
  127. data/spec/fixtures/worktree/_git/objects/info/packs +2 -0
  128. data/spec/fixtures/worktree/_git/objects/pack/pack-f1c1717e9264c12310c7bd3e7dcdd28924000ff6.idx +0 -0
  129. data/spec/fixtures/worktree/_git/objects/pack/pack-f1c1717e9264c12310c7bd3e7dcdd28924000ff6.pack +0 -0
  130. data/spec/fixtures/worktree/_git/packed-refs +2 -0
  131. data/spec/fixtures/worktree/_git/refs/heads/branch-a +1 -0
  132. data/spec/fixtures/worktree/_git/refs/heads/branch-b +1 -0
  133. data/spec/fixtures/worktree/_git/refs/heads/master +1 -0
  134. data/spec/fixtures/worktree/_git/refs/tags/simple-tag +1 -0
  135. data/spec/fixtures/worktree/_git/refs/tags/test3-tag +1 -0
  136. data/spec/fixtures/worktree/sample-a.txt +1 -0
  137. data/spec/fixtures/worktree/sample.txt +1 -0
  138. data/spec/fixtures/worktree/subdir/sample-sub.txt +0 -0
  139. data/spec/git-object-browser/main_spec.rb +31 -0
  140. data/spec/git-object-browser/models/bindata_spec.rb +144 -0
  141. data/spec/git-object-browser/models/git_object_spec.rb +49 -0
  142. data/spec/git-object-browser/models/index_spec.rb +42 -0
  143. data/spec/git-object-browser/models/index_tree_extension_spec.rb +58 -0
  144. data/spec/git-object-browser/models/plain_file_spec.rb +11 -0
  145. data/spec/spec_helper.rb +19 -0
  146. metadata +260 -0
@@ -0,0 +1,77 @@
1
+ module GitObjectBrowser
2
+
3
+ module Models
4
+
5
+ # Parse .git/index file
6
+ class Index < Bindata
7
+
8
+ attr_reader :version, :entry_count, :entries, :extensions, :sha1
9
+
10
+ def initialize(input)
11
+ super(input)
12
+ end
13
+
14
+ def parse
15
+ dirc = raw(4)
16
+ if dirc != "DIRC"
17
+ throw Exception.new("Illegal format.")
18
+ end
19
+
20
+ @version = int
21
+ @entry_count = int
22
+ @entries = parse_entries
23
+ @extensions = parse_extensions
24
+ @sha1 = hex(20)
25
+
26
+ self
27
+ end
28
+
29
+ def parse_entries
30
+ entries = []
31
+ @entry_count.times do |i|
32
+ entries << IndexEntry.new(@in, @version)
33
+ end
34
+ return entries
35
+ end
36
+
37
+ def parse_extensions
38
+ extensions = []
39
+ while signature = peek(4)
40
+ if signature == "TREE"
41
+ extensions << IndexTreeExtension.new(@in).parse
42
+ elsif signature == "REUC"
43
+ extensions << IndexReucExtension.new(@in).parse
44
+ else
45
+ break
46
+ end
47
+ end
48
+ return extensions
49
+ end
50
+
51
+ def to_hash
52
+ entries = []
53
+ @entries.each do |entry|
54
+ entries << entry.to_hash
55
+ end
56
+
57
+ extensions = []
58
+ @extensions.each do |extension|
59
+ extensions << extension.to_hash
60
+ end
61
+
62
+ return {
63
+ "version" => @version,
64
+ "entry_count" => @entry_count,
65
+ "entries" => entries,
66
+ "extensions" => extensions,
67
+ "sha1" => @sha1,
68
+ }
69
+ end
70
+
71
+ def self.path?(relpath)
72
+ relpath == "index"
73
+ end
74
+
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,95 @@
1
+ module GitObjectBrowser
2
+
3
+ module Models
4
+
5
+ class IndexEntry < Bindata
6
+
7
+ attr_reader :version, :ctime, :cnano, :mtime, :mnano, :dev, :ino
8
+ attr_reader :object_type, :unix_permission
9
+ attr_reader :uid, :gid, :size, :sha1, :path
10
+ attr_reader :assume_valid_flag, :extended_flag, :stage
11
+ attr_reader :skip_worktree, :intent_to_add
12
+ attr_reader :name_length
13
+
14
+ def initialize(input, version)
15
+ super(input)
16
+ @version = version
17
+ parse
18
+ end
19
+
20
+ def parse
21
+ @ctime = int
22
+ @cnano = int
23
+ @mtime = int
24
+ @mnano = int # 16 byte
25
+ @dev = int
26
+ @ino = int
27
+
28
+ mode = binstr(4)
29
+ @object_type = mode[16..19]
30
+ unused = mode[20..22]
31
+ @unix_permission = sprintf('%o', mode[23..31].to_i(2))
32
+
33
+ @uid = int # 32 bytes
34
+ @gid = int
35
+ @size = int
36
+ @sha1 = hex(20)
37
+ parse_flags # 62 bytes
38
+ @path = parse_path
39
+ end
40
+
41
+ def parse_flags
42
+ flags = binstr(2)
43
+ if @version == 2
44
+ @assume_valid_flag = flags[0..0]
45
+ @extended_flag = flags[1..1]
46
+ @stage = flags[2..3]
47
+ elsif @version == 3
48
+ reserved = flags[0..0]
49
+ @skip_worktree = flags[1..1]
50
+ @intent_to_add = flags[2..2]
51
+ end
52
+ @name_length = ["0000" + flags[4..15]].pack("B*").unpack("n")[0]
53
+ end
54
+
55
+ # path: 2 + 8 * n bytes (nul pannding)
56
+ def parse_path
57
+ token = raw(2) # 64 bytes
58
+ path = ""
59
+ begin
60
+ path += token.unpack("Z*").first
61
+ break if token.unpack("C*").last == 0
62
+ end while(token = raw(8))
63
+ return path
64
+ end
65
+
66
+
67
+ def to_hash
68
+ return {
69
+ "ctime" => @ctime,
70
+ "cnano" => @cnano,
71
+ "mtime" => @mtime,
72
+ "mnano" => @mnano,
73
+ "dev" => @dev,
74
+ "ino" => @ino,
75
+ "object_type" => @object_type,
76
+ "unix_permission" => @unix_permission,
77
+
78
+ "uid" => @uid,
79
+ "gid" => @gid,
80
+ "size" => @size,
81
+ "sha1" => @sha1,
82
+ "path" => @path,
83
+
84
+ "assume_valid_flag" => @assume_valid_flag,
85
+ "extended_flag" => @extended_flag,
86
+ "stage" => @stage,
87
+ "skip_worktree" => @skip_worktree,
88
+ "intent_to_add" => @intent_to_add,
89
+ "name_length" => @name_length,
90
+ }
91
+ end
92
+
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,31 @@
1
+ module GitObjectBrowser
2
+
3
+ module Models
4
+
5
+ class IndexReucExtension < Bindata
6
+
7
+ attr_reader :signature, :total_length
8
+
9
+ def initialize(input)
10
+ super(input)
11
+ end
12
+
13
+ def parse
14
+ @signature = raw(4) # REUC
15
+ @total_length = int
16
+
17
+ data = raw(@total_length) # TODO
18
+
19
+ self
20
+ end
21
+
22
+ def to_hash
23
+ return {
24
+ "signature" => @signature,
25
+ "total_length" => @total_length,
26
+ }
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,52 @@
1
+ module GitObjectBrowser
2
+
3
+ module Models
4
+
5
+ class IndexTreeExtension < Bindata
6
+
7
+ attr_reader :signature, :total_length, :entries
8
+
9
+ def initialize(input)
10
+ super(input)
11
+ end
12
+
13
+ def parse
14
+ @signature = raw(4) # TREE
15
+ @total_length = int
16
+ @entries = []
17
+
18
+ length = 0
19
+ while (length < @total_length)
20
+ entry = {}
21
+ entry['path_component'] = find_char "\0"
22
+ entry['entry_count'] = find_char " "
23
+ entry['subtree_count'] = find_char "\n"
24
+
25
+ length += entry['path_component'].bytesize + 1
26
+ length += entry['entry_count'].bytesize + 1
27
+ length += entry['subtree_count'].bytesize + 1
28
+
29
+ entry['entry_count'] = entry['entry_count'].to_i
30
+ entry['subtree_count'] = entry['subtree_count'].to_i
31
+
32
+ if 0 <= entry['entry_count']
33
+ entry['sha1'] = hex(20)
34
+ length += 20
35
+ end
36
+ @entries << entry
37
+ end
38
+
39
+ self
40
+ end
41
+
42
+ def to_hash
43
+ return {
44
+ "signature" => @signature,
45
+ "total_length" => @total_length,
46
+ "entries" => @entries
47
+ }
48
+ end
49
+
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,32 @@
1
+
2
+ module GitObjectBrowser
3
+
4
+ module Models
5
+
6
+ class InfoRefs
7
+ def initialize(input)
8
+ @entries = []
9
+ while (line = input.gets) do
10
+ next if line =~ /\A\s*#/
11
+ next unless line =~ /([0-9a-f]{40})\s*(.*)/
12
+ entry = {}
13
+ entry[:sha1] = $1
14
+ entry[:ref] = $2
15
+ @entries << entry
16
+ end
17
+ end
18
+
19
+ def to_hash
20
+ return {
21
+ :entries => @entries
22
+ }
23
+ end
24
+
25
+ def self.path?(relpath)
26
+ return relpath == "info/refs"
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,40 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+
4
+ module GitObjectBrowser
5
+
6
+ module Models
7
+
8
+ # signature 4bytes PACK
9
+ # version 4bytes
10
+ # objects number 4bytes
11
+ # object entries -> packed_object.rb
12
+ #
13
+ # https://github.com/git/git/blob/master/Documentation/technical/pack-format.txt
14
+ class PackFile < Bindata
15
+ def initialize(input)
16
+ super(input)
17
+ end
18
+
19
+ def self.path?(relpath)
20
+ return relpath =~ %r{\Aobjects/pack/pack-[0-9a-f]{40}.pack\z}
21
+ end
22
+
23
+ def parse
24
+ signature = raw(4)
25
+ raise 'wrong signature' if signature != 'PACK'
26
+ @version = int
27
+ @object_number = int
28
+ self
29
+ end
30
+
31
+ def to_hash
32
+ return {
33
+ :version => @version,
34
+ :object_number => @object_number
35
+ }
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,146 @@
1
+ # -*- coding: utf-8 -*-
2
+ module GitObjectBrowser
3
+
4
+ module Models
5
+
6
+ # v2
7
+ # signature 4bytes
8
+ # version 4bytes
9
+ # fanout 4bytes * 256
10
+ # sha1 20bytes * fanout[255]
11
+ # crc 4bytes * fanout[255]
12
+ # offset 4bytes * fanout[255]
13
+ class PackIndex < Bindata
14
+
15
+ def initialize(input)
16
+ super(input)
17
+ end
18
+
19
+ def parse
20
+ parse_fanout
21
+
22
+ @entries = []
23
+ @fanout[255].times do |i|
24
+ entry = {}
25
+ entry[:sha1] = hex(20)
26
+ @entries << entry
27
+ end
28
+
29
+ @fanout[255].times do |i|
30
+ @entries[i][:crc32] = hex(4)
31
+ end
32
+
33
+ @fanout[255].times do |i|
34
+ @entries[i][:offset] = int
35
+ end
36
+
37
+ # XXX Doesn't support packfile >= 2 GiB
38
+ # x.times do |i|
39
+ # puts "offset[#{ i }] = #{ hex(8) }"
40
+ # end
41
+
42
+ @packfile_sha1 = hex(20)
43
+ @index_sha1 = hex(20)
44
+
45
+ self
46
+ end
47
+
48
+ def parse_fanout
49
+ return if @fanout
50
+
51
+ seek(0)
52
+ signature = raw(4)
53
+ signature_v2 = [255, 'tOc'].pack('Ca*')
54
+
55
+ raise "FIXME" if signature != signature_v2
56
+ @version = int
57
+ raise "FIXME" if @version != 2
58
+
59
+ @fanout = []
60
+ 256.times do |i|
61
+ @fanout << int
62
+ end
63
+ end
64
+
65
+ def find(sha1_hex)
66
+ parse_fanout
67
+ sha1 = [sha1_hex].pack("H*")
68
+ fanout_idx = sha1.unpack("C").first
69
+
70
+ lo = fanout_idx == 0 ? 0 : @fanout[fanout_idx - 1]
71
+ hi = @fanout[fanout_idx]
72
+
73
+ while lo < hi
74
+ mid = (lo + hi) / 2
75
+ mid_sha1 = get_sha1(mid)
76
+ if mid_sha1 == sha1
77
+ return {
78
+ :sha1 => sha1_hex,
79
+ :crc => get_crc_hex(mid),
80
+ :offset => get_offset(mid)
81
+ }
82
+ elsif sha1 < mid_sha1
83
+ hi = mid
84
+ else
85
+ lo = mid + 1
86
+ end
87
+ end
88
+ nil
89
+ end
90
+
91
+ def get_sha1(pos)
92
+ if @version == 2
93
+ seek(4 + 4 + 4 * 256 + 20 * pos)
94
+ else
95
+ raise "FIXME version 1"
96
+ end
97
+ raw(20)
98
+ end
99
+
100
+ def get_crc_hex(pos)
101
+ if @version == 2
102
+ seek(4 + 4 + 4 * 256 + 20 * @fanout[255] + 4 * pos)
103
+ else
104
+ raise "FIXME version 1"
105
+ end
106
+ hex(4)
107
+ end
108
+
109
+ def get_offset(pos)
110
+ if @version == 2
111
+ seek(4 + 4 + 4 * 256 + 20 * @fanout[255] + 4 * @fanout[255] + 4 * pos)
112
+ else
113
+ raise "FIXME version 1"
114
+ end
115
+ int
116
+ end
117
+
118
+ def self.path?(relpath)
119
+ return relpath =~ %r{\Aobjects/pack/pack-[0-9a-f]{40}.idx\z}
120
+ end
121
+
122
+ def to_hash
123
+ return {
124
+ :fanout => @fanout,
125
+ :entries => @entries,
126
+ :packfile_sha1 => @packfile_sha1,
127
+ :index_sha1 => @index_sha1,
128
+ }
129
+ end
130
+
131
+ def load_object_types(input)
132
+ obj = PackedObject.new(self, input)
133
+ @entries.each do |entry|
134
+ header = obj.parse_header(entry[:offset])
135
+ if header[:type] == 'ofs_delta'
136
+ obj.parse_ofs_delta_header(entry[:offset], header)
137
+ elsif header[:type] == 'ref_delta'
138
+ obj.parse_ref_delta_header(header)
139
+ end
140
+ entry.merge!(header)
141
+ end
142
+ end
143
+
144
+ end
145
+ end
146
+ end