git-object-browser 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/htdocs/js/main.js +4 -7
- data/htdocs/templates/objects.html +1 -1
- data/lib/git-object-browser/models/index.rb +3 -1
- data/lib/git-object-browser/models/index_entry.rb +64 -28
- data/lib/git-object-browser/models/packed_object.rb +2 -0
- 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 +16 -0
- metadata +5 -3
data/htdocs/js/main.js
CHANGED
@@ -154,16 +154,13 @@ function GitCtrl($scope, $location, $routeParams, GitResource, PackedObjectResou
|
|
154
154
|
'gid',
|
155
155
|
'size',
|
156
156
|
'sha1',
|
157
|
+
'assume_valid_flag',
|
158
|
+
'extended_flag',
|
159
|
+
'stage',
|
157
160
|
'path'
|
158
161
|
]
|
159
162
|
|
160
|
-
if (version ==
|
161
|
-
keys = keys.concat([
|
162
|
-
'assume_valid_flag',
|
163
|
-
'extended_flag',
|
164
|
-
'stage',
|
165
|
-
]);
|
166
|
-
} else {
|
163
|
+
if (version == 3) {
|
167
164
|
keys = keys.concat([
|
168
165
|
'skip_worktree',
|
169
166
|
'intent_to_add',
|
@@ -7,7 +7,7 @@
|
|
7
7
|
<tr data-ng-repeat="rows in objectTable">
|
8
8
|
<td data-ng-repeat="cel in rows">
|
9
9
|
<span data-ng-switch="cel.type">
|
10
|
-
<span data-ng-switch-when="empty">{{cel.basename}}</span>
|
10
|
+
<span data-ng-switch-when="empty"><span style="color:#eee">{{cel.basename}}</span></span>
|
11
11
|
<span data-ng-switch-default><a href="/#/.git/objects/{{cel.basename}}">{{cel.basename}}</a></span>
|
12
12
|
</span>
|
13
13
|
</td>
|
@@ -28,8 +28,10 @@ module GitObjectBrowser
|
|
28
28
|
|
29
29
|
def parse_entries
|
30
30
|
entries = []
|
31
|
+
last_path = nil
|
31
32
|
@entry_count.times do |i|
|
32
|
-
entries << IndexEntry.new(@in, @version)
|
33
|
+
entries << IndexEntry.new(@in, @version, last_path)
|
34
|
+
last_path = entries.last.path
|
33
35
|
end
|
34
36
|
return entries
|
35
37
|
end
|
@@ -11,58 +11,94 @@ module GitObjectBrowser
|
|
11
11
|
attr_reader :skip_worktree, :intent_to_add
|
12
12
|
attr_reader :name_length
|
13
13
|
|
14
|
-
def initialize(input, version)
|
14
|
+
def initialize(input, version, last_path = nil)
|
15
15
|
super(input)
|
16
16
|
@version = version
|
17
|
+
@last_path = last_path
|
17
18
|
parse
|
18
19
|
end
|
19
20
|
|
20
21
|
def parse
|
21
|
-
@ctime = int
|
22
|
-
@cnano = int
|
23
|
-
@mtime = int
|
24
|
-
@mnano = int
|
25
|
-
@dev = int
|
26
|
-
@ino = int
|
22
|
+
@ctime = int # 4
|
23
|
+
@cnano = int # 8
|
24
|
+
@mtime = int # 12
|
25
|
+
@mnano = int # 16
|
26
|
+
@dev = int # 20
|
27
|
+
@ino = int # 24
|
28
|
+
parse_mode # 28
|
29
|
+
@uid = int # 32
|
30
|
+
@gid = int # 36
|
31
|
+
@size = int # 40
|
32
|
+
@sha1 = hex(20) # 60
|
33
|
+
parse_flags # 62
|
34
|
+
parse_path
|
35
|
+
end
|
27
36
|
|
28
|
-
|
37
|
+
def parse_mode
|
38
|
+
mode = binstr(4)
|
29
39
|
@object_type = mode[16..19]
|
30
40
|
unused = mode[20..22]
|
31
41
|
@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
42
|
end
|
43
|
+
private :parse_mode
|
40
44
|
|
41
45
|
def parse_flags
|
42
46
|
flags = binstr(2)
|
43
|
-
|
44
|
-
|
45
|
-
|
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
|
47
|
+
@assume_valid_flag = flags[0..0].to_i
|
48
|
+
@extended_flag = flags[1..1].to_i
|
49
|
+
@stage = flags[2..3]
|
52
50
|
@name_length = ["0000" + flags[4..15]].pack("B*").unpack("n")[0]
|
51
|
+
if @version == 3 && @extended_flag == 1
|
52
|
+
exended = binstr(2)
|
53
|
+
reserved = extended[0..0]
|
54
|
+
@skip_worktree = extended[1..1]
|
55
|
+
@intent_to_add = extended[2..2]
|
56
|
+
end
|
53
57
|
end
|
58
|
+
private :parse_flags
|
54
59
|
|
55
|
-
# path: 2 + 8 * n bytes (nul pannding)
|
56
60
|
def parse_path
|
61
|
+
if @version == 2 || @version == 3
|
62
|
+
parse_path_v2
|
63
|
+
elsif @version == 4
|
64
|
+
parse_path_v4
|
65
|
+
end
|
66
|
+
end
|
67
|
+
private :parse_path
|
68
|
+
|
69
|
+
# path: 2 + 8 * n bytes (nul pannding)
|
70
|
+
def parse_path_v2
|
57
71
|
token = raw(2) # 64 bytes
|
58
|
-
path = ""
|
72
|
+
@path = ""
|
59
73
|
begin
|
60
|
-
path += token.unpack("Z*").first
|
74
|
+
@path += token.unpack("Z*").first
|
61
75
|
break if token.unpack("C*").last == 0
|
62
76
|
end while(token = raw(8))
|
63
|
-
return path
|
64
77
|
end
|
78
|
+
private :parse_path_v2
|
65
79
|
|
80
|
+
def parse_path_v4
|
81
|
+
(chop_size, _) = parse_chop_size()
|
82
|
+
@path = find_char("\0")
|
83
|
+
if chop_size > 0
|
84
|
+
@path = @last_path[0 .. chop_size * -1 - 1] + @path
|
85
|
+
end
|
86
|
+
end
|
87
|
+
private :parse_path_v4
|
88
|
+
|
89
|
+
def parse_chop_size
|
90
|
+
value = -1
|
91
|
+
value_size = 0
|
92
|
+
begin
|
93
|
+
b = byte
|
94
|
+
value_size += 1
|
95
|
+
continue = b & 0b10000000
|
96
|
+
low_value = b & 0b01111111
|
97
|
+
value = ((value + 1) << 7) | low_value
|
98
|
+
end while continue != 0
|
99
|
+
return [value, value_size]
|
100
|
+
end
|
101
|
+
private :parse_chop_size
|
66
102
|
|
67
103
|
def to_hash
|
68
104
|
return {
|
@@ -206,7 +206,9 @@ module GitObjectBrowser
|
|
206
206
|
end
|
207
207
|
|
208
208
|
# sha1_file.c get_delta_base
|
209
|
+
# https://github.com/git/git/blob/master/sha1_file.c
|
209
210
|
# unpack-objects.c unpack_delta_entry
|
211
|
+
# https://github.com/git/git/blob/master/builtin/unpack-objects.c
|
210
212
|
def parse_delta_offset
|
211
213
|
offset = -1
|
212
214
|
hdr_size = 0
|
Binary file
|
@@ -38,5 +38,21 @@ module GitObjectBrowser::Models
|
|
38
38
|
extensions.length.should eq 1
|
39
39
|
end
|
40
40
|
|
41
|
+
context 'when the index version is 4' do
|
42
|
+
let(:infile) { '003-version-4' }
|
43
|
+
|
44
|
+
it 'should parse header' do
|
45
|
+
index = subject.parse.to_hash
|
46
|
+
index[:version].should eq 4
|
47
|
+
index[:entry_count].should eq index[:entries].length
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should parse pathes' do
|
51
|
+
index = subject.parse.to_hash
|
52
|
+
entries = index[:entries]
|
53
|
+
expect = ['test.txt', 'test2.txt', 'test3.txt']
|
54
|
+
entries.map {|entry| entry[:path]}.should eq expect
|
55
|
+
end
|
56
|
+
end
|
41
57
|
end
|
42
58
|
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.4
|
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-02-
|
12
|
+
date: 2013-02-11 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Browse git raw objects.
|
15
15
|
email:
|
@@ -98,6 +98,7 @@ files:
|
|
98
98
|
- spec/fixtures/generate_worktree.sh
|
99
99
|
- spec/fixtures/git/indexes/001
|
100
100
|
- spec/fixtures/git/indexes/002-empty-tree-extension
|
101
|
+
- spec/fixtures/git/indexes/003-version-4
|
101
102
|
- spec/fixtures/git/plain_file
|
102
103
|
- spec/fixtures/json/blob.json
|
103
104
|
- spec/fixtures/json/merge-a.json
|
@@ -184,7 +185,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
184
185
|
version: '0'
|
185
186
|
segments:
|
186
187
|
- 0
|
187
|
-
hash:
|
188
|
+
hash: 2893578660749395643
|
188
189
|
requirements: []
|
189
190
|
rubyforge_project:
|
190
191
|
rubygems_version: 1.8.24
|
@@ -195,6 +196,7 @@ test_files:
|
|
195
196
|
- spec/fixtures/generate_worktree.sh
|
196
197
|
- spec/fixtures/git/indexes/001
|
197
198
|
- spec/fixtures/git/indexes/002-empty-tree-extension
|
199
|
+
- spec/fixtures/git/indexes/003-version-4
|
198
200
|
- spec/fixtures/git/plain_file
|
199
201
|
- spec/fixtures/json/blob.json
|
200
202
|
- spec/fixtures/json/merge-a.json
|