git-object-browser 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,5 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
+ gem 'rake'
3
4
  gem 'json'
4
5
 
5
6
  # Specify your gem's dependencies in git-object-browser.gemspec
data/htdocs/js/main.js CHANGED
@@ -201,6 +201,9 @@ function GitCtrl($scope, $location, $routeParams, GitResource, PackedObjectResou
201
201
  }
202
202
  });
203
203
  $scope.object.entries = entries;
204
+ } else if (json.type == "packed_object") {
205
+ template = json.type;
206
+ $scope.unpacked = json.unpacked;
204
207
  } else {
205
208
  template = json.type;
206
209
  }
@@ -1,54 +1,83 @@
1
1
  <article>
2
- <h1 style="font-size:1.8em;"><i data-entry-icon="'object'"></i> {{path}} <small>Object</small></h1>
2
+ <h1 style="font-size:1.8em;"><i data-entry-icon="'object'"></i> {{path}} <small>Object</small></h1>
3
3
 
4
- <table class="table">
5
-
6
- <tbody>
7
- <tr><th>type</th><td>
8
- <i data-entry-icon="object.type"></i> {{object.type}}
9
- </td>
10
- </tr>
11
- <tr><th>sha1</th><td>{{object.sha1}}</td></tr>
12
- <tr><th>size</th><td>{{object.size}}</td></tr>
13
-
14
- <tr data-ng-repeat="prop in object.properties">
15
- <th>{{prop.key}}</th>
16
- <td data-ng-switch="prop.type">
17
- <span data-ng-switch-when="sha1"><a href="#/.git/{{prop.path}}">{{prop.value}}</a></span>
18
- <span data-ng-switch-when="user">{{prop.value}} <small style="color:#aaa">{{prop.date}}</small></span>
19
- <span data-ng-switch-default>{{prop.value}}</span>
20
- </td>
21
- </tr>
22
- </tbody>
4
+ <div class="tabbable">
5
+ <ul class="nav nav-tabs">
6
+ <li class="active"><a href="#parsed" data-toggle="tab">Parsed</a></li>
7
+ <li><a href="#plain" data-toggle="tab">Plain</a></li>
8
+ </ul>
9
+ <div class="tab-content">
10
+ <div class="tab-pane active" id="parsed">
23
11
 
24
- <tbody data-ng-switch="object.type">
25
- <tr data-ng-switch-when="blob"><th>content</th><td><pre>{{object.content}}</pre></td></tr>
26
- <tr data-ng-switch-when="commit"><th>message</th><td>{{object.message}}</td></tr>
27
- <tr data-ng-switch-when="tag"><th>message</th><td>{{object.message}}</td></tr>
28
- <tr data-ng-switch-when="tree"><th>entries</th><td>
12
+ <table class="table">
13
+ <tbody>
14
+ <tr>
15
+ <th>sha1</th>
16
+ <td>{{object.sha1}}</td>
17
+ </tr>
18
+ <tr>
19
+ <th>type</th>
20
+ <td><i data-entry-icon="object.type"></i> {{object.type}}</td>
21
+ </tr>
22
+ <tr>
23
+ <th>size</th>
24
+ <td>{{object.size}}</td>
25
+ </tr>
26
+ <tr data-ng-repeat="prop in object.properties">
27
+ <th>{{prop.key}}</th>
28
+ <td data-ng-switch="prop.type">
29
+ <span data-ng-switch-when="sha1"><a href="#/.git/{{prop.path}}">{{prop.value}}</a></span>
30
+ <span data-ng-switch-when="user">{{prop.value}} <small style="color:#aaa">{{prop.date}}</small></span>
31
+ <span data-ng-switch-default>{{prop.value}}</span>
32
+ </td>
33
+ </tr>
34
+ </tbody>
29
35
 
30
- <table class="table table-striped table-condensed">
31
- <thead>
32
- <tr>
33
- <th>mode</th>
34
- <th>filename</th>
35
- <th>sha1</th>
36
- </tr>
37
- </thead>
38
- <tbody>
39
- <tr data-ng-repeat="entry in object.entries">
40
- <td><i data-mode-icon="entry.mode"></i> {{entry.mode}}</td>
41
- <td>{{entry.filename}}</td>
42
- <td><a href="#" data-ref-href="entry">{{entry.sha1}}</a></td>
43
- </tr>
44
- </tbody>
36
+ <tbody data-ng-switch="object.type">
37
+ <tr data-ng-switch-when="blob">
38
+ <th>content</th>
39
+ <td><pre>{{object.content}}</pre></td>
40
+ </tr>
41
+ <tr data-ng-switch-when="commit">
42
+ <th>message</th>
43
+ <td>{{object.message}}</td>
44
+ </tr>
45
+ <tr data-ng-switch-when="tag">
46
+ <th>message</th>
47
+ <td>{{object.message}}</td>
48
+ </tr>
49
+ <tr data-ng-switch-when="tree">
50
+ <th>entries</th>
51
+ <td>
52
+ <table class="table table-striped table-condensed">
53
+ <thead>
54
+ <tr>
55
+ <th>mode</th>
56
+ <th>filename</th>
57
+ <th>sha1</th>
58
+ </tr>
59
+ </thead>
60
+ <tbody>
61
+ <tr data-ng-repeat="entry in object.entries">
62
+ <td><i data-mode-icon="entry.mode"></i> {{entry.mode}}</td>
63
+ <td>{{entry.filename}}</td>
64
+ <td><a href="#" data-ref-href="entry">{{entry.sha1}}</a></td>
65
+ </tr>
66
+ </tbody>
67
+ </table>
68
+ </td>
69
+ </tr>
70
+ </tbody>
45
71
 
46
72
  </table>
47
- </td></tr>
48
-
49
- </tbody>
50
73
 
51
- </table>
74
+ </div>
75
+ <div class="tab-pane" id="plain">
52
76
 
77
+ <pre>{{object.type}} {{object.size}}\0
78
+ {{object.content}}</pre>
53
79
 
80
+ </div>
81
+ </div>
82
+ </div>
54
83
  </article>
@@ -9,8 +9,8 @@
9
9
  <th>sha1</th>
10
10
  <th>crc32</th>
11
11
  <th><a href="" data-ng-click="orderByOffset()">offset</a></th>
12
- <th>type *</th>
13
- <th>size *</th>
12
+ <th>type</th>
13
+ <th>size</th>
14
14
  </tr>
15
15
  </thead>
16
16
  <tbody>
@@ -26,13 +26,12 @@
26
26
  <td><a href="#/{{packUrl}}?offset={{entry.offset}}">{{entry.offset}}</a></td>
27
27
  <td><i data-entry-icon="entry.type"></i> {{entry.type}}
28
28
  <span data-ng-show="entry.base_offset"><a href="#/{{packUrl}}?offset={{entry.base_offset}}">{{entry.base_offset}}</a></span>
29
- <span data-ng-show="entry.base_sha1"><a href="#/{{packUrl}}?sha1={{entry.base_sha1}}">{{entry.base_sha1.substr(0,6)}}</a></span>
29
+ <span data-ng-show="entry.base_sha1"><a data-ref-href="entry.base_sha1">{{entry.base_sha1.substr(0,6)}}</a></span>
30
30
  </td>
31
31
  <td>{{entry.size}}</td>
32
32
  </tr>
33
33
  </tbody>
34
34
  </table>
35
35
 
36
- <a href="#/.git/packed-refs" data-ng-show="limited">Show All</a>
37
36
  </article>
38
37
 
@@ -1,111 +1,120 @@
1
1
  <article>
2
2
  <h1 style="font-size:1.8em;"><i data-entry-icon="'object'"></i> {{path}} <small>Packed Object</small></h1>
3
3
 
4
+ <div class="tabbable">
5
+ <ul class="nav nav-tabs">
6
+ <li class="active"><a href="#parsed" data-toggle="tab">Parsed</a></li>
7
+ <li data-ng-show="object.object.content"><a href="#plain" data-toggle="tab">Plain</a></li>
8
+ <li data-ng-show="object.delta_commands"><a href="#deltas" data-toggle="tab">Deltas</a></li>
9
+ <li><a href="#/{{path.replace('.pack', '.idx')}}"><i class="icon-list"></i> Index</a></li>
10
+ </ul>
11
+
12
+ <div class="tab-content">
13
+ <div class="tab-pane active" id="parsed">
4
14
  <table class="table">
5
- <tbody>
6
-
7
- <tr>
8
- <th>offset</th>
9
- <td>{{object.offset}}</td>
10
- </tr>
11
-
12
- <tr data-ng-show="object.base_offset">
13
- <th>base offset</th>
14
- <td><a href="#/{{path}}?offset={{object.base_offset}}">{{object.base_offset}}</a></td>
15
- </tr>
16
-
17
- <tr data-ng-show="object.base_offset">
18
- <th>delta type</th>
19
- <td><i data-entry-icon="object.type"></i> {{object.type}}</td>
20
- </tr>
21
-
22
- <tr>
23
- <th>type</th>
24
- <td><i data-entry-icon="object.object.type"></i> {{object.object.type}}</td>
25
- </tr>
26
-
27
- <tr data-ng-show="object.base_offset">
28
- <th>base size</th>
29
- <td>{{object.base_size}}</td>
30
- </tr>
31
-
32
- <tr data-ng-show="object.base_offset">
33
- <th>delta size</th>
34
- <td>{{object.size}}</td>
35
- </tr>
36
-
37
- <tr><th>size</th><td>{{object.object.size}}</td></tr>
38
-
39
- <tr><th>sha1</th><td>{{object.object.sha1}}</td></tr>
40
-
41
- <tr data-ng-repeat="prop in object.object.properties">
42
- <th>{{prop.key}}</th>
43
- <td data-ng-switch="prop.type">
44
- <span data-ng-switch-when="sha1"><a href="#/.git/{{prop.path}}">{{prop.value}}</a></span>
45
- <span data-ng-switch-when="user">{{prop.value}} <small style="color:#aaa">{{prop.date}}</small></span>
46
- <span data-ng-switch-default>{{prop.value}}</span>
47
- </td>
48
- </tr>
49
- </tbody>
50
-
51
- <tbody data-ng-switch="object.object.type">
52
- <tr data-ng-switch-when="blob"><th>content</th><td><pre>{{object.object.content}}</pre></td></tr>
53
- <tr data-ng-switch-when="commit"><th>message</th><td>{{object.object.message}}</td></tr>
54
- <tr data-ng-switch-when="tag"><th>message</th><td>{{object.object.message}}</td></tr>
55
- <tr data-ng-switch-when="tree"><th>entries</th><td>
56
-
57
- <table class="table table-striped table-condensed">
58
- <thead>
59
- <tr>
60
- <th>mode</th>
61
- <th>filename</th>
62
- <th>sha1</th>
63
- </tr>
64
- </thead>
65
- <tbody>
66
- <tr data-ng-repeat="entry in object.object.entries">
67
- <td><i data-mode-icon="entry.mode"></i> {{entry.mode}}</td>
68
- <td>{{entry.filename}}</td>
69
- <td><a href="#" data-ref-href="entry">{{entry.sha1}}</a></td>
70
- </tr>
71
- </tbody>
15
+ <tbody>
16
+ <tr>
17
+ <!-- Object could be unpacked. -->
18
+ <th>sha1</th>
19
+ <td>{{object.object.sha1}} <a data-ref-href="object.object" data-ng-show="unpacked"><i class="icon-arrow-right"></i> unpacked</a></td>
20
+ </tr>
21
+ <tr>
22
+ <th>offset</th>
23
+ <td><a href="#/{{path}}?offset={{object.offset}}">{{object.offset}}</a></td>
24
+ </tr>
25
+ <tr data-ng-show="object.base_offset">
26
+ <th>base offset</th>
27
+ <td><a href="#/{{path}}?offset={{object.base_offset}}">{{object.base_offset}}</a></td>
28
+ </tr>
29
+ <tr data-ng-show="object.base_offset">
30
+ <th>delta type</th>
31
+ <td><i data-entry-icon="object.type"></i> {{object.type}}</td>
32
+ </tr>
33
+ <tr>
34
+ <th>type</th>
35
+ <td><i data-entry-icon="object.object.type"></i> {{object.object.type}}</td>
36
+ </tr>
37
+ <tr data-ng-show="object.base_offset">
38
+ <th>base size</th>
39
+ <td>{{object.base_size}}</td>
40
+ </tr>
41
+ <tr data-ng-show="object.base_offset">
42
+ <th>delta size</th>
43
+ <td>{{object.size}}</td>
44
+ </tr>
45
+ <tr><th>size</th><td>{{object.object.size}}</td></tr>
46
+
47
+ <tr data-ng-repeat="prop in object.object.properties">
48
+ <th>{{prop.key}}</th>
49
+ <td data-ng-switch="prop.type">
50
+ <span data-ng-switch-when="sha1"><a href="#/.git/{{prop.path}}">{{prop.value}}</a></span>
51
+ <span data-ng-switch-when="user">{{prop.value}} <small style="color:#aaa">{{prop.date}}</small></span>
52
+ <span data-ng-switch-default>{{prop.value}}</span>
53
+ </td>
54
+ </tr>
55
+ </tbody>
56
+ <table>
72
57
 
58
+ <table class="table">
59
+ <tbody data-ng-switch="object.object.type">
60
+ <tr data-ng-switch-when="blob"><th>content</th><td><pre>{{object.object.content}}</pre></td></tr>
61
+ <tr data-ng-switch-when="commit"><th>message</th><td>{{object.object.message}}</td></tr>
62
+ <tr data-ng-switch-when="tag"><th>message</th><td>{{object.object.message}}</td></tr>
63
+ <tr data-ng-switch-when="tree">
64
+ <th>entries</th>
65
+ <td>
66
+ <table class="table table-striped table-condensed">
67
+ <thead>
68
+ <tr>
69
+ <th>mode</th>
70
+ <th>filename</th>
71
+ <th>sha1</th>
72
+ </tr>
73
+ </thead>
74
+ <tbody>
75
+ <tr data-ng-repeat="entry in object.object.entries">
76
+ <td><i data-mode-icon="entry.mode"></i> {{entry.mode}}</td>
77
+ <td>{{entry.filename}}</td>
78
+ <td><a href="#" data-ref-href="entry">{{entry.sha1}}</a></td>
79
+ </tr>
80
+ </tbody>
81
+ </table>
82
+ </td>
83
+ </tr>
84
+ </tbody>
73
85
  </table>
74
- </td></tr>
75
- </tbody>
76
86
 
77
- <tbody>
87
+ </div>
88
+ <div class="tab-pane" id="deltas">
78
89
 
79
- <tr>
80
- <th>commands</th>
81
- <td>
90
+ <table class="table table-striped">
91
+ <thead>
92
+ <th>source</th>
93
+ <th>offset</th>
94
+ <th>size</th>
95
+ <th>data</th>
96
+ </thead>
97
+ <tbody>
98
+ <tr data-ng-repeat="command in object.delta_commands">
99
+ <td>{{command.source}}</td>
100
+ <td>{{command.offset}}</td>
101
+ <td>{{command.size}}</td>
102
+ <td><pre data-ng-show="command.data">{{command.data}}</pre></td>
103
+ </tr>
104
+ </tbody>
105
+ </table>
82
106
 
83
- <table class="table table-striped">
84
- <thead>
85
- <th>source</th>
86
- <th>offset</th>
87
- <th>size</th>
88
- <th>data</th>
89
- </thead>
90
- <tbody>
91
- <tr data-ng-repeat="command in object.delta_commands">
92
- <td>{{command.source}}</td>
93
- <td>{{command.offset}}</td>
94
- <td>{{command.size}}</td>
95
- <td><pre data-ng-show="command.data">{{command.data}}</pre></td>
96
- </tr>
97
- </tbody>
107
+ </div>
108
+ <div class="tab-pane" id="plain">
98
109
 
99
- </table>
110
+ <pre>{{object.object.type}} {{object.object.size}}\0
111
+ {{object.object.content}}</pre>
100
112
 
101
- </td>
102
- </tr>
113
+ </div>
114
+ </div>
115
+ </div>
103
116
 
104
117
 
105
118
 
106
- </tbody>
107
- </table>
108
119
 
109
- <a href="#/.git/packed-refs" data-ng-show="limited">Show All</a>
110
120
  </article>
111
-
@@ -1,27 +1,43 @@
1
1
  <article>
2
- <h1><i data-entry-icon="'ref'"></i> {{path}} <small>Packed References</small></h1>
2
+ <h1><i data-entry-icon="'ref'"></i> {{path}} <small>Packed References</small></h1>
3
+
4
+ <div class="tabbable">
5
+ <ul class="nav nav-tabs">
6
+ <li class="active"><a href="#parsed" data-toggle="tab">Parsed</a></li>
7
+ <li><a href="#plain" data-toggle="tab">Plain</a></li>
8
+ </ul>
9
+ <div class="tab-content">
10
+ <div class="tab-pane active" id="parsed">
3
11
 
4
12
  <table class="table table-striped">
5
- <thead>
6
- <tr>
7
- <th>sha1</th>
8
- <th>ref</th>
9
- </tr>
10
- </thead>
11
- <tbody>
12
- <tr data-ng-repeat="entry in object.entries">
13
- <td>
14
- <i data-entry-icon="'commit'" data-ng-hide="entry.tag_sha1"></i>
15
- <i data-entry-icon="'tag'" data-ng-show="entry.tag_sha1"></i>
16
- <a data-ref-href="entry">{{entry.sha1}}</a>
17
- <span data-ng-show="entry.tag_sha1"><br>
18
- <i data-entry-icon="'commit'"></i> <a data-ref-href="entry.tag_sha1">{{entry.tag_sha1}}</a>
19
- </span>
20
- </td>
21
- <td><a href="#/.git/packed-refs?ref={{entry.ref}}">{{entry.ref}}</a></td>
22
- </tr>
23
- </tbody>
13
+ <thead>
14
+ <tr>
15
+ <th>sha1</th>
16
+ <th>ref</th>
17
+ </tr>
18
+ </thead>
19
+ <tbody>
20
+ <tr data-ng-repeat="entry in object.entries">
21
+ <td>
22
+ <i data-entry-icon="'commit'" data-ng-hide="entry.tag_sha1"></i>
23
+ <i data-entry-icon="'tag'" data-ng-show="entry.tag_sha1"></i>
24
+ <a data-ref-href="entry">{{entry.sha1}}</a>
25
+ <span data-ng-show="entry.tag_sha1"><br>
26
+ <i data-entry-icon="'commit'"></i> <a data-ref-href="entry.tag_sha1">{{entry.tag_sha1}}</a>
27
+ </span>
28
+ </td>
29
+ <td><a href="#/.git/packed-refs?ref={{entry.ref}}">{{entry.ref}}</a></td>
30
+ </tr>
31
+ </tbody>
24
32
  </table>
25
-
26
33
  <a href="#/.git/packed-refs" data-ng-show="limited">Show All</a>
34
+
35
+ </div>
36
+ <div class="tab-pane" id="plain">
37
+ <pre>{{object.content}}</pre>
38
+ </div>
39
+ </div>
40
+ </div>
41
+ </article>
42
+
27
43
  </article>
@@ -1,6 +1,14 @@
1
1
  <article>
2
2
  <h1><i data-entry-icon="'ref'"></i> {{path}} <small>Reference</small></h1>
3
3
 
4
+ <div class="tabbable">
5
+ <ul class="nav nav-tabs">
6
+ <li class="active"><a href="#parsed" data-toggle="tab">Parsed</a></li>
7
+ <li><a href="#plain" data-toggle="tab">Plain</a></li>
8
+ </ul>
9
+ <div class="tab-content">
10
+ <div class="tab-pane active" id="parsed">
11
+
4
12
  <table class="table">
5
13
  <tr data-ng-show="object.sha1">
6
14
  <th>sha1</th><td><a data-ref-href="object">{{object.sha1}}</a></td>
@@ -9,4 +17,15 @@
9
17
  <th>ref</th><td><a data-ref-href="object">{{object.ref}}</a></td>
10
18
  </tr>
11
19
  </table>
20
+
21
+ </div>
22
+ <div class="tab-pane" id="plain">
23
+
24
+ <pre>{{object.content}}</pre>
25
+
26
+ </div>
27
+ </div>
28
+ </div>
29
+
30
+
12
31
  </article>
@@ -49,9 +49,9 @@ module GitObjectBrowser
49
49
 
50
50
  def to_hash
51
51
  return {
52
- "type" => "directory",
53
- "path" => @path,
54
- "entries" => @entries
52
+ :type => "directory",
53
+ :path => @path,
54
+ :entries => @entries
55
55
  }
56
56
  end
57
57
 
@@ -47,13 +47,13 @@ module GitObjectBrowser
47
47
 
48
48
  def to_hash
49
49
  return {
50
- 'type' => @type,
51
- 'sha1' => @sha1,
52
- 'size' => @size,
53
- 'entries' => @entries,
54
- 'content' => @content,
55
- 'properties' => @properties,
56
- 'message' => @message,
50
+ :type => @type,
51
+ :sha1 => @sha1,
52
+ :size => @size,
53
+ :entries => @entries,
54
+ :content => @content,
55
+ :properties => @properties,
56
+ :message => @message
57
57
  }
58
58
  end
59
59
 
@@ -65,6 +65,7 @@ module GitObjectBrowser
65
65
  private
66
66
 
67
67
  def parse_tree_entries
68
+ @content = ''
68
69
  entries = []
69
70
  loop do
70
71
  entry = {}
@@ -72,6 +73,7 @@ module GitObjectBrowser
72
73
  break if entry[:mode].empty?
73
74
  entry[:filename] = find_char "\0"
74
75
  entry[:sha1] = hex(20)
76
+ @content += "#{entry[:mode]} #{entry[:filename]}\\0\\#{entry[:sha1]}\n"
75
77
  entries << entry
76
78
  end
77
79
  return entries
@@ -86,23 +88,23 @@ module GitObjectBrowser
86
88
  line = lines.shift
87
89
  break if line.empty?
88
90
  prop = {}
89
- (prop['key'], prop['value']) = line.split(/ /, 2)
90
- if prop['value'] =~ /\A([0-9a-f]{2})([0-9a-f]{38})\z/
91
- prop['type'] = 'sha1'
92
- prop['path'] = "objects/#{ $1 }/#{ $2 }"
93
- elsif %w{author committer tagger}.include?(prop['key']) &&
91
+ (prop[:key], prop[:value]) = line.split(/ /, 2)
92
+ if prop[:value] =~ /\A([0-9a-f]{2})([0-9a-f]{38})\z/
93
+ prop[:type] = 'sha1'
94
+ prop[:path] = "objects/#{ $1 }/#{ $2 }"
95
+ elsif %w{author committer tagger}.include?(prop[:key]) &&
94
96
  # couldn't find the spec...
95
- prop['value'].to_s =~ /\A(.*) <(.*)> (\d+)(?: ((?:(?:\+|-)(?:\d{4}|\d{2}:\d{2}))|Z))?\z/
96
- prop['type'] = 'user'
97
- prop['name'] = $1.force_encoding("UTF-8")
98
- prop['name'] = '(not UTF-8)' unless prop['name'].valid_encoding?
99
- prop['email'] = $2.force_encoding("UTF-8")
100
- prop['email'] = '(not UTF-8)' unless prop['email'].valid_encoding?
101
- prop['unixtime'] = $3
102
- prop['timezone'] = $4
103
- prop['date'] = epoch($3.to_i, $4).iso8601
97
+ prop[:value].to_s =~ /\A(.*) <(.*)> (\d+)(?: ((?:(?:\+|-)(?:\d{4}|\d{2}:\d{2}))|Z))?\z/
98
+ prop[:type] = 'user'
99
+ prop[:name] = $1.force_encoding("UTF-8")
100
+ prop[:name] = '(not UTF-8)' unless prop[:name].valid_encoding?
101
+ prop[:email] = $2.force_encoding("UTF-8")
102
+ prop[:email] = '(not UTF-8)' unless prop[:email].valid_encoding?
103
+ prop[:unixtime] = $3
104
+ prop[:timezone] = $4
105
+ prop[:date] = epoch($3.to_i, $4).iso8601
104
106
  else
105
- prop['type'] = 'text'
107
+ prop[:type] = 'text'
106
108
  end
107
109
  properties << prop
108
110
  end
@@ -60,11 +60,11 @@ module GitObjectBrowser
60
60
  end
61
61
 
62
62
  return {
63
- "version" => @version,
64
- "entry_count" => @entry_count,
65
- "entries" => entries,
66
- "extensions" => extensions,
67
- "sha1" => @sha1,
63
+ :version => @version,
64
+ :entry_count => @entry_count,
65
+ :entries => entries,
66
+ :extensions => extensions,
67
+ :sha1 => @sha1,
68
68
  }
69
69
  end
70
70
 
@@ -66,27 +66,27 @@ module GitObjectBrowser
66
66
 
67
67
  def to_hash
68
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,
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
77
 
78
- "uid" => @uid,
79
- "gid" => @gid,
80
- "size" => @size,
81
- "sha1" => @sha1,
82
- "path" => @path,
78
+ :uid => @uid,
79
+ :gid => @gid,
80
+ :size => @size,
81
+ :sha1 => @sha1,
82
+ :path => @path,
83
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,
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
90
  }
91
91
  end
92
92
 
@@ -21,8 +21,8 @@ module GitObjectBrowser
21
21
 
22
22
  def to_hash
23
23
  return {
24
- "signature" => @signature,
25
- "total_length" => @total_length,
24
+ :signature => @signature,
25
+ :total_length => @total_length,
26
26
  }
27
27
  end
28
28
 
@@ -18,19 +18,19 @@ module GitObjectBrowser
18
18
  length = 0
19
19
  while (length < @total_length)
20
20
  entry = {}
21
- entry['path_component'] = find_char "\0"
22
- entry['entry_count'] = find_char " "
23
- entry['subtree_count'] = find_char "\n"
21
+ entry[:path_component] = find_char "\0"
22
+ entry[:entry_count] = find_char " "
23
+ entry[:subtree_count] = find_char "\n"
24
24
 
25
- length += entry['path_component'].bytesize + 1
26
- length += entry['entry_count'].bytesize + 1
27
- length += entry['subtree_count'].bytesize + 1
25
+ length += entry[:path_component].bytesize + 1
26
+ length += entry[:entry_count].bytesize + 1
27
+ length += entry[:subtree_count].bytesize + 1
28
28
 
29
- entry['entry_count'] = entry['entry_count'].to_i
30
- entry['subtree_count'] = entry['subtree_count'].to_i
29
+ entry[:entry_count] = entry[:entry_count].to_i
30
+ entry[:subtree_count] = entry[:subtree_count].to_i
31
31
 
32
- if 0 <= entry['entry_count']
33
- entry['sha1'] = hex(20)
32
+ if 0 <= entry[:entry_count]
33
+ entry[:sha1] = hex(20)
34
34
  length += 20
35
35
  end
36
36
  @entries << entry
@@ -41,9 +41,9 @@ module GitObjectBrowser
41
41
 
42
42
  def to_hash
43
43
  return {
44
- "signature" => @signature,
45
- "total_length" => @total_length,
46
- "entries" => @entries
44
+ :signature => @signature,
45
+ :total_length => @total_length,
46
+ :entries => @entries
47
47
  }
48
48
  end
49
49
 
@@ -121,10 +121,10 @@ module GitObjectBrowser
121
121
 
122
122
  def to_hash
123
123
  return {
124
- :fanout => @fanout,
125
- :entries => @entries,
124
+ :fanout => @fanout,
125
+ :entries => @entries,
126
126
  :packfile_sha1 => @packfile_sha1,
127
- :index_sha1 => @index_sha1,
127
+ :index_sha1 => @index_sha1,
128
128
  }
129
129
  end
130
130
 
@@ -5,6 +5,8 @@ module GitObjectBrowser
5
5
 
6
6
  class PackedRefs
7
7
  def initialize(input)
8
+ @content = input.read(nil)
9
+ input.seek(0)
8
10
  @entries = []
9
11
  while (line = input.gets) do
10
12
  next if line =~ /\A\s*#/
@@ -25,7 +27,8 @@ module GitObjectBrowser
25
27
 
26
28
  def to_hash
27
29
  return {
28
- :entries => @entries
30
+ :entries => @entries,
31
+ :content => @content
29
32
  }
30
33
  end
31
34
 
@@ -17,7 +17,7 @@ module GitObjectBrowser
17
17
  end
18
18
 
19
19
  def to_hash
20
- return { 'content' => @content }
20
+ return { :content => @content }
21
21
  end
22
22
  end
23
23
  end
@@ -5,19 +5,20 @@ module GitObjectBrowser
5
5
 
6
6
  class Ref
7
7
  def initialize(input)
8
- line = input.gets.to_s
8
+ @content = input.read(nil)
9
9
 
10
- if line =~ %r{\Aref:\s*(.+)}
10
+ if @content =~ %r{\Aref:\s*(.+)}
11
11
  @ref = $1
12
- elsif line =~ %r{\A([0-9a-f]{40})}
12
+ elsif @content =~ %r{\A([0-9a-f]{40})}
13
13
  @sha1 = $1
14
14
  end
15
15
  end
16
16
 
17
17
  def to_hash
18
18
  return {
19
- "ref" => @ref,
20
- "sha1" => @sha1
19
+ :ref => @ref,
20
+ :sha1 => @sha1,
21
+ :content => @content
21
22
  }
22
23
  end
23
24
 
@@ -65,11 +65,16 @@ module GitObjectBrowser
65
65
  def response_wrapped_object(response, type, obj)
66
66
  ok(response)
67
67
  hash = {}
68
- hash["type"] = type
69
- hash["object"] = obj.to_hash
70
- hash["root"] = @target
71
- hash["path"] = @relpath
72
- hash["wroking_dir"] = File.basename(File.dirname(@target))
68
+ hash[:type] = type
69
+ hash[:object] = obj.to_hash
70
+ hash[:root] = @target
71
+ hash[:path] = @relpath
72
+ hash[:wroking_dir] = File.basename(File.dirname(@target))
73
+
74
+ if type == 'packed_object'
75
+ sha1 = hash[:object][:object][:sha1]
76
+ hash[:unpacked] = File.exist?(File.join(@target, 'objects', sha1[0..1], sha1[2..-1]).to_s)
77
+ end
73
78
 
74
79
  response.body = ::JSON.generate(hash)
75
80
  end
@@ -1,3 +1,3 @@
1
1
  module GitObjectBrowser
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -14,7 +14,7 @@
14
14
  "sha1": "d234c5e057fe32c676ea67e8cb38f4625ddaeb54"
15
15
  }
16
16
  ],
17
- "content": null,
17
+ "content": "100644 sample-a.txt\\0\\1d3dc60b5a117054e43741d51e599ff31bb15f9f\n100644 sample.txt\\0\\d234c5e057fe32c676ea67e8cb38f4625ddaeb54\n",
18
18
  "properties": null,
19
19
  "message": null
20
20
  }
@@ -11,30 +11,30 @@ module GitObjectBrowser::Models
11
11
 
12
12
  it 'should parse header' do
13
13
  index = subject.parse.to_hash
14
- index['version'].should eq 2
15
- index['entry_count'].should eq index['entries'].length
14
+ index[:version].should eq 2
15
+ index[:entry_count].should eq index[:entries].length
16
16
  end
17
17
 
18
18
  it 'should parse entries' do
19
19
  index = subject.parse.to_hash
20
- entries = index['entries']
20
+ entries = index[:entries]
21
21
  entries.length.should eq 2
22
- entries[0]['path'].should eq 'sample-a.txt'
23
- entries[0]['sha1'].should eq '1d3dc60b5a117054e43741d51e599ff31bb15f9f'
24
- entries[0]['object_type'].should eq '1000'
25
- entries[0]['unix_permission'].should eq '644'
26
- entries[0]['size'].should eq 9
22
+ entries[0][:path].should eq 'sample-a.txt'
23
+ entries[0][:sha1].should eq '1d3dc60b5a117054e43741d51e599ff31bb15f9f'
24
+ entries[0][:object_type].should eq '1000'
25
+ entries[0][:unix_permission].should eq '644'
26
+ entries[0][:size].should eq 9
27
27
 
28
- entries[1]['path'].should eq 'sample.txt'
29
- entries[1]['sha1'].should eq 'd234c5e057fe32c676ea67e8cb38f4625ddaeb54'
30
- entries[1]['object_type'].should eq '1000'
31
- entries[1]['unix_permission'].should eq '644'
32
- entries[0]['size'].should eq 9
28
+ entries[1][:path].should eq 'sample.txt'
29
+ entries[1][:sha1].should eq 'd234c5e057fe32c676ea67e8cb38f4625ddaeb54'
30
+ entries[1][:object_type].should eq '1000'
31
+ entries[1][:unix_permission].should eq '644'
32
+ entries[0][:size].should eq 9
33
33
  end
34
34
 
35
35
  it 'should parse extensions (index_tree_extension_spec.rb tests the content)' do
36
36
  index = subject.parse.to_hash
37
- extensions = index['extensions']
37
+ extensions = index[:extensions]
38
38
  extensions.length.should eq 1
39
39
  end
40
40
 
@@ -14,18 +14,18 @@ module GitObjectBrowser::Models
14
14
 
15
15
  it 'should parse extension signature and length' do
16
16
  data = subject.parse.to_hash
17
- tree = data['extensions'][0]
18
- tree['signature'].should eq 'TREE'
19
- tree['total_length'].should eq 25
17
+ tree = data[:extensions][0]
18
+ tree[:signature].should eq 'TREE'
19
+ tree[:total_length].should eq 25
20
20
  end
21
21
 
22
22
  it 'should parse entries' do
23
- entries = subject.parse.to_hash['extensions'][0]['entries']
23
+ entries = subject.parse.to_hash[:extensions][0][:entries]
24
24
  entries.length.should eq 1
25
25
  entry = entries.first
26
- entry['sha1'].should eq 'c36491256978d26c08cd7aa97eee0f5631f96659'
27
- entry['entry_count'].should eq 2
28
- entry['subtree_count'].should eq 0
26
+ entry[:sha1].should eq 'c36491256978d26c08cd7aa97eee0f5631f96659'
27
+ entry[:entry_count].should eq 2
28
+ entry[:subtree_count].should eq 0
29
29
  end
30
30
  end
31
31
 
@@ -34,24 +34,24 @@ module GitObjectBrowser::Models
34
34
 
35
35
  it 'should parse extension signature and length' do
36
36
  data = subject.parse.to_hash
37
- tree = data['extensions'][0]
38
- tree['signature'].should eq 'TREE'
39
- tree['total_length'].should eq 6
37
+ tree = data[:extensions][0]
38
+ tree[:signature].should eq 'TREE'
39
+ tree[:total_length].should eq 6
40
40
  end
41
41
 
42
42
  it 'should return -1 entry_count' do
43
- entries = subject.parse.to_hash['extensions'][0]['entries']
43
+ entries = subject.parse.to_hash[:extensions][0][:entries]
44
44
  entries.length.should eq 1
45
45
  entry = entries.first
46
- entry['entry_count'].should eq -1
47
- entry['subtree_count'].should eq 0
48
- entry['path_component'].should eq ''
49
- entry['sha1'].should be_nil
46
+ entry[:entry_count].should eq -1
47
+ entry[:subtree_count].should eq 0
48
+ entry[:path_component].should eq ''
49
+ entry[:sha1].should be_nil
50
50
  end
51
51
 
52
52
  it 'return correct hash' do
53
53
  data = subject.parse.to_hash
54
- data['sha1'].should eq 'ad7408a5d4e6050d3b95c21d260ae568b24e4d19'
54
+ data[:sha1].should eq 'ad7408a5d4e6050d3b95c21d260ae568b24e4d19'
55
55
  end
56
56
  end
57
57
  end
@@ -5,7 +5,7 @@ module GitObjectBrowser::Models
5
5
  it 'should read content' do
6
6
  input = File.open(File.join(FIXTURES_DIR, 'git/plain_file'))
7
7
  data = PlainFile.new(input).parse.to_hash
8
- data.should eq({ 'content' => 'sample' })
8
+ data.should eq({ :content => 'sample' })
9
9
  end
10
10
  end
11
11
  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.2
4
+ version: 0.0.3
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-01-14 00:00:00.000000000 Z
12
+ date: 2013-02-10 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Browse git raw objects.
15
15
  email:
@@ -182,6 +182,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
182
182
  - - ! '>='
183
183
  - !ruby/object:Gem::Version
184
184
  version: '0'
185
+ segments:
186
+ - 0
187
+ hash: -211213857821396965
185
188
  requirements: []
186
189
  rubyforge_project:
187
190
  rubygems_version: 1.8.24