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 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 == 2) {
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 # 16 byte
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
- mode = binstr(4)
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
- 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
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
@@ -1,3 +1,3 @@
1
1
  module GitObjectBrowser
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -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.3
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-10 00:00:00.000000000 Z
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: -211213857821396965
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