git-object-browser 0.0.3 → 0.0.4

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 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