gollum_rails 1.0.1 → 1.0.2
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.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/Gemfile.lock +10 -11
- data/HISTORY.md +6 -0
- data/README.md +5 -7
- data/gollum_rails.gemspec +7 -10
- data/lib/core_ext/string.rb +10 -0
- data/lib/gollum_rails.rb +7 -8
- data/lib/gollum_rails/page.rb +43 -30
- data/lib/grit/git-ruby/internal/pack.rb +397 -0
- metadata +11 -9
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8e56f1c38049b5c88e4774cd88ceb414d3a88e3c
|
|
4
|
+
data.tar.gz: 4238c31d63ca8597e1ed8b0e69a9aaa46a31f253
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6599a1872724fbb09a65bb489e845eef9d2b07cfd9c7e093d82eaacdbf6af6e3633c511b147cae1600f9297ab7503f7dac1a00df97e03ff9236011f79abe4dd7
|
|
7
|
+
data.tar.gz: 9a6c1f70a997384592437c2295fffab178639fdb1ef1d94c2690eacc844a6cba06db48fa8070a2813845b873d7ad6ec5950604a82b15b5c3dd748392957495d9
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,17 +1,9 @@
|
|
|
1
|
-
GIT
|
|
2
|
-
remote: git://github.com/styx/grit.git
|
|
3
|
-
revision: 2109888819d23f18cdc30c0fbb6280ec3208fa7d
|
|
4
|
-
specs:
|
|
5
|
-
grit (2.5.0)
|
|
6
|
-
diff-lcs (~> 1.1)
|
|
7
|
-
mime-types (~> 1.15)
|
|
8
|
-
posix-spawn (~> 0.3.6)
|
|
9
|
-
|
|
10
1
|
PATH
|
|
11
2
|
remote: .
|
|
12
3
|
specs:
|
|
13
|
-
gollum_rails (1.0.
|
|
4
|
+
gollum_rails (1.0.2)
|
|
14
5
|
activemodel (~> 3.2.13)
|
|
6
|
+
gitlab-grit (~> 1.0.0)
|
|
15
7
|
gollum-lib (~> 1.0.0)
|
|
16
8
|
|
|
17
9
|
GEM
|
|
@@ -57,6 +49,10 @@ GEM
|
|
|
57
49
|
erubis (2.7.0)
|
|
58
50
|
github-markdown (0.5.3)
|
|
59
51
|
github-markup (0.7.5)
|
|
52
|
+
gitlab-grit (1.0.0)
|
|
53
|
+
diff-lcs (~> 1.1)
|
|
54
|
+
mime-types (~> 1.15)
|
|
55
|
+
posix-spawn (~> 0.3.6)
|
|
60
56
|
gollum-lib (1.0.0)
|
|
61
57
|
github-markdown (~> 0.5.3)
|
|
62
58
|
github-markup (>= 0.7.5, < 1.0.0)
|
|
@@ -65,6 +61,10 @@ GEM
|
|
|
65
61
|
pygments.rb (~> 0.4.2)
|
|
66
62
|
sanitize (~> 2.0.3)
|
|
67
63
|
stringex (~> 1.5.1)
|
|
64
|
+
grit (2.5.0)
|
|
65
|
+
diff-lcs (~> 1.1)
|
|
66
|
+
mime-types (~> 1.15)
|
|
67
|
+
posix-spawn (~> 0.3.6)
|
|
68
68
|
hike (1.2.1)
|
|
69
69
|
i18n (0.6.1)
|
|
70
70
|
journey (1.0.4)
|
|
@@ -145,7 +145,6 @@ PLATFORMS
|
|
|
145
145
|
DEPENDENCIES
|
|
146
146
|
coveralls
|
|
147
147
|
gollum_rails!
|
|
148
|
-
grit!
|
|
149
148
|
rails (~> 3.2.13)
|
|
150
149
|
rr (~> 1.0.4)
|
|
151
150
|
rspec (~> 2.13.0)
|
data/HISTORY.md
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
# 1.0.2 23th April 2013
|
|
2
|
+
* added standalone compability for ruby 2.0
|
|
3
|
+
* added patches by styx
|
|
4
|
+
* added string corext for ruby2
|
|
5
|
+
* added mutex locks for ugly threadsave
|
|
6
|
+
|
|
1
7
|
# 1.0.1 5th April 2013
|
|
2
8
|
* added find_all and all for Page
|
|
3
9
|
* removed some unused functions
|
data/README.md
CHANGED
|
@@ -7,7 +7,7 @@ Gollum for Rails
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
gollum_rails combines the git-powered wiki software gollum with the extremely popular webframework rails.
|
|
10
|
-
It improves the lightweight "gollum" experience which is quite awesome.
|
|
10
|
+
It improves the lightweight "gollum" experience which is quite awesome.
|
|
11
11
|
|
|
12
12
|
with gollum_rails you can:
|
|
13
13
|
|
|
@@ -23,7 +23,6 @@ with gollum_rails you can:
|
|
|
23
23
|
- Unix like operating system (OS X, Ubuntu, Debian, and more)
|
|
24
24
|
- Will not work on Windows (see [gollum](https://github.com/github/gollum/blob/master/README.md#system-requirements))
|
|
25
25
|
|
|
26
|
-
## [RUBY >= 2.0 READ THIS](https://github.com/nirnanaaa/gollum_rails/wiki/Ruby#ruby-2.0)
|
|
27
26
|
## [Installation](https://github.com/nirnanaaa/gollum_rails/wiki/Installation)
|
|
28
27
|
|
|
29
28
|
## [Usage](https://github.com/nirnanaaa/gollum_rails/wiki/Usage)
|
|
@@ -37,11 +36,11 @@ Very cool. Just fork this repository and send me pull requests.
|
|
|
37
36
|
|
|
38
37
|
Clone the repository:
|
|
39
38
|
|
|
40
|
-
|
|
39
|
+
$ git clone git://github.com/nirnanaaa/gollum_rails.git
|
|
41
40
|
|
|
42
41
|
Run the [Bundler](http://gembundler.com/):
|
|
43
42
|
|
|
44
|
-
|
|
43
|
+
$ bundle install
|
|
45
44
|
|
|
46
45
|
|
|
47
46
|
### TESTING
|
|
@@ -51,13 +50,13 @@ All tests are stored under the `spec/` directory.
|
|
|
51
50
|
|
|
52
51
|
To run tests just use the `rspec` command:
|
|
53
52
|
|
|
54
|
-
|
|
53
|
+
$ bundle exec rspec
|
|
55
54
|
|
|
56
55
|
## LICENSE
|
|
57
56
|
|
|
58
57
|
[](http://www.gnu.org/licenses/agpl-3.0.en.html)
|
|
59
58
|
|
|
60
|
-
gollum_rails is licensed under the AGPL license.
|
|
59
|
+
gollum_rails is licensed under the AGPL license.
|
|
61
60
|
|
|
62
61
|
Copyright (C) 2013 Florian Kasper
|
|
63
62
|
|
|
@@ -73,4 +72,3 @@ GNU Affero General Public License for more details.
|
|
|
73
72
|
|
|
74
73
|
You should have received a copy of the GNU Affero General Public License
|
|
75
74
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
76
|
-
|
data/gollum_rails.gemspec
CHANGED
|
@@ -1,24 +1,20 @@
|
|
|
1
1
|
Gem::Specification.new do |s|
|
|
2
2
|
s.rubygems_version = '>= 1.3.5'
|
|
3
|
-
|
|
3
|
+
|
|
4
4
|
s.name = 'gollum_rails'
|
|
5
5
|
s.rubyforge_project = s.name
|
|
6
6
|
|
|
7
|
-
s.version = '1.0.
|
|
7
|
+
s.version = '1.0.2'
|
|
8
8
|
|
|
9
9
|
s.summary = 'Combines the benefits from Gollum and Rails'
|
|
10
10
|
s.description= 'Use all the benefits from Rails and combine them with the awesome Gollum wiki'
|
|
11
|
-
#File.read(File.join(File.dirname(__FILE__), 'README.md'))
|
|
12
11
|
|
|
13
12
|
s.add_dependency 'activemodel', '~> 3.2.13'
|
|
14
13
|
s.add_dependency 'gollum-lib', '~> 1.0.0'
|
|
15
|
-
|
|
16
|
-
#s.add_dependency 'builder', '~> 3.0.0'
|
|
17
|
-
#s.add_dependency 'rack', '~> 1.4.5'
|
|
14
|
+
s.add_dependency 'gitlab-grit', '~> 1.0.0'
|
|
18
15
|
|
|
19
16
|
s.add_development_dependency 'rspec', '~> 2.13.0'
|
|
20
|
-
s.add_development_dependency '
|
|
21
|
-
s.add_development_dependency 'rr', '~> 1.0.4'
|
|
17
|
+
s.add_development_dependency 'rr', '~> 1.0.4'
|
|
22
18
|
s.add_development_dependency 'rails', '~> 3.2.13'
|
|
23
19
|
|
|
24
20
|
s.author = 'Florian Kasper'
|
|
@@ -37,6 +33,7 @@ Gem::Specification.new do |s|
|
|
|
37
33
|
README.md
|
|
38
34
|
Rakefile
|
|
39
35
|
gollum_rails.gemspec
|
|
36
|
+
lib/core_ext/string.rb
|
|
40
37
|
lib/generators/gollum_rails/install/install_generator.rb
|
|
41
38
|
lib/generators/gollum_rails/install/templates/gollum_initializer.rb
|
|
42
39
|
lib/generators/gollum_rails/language/language_generator.rb
|
|
@@ -57,6 +54,7 @@ Gem::Specification.new do |s|
|
|
|
57
54
|
lib/gollum_rails/modules/loader.rb
|
|
58
55
|
lib/gollum_rails/page.rb
|
|
59
56
|
lib/gollum_rails/setup.rb
|
|
57
|
+
lib/grit/git-ruby/internal/pack.rb
|
|
60
58
|
spec/gollum_rails/adapters/activemodel/error_spec.rb
|
|
61
59
|
spec/gollum_rails/adapters/activemodel/naming_spec.rb
|
|
62
60
|
spec/gollum_rails/adapters/activemodel/validation_unused.rb
|
|
@@ -77,7 +75,7 @@ Gem::Specification.new do |s|
|
|
|
77
75
|
|
|
78
76
|
|
|
79
77
|
s.require_paths = %w[lib]
|
|
80
|
-
s.post_install_message = <<-END
|
|
78
|
+
s.post_install_message = <<-END
|
|
81
79
|
Important: \n
|
|
82
80
|
**********************************************
|
|
83
81
|
To use the installer just run the following command:
|
|
@@ -89,4 +87,3 @@ Gem::Specification.new do |s|
|
|
|
89
87
|
**********************************************"
|
|
90
88
|
END
|
|
91
89
|
end
|
|
92
|
-
|
data/lib/gollum_rails.rb
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
require 'rubygems'
|
|
2
2
|
require 'gollum-lib'
|
|
3
|
-
|
|
3
|
+
require 'grit/git-ruby/internal/pack'
|
|
4
|
+
require 'core_ext/string'
|
|
4
5
|
# GollumRails is a RubyGem for extending Rails and the Gollum wiki powered by github
|
|
5
6
|
# It has the ability to combine the benefits from a git powered wiki with Rails.
|
|
6
7
|
#
|
|
@@ -12,17 +13,17 @@ require 'gollum-lib'
|
|
|
12
13
|
module GollumRails
|
|
13
14
|
autoload :Page, 'gollum_rails/page'
|
|
14
15
|
autoload :Setup, 'gollum_rails/setup'
|
|
15
|
-
|
|
16
|
+
|
|
16
17
|
# GollumRails version string
|
|
17
|
-
VERSION = '1.0.
|
|
18
|
-
|
|
18
|
+
VERSION = '1.0.2'
|
|
19
|
+
|
|
19
20
|
# Simplified error
|
|
20
21
|
class Error < StandardError; end
|
|
21
22
|
|
|
22
23
|
# For use with internal gollumGem exceptions
|
|
23
|
-
#
|
|
24
|
+
#
|
|
24
25
|
class GollumInternalError < Error
|
|
25
|
-
|
|
26
|
+
|
|
26
27
|
end
|
|
27
28
|
end
|
|
28
29
|
|
|
@@ -33,5 +34,3 @@ require File.expand_path '../gollum_rails/adapters/gollum', __FILE__
|
|
|
33
34
|
#require File.expand_path '../gollum_rails/page', __FILE__
|
|
34
35
|
# load extensions
|
|
35
36
|
require File.expand_path '../gollum_rails/modules/loader', __FILE__
|
|
36
|
-
|
|
37
|
-
|
data/lib/gollum_rails/page.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require 'thread'
|
|
2
|
+
|
|
1
3
|
module GollumRails
|
|
2
4
|
|
|
3
5
|
# Main class, used to interact with rails.
|
|
@@ -12,12 +14,12 @@ module GollumRails
|
|
|
12
14
|
# * delete
|
|
13
15
|
# * find_or_initialize_by_naname
|
|
14
16
|
#
|
|
15
|
-
class Page
|
|
17
|
+
class Page
|
|
16
18
|
extend ::ActiveModel::Callbacks
|
|
17
19
|
include ::ActiveModel::Validations
|
|
18
20
|
include ::ActiveModel::Conversion
|
|
19
21
|
extend ::ActiveModel::Naming
|
|
20
|
-
|
|
22
|
+
|
|
21
23
|
|
|
22
24
|
# Callback for save
|
|
23
25
|
define_model_callbacks :save
|
|
@@ -80,7 +82,7 @@ module GollumRails
|
|
|
80
82
|
action = self.create(hash)
|
|
81
83
|
action
|
|
82
84
|
end
|
|
83
|
-
|
|
85
|
+
|
|
84
86
|
# Finds a page based on the name and specified version
|
|
85
87
|
#
|
|
86
88
|
# name - the name of the page
|
|
@@ -104,6 +106,8 @@ module GollumRails
|
|
|
104
106
|
|
|
105
107
|
end
|
|
106
108
|
|
|
109
|
+
# mutex lock for multithreading
|
|
110
|
+
attr_reader :mutex
|
|
107
111
|
|
|
108
112
|
# Initializes a new Page
|
|
109
113
|
#
|
|
@@ -111,6 +115,7 @@ module GollumRails
|
|
|
111
115
|
#
|
|
112
116
|
# commit must be given to perform any page action!
|
|
113
117
|
def initialize(attrs = {})
|
|
118
|
+
@mutex = Mutex.new
|
|
114
119
|
if Adapters::Gollum::Connector.enabled
|
|
115
120
|
attrs.each{|k,v| self.public_send("#{k}=",v)} if attrs
|
|
116
121
|
else
|
|
@@ -121,7 +126,7 @@ module GollumRails
|
|
|
121
126
|
#########
|
|
122
127
|
# Setters
|
|
123
128
|
#########
|
|
124
|
-
|
|
129
|
+
|
|
125
130
|
|
|
126
131
|
# Gets / Sets the pages name
|
|
127
132
|
attr_accessor :name
|
|
@@ -135,7 +140,7 @@ module GollumRails
|
|
|
135
140
|
# Sets the format
|
|
136
141
|
attr_writer :format
|
|
137
142
|
|
|
138
|
-
|
|
143
|
+
|
|
139
144
|
#########
|
|
140
145
|
# Getters
|
|
141
146
|
#########
|
|
@@ -151,7 +156,7 @@ module GollumRails
|
|
|
151
156
|
def page
|
|
152
157
|
@page ||= Adapters::Gollum::Connector.page_class.new
|
|
153
158
|
end
|
|
154
|
-
|
|
159
|
+
|
|
155
160
|
#############
|
|
156
161
|
# activemodel
|
|
157
162
|
#############
|
|
@@ -162,30 +167,32 @@ module GollumRails
|
|
|
162
167
|
# will detect it and returns that page instead.
|
|
163
168
|
#
|
|
164
169
|
# Examples:
|
|
165
|
-
#
|
|
170
|
+
#
|
|
166
171
|
# obj = GollumRails::Page.new <params>
|
|
167
172
|
# @article = obj.save
|
|
168
173
|
# # => Gollum::Page
|
|
169
|
-
#
|
|
174
|
+
#
|
|
170
175
|
# @article.name
|
|
171
|
-
# whatever name you have entered OR the name of the previous
|
|
176
|
+
# whatever name you have entered OR the name of the previous
|
|
172
177
|
# created page
|
|
173
|
-
#
|
|
178
|
+
#
|
|
174
179
|
#
|
|
175
180
|
# TODO:
|
|
176
181
|
# * overriding for creation(duplicates)
|
|
177
|
-
# * do not alias save! on save
|
|
178
|
-
#
|
|
182
|
+
# * do not alias save! on save
|
|
183
|
+
#
|
|
179
184
|
# Returns an instance of Gollum::Page or false
|
|
180
185
|
def save
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
186
|
+
mutex.synchronize do
|
|
187
|
+
run_callbacks :save do
|
|
188
|
+
return false unless valid?
|
|
189
|
+
begin
|
|
190
|
+
page.new_page(name,content,format,commit)
|
|
191
|
+
rescue ::Gollum::DuplicatePageError => e
|
|
192
|
+
page.page = page.find_page(name)
|
|
193
|
+
end
|
|
194
|
+
return page.page
|
|
187
195
|
end
|
|
188
|
-
return page.page
|
|
189
196
|
end
|
|
190
197
|
end
|
|
191
198
|
|
|
@@ -202,39 +209,45 @@ module GollumRails
|
|
|
202
209
|
# to initialize the instance
|
|
203
210
|
#
|
|
204
211
|
#
|
|
205
|
-
# Returns an instance of Gollum::Page
|
|
212
|
+
# Returns an instance of Gollum::Page
|
|
206
213
|
def update_attributes(hash, commit=nil)
|
|
207
|
-
|
|
208
|
-
|
|
214
|
+
mutex.synchronize do
|
|
215
|
+
run_callbacks :update do
|
|
216
|
+
page.update_page hash, get_right_commit(commit)
|
|
217
|
+
end
|
|
209
218
|
end
|
|
219
|
+
|
|
210
220
|
end
|
|
211
|
-
|
|
221
|
+
|
|
212
222
|
# Deletes current page (also available static. See below)
|
|
213
223
|
#
|
|
214
224
|
# commit - optional. If given this commit will be used instead of that one, used
|
|
215
225
|
# to initialize the instance
|
|
216
226
|
#
|
|
217
|
-
# Returns the commit id of the current action as String
|
|
227
|
+
# Returns the commit id of the current action as String
|
|
218
228
|
def delete(commit=nil)
|
|
219
|
-
|
|
220
|
-
|
|
229
|
+
mutex.synchronize do
|
|
230
|
+
run_callbacks :delete do
|
|
231
|
+
page.delete_page get_right_commit(commit)
|
|
232
|
+
end
|
|
221
233
|
end
|
|
234
|
+
|
|
222
235
|
end
|
|
223
236
|
|
|
224
237
|
# checks if entry already has been saved
|
|
225
|
-
#
|
|
238
|
+
#
|
|
226
239
|
#
|
|
227
240
|
def persisted?
|
|
228
241
|
return true if page.page.instance_of?(::Gollum::Page)
|
|
229
242
|
return false
|
|
230
243
|
end
|
|
231
244
|
# Previews the page - Mostly used if you want to see what you do before saving
|
|
232
|
-
#
|
|
245
|
+
#
|
|
233
246
|
# This is an extremely performant method!
|
|
234
|
-
# 1 rendering attempt take depending on the content about 0.001 (simple markdown)
|
|
247
|
+
# 1 rendering attempt take depending on the content about 0.001 (simple markdown)
|
|
235
248
|
# upto 0.004 (1000 chars markdown) seconds, which is quite good
|
|
236
249
|
#
|
|
237
|
-
#
|
|
250
|
+
#
|
|
238
251
|
# format - Specify the format you want to render with see {self.format_supported?}
|
|
239
252
|
# for formats
|
|
240
253
|
#
|
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
#
|
|
2
|
+
# converted from the gitrb project
|
|
3
|
+
#
|
|
4
|
+
# authors:
|
|
5
|
+
# Matthias Lederhofer <matled@gmx.net>
|
|
6
|
+
# Simon 'corecode' Schubert <corecode@fs.ei.tum.de>
|
|
7
|
+
# Scott Chacon <schacon@gmail.com>
|
|
8
|
+
#
|
|
9
|
+
# provides native ruby access to git objects and pack files
|
|
10
|
+
#
|
|
11
|
+
|
|
12
|
+
require 'zlib'
|
|
13
|
+
require 'grit/git-ruby/internal/raw_object'
|
|
14
|
+
require 'grit/git-ruby/internal/file_window'
|
|
15
|
+
|
|
16
|
+
PACK_IDX_SIGNATURE = [0xFF, 0x74, 0x4F, 0x63]
|
|
17
|
+
|
|
18
|
+
module Grit
|
|
19
|
+
module GitRuby
|
|
20
|
+
module Internal
|
|
21
|
+
class PackFormatError < StandardError
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
class PackStorage
|
|
25
|
+
OBJ_OFS_DELTA = 6
|
|
26
|
+
OBJ_REF_DELTA = 7
|
|
27
|
+
|
|
28
|
+
FanOutCount = 256
|
|
29
|
+
SHA1Size = 20
|
|
30
|
+
IdxOffsetSize = 4
|
|
31
|
+
OffsetSize = 4
|
|
32
|
+
ExtendedOffsetSize = 8
|
|
33
|
+
CrcSize = 4
|
|
34
|
+
OffsetStart = FanOutCount * IdxOffsetSize
|
|
35
|
+
SHA1Start = OffsetStart + OffsetSize
|
|
36
|
+
EntrySize = OffsetSize + SHA1Size
|
|
37
|
+
EntrySizeV2 = SHA1Size + CrcSize + OffsetSize
|
|
38
|
+
|
|
39
|
+
def initialize(file)
|
|
40
|
+
if file =~ /\.idx$/
|
|
41
|
+
file = file[0...-3] + 'pack'
|
|
42
|
+
end
|
|
43
|
+
@name = file
|
|
44
|
+
@cache = {}
|
|
45
|
+
init_pack
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def with_idx(index_file = nil)
|
|
49
|
+
index_file ||= @name[0...-4] + 'idx'
|
|
50
|
+
|
|
51
|
+
begin
|
|
52
|
+
idxfile = File.open(index_file, 'rb')
|
|
53
|
+
rescue Errno::ENOENT => boom
|
|
54
|
+
# file went away. bail out without yielding.
|
|
55
|
+
return
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# read header
|
|
59
|
+
sig = idxfile.read(4).unpack("C*")
|
|
60
|
+
ver = idxfile.read(4).unpack("N")[0]
|
|
61
|
+
|
|
62
|
+
if sig == PACK_IDX_SIGNATURE
|
|
63
|
+
if(ver != 2)
|
|
64
|
+
raise PackFormatError, "pack #@name has unknown pack file version #{ver}"
|
|
65
|
+
end
|
|
66
|
+
@version = 2
|
|
67
|
+
else
|
|
68
|
+
@version = 1
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
idx = FileWindow.new(idxfile, @version)
|
|
72
|
+
yield idx
|
|
73
|
+
idx.unmap
|
|
74
|
+
ensure
|
|
75
|
+
idxfile.close if idxfile
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def with_packfile
|
|
79
|
+
begin
|
|
80
|
+
packfile = File.open(@name, 'rb')
|
|
81
|
+
rescue Errno::ENOENT
|
|
82
|
+
# file went away. bail out without yielding.
|
|
83
|
+
return
|
|
84
|
+
end
|
|
85
|
+
yield packfile
|
|
86
|
+
ensure
|
|
87
|
+
packfile.close if packfile
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def cache_objects
|
|
91
|
+
@cache = {}
|
|
92
|
+
with_packfile do |packfile|
|
|
93
|
+
each_entry do |sha, offset|
|
|
94
|
+
data, type = unpack_object(packfile, offset, {:caching => true})
|
|
95
|
+
if data
|
|
96
|
+
@cache[sha] = RawObject.new(OBJ_TYPES[type], data)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def name
|
|
103
|
+
@name
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def close
|
|
107
|
+
# shouldnt be anything open now
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# given an index file, list out the shas that it's packfile contains
|
|
111
|
+
def get_shas
|
|
112
|
+
shas = []
|
|
113
|
+
each_sha1 { |sha| shas << sha.unpack("H*")[0] }
|
|
114
|
+
shas
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def [](sha1)
|
|
118
|
+
if obj = @cache[sha1]
|
|
119
|
+
return obj
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
offset = find_object(sha1)
|
|
123
|
+
return nil if !offset
|
|
124
|
+
@cache[sha1] = obj = parse_object(offset)
|
|
125
|
+
return obj
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def init_pack
|
|
129
|
+
with_idx do |idx|
|
|
130
|
+
@offsets = [0]
|
|
131
|
+
FanOutCount.times do |i|
|
|
132
|
+
pos = idx[i * IdxOffsetSize,IdxOffsetSize].unpack('N')[0]
|
|
133
|
+
if pos < @offsets[i]
|
|
134
|
+
raise PackFormatError, "pack #@name has discontinuous index #{i}"
|
|
135
|
+
end
|
|
136
|
+
@offsets << pos
|
|
137
|
+
end
|
|
138
|
+
@size = @offsets[-1]
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def each_entry
|
|
143
|
+
with_idx do |idx|
|
|
144
|
+
if @version == 2
|
|
145
|
+
data = read_data_v2(idx)
|
|
146
|
+
data.each do |sha1, crc, offset|
|
|
147
|
+
yield sha1, offset
|
|
148
|
+
end
|
|
149
|
+
else
|
|
150
|
+
pos = OffsetStart
|
|
151
|
+
@size.times do
|
|
152
|
+
offset = idx[pos,OffsetSize].unpack('N')[0]
|
|
153
|
+
sha1 = idx[pos+OffsetSize,SHA1Size]
|
|
154
|
+
pos += EntrySize
|
|
155
|
+
yield sha1, offset
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def read_data_v2(idx)
|
|
162
|
+
data = []
|
|
163
|
+
pos = OffsetStart
|
|
164
|
+
@size.times do |i|
|
|
165
|
+
data[i] = [idx[pos,SHA1Size], 0, 0]
|
|
166
|
+
pos += SHA1Size
|
|
167
|
+
end
|
|
168
|
+
@size.times do |i|
|
|
169
|
+
crc = idx[pos,CrcSize]
|
|
170
|
+
data[i][1] = crc
|
|
171
|
+
pos += CrcSize
|
|
172
|
+
end
|
|
173
|
+
@size.times do |i|
|
|
174
|
+
offset = idx[pos,OffsetSize].unpack('N')[0]
|
|
175
|
+
data[i][2] = offset
|
|
176
|
+
pos += OffsetSize
|
|
177
|
+
end
|
|
178
|
+
data
|
|
179
|
+
end
|
|
180
|
+
private :read_data_v2
|
|
181
|
+
|
|
182
|
+
def each_sha1
|
|
183
|
+
with_idx do |idx|
|
|
184
|
+
if @version == 2
|
|
185
|
+
data = read_data_v2(idx)
|
|
186
|
+
data.each do |sha1, crc, offset|
|
|
187
|
+
yield sha1
|
|
188
|
+
end
|
|
189
|
+
else
|
|
190
|
+
pos = SHA1Start
|
|
191
|
+
@size.times do
|
|
192
|
+
sha1 = idx[pos,SHA1Size]
|
|
193
|
+
pos += EntrySize
|
|
194
|
+
yield sha1
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def find_object_in_index(idx, sha1)
|
|
201
|
+
slot = sha1.getord(0)
|
|
202
|
+
return nil if !slot
|
|
203
|
+
first, last = @offsets[slot,2]
|
|
204
|
+
while first < last
|
|
205
|
+
mid = (first + last) / 2
|
|
206
|
+
if @version == 2
|
|
207
|
+
midsha1 = idx[OffsetStart + (mid * SHA1Size), SHA1Size]
|
|
208
|
+
cmp = midsha1 <=> sha1
|
|
209
|
+
|
|
210
|
+
if cmp < 0
|
|
211
|
+
first = mid + 1
|
|
212
|
+
elsif cmp > 0
|
|
213
|
+
last = mid
|
|
214
|
+
else
|
|
215
|
+
pos = OffsetStart + (@size * (SHA1Size + CrcSize)) + (mid * OffsetSize)
|
|
216
|
+
offset = idx[pos, OffsetSize].unpack('N')[0]
|
|
217
|
+
if offset & 0x80000000 > 0
|
|
218
|
+
offset &= 0x7fffffff
|
|
219
|
+
pos = OffsetStart + (@size * (SHA1Size + CrcSize + OffsetSize)) + (offset * ExtendedOffsetSize)
|
|
220
|
+
words = idx[pos, ExtendedOffsetSize].unpack('NN')
|
|
221
|
+
offset = (words[0] << 32) | words[1]
|
|
222
|
+
end
|
|
223
|
+
return offset
|
|
224
|
+
end
|
|
225
|
+
else
|
|
226
|
+
midsha1 = idx[SHA1Start + mid * EntrySize,SHA1Size]
|
|
227
|
+
cmp = midsha1 <=> sha1
|
|
228
|
+
|
|
229
|
+
if cmp < 0
|
|
230
|
+
first = mid + 1
|
|
231
|
+
elsif cmp > 0
|
|
232
|
+
last = mid
|
|
233
|
+
else
|
|
234
|
+
pos = OffsetStart + mid * EntrySize
|
|
235
|
+
offset = idx[pos,OffsetSize].unpack('N')[0]
|
|
236
|
+
return offset
|
|
237
|
+
end
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
nil
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
def find_object(sha1)
|
|
244
|
+
obj = nil
|
|
245
|
+
with_idx do |idx|
|
|
246
|
+
obj = find_object_in_index(idx, sha1)
|
|
247
|
+
end
|
|
248
|
+
obj
|
|
249
|
+
end
|
|
250
|
+
private :find_object
|
|
251
|
+
|
|
252
|
+
def parse_object(offset)
|
|
253
|
+
obj = nil
|
|
254
|
+
with_packfile do |packfile|
|
|
255
|
+
data, type = unpack_object(packfile, offset)
|
|
256
|
+
obj = RawObject.new(OBJ_TYPES[type], data)
|
|
257
|
+
end
|
|
258
|
+
obj
|
|
259
|
+
end
|
|
260
|
+
protected :parse_object
|
|
261
|
+
|
|
262
|
+
def unpack_object(packfile, offset, options = {})
|
|
263
|
+
obj_offset = offset
|
|
264
|
+
packfile.seek(offset)
|
|
265
|
+
|
|
266
|
+
c = packfile.read(1).getord(0)
|
|
267
|
+
size = c & 0xf
|
|
268
|
+
type = (c >> 4) & 7
|
|
269
|
+
shift = 4
|
|
270
|
+
offset += 1
|
|
271
|
+
while c & 0x80 != 0
|
|
272
|
+
c = packfile.read(1).getord(0)
|
|
273
|
+
size |= ((c & 0x7f) << shift)
|
|
274
|
+
shift += 7
|
|
275
|
+
offset += 1
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
return [false, false] if !(type == OBJ_COMMIT || type == OBJ_TREE) && options[:caching]
|
|
279
|
+
|
|
280
|
+
case type
|
|
281
|
+
when OBJ_OFS_DELTA, OBJ_REF_DELTA
|
|
282
|
+
data, type = unpack_deltified(packfile, type, offset, obj_offset, size, options)
|
|
283
|
+
#puts type
|
|
284
|
+
when OBJ_COMMIT, OBJ_TREE, OBJ_BLOB, OBJ_TAG
|
|
285
|
+
data = unpack_compressed(offset, size)
|
|
286
|
+
else
|
|
287
|
+
raise PackFormatError, "invalid type #{type}"
|
|
288
|
+
end
|
|
289
|
+
[data, type]
|
|
290
|
+
end
|
|
291
|
+
private :unpack_object
|
|
292
|
+
|
|
293
|
+
def unpack_deltified(packfile, type, offset, obj_offset, size, options = {})
|
|
294
|
+
packfile.seek(offset)
|
|
295
|
+
data = packfile.read(SHA1Size)
|
|
296
|
+
|
|
297
|
+
if type == OBJ_OFS_DELTA
|
|
298
|
+
i = 0
|
|
299
|
+
c = data.getord(i)
|
|
300
|
+
base_offset = c & 0x7f
|
|
301
|
+
while c & 0x80 != 0
|
|
302
|
+
c = data.getord(i += 1)
|
|
303
|
+
base_offset += 1
|
|
304
|
+
base_offset <<= 7
|
|
305
|
+
base_offset |= c & 0x7f
|
|
306
|
+
end
|
|
307
|
+
base_offset = obj_offset - base_offset
|
|
308
|
+
offset += i + 1
|
|
309
|
+
else
|
|
310
|
+
base_offset = find_object(data)
|
|
311
|
+
offset += SHA1Size
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
base, type = unpack_object(packfile, base_offset)
|
|
315
|
+
|
|
316
|
+
return [false, false] if !(type == OBJ_COMMIT || type == OBJ_TREE) && options[:caching]
|
|
317
|
+
|
|
318
|
+
delta = unpack_compressed(offset, size)
|
|
319
|
+
[patch_delta(base, delta), type]
|
|
320
|
+
end
|
|
321
|
+
private :unpack_deltified
|
|
322
|
+
|
|
323
|
+
def unpack_compressed(offset, destsize)
|
|
324
|
+
outdata = ""
|
|
325
|
+
with_packfile do |packfile|
|
|
326
|
+
packfile.seek(offset)
|
|
327
|
+
zstr = Zlib::Inflate.new
|
|
328
|
+
while outdata.size < destsize
|
|
329
|
+
indata = packfile.read(4096)
|
|
330
|
+
if indata.size == 0
|
|
331
|
+
raise PackFormatError, 'error reading pack data'
|
|
332
|
+
end
|
|
333
|
+
outdata << zstr.inflate(indata)
|
|
334
|
+
end
|
|
335
|
+
if outdata.size > destsize
|
|
336
|
+
raise PackFormatError, 'error reading pack data'
|
|
337
|
+
end
|
|
338
|
+
zstr.close
|
|
339
|
+
end
|
|
340
|
+
outdata
|
|
341
|
+
end
|
|
342
|
+
private :unpack_compressed
|
|
343
|
+
|
|
344
|
+
def patch_delta(base, delta)
|
|
345
|
+
src_size, pos = patch_delta_header_size(delta, 0)
|
|
346
|
+
if src_size != base.size
|
|
347
|
+
raise PackFormatError, 'invalid delta data'
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
dest_size, pos = patch_delta_header_size(delta, pos)
|
|
351
|
+
dest = ""
|
|
352
|
+
while pos < delta.size
|
|
353
|
+
c = delta.getord(pos)
|
|
354
|
+
pos += 1
|
|
355
|
+
if c & 0x80 != 0
|
|
356
|
+
pos -= 1
|
|
357
|
+
cp_off = cp_size = 0
|
|
358
|
+
cp_off = delta.getord(pos += 1) if c & 0x01 != 0
|
|
359
|
+
cp_off |= delta.getord(pos += 1) << 8 if c & 0x02 != 0
|
|
360
|
+
cp_off |= delta.getord(pos += 1) << 16 if c & 0x04 != 0
|
|
361
|
+
cp_off |= delta.getord(pos += 1) << 24 if c & 0x08 != 0
|
|
362
|
+
cp_size = delta.getord(pos += 1) if c & 0x10 != 0
|
|
363
|
+
cp_size |= delta.getord(pos += 1) << 8 if c & 0x20 != 0
|
|
364
|
+
cp_size |= delta.getord(pos += 1) << 16 if c & 0x40 != 0
|
|
365
|
+
cp_size = 0x10000 if cp_size == 0
|
|
366
|
+
pos += 1
|
|
367
|
+
dest << base[cp_off,cp_size]
|
|
368
|
+
elsif c != 0
|
|
369
|
+
dest << delta[pos,c]
|
|
370
|
+
pos += c
|
|
371
|
+
else
|
|
372
|
+
raise PackFormatError, 'invalid delta data'
|
|
373
|
+
end
|
|
374
|
+
end
|
|
375
|
+
dest
|
|
376
|
+
end
|
|
377
|
+
private :patch_delta
|
|
378
|
+
|
|
379
|
+
def patch_delta_header_size(delta, pos)
|
|
380
|
+
size = 0
|
|
381
|
+
shift = 0
|
|
382
|
+
begin
|
|
383
|
+
c = delta.getord(pos)
|
|
384
|
+
if c == nil
|
|
385
|
+
raise PackFormatError, 'invalid delta header'
|
|
386
|
+
end
|
|
387
|
+
pos += 1
|
|
388
|
+
size |= (c & 0x7f) << shift
|
|
389
|
+
shift += 7
|
|
390
|
+
end while c & 0x80 != 0
|
|
391
|
+
[size, pos]
|
|
392
|
+
end
|
|
393
|
+
private :patch_delta_header_size
|
|
394
|
+
end
|
|
395
|
+
end
|
|
396
|
+
end
|
|
397
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: gollum_rails
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.
|
|
4
|
+
version: 1.0.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Florian Kasper
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2013-04-
|
|
11
|
+
date: 2013-04-23 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activemodel
|
|
@@ -39,33 +39,33 @@ dependencies:
|
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
40
|
version: 1.0.0
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
|
-
name:
|
|
42
|
+
name: gitlab-grit
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
45
|
- - ~>
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
|
-
version:
|
|
48
|
-
type: :
|
|
47
|
+
version: 1.0.0
|
|
48
|
+
type: :runtime
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
52
|
- - ~>
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
|
-
version:
|
|
54
|
+
version: 1.0.0
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
|
-
name:
|
|
56
|
+
name: rspec
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
58
58
|
requirements:
|
|
59
59
|
- - ~>
|
|
60
60
|
- !ruby/object:Gem::Version
|
|
61
|
-
version:
|
|
61
|
+
version: 2.13.0
|
|
62
62
|
type: :development
|
|
63
63
|
prerelease: false
|
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
65
|
requirements:
|
|
66
66
|
- - ~>
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
|
-
version:
|
|
68
|
+
version: 2.13.0
|
|
69
69
|
- !ruby/object:Gem::Dependency
|
|
70
70
|
name: rr
|
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -108,6 +108,7 @@ files:
|
|
|
108
108
|
- README.md
|
|
109
109
|
- Rakefile
|
|
110
110
|
- gollum_rails.gemspec
|
|
111
|
+
- lib/core_ext/string.rb
|
|
111
112
|
- lib/generators/gollum_rails/install/install_generator.rb
|
|
112
113
|
- lib/generators/gollum_rails/install/templates/gollum_initializer.rb
|
|
113
114
|
- lib/generators/gollum_rails/language/language_generator.rb
|
|
@@ -128,6 +129,7 @@ files:
|
|
|
128
129
|
- lib/gollum_rails/modules/loader.rb
|
|
129
130
|
- lib/gollum_rails/page.rb
|
|
130
131
|
- lib/gollum_rails/setup.rb
|
|
132
|
+
- lib/grit/git-ruby/internal/pack.rb
|
|
131
133
|
- spec/gollum_rails/adapters/activemodel/error_spec.rb
|
|
132
134
|
- spec/gollum_rails/adapters/activemodel/naming_spec.rb
|
|
133
135
|
- spec/gollum_rails/adapters/activemodel/validation_unused.rb
|