git-object-browser 0.0.4 → 0.0.6
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.
- data/htdocs/js/main.js +3 -4
- data/lib/git-object-browser.rb +5 -3
- data/lib/git-object-browser/dumper/index_dumper.rb +24 -0
- data/lib/git-object-browser/dumper/main.rb +124 -0
- data/lib/git-object-browser/dumper/object_dumper.rb +20 -0
- data/lib/git-object-browser/dumper/pack_index_dumper.rb +21 -0
- data/lib/git-object-browser/dumper/packed_object_dumper.rb +19 -0
- data/lib/git-object-browser/main.rb +10 -7
- data/lib/git-object-browser/models/git_object.rb +13 -10
- data/lib/git-object-browser/models/index_entry.rb +4 -4
- data/lib/git-object-browser/version.rb +1 -1
- data/spec/fixtures/git/indexes/003-version-4 +0 -0
- data/spec/git-object-browser/models/index_spec.rb +14 -0
- metadata +8 -6
- data/lib/git-object-browser/dumper.rb +0 -62
- data/lib/git-object-browser/index_dumper.rb +0 -77
- data/lib/git-object-browser/object_dumper.rb +0 -31
data/htdocs/js/main.js
CHANGED
@@ -157,16 +157,15 @@ function GitCtrl($scope, $location, $routeParams, GitResource, PackedObjectResou
|
|
157
157
|
'assume_valid_flag',
|
158
158
|
'extended_flag',
|
159
159
|
'stage',
|
160
|
-
'
|
160
|
+
'name_length'
|
161
161
|
]
|
162
|
-
|
163
|
-
if (version == 3) {
|
162
|
+
if (version > 2) {
|
164
163
|
keys = keys.concat([
|
165
164
|
'skip_worktree',
|
166
165
|
'intent_to_add',
|
167
166
|
]);
|
168
167
|
}
|
169
|
-
keys.push('
|
168
|
+
keys.push('path')
|
170
169
|
|
171
170
|
return keys;
|
172
171
|
};
|
data/lib/git-object-browser.rb
CHANGED
@@ -30,8 +30,10 @@ require "git-object-browser/models/plain_file"
|
|
30
30
|
require "git-object-browser/server/main"
|
31
31
|
require "git-object-browser/server/git_servlet"
|
32
32
|
|
33
|
-
require "git-object-browser/dumper"
|
34
|
-
require "git-object-browser/object_dumper"
|
35
|
-
require "git-object-browser/index_dumper"
|
33
|
+
require "git-object-browser/dumper/main"
|
34
|
+
require "git-object-browser/dumper/object_dumper"
|
35
|
+
require "git-object-browser/dumper/index_dumper"
|
36
|
+
require "git-object-browser/dumper/pack_index_dumper"
|
37
|
+
require "git-object-browser/dumper/packed_object_dumper"
|
36
38
|
|
37
39
|
GitObjectBrowser::Main.new().execute if __FILE__ == $0
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
module GitObjectBrowser
|
4
|
+
|
5
|
+
module Dumper
|
6
|
+
|
7
|
+
class IndexDumper
|
8
|
+
|
9
|
+
def initialize(input, output)
|
10
|
+
@index = GitObjectBrowser::Models::Index.new(input)
|
11
|
+
@out = output
|
12
|
+
end
|
13
|
+
|
14
|
+
def dump
|
15
|
+
@out << JSON.pretty_generate(@index.parse.to_hash)
|
16
|
+
|
17
|
+
# template = File.join(GitObjectBrowser::Dumper::TEMPLATES_DIR, 'index.txt.erb')
|
18
|
+
# index = @index.parse.to_hash
|
19
|
+
# @out << ERB.new(File.read(template), nil, '-').result(binding)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
module GitObjectBrowser
|
2
|
+
module Dumper
|
3
|
+
|
4
|
+
# TEMPLATES_DIR = File.join(File.dirname(__FILE__), '../../../templates/dumper')
|
5
|
+
|
6
|
+
class Main
|
7
|
+
|
8
|
+
def self.execute(target)
|
9
|
+
new(target).dump
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(target)
|
13
|
+
@target = target
|
14
|
+
@outdir = File.join(target, "dump")
|
15
|
+
end
|
16
|
+
|
17
|
+
def dump
|
18
|
+
Dir.mkdir(@outdir) unless File.exist?(@outdir)
|
19
|
+
dump_index
|
20
|
+
dump_objects
|
21
|
+
dump_packed
|
22
|
+
end
|
23
|
+
|
24
|
+
def dump_index
|
25
|
+
index_file = File.join(@target, "index")
|
26
|
+
out_file = File.join(@outdir, "index")
|
27
|
+
|
28
|
+
return unless File.exist?(index_file)
|
29
|
+
|
30
|
+
STDERR << "Write: .git/dump/index\n"
|
31
|
+
File.open(index_file) do |input|
|
32
|
+
File.open(out_file, "w") do |output|
|
33
|
+
dumper = GitObjectBrowser::Dumper::IndexDumper.new(input, output)
|
34
|
+
dumper.dump
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def dump_objects
|
40
|
+
obj_files = []
|
41
|
+
Dir.chdir(@target) do
|
42
|
+
Dir.glob("objects/**/*") do |path|
|
43
|
+
obj_files << path if File.file?(path) && path =~ %r{/[a-z0-9]{38}$}
|
44
|
+
end
|
45
|
+
end
|
46
|
+
return if obj_files.empty?
|
47
|
+
|
48
|
+
obj_dir = File.join(@outdir, "objects")
|
49
|
+
Dir.mkdir(obj_dir) unless File.exist?(obj_dir)
|
50
|
+
|
51
|
+
obj_files.each do |path|
|
52
|
+
outfile = File.join(@outdir, path)
|
53
|
+
next if File.exist?(outfile)
|
54
|
+
|
55
|
+
parent = File.dirname(outfile)
|
56
|
+
Dir.mkdir(parent) unless File.exist?(parent)
|
57
|
+
|
58
|
+
STDERR << "Write: .git/dump/objects/#{path}\n"
|
59
|
+
obj_file = File.join(@target, path)
|
60
|
+
File.open(obj_file) do |input|
|
61
|
+
File.open(outfile, "w") do |output|
|
62
|
+
dumper = GitObjectBrowser::Dumper::ObjectDumper.new(input, output)
|
63
|
+
dumper.dump
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
def dump_packed
|
71
|
+
files = []
|
72
|
+
Dir.chdir(@target) do
|
73
|
+
Dir.glob("objects/pack/*.idx") do |path|
|
74
|
+
files << path
|
75
|
+
end
|
76
|
+
end
|
77
|
+
return if files.empty?
|
78
|
+
|
79
|
+
obj_dir = File.join(@outdir, "objects")
|
80
|
+
Dir.mkdir(obj_dir) unless File.exist?(obj_dir)
|
81
|
+
pack_dir = File.join(@outdir, "objects/pack")
|
82
|
+
Dir.mkdir(pack_dir) unless File.exist?(pack_dir)
|
83
|
+
|
84
|
+
files.each do |path|
|
85
|
+
outfile = File.join(@outdir, path)
|
86
|
+
packpath = path.gsub(/\.idx\z/, '.pack')
|
87
|
+
|
88
|
+
STDERR << "Write: .git/dump/#{path}\n"
|
89
|
+
index_file = File.join(@target, path)
|
90
|
+
File.open(index_file) do |input|
|
91
|
+
File.open(outfile, "w") do |output|
|
92
|
+
dumper = GitObjectBrowser::Dumper::PackIndexDumper.new(input, output)
|
93
|
+
dumper.dump
|
94
|
+
index = dumper.pack_index
|
95
|
+
entries = index.to_hash[:entries]
|
96
|
+
|
97
|
+
File.open(File.join(@target, packpath)) do |pack_input|
|
98
|
+
object_dumper = GitObjectBrowser::Dumper::PackedObjectDumper.new(pack_input, index)
|
99
|
+
entries.each do |entry|
|
100
|
+
dump_packed_object(object_dumper, entry)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def dump_packed_object(dumper, entry)
|
109
|
+
sha1_1 = entry[:sha1][0..1]
|
110
|
+
sha1_2 = entry[:sha1][2..-1]
|
111
|
+
obj_dir = File.join(@outdir, "objects", sha1_1)
|
112
|
+
Dir.mkdir(obj_dir) unless File.exist?(obj_dir)
|
113
|
+
|
114
|
+
outfile = File.join(obj_dir, sha1_2)
|
115
|
+
STDERR << "Write: .git/dump/objects/#{sha1_1}/#{sha1_2}\n"
|
116
|
+
|
117
|
+
File.open(outfile, "w") do |output|
|
118
|
+
dumper.dump(output, entry[:offset])
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
module GitObjectBrowser
|
4
|
+
|
5
|
+
module Dumper
|
6
|
+
|
7
|
+
class ObjectDumper
|
8
|
+
|
9
|
+
def initialize(input, output)
|
10
|
+
@object = GitObjectBrowser::Models::GitObject.new(input)
|
11
|
+
@out = output
|
12
|
+
end
|
13
|
+
|
14
|
+
def dump
|
15
|
+
@out << JSON.pretty_generate(@object.parse.to_hash)
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
module GitObjectBrowser
|
4
|
+
|
5
|
+
module Dumper
|
6
|
+
|
7
|
+
class PackIndexDumper
|
8
|
+
attr_reader :pack_index
|
9
|
+
|
10
|
+
def initialize(input, output)
|
11
|
+
@pack_index = GitObjectBrowser::Models::PackIndex.new(input)
|
12
|
+
@out = output
|
13
|
+
end
|
14
|
+
|
15
|
+
def dump
|
16
|
+
@out << JSON.pretty_generate(@pack_index.parse.to_hash)
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
module GitObjectBrowser
|
4
|
+
|
5
|
+
module Dumper
|
6
|
+
|
7
|
+
class PackedObjectDumper
|
8
|
+
|
9
|
+
def initialize(input, index)
|
10
|
+
@object = GitObjectBrowser::Models::PackedObject.new(index, input)
|
11
|
+
end
|
12
|
+
|
13
|
+
def dump(output, offset)
|
14
|
+
output << JSON.pretty_generate(@object.parse(offset).to_hash)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -4,16 +4,16 @@ module GitObjectBrowser
|
|
4
4
|
def execute
|
5
5
|
host = '127.0.0.1'
|
6
6
|
port = 8080
|
7
|
+
dump = false
|
7
8
|
opts = OptionParser.new do |opts|
|
8
|
-
opts.on('-p', '--port
|
9
|
+
opts.on('-p', '--port PORT', 'port number') do |value|
|
9
10
|
port = value.to_i if 0 < value.to_i
|
10
11
|
end
|
11
|
-
opts.on('-b', '--bind
|
12
|
+
opts.on('-b', '--bind HOST', 'address to bind') do |value|
|
12
13
|
host = value
|
13
14
|
end
|
14
|
-
opts.on('-d', '--dump', 'dump objects') do
|
15
|
-
|
16
|
-
exit
|
15
|
+
opts.on('-d', '--dump', 'dump objects') do |value|
|
16
|
+
dump = true
|
17
17
|
end
|
18
18
|
opts.on_tail("-h", "--help", "show this help.") do
|
19
19
|
puts opts
|
@@ -25,9 +25,12 @@ module GitObjectBrowser
|
|
25
25
|
end
|
26
26
|
opts.parse!(ARGV)
|
27
27
|
end
|
28
|
-
|
29
28
|
target = find_target(ARGV[0])
|
30
|
-
|
29
|
+
if dump
|
30
|
+
GitObjectBrowser::Dumper::Main.execute(target)
|
31
|
+
else
|
32
|
+
GitObjectBrowser::Server::Main.execute(target, host, port)
|
33
|
+
end
|
31
34
|
end
|
32
35
|
|
33
36
|
def find_target(target = nil, git_dir_name = '.git')
|
@@ -36,15 +36,13 @@ module GitObjectBrowser
|
|
36
36
|
(@properties, @message) = parse_contents
|
37
37
|
end
|
38
38
|
|
39
|
-
@content = @content
|
40
|
-
@content = '(not UTF-8)' unless @content.valid_encoding?
|
39
|
+
@content = force_utf8(@content)
|
41
40
|
@content = @content[0, 3000] + "\n..." if @content.length > 3000
|
42
41
|
end
|
43
42
|
|
44
43
|
self
|
45
44
|
end
|
46
45
|
|
47
|
-
|
48
46
|
def to_hash
|
49
47
|
return {
|
50
48
|
:type => @type,
|
@@ -71,7 +69,7 @@ module GitObjectBrowser
|
|
71
69
|
entry = {}
|
72
70
|
entry[:mode] = find_char ' '
|
73
71
|
break if entry[:mode].empty?
|
74
|
-
entry[:filename] = find_char
|
72
|
+
entry[:filename] = force_utf8(find_char("\0"))
|
75
73
|
entry[:sha1] = hex(20)
|
76
74
|
@content += "#{entry[:mode]} #{entry[:filename]}\\0\\#{entry[:sha1]}\n"
|
77
75
|
entries << entry
|
@@ -96,20 +94,19 @@ module GitObjectBrowser
|
|
96
94
|
# couldn't find the spec...
|
97
95
|
prop[:value].to_s =~ /\A(.*) <(.*)> (\d+)(?: ((?:(?:\+|-)(?:\d{4}|\d{2}:\d{2}))|Z))?\z/
|
98
96
|
prop[:type] = 'user'
|
99
|
-
prop[:name] = $1
|
100
|
-
prop[:
|
101
|
-
prop[:email] = $2.force_encoding("UTF-8")
|
102
|
-
prop[:email] = '(not UTF-8)' unless prop[:email].valid_encoding?
|
97
|
+
prop[:name] = force_utf8($1)
|
98
|
+
prop[:email] = force_utf8($2)
|
103
99
|
prop[:unixtime] = $3
|
104
100
|
prop[:timezone] = $4
|
105
101
|
prop[:date] = epoch($3.to_i, $4).iso8601
|
102
|
+
|
103
|
+
prop[:value] = force_utf8(prop[:value])
|
106
104
|
else
|
107
105
|
prop[:type] = 'text'
|
108
106
|
end
|
109
107
|
properties << prop
|
110
108
|
end
|
111
|
-
message = lines.join("\n")
|
112
|
-
message = '(not UTF-8)' unless message.valid_encoding?
|
109
|
+
message = force_utf8(lines.join("\n"))
|
113
110
|
|
114
111
|
[properties, message]
|
115
112
|
end
|
@@ -124,6 +121,12 @@ module GitObjectBrowser
|
|
124
121
|
Rational($2.to_i, 24) + Rational($3, 60) * (($1 == '-') ? -1 : 1)
|
125
122
|
end
|
126
123
|
|
124
|
+
def force_utf8(str)
|
125
|
+
str = str.force_encoding('UTF-8')
|
126
|
+
str.valid_encoding? ? str : '(not UTF-8)'
|
127
|
+
end
|
128
|
+
private :force_utf8
|
129
|
+
|
127
130
|
end
|
128
131
|
end
|
129
132
|
end
|
@@ -30,7 +30,7 @@ module GitObjectBrowser
|
|
30
30
|
@gid = int # 36
|
31
31
|
@size = int # 40
|
32
32
|
@sha1 = hex(20) # 60
|
33
|
-
parse_flags # 62
|
33
|
+
parse_flags # 62 (+2)
|
34
34
|
parse_path
|
35
35
|
end
|
36
36
|
|
@@ -48,8 +48,8 @@ module GitObjectBrowser
|
|
48
48
|
@extended_flag = flags[1..1].to_i
|
49
49
|
@stage = flags[2..3]
|
50
50
|
@name_length = ["0000" + flags[4..15]].pack("B*").unpack("n")[0]
|
51
|
-
if @version
|
52
|
-
|
51
|
+
if @version > 2 && @extended_flag == 1
|
52
|
+
extended = binstr(2)
|
53
53
|
reserved = extended[0..0]
|
54
54
|
@skip_worktree = extended[1..1]
|
55
55
|
@intent_to_add = extended[2..2]
|
@@ -68,7 +68,7 @@ module GitObjectBrowser
|
|
68
68
|
|
69
69
|
# path: 2 + 8 * n bytes (nul pannding)
|
70
70
|
def parse_path_v2
|
71
|
-
token = raw(
|
71
|
+
token = raw(@extended_flag == 1 ? 8 : 2)
|
72
72
|
@path = ""
|
73
73
|
begin
|
74
74
|
@path += token.unpack("Z*").first
|
Binary file
|
@@ -53,6 +53,20 @@ module GitObjectBrowser::Models
|
|
53
53
|
expect = ['test.txt', 'test2.txt', 'test3.txt']
|
54
54
|
entries.map {|entry| entry[:path]}.should eq expect
|
55
55
|
end
|
56
|
+
|
57
|
+
it 'should parse extended data' do
|
58
|
+
index = subject.parse.to_hash
|
59
|
+
|
60
|
+
entry = index[:entries][1]
|
61
|
+
entry[:extended_flag].should eq 0
|
62
|
+
entry[:skip_worktree] = nil
|
63
|
+
entry[:intent_to_add] = nil
|
64
|
+
|
65
|
+
entry = index[:entries][2]
|
66
|
+
entry[:extended_flag].should eq 1
|
67
|
+
entry[:skip_worktree] = 0
|
68
|
+
entry[:intent_to_add] = 1
|
69
|
+
end
|
56
70
|
end
|
57
71
|
end
|
58
72
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: git-object-browser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-06-13 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Browse git raw objects.
|
15
15
|
email:
|
@@ -74,8 +74,11 @@ files:
|
|
74
74
|
- htdocs/templates/packed_refs.html
|
75
75
|
- htdocs/templates/ref.html
|
76
76
|
- lib/git-object-browser.rb
|
77
|
-
- lib/git-object-browser/dumper.rb
|
78
|
-
- lib/git-object-browser/
|
77
|
+
- lib/git-object-browser/dumper/index_dumper.rb
|
78
|
+
- lib/git-object-browser/dumper/main.rb
|
79
|
+
- lib/git-object-browser/dumper/object_dumper.rb
|
80
|
+
- lib/git-object-browser/dumper/pack_index_dumper.rb
|
81
|
+
- lib/git-object-browser/dumper/packed_object_dumper.rb
|
79
82
|
- lib/git-object-browser/main.rb
|
80
83
|
- lib/git-object-browser/models/bindata.rb
|
81
84
|
- lib/git-object-browser/models/directory.rb
|
@@ -91,7 +94,6 @@ files:
|
|
91
94
|
- lib/git-object-browser/models/packed_refs.rb
|
92
95
|
- lib/git-object-browser/models/plain_file.rb
|
93
96
|
- lib/git-object-browser/models/ref.rb
|
94
|
-
- lib/git-object-browser/object_dumper.rb
|
95
97
|
- lib/git-object-browser/server/git_servlet.rb
|
96
98
|
- lib/git-object-browser/server/main.rb
|
97
99
|
- lib/git-object-browser/version.rb
|
@@ -185,7 +187,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
185
187
|
version: '0'
|
186
188
|
segments:
|
187
189
|
- 0
|
188
|
-
hash:
|
190
|
+
hash: 144653815734182267
|
189
191
|
requirements: []
|
190
192
|
rubyforge_project:
|
191
193
|
rubygems_version: 1.8.24
|
@@ -1,62 +0,0 @@
|
|
1
|
-
module GitObjectBrowser
|
2
|
-
|
3
|
-
class Dumper
|
4
|
-
|
5
|
-
def initialize(target)
|
6
|
-
@target = target
|
7
|
-
@outdir = File.join(@target, "plain")
|
8
|
-
end
|
9
|
-
|
10
|
-
def dump
|
11
|
-
Dir.mkdir(@outdir) unless File.exist?(@outdir)
|
12
|
-
dump_index
|
13
|
-
dump_objects
|
14
|
-
end
|
15
|
-
|
16
|
-
def dump_index
|
17
|
-
index_file = File.join(@target, "index")
|
18
|
-
out_file = File.join(@outdir, "index")
|
19
|
-
|
20
|
-
return unless File.exist?(index_file)
|
21
|
-
|
22
|
-
STDERR << "Write: .git/plain/index\n"
|
23
|
-
File.open(index_file) do |input|
|
24
|
-
File.open(out_file, "w") do |output|
|
25
|
-
dumper = GitObjectBrowser::IndexDumper.new(input, output)
|
26
|
-
dumper.dump
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def dump_objects
|
32
|
-
obj_files = []
|
33
|
-
Dir.chdir(@target) do
|
34
|
-
Dir.glob("objects/**/*") do |path|
|
35
|
-
obj_files << path if File.file?(path) && path =~ %r{/[a-z0-9]{38}$}
|
36
|
-
end
|
37
|
-
end
|
38
|
-
return if obj_files.empty?
|
39
|
-
|
40
|
-
obj_dir = File.join(@outdir, "objects")
|
41
|
-
Dir.mkdir(obj_dir) unless File.exist?(obj_dir)
|
42
|
-
|
43
|
-
obj_files.each do |path|
|
44
|
-
outfile = File.join(@outdir, path)
|
45
|
-
next if File.exist?(outfile)
|
46
|
-
|
47
|
-
parent = File.dirname(outfile)
|
48
|
-
Dir.mkdir(parent) unless File.exist?(parent)
|
49
|
-
|
50
|
-
STDERR << "Write: .git/plain/#{path}\n"
|
51
|
-
obj_file = File.join(@target, path)
|
52
|
-
File.open(obj_file) do |input|
|
53
|
-
File.open(outfile, "w") do |output|
|
54
|
-
dumper = GitObjectBrowser::ObjectDumper.new(input, output)
|
55
|
-
dumper.dump
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
@@ -1,77 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
|
3
|
-
module GitObjectBrowser
|
4
|
-
|
5
|
-
class IndexDumper
|
6
|
-
|
7
|
-
def initialize(input, output)
|
8
|
-
@index = Models::Index.new(input)
|
9
|
-
@out = output
|
10
|
-
end
|
11
|
-
|
12
|
-
def dump
|
13
|
-
@out << "----------------------------------------------------------------\n"
|
14
|
-
@out << "header\n"
|
15
|
-
@out << "----------------------------------------------------------------\n"
|
16
|
-
@out << "version: #{@index.version}\n"
|
17
|
-
@out << "entries: #{@index.entry_count}\n"
|
18
|
-
@out << "\n"
|
19
|
-
|
20
|
-
@index.entries.each_with_index do |entry, i|
|
21
|
-
@out << "----------------------------------------------------------------\n"
|
22
|
-
@out << "entry: #{i+1}\n"
|
23
|
-
@out << "----------------------------------------------------------------\n"
|
24
|
-
@out << " ctime: #{entry.ctime}\n"
|
25
|
-
@out << " ctime nano: #{entry.cnano}\n"
|
26
|
-
@out << " mtime: #{entry.mtime}\n"
|
27
|
-
@out << " mtime nano: #{entry.mnano}\n"
|
28
|
-
@out << " dev: #{entry.dev}\n"
|
29
|
-
@out << " ino: #{entry.ino}\n"
|
30
|
-
@out << " object_type: #{entry.object_type}\n"
|
31
|
-
@out << " unix_permission: #{entry.unix_permission}\n"
|
32
|
-
@out << " uid: #{entry.uid}\n"
|
33
|
-
@out << " gid: #{entry.gid}\n"
|
34
|
-
@out << " size: #{entry.size}\n"
|
35
|
-
@out << " sha1: #{entry.sha1}\n"
|
36
|
-
if @version == 2
|
37
|
-
@out << "assume_valid_flag: #{entry.assume_valid_flag}\n"
|
38
|
-
@out << " extended_flag: #{entry.extended_flag}\n"
|
39
|
-
@out << " stage: #{entry.stage}\n"
|
40
|
-
elsif @version == 3
|
41
|
-
@out << " skip_worktree: #{entry.skip_worktree}\n"
|
42
|
-
@out << " intent_to_add: #{entry.intent_to_add}\n"
|
43
|
-
end
|
44
|
-
@out << " name_length: #{entry.name_length}\n"
|
45
|
-
@out << " path: #{entry.path}\n"
|
46
|
-
@out << "\n"
|
47
|
-
end
|
48
|
-
|
49
|
-
@index.extensions.each do |extension|
|
50
|
-
@out << "----------------------------------------------------------------\n"
|
51
|
-
@out << "extension: #{extension.signature}\n"
|
52
|
-
@out << "----------------------------------------------------------------\n"
|
53
|
-
if extension.signature == "TREE"
|
54
|
-
dump_tree_extension(extension)
|
55
|
-
elsif extension.signature == "REUC"
|
56
|
-
dump_reuc_extension
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
@out << "----------------------------------------------------------------\n"
|
61
|
-
@out << "checksum\n"
|
62
|
-
@out << "----------------------------------------------------------------\n"
|
63
|
-
@out << "sha1: #{@index.sha1}\n"
|
64
|
-
end
|
65
|
-
|
66
|
-
def dump_tree_extension(tree_extension)
|
67
|
-
tree_extension.entries.each do |entry|
|
68
|
-
@out << " path_component: #{entry[:path_component]}\n"
|
69
|
-
@out << " entry_count: #{entry[:entry_count]}\n"
|
70
|
-
@out << " subtree_count: #{entry[:subtree_count]}\n"
|
71
|
-
@out << " sha1: #{entry[:sha1]}\n\n"
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
end
|
76
|
-
|
77
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
|
3
|
-
module GitObjectBrowser
|
4
|
-
|
5
|
-
class ObjectDumper
|
6
|
-
|
7
|
-
def initialize(input, output)
|
8
|
-
@object = Models::GitObject.new(input)
|
9
|
-
@out = output
|
10
|
-
end
|
11
|
-
|
12
|
-
def dump
|
13
|
-
@out << "type: #{@object.type}\n"
|
14
|
-
@out << "size: #{@object.size}\n"
|
15
|
-
@out << "sha1: #{@object.sha1}\n"
|
16
|
-
@out << "\n"
|
17
|
-
if @object.type == "tree"
|
18
|
-
dump_tree_entries
|
19
|
-
else
|
20
|
-
@out << @object.contents
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
# man git-ls-tree
|
25
|
-
def dump_tree_entries
|
26
|
-
@object.entries.each do |entry|
|
27
|
-
@out << "#{entry[:mode]} #{entry[:sha1]} #{entry[:filename]}\n"
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|