smeagol 0.2.4 → 0.3.0
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/README.md +1 -1
- data/bin/smeagol +21 -5
- data/bin/smeagold +6 -0
- data/lib/smeagol/app.rb +19 -5
- data/lib/smeagol/option_parser.rb +10 -3
- data/lib/smeagol/public/smeagol/html5.js +5 -0
- data/lib/smeagol/templates/page.mustache +4 -0
- data/lib/smeagol/updater.rb +10 -7
- data/lib/smeagol/version.rb +1 -1
- data/test/helper.rb +0 -1
- metadata +59 -84
data/README.md
CHANGED
@@ -8,7 +8,7 @@ Smeagol is a server that can run a read-only version of a
|
|
8
8
|
to maintain a standalone copy of a Github wiki but you want to update it through
|
9
9
|
the Github interface.
|
10
10
|
|
11
|
-
|
11
|
+
Smeagol follows the rules of [Semantic Versioning](http://semver.org/) and uses
|
12
12
|
[TomDoc](http://tomdoc.org/) for inline documentation.
|
13
13
|
|
14
14
|
|
data/bin/smeagol
CHANGED
@@ -1,28 +1,44 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require 'rubygems'
|
3
|
-
require '
|
3
|
+
require 'daemons'
|
4
4
|
require 'optparse'
|
5
5
|
require 'ostruct'
|
6
6
|
require File.expand_path(File.dirname(__FILE__) + '/../lib/smeagol')
|
7
7
|
|
8
|
+
# Catch signals
|
9
|
+
Signal.trap('TERM') do
|
10
|
+
Process.kill('KILL', 0)
|
11
|
+
end
|
12
|
+
|
8
13
|
# Parse options
|
9
14
|
options = Smeagol::OptionParser.parse(ARGV)
|
10
15
|
|
16
|
+
# Show repositories being served
|
17
|
+
$stderr.puts "\n Now serving:"
|
18
|
+
options.repositories.each do |repository|
|
19
|
+
$stderr.puts " #{repository.path} (#{repository.cname})"
|
20
|
+
end
|
21
|
+
$stderr.puts "\n"
|
22
|
+
|
11
23
|
# Run the auto update process
|
12
24
|
if options.git && options.auto_update
|
13
25
|
Thread.new do
|
14
26
|
while true do
|
15
27
|
sleep 86400
|
16
|
-
|
28
|
+
options.repositories.each do |repository|
|
29
|
+
Smeagol::Updater.update(options.git, repository.path)
|
30
|
+
end
|
17
31
|
end
|
18
32
|
end
|
19
33
|
end
|
20
34
|
|
21
|
-
# Clear the
|
22
|
-
|
35
|
+
# Clear the caches
|
36
|
+
options.repositories.each do |repository|
|
37
|
+
Smeagol::Cache.new(Gollum::Wiki.new(repository.path)).clear()
|
38
|
+
end
|
23
39
|
|
24
40
|
# Run the web server
|
25
|
-
Smeagol::App.set(:
|
41
|
+
Smeagol::App.set(:repositories, options.repositories)
|
26
42
|
Smeagol::App.set(:git, options.git)
|
27
43
|
Smeagol::App.set(:cache_enabled, options.cache_enabled)
|
28
44
|
Smeagol::App.run!(:port => options.port)
|
data/bin/smeagold
ADDED
data/lib/smeagol/app.rb
CHANGED
@@ -24,7 +24,7 @@ module Smeagol
|
|
24
24
|
|
25
25
|
# Update the gollum repository
|
26
26
|
get '/update' do
|
27
|
-
if Updater.update(settings.git,
|
27
|
+
if Updater.update(settings.git, repository)
|
28
28
|
'ok'
|
29
29
|
else
|
30
30
|
'error'
|
@@ -37,10 +37,10 @@ module Smeagol
|
|
37
37
|
name = "Home" if name == ""
|
38
38
|
name = name.gsub(/\/+$/, '')
|
39
39
|
name = File.sanitize_path(name)
|
40
|
-
file_path = "#{
|
40
|
+
file_path = "#{repository.path}/#{name}"
|
41
41
|
|
42
42
|
# Load the wiki settings
|
43
|
-
wiki = Smeagol::Wiki.new(
|
43
|
+
wiki = Smeagol::Wiki.new(repository.path)
|
44
44
|
cache = Smeagol::Cache.new(wiki)
|
45
45
|
|
46
46
|
# First check the cache
|
@@ -78,8 +78,8 @@ module Smeagol
|
|
78
78
|
# repository if it exists. Otherwise, it uses the default page.mustache file
|
79
79
|
# packaged with the Smeagol library.
|
80
80
|
def page_template
|
81
|
-
if File.exists?("#{
|
82
|
-
IO.read("#{
|
81
|
+
if File.exists?("#{repository.path}/page.mustache")
|
82
|
+
IO.read("#{repository.path}/page.mustache")
|
83
83
|
else
|
84
84
|
IO.read(File.join(File.dirname(__FILE__), 'templates/page.mustache'))
|
85
85
|
end
|
@@ -98,5 +98,19 @@ module Smeagol
|
|
98
98
|
|
99
99
|
return 'text/plain'
|
100
100
|
end
|
101
|
+
|
102
|
+
# Determines the repository to use based on the hostname.
|
103
|
+
def repository
|
104
|
+
# Match on hostname
|
105
|
+
settings.repositories.each do |repository|
|
106
|
+
next if repository.cname.nil?
|
107
|
+
if repository.cname.upcase == request.host.upcase
|
108
|
+
return repository
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
# If no match, use the first repository as the default
|
113
|
+
settings.repositories.first
|
114
|
+
end
|
101
115
|
end
|
102
116
|
end
|
@@ -57,8 +57,16 @@ module Smeagol
|
|
57
57
|
# Attempt to find the git binary
|
58
58
|
update_git_path(opts)
|
59
59
|
|
60
|
-
#
|
61
|
-
opts.
|
60
|
+
# Append repositories from the command line.
|
61
|
+
opts.repositories ||= []
|
62
|
+
if !args.first.nil?
|
63
|
+
opts.repositories.unshift({:path => args.first}.to_ostruct)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Set repository to present working directory if no paths specified.
|
67
|
+
if opts.repositories.empty?
|
68
|
+
opts.repositories = [{:path => Dir.pwd}.to_ostruct]
|
69
|
+
end
|
62
70
|
|
63
71
|
# Merge all options
|
64
72
|
return opts
|
@@ -96,7 +104,6 @@ module Smeagol
|
|
96
104
|
end
|
97
105
|
|
98
106
|
config = YAML.load(IO.read(path))
|
99
|
-
p config
|
100
107
|
end
|
101
108
|
|
102
109
|
return config
|
@@ -0,0 +1,5 @@
|
|
1
|
+
// html5shiv MIT @rem remysharp.com/html5-enabling-script
|
2
|
+
// iepp v1.5.1 MIT @jon_neal iecss.com/print-protector
|
3
|
+
/*@cc_on(function(p,e){var q=e.createElement("div");q.innerHTML="<z>i</z>";q.childNodes.length!==1&&function(){function r(a,b){if(g[a])g[a].styleSheet.cssText+=b;else{var c=s[l],d=e[j]("style");d.media=a;c.insertBefore(d,c[l]);g[a]=d;r(a,b)}}function t(a,b){for(var c=new RegExp("\\b("+m+")\\b(?!.*[;}])","gi"),d=function(k){return".iepp_"+k},h=-1;++h<a.length;){b=a[h].media||b;t(a[h].imports,b);r(b,a[h].cssText.replace(c,d))}}for(var s=e.documentElement,i=e.createDocumentFragment(),g={},m="abbr article aside audio canvas details figcaption figure footer header hgroup mark meter nav output progress section summary time video".replace(/ /g, '|'),
|
4
|
+
n=m.split("|"),f=[],o=-1,l="firstChild",j="createElement";++o<n.length;){e[j](n[o]);i[j](n[o])}i=i.appendChild(e[j]("div"));p.attachEvent("onbeforeprint",function(){for(var a,b=e.getElementsByTagName("*"),c,d,h=new RegExp("^"+m+"$","i"),k=-1;++k<b.length;)if((a=b[k])&&(d=a.nodeName.match(h))){c=new RegExp("^\\s*<"+d+"(.*)\\/"+d+">\\s*$","i");i.innerHTML=a.outerHTML.replace(/\r|\n/g," ").replace(c,a.currentStyle.display=="block"?"<div$1/div>":"<span$1/span>");c=i.childNodes[0];c.className+=" iepp_"+
|
5
|
+
d;c=f[f.length]=[a,c];a.parentNode.replaceChild(c[1],c[0])}t(e.styleSheets,"all")});p.attachEvent("onafterprint",function(){for(var a=-1,b;++a<f.length;)f[a][1].parentNode.replaceChild(f[a][0],f[a][1]);for(b in g)s[l].removeChild(g[b]);g={};f=[]})}()})(this,document);@*/
|
@@ -5,6 +5,10 @@
|
|
5
5
|
<title>{{wiki_title}} - {{page_title}}</title>
|
6
6
|
<link rel="stylesheet" href="/smeagol/main.css" type="text/css"/>
|
7
7
|
<link rel="stylesheet" href="/smeagol/pygment.css" type="text/css"/>
|
8
|
+
|
9
|
+
<!--[if lt IE 9]>
|
10
|
+
<script src="/smeagol/html5.js"></script>
|
11
|
+
<![endif]-->
|
8
12
|
</head>
|
9
13
|
|
10
14
|
<body>
|
data/lib/smeagol/updater.rb
CHANGED
@@ -3,19 +3,22 @@ module Smeagol
|
|
3
3
|
# Public: Updates the repository that the server is point at.
|
4
4
|
#
|
5
5
|
# git - The path to the git binary.
|
6
|
-
#
|
6
|
+
# path - The paths to the git repository to update.
|
7
7
|
#
|
8
8
|
# Returns true if successful. Otherwise returns false.
|
9
|
-
def self.update(git,
|
9
|
+
def self.update(git, path)
|
10
|
+
# TODO: Change this method to raise errors if something goes wrong instead
|
11
|
+
# of returning a status.
|
12
|
+
|
10
13
|
# If the git executable is available, pull from master and check status.
|
11
|
-
if !git.nil? && !
|
12
|
-
output = `cd #{
|
13
|
-
|
14
|
+
if !git.nil? && !path.nil?
|
15
|
+
output = `cd #{path} && #{git} pull origin master 2>/dev/null`
|
16
|
+
|
14
17
|
# Write update to log if something happened
|
15
18
|
if output.index('Already up-to-date').nil?
|
16
|
-
puts "==Repository updated at #{Time.new()}=="
|
19
|
+
$stderr.puts "==Repository updated at #{Time.new()} : #{path}=="
|
17
20
|
end
|
18
|
-
|
21
|
+
|
19
22
|
return $? == 0
|
20
23
|
# Otherwise return false.
|
21
24
|
else
|
data/lib/smeagol/version.rb
CHANGED
data/test/helper.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smeagol
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ben Johnson
|
@@ -15,27 +15,13 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-10-01 00:00:00 -06:00
|
19
19
|
default_executable: smeagol
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
-
|
23
|
-
none: false
|
24
|
-
requirements:
|
25
|
-
- - ~>
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
hash: 23
|
28
|
-
segments:
|
29
|
-
- 1
|
30
|
-
- 0
|
31
|
-
- 0
|
32
|
-
version: 1.0.0
|
33
|
-
requirement: *id001
|
34
|
-
type: :runtime
|
35
|
-
name: bundler
|
22
|
+
name: rack
|
36
23
|
prerelease: false
|
37
|
-
|
38
|
-
version_requirements: &id002 !ruby/object:Gem::Requirement
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
39
25
|
none: false
|
40
26
|
requirements:
|
41
27
|
- - "="
|
@@ -46,12 +32,12 @@ dependencies:
|
|
46
32
|
- 2
|
47
33
|
- 0
|
48
34
|
version: 1.2.0
|
49
|
-
requirement: *id002
|
50
35
|
type: :runtime
|
51
|
-
|
52
|
-
prerelease: false
|
36
|
+
version_requirements: *id001
|
53
37
|
- !ruby/object:Gem::Dependency
|
54
|
-
|
38
|
+
name: gollum
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
55
41
|
none: false
|
56
42
|
requirements:
|
57
43
|
- - ~>
|
@@ -62,12 +48,12 @@ dependencies:
|
|
62
48
|
- 0
|
63
49
|
- 1
|
64
50
|
version: 1.0.1
|
65
|
-
requirement: *id003
|
66
51
|
type: :runtime
|
67
|
-
|
68
|
-
prerelease: false
|
52
|
+
version_requirements: *id002
|
69
53
|
- !ruby/object:Gem::Dependency
|
70
|
-
|
54
|
+
name: sinatra
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
71
57
|
none: false
|
72
58
|
requirements:
|
73
59
|
- - ~>
|
@@ -77,12 +63,12 @@ dependencies:
|
|
77
63
|
- 1
|
78
64
|
- 0
|
79
65
|
version: "1.0"
|
80
|
-
requirement: *id004
|
81
66
|
type: :runtime
|
82
|
-
|
83
|
-
prerelease: false
|
67
|
+
version_requirements: *id003
|
84
68
|
- !ruby/object:Gem::Dependency
|
85
|
-
|
69
|
+
name: mustache
|
70
|
+
prerelease: false
|
71
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
86
72
|
none: false
|
87
73
|
requirements:
|
88
74
|
- - ~>
|
@@ -93,12 +79,12 @@ dependencies:
|
|
93
79
|
- 11
|
94
80
|
- 2
|
95
81
|
version: 0.11.2
|
96
|
-
requirement: *id005
|
97
82
|
type: :runtime
|
98
|
-
|
99
|
-
prerelease: false
|
83
|
+
version_requirements: *id004
|
100
84
|
- !ruby/object:Gem::Dependency
|
101
|
-
|
85
|
+
name: OptionParser
|
86
|
+
prerelease: false
|
87
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
102
88
|
none: false
|
103
89
|
requirements:
|
104
90
|
- - ~>
|
@@ -109,40 +95,28 @@ dependencies:
|
|
109
95
|
- 5
|
110
96
|
- 1
|
111
97
|
version: 0.5.1
|
112
|
-
requirement: *id006
|
113
98
|
type: :runtime
|
114
|
-
|
115
|
-
prerelease: false
|
99
|
+
version_requirements: *id005
|
116
100
|
- !ruby/object:Gem::Dependency
|
117
|
-
|
118
|
-
none: false
|
119
|
-
requirements:
|
120
|
-
- - ">="
|
121
|
-
- !ruby/object:Gem::Version
|
122
|
-
hash: 3
|
123
|
-
segments:
|
124
|
-
- 0
|
125
|
-
version: "0"
|
126
|
-
requirement: *id007
|
127
|
-
type: :runtime
|
128
|
-
name: rdiscount
|
101
|
+
name: daemons
|
129
102
|
prerelease: false
|
130
|
-
|
131
|
-
version_requirements: &id008 !ruby/object:Gem::Requirement
|
103
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
132
104
|
none: false
|
133
105
|
requirements:
|
134
|
-
- -
|
106
|
+
- - ~>
|
135
107
|
- !ruby/object:Gem::Version
|
136
|
-
hash:
|
108
|
+
hash: 19
|
137
109
|
segments:
|
110
|
+
- 1
|
111
|
+
- 1
|
138
112
|
- 0
|
139
|
-
version:
|
140
|
-
requirement: *id008
|
113
|
+
version: 1.1.0
|
141
114
|
type: :runtime
|
142
|
-
|
143
|
-
prerelease: false
|
115
|
+
version_requirements: *id006
|
144
116
|
- !ruby/object:Gem::Dependency
|
145
|
-
|
117
|
+
name: rake
|
118
|
+
prerelease: false
|
119
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
146
120
|
none: false
|
147
121
|
requirements:
|
148
122
|
- - ~>
|
@@ -153,12 +127,12 @@ dependencies:
|
|
153
127
|
- 8
|
154
128
|
- 3
|
155
129
|
version: 0.8.3
|
156
|
-
requirement: *id009
|
157
130
|
type: :development
|
158
|
-
|
159
|
-
prerelease: false
|
131
|
+
version_requirements: *id007
|
160
132
|
- !ruby/object:Gem::Dependency
|
161
|
-
|
133
|
+
name: minitest
|
134
|
+
prerelease: false
|
135
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
162
136
|
none: false
|
163
137
|
requirements:
|
164
138
|
- - ~>
|
@@ -169,12 +143,12 @@ dependencies:
|
|
169
143
|
- 7
|
170
144
|
- 0
|
171
145
|
version: 1.7.0
|
172
|
-
requirement: *id010
|
173
146
|
type: :development
|
174
|
-
|
175
|
-
prerelease: false
|
147
|
+
version_requirements: *id008
|
176
148
|
- !ruby/object:Gem::Dependency
|
177
|
-
|
149
|
+
name: mocha
|
150
|
+
prerelease: false
|
151
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
178
152
|
none: false
|
179
153
|
requirements:
|
180
154
|
- - ~>
|
@@ -185,12 +159,12 @@ dependencies:
|
|
185
159
|
- 9
|
186
160
|
- 8
|
187
161
|
version: 0.9.8
|
188
|
-
requirement: *id011
|
189
162
|
type: :development
|
190
|
-
|
191
|
-
prerelease: false
|
163
|
+
version_requirements: *id009
|
192
164
|
- !ruby/object:Gem::Dependency
|
193
|
-
|
165
|
+
name: cucumber
|
166
|
+
prerelease: false
|
167
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
194
168
|
none: false
|
195
169
|
requirements:
|
196
170
|
- - ~>
|
@@ -201,12 +175,12 @@ dependencies:
|
|
201
175
|
- 8
|
202
176
|
- 5
|
203
177
|
version: 0.8.5
|
204
|
-
requirement: *id012
|
205
178
|
type: :development
|
206
|
-
|
207
|
-
prerelease: false
|
179
|
+
version_requirements: *id010
|
208
180
|
- !ruby/object:Gem::Dependency
|
209
|
-
|
181
|
+
name: rspec
|
182
|
+
prerelease: false
|
183
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
210
184
|
none: false
|
211
185
|
requirements:
|
212
186
|
- - ~>
|
@@ -217,12 +191,12 @@ dependencies:
|
|
217
191
|
- 3
|
218
192
|
- 0
|
219
193
|
version: 1.3.0
|
220
|
-
requirement: *id013
|
221
194
|
type: :development
|
222
|
-
|
223
|
-
prerelease: false
|
195
|
+
version_requirements: *id011
|
224
196
|
- !ruby/object:Gem::Dependency
|
225
|
-
|
197
|
+
name: capybara
|
198
|
+
prerelease: false
|
199
|
+
requirement: &id012 !ruby/object:Gem::Requirement
|
226
200
|
none: false
|
227
201
|
requirements:
|
228
202
|
- - ~>
|
@@ -233,15 +207,14 @@ dependencies:
|
|
233
207
|
- 3
|
234
208
|
- 9
|
235
209
|
version: 0.3.9
|
236
|
-
requirement: *id014
|
237
210
|
type: :development
|
238
|
-
|
239
|
-
prerelease: false
|
211
|
+
version_requirements: *id012
|
240
212
|
description:
|
241
213
|
email:
|
242
214
|
- benbjohnson@yahoo.com
|
243
215
|
executables:
|
244
216
|
- smeagol
|
217
|
+
- smeagold
|
245
218
|
extensions: []
|
246
219
|
|
247
220
|
extra_rdoc_files: []
|
@@ -252,6 +225,7 @@ files:
|
|
252
225
|
- lib/smeagol/cache.rb
|
253
226
|
- lib/smeagol/hash.rb
|
254
227
|
- lib/smeagol/option_parser.rb
|
228
|
+
- lib/smeagol/public/smeagol/html5.js
|
255
229
|
- lib/smeagol/public/smeagol/main.css
|
256
230
|
- lib/smeagol/public/smeagol/pygment.css
|
257
231
|
- lib/smeagol/templates/page.mustache
|
@@ -267,6 +241,7 @@ files:
|
|
267
241
|
- test/test_hash.rb
|
268
242
|
- test/test_wiki.rb
|
269
243
|
- bin/smeagol
|
244
|
+
- bin/smeagold
|
270
245
|
has_rdoc: true
|
271
246
|
homepage: http://smeagolrb.info
|
272
247
|
licenses: []
|