git-object-browser 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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