rubygems-update 0.9.0 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of rubygems-update might be problematic. Click here for more details.
- data/.document +4 -0
- data/ChangeLog +458 -0
- data/GPL.txt +340 -0
- data/LICENSE.txt +53 -0
- data/Rakefile +26 -10
- data/TODO +0 -1
- data/bin/gem_server +2 -434
- data/bin/gemlock +1 -1
- data/bin/index_gem_repository.rb +34 -12
- data/examples/application/an-app.gemspec +4 -2
- data/examples/application/ext/Makefile +139 -0
- data/examples/application/ext/extconf.rb +3 -0
- data/examples/application/ext/foo.c +1 -0
- data/lib/gemconfigure.rb +2 -2
- data/lib/rubygems.rb +85 -46
- data/lib/rubygems/cmd_manager.rb +14 -11
- data/lib/rubygems/command.rb +18 -9
- data/lib/rubygems/config_file.rb +17 -16
- data/lib/rubygems/custom_require.rb +7 -12
- data/lib/rubygems/dependency_list.rb +38 -38
- data/lib/rubygems/gem_commands.rb +471 -242
- data/lib/rubygems/gem_openssl.rb +1 -1
- data/lib/rubygems/gem_runner.rb +2 -1
- data/lib/rubygems/installer.rb +189 -143
- data/lib/rubygems/package.rb +625 -621
- data/lib/rubygems/remote_fetcher.rb +142 -0
- data/lib/rubygems/remote_installer.rb +85 -465
- data/lib/rubygems/rubygems_version.rb +1 -1
- data/lib/rubygems/security.rb +54 -11
- data/lib/rubygems/server.rb +486 -0
- data/lib/rubygems/source_index.rb +187 -21
- data/lib/rubygems/source_info_cache.rb +153 -0
- data/lib/rubygems/source_info_cache_entry.rb +31 -0
- data/lib/rubygems/specification.rb +71 -30
- data/lib/rubygems/user_interaction.rb +22 -20
- data/lib/rubygems/validator.rb +8 -7
- data/lib/rubygems/version.rb +32 -17
- data/pkgs/sources/sources-0.0.1.gem +0 -0
- data/post-install.rb +42 -3
- data/scripts/gemdoc.rb +3 -3
- data/scripts/runtest.rb +1 -1
- data/scripts/upload_gemdoc.rb +11 -11
- data/setup.rb +14 -7
- data/test/brokenbuildgem.rb +35 -0
- data/test/data/a-0.0.1.gem +0 -0
- data/test/data/a-0.0.2.gem +0 -0
- data/test/data/b-0.0.2.gem +0 -0
- data/test/data/broken-1.0.0.gem +0 -0
- data/test/data/broken_build/broken-build.gemspec +20 -0
- data/test/data/broken_build/ext/extconf.rb +3 -0
- data/test/data/broken_build/ext/foo.c +1 -0
- data/test/data/c-1.2.gem +0 -0
- data/test/data/gemhome/cache/a-0.0.1.gem +0 -0
- data/test/data/gemhome/cache/a-0.0.2.gem +0 -0
- data/test/data/gemhome/cache/b-0.0.2.gem +0 -0
- data/test/data/gemhome/cache/c-1.2.gem +0 -0
- data/test/data/gemhome/gems/a-0.0.1/lib/code.rb +0 -6
- data/test/data/gemhome/gems/a-0.0.2/lib/code.rb +0 -6
- data/test/data/gemhome/gems/b-0.0.2/lib/code.rb +0 -6
- data/test/data/gemhome/gems/c-1.2/lib/code.rb +0 -6
- data/test/data/gemhome/specifications/a-0.0.1.gemspec +1 -1
- data/test/data/gemhome/specifications/a-0.0.2.gemspec +1 -1
- data/test/data/gemhome/specifications/b-0.0.2.gemspec +1 -1
- data/test/data/gemhome/specifications/c-1.2.gemspec +1 -1
- data/test/data/lib/code.rb +0 -6
- data/test/data/one/one-0.0.1.gem +0 -0
- data/test/functional.rb +24 -21
- data/test/functional_extension_gems.rb +48 -0
- data/test/functional_generate_yaml_index.rb +6 -3
- data/test/gemenvironment.rb +27 -22
- data/test/gemutilities.rb +95 -5
- data/test/insure_session.rb +2 -2
- data/test/io_capture.rb +33 -0
- data/test/test_check_command.rb +2 -2
- data/test/test_command.rb +16 -13
- data/test/test_dependency_list.rb +20 -20
- data/test/test_file_list.rb +10 -11
- data/test/test_format.rb +19 -46
- data/test/test_gem.rb +25 -0
- data/test/test_gem_ext_configure_builder.rb +88 -0
- data/test/test_gem_ext_ext_conf_builder.rb +122 -0
- data/test/test_gem_ext_rake_builder.rb +61 -0
- data/test/test_gem_outdated_command.rb +37 -0
- data/test/test_gem_source_info_cache.rb +196 -0
- data/test/test_gem_source_info_cache_entry.rb +44 -0
- data/test/test_gem_sources_command.rb +130 -0
- data/test/test_installer.rb +137 -9
- data/test/test_package.rb +521 -531
- data/test/test_parse_commands.rb +7 -7
- data/test/test_process_commands.rb +1 -1
- data/test/test_remote_fetcher.rb +187 -45
- data/test/test_remote_installer.rb +35 -52
- data/test/test_require_gem.rb +12 -12
- data/test/test_source_index.rb +194 -48
- data/test/test_specification.rb +154 -0
- data/test/test_user_interaction.rb +48 -0
- data/test/test_validator.rb +1 -1
- data/test/test_version_comparison.rb +116 -5
- metadata +33 -10
- data/lib/rubygems/incremental_fetcher.rb +0 -136
- data/lib/rubygems/loadpath_manager.rb +0 -114
- data/lib/rubygems/open-uri.rb +0 -756
- data/test/test_cached_fetcher.rb +0 -64
- data/test/test_incremental_fetcher.rb +0 -175
- data/test/test_local_cache.rb +0 -106
data/TODO
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
* support for installing binary (pre-compiled), platform-dependent gems. This already works as long as you pick the right gem manually, but I'd like the remote installer to intelligently select the right one and for the installer to throw an error (or a warning) if you attempt o install (e.g.) a Windows gem on a linux system. Requires a lot of data to be collected on platform dependency fulfillment.
|
2
2
|
* syncing gem repositories
|
3
3
|
* optional dependencies: "semitar can use REXML, but it works better if you have the ruby raptor library installed", or not so optional as in: "you need Ruby/RSS > = 1.0 OR rss > 0.91 for this library to work"
|
4
|
-
* ri data generation
|
5
4
|
* Integration with platform-native packaging systems
|
6
5
|
* MD5 summing stuff doesn't work right on the new format (0.8.0+)
|
7
6
|
* Rethink testing strategy. May need to write a document describing how to avoid doing things in unit tests that won't work outside of `pwd`
|
data/bin/gem_server
CHANGED
@@ -1,438 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
4
|
-
<?xml version="1.0" encoding="iso-8859-1"?>
|
5
|
-
<!DOCTYPE html
|
6
|
-
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
7
|
-
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
3
|
+
require 'rubygems/server'
|
8
4
|
|
9
|
-
|
10
|
-
<head>
|
11
|
-
<title>RubyGems Documentation Index</title>
|
12
|
-
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
13
|
-
<link rel="stylesheet" href="rdoc-style.css" type="text/css" media="screen" />
|
14
|
-
</head>
|
15
|
-
<body>
|
16
|
-
<div id="fileHeader">
|
17
|
-
<h1>RubyGems Documentation Index</h1>
|
18
|
-
</div>
|
19
|
-
<!-- banner header -->
|
5
|
+
Gem::Server.run ARGV
|
20
6
|
|
21
|
-
<div id="bodyContent">
|
22
|
-
<div id="contextContent">
|
23
|
-
<div id="description">
|
24
|
-
<h1>Summary</h1>
|
25
|
-
<p>There are %gem_count% gems installed:</p>
|
26
|
-
<p>
|
27
|
-
START:specs
|
28
|
-
IFNOT:is_last
|
29
|
-
<a href="#%name%">%name%</a>,
|
30
|
-
ENDIF:is_last
|
31
|
-
IF:is_last
|
32
|
-
<a href="#%name%">%name%</a>.
|
33
|
-
ENDIF:is_last
|
34
|
-
END:specs
|
35
|
-
<h1>Gems</h1>
|
36
|
-
|
37
|
-
<dl>
|
38
|
-
START:specs
|
39
|
-
<dt>
|
40
|
-
IF:first_name_entry
|
41
|
-
<a name="%name%"></a>
|
42
|
-
ENDIF:first_name_entry
|
43
|
-
<b>%name% %version%</b>
|
44
|
-
IF:rdoc_installed
|
45
|
-
<a href="%doc_path%">[rdoc]</a>
|
46
|
-
ENDIF:rdoc_installed
|
47
|
-
IFNOT:rdoc_installed
|
48
|
-
<span title="rdoc not installed">[rdoc]</span>
|
49
|
-
ENDIF:rdoc_installed
|
50
|
-
IF:homepage
|
51
|
-
<a href="%homepage%" target="_blank" title="%homepage%">[www]</a>
|
52
|
-
ENDIF:homepage
|
53
|
-
IFNOT:homepage
|
54
|
-
<span title="no homepage available">[www]</span>
|
55
|
-
ENDIF:homepage
|
56
|
-
IF:has_deps
|
57
|
-
- depends on
|
58
|
-
START:dependencies
|
59
|
-
IFNOT:is_last
|
60
|
-
<a href="#%name%" title="%version%">%name%</a>,
|
61
|
-
ENDIF:is_last
|
62
|
-
IF:is_last
|
63
|
-
<a href="#%name%" title="%version%">%name%</a>.
|
64
|
-
ENDIF:is_last
|
65
|
-
END:dependencies
|
66
|
-
ENDIF:has_deps
|
67
|
-
</dt>
|
68
|
-
<dd>
|
69
|
-
%summary%
|
70
|
-
IF:executables
|
71
|
-
<br/>
|
72
|
-
|
73
|
-
IF:only_one_executable
|
74
|
-
Executable is
|
75
|
-
ENDIF:only_one_executable
|
76
|
-
|
77
|
-
IFNOT:only_one_executable
|
78
|
-
Executables are
|
79
|
-
ENDIF:only_one_executable
|
80
|
-
|
81
|
-
START:executables
|
82
|
-
IFNOT:is_last
|
83
|
-
<span class="context-item-name">%executable%</span>,
|
84
|
-
ENDIF:is_last
|
85
|
-
IF:is_last
|
86
|
-
<span class="context-item-name">%executable%</span>.
|
87
|
-
ENDIF:is_last
|
88
|
-
END:executables
|
89
|
-
ENDIF:executables
|
90
|
-
<br/>
|
91
|
-
<br/>
|
92
|
-
</dd>
|
93
|
-
END:specs
|
94
|
-
</dl>
|
95
|
-
|
96
|
-
</div>
|
97
|
-
</div>
|
98
|
-
</div>
|
99
|
-
<div id="validator-badges">
|
100
|
-
<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
|
101
|
-
</div>
|
102
|
-
</body>
|
103
|
-
</html>
|
104
|
-
WEBPAGE
|
105
|
-
|
106
|
-
|
107
|
-
# CSS is copy & paste from rdoc-style.css, RDoc V1.0.1 - 20041108
|
108
|
-
RDOC_CSS = <<-RDOCCSS
|
109
|
-
body {
|
110
|
-
font-family: Verdana,Arial,Helvetica,sans-serif;
|
111
|
-
font-size: 90%;
|
112
|
-
margin: 0;
|
113
|
-
margin-left: 40px;
|
114
|
-
padding: 0;
|
115
|
-
background: white;
|
116
|
-
}
|
117
|
-
|
118
|
-
h1,h2,h3,h4 { margin: 0; color: #efefef; background: transparent; }
|
119
|
-
h1 { font-size: 150%; }
|
120
|
-
h2,h3,h4 { margin-top: 1em; }
|
121
|
-
|
122
|
-
a { background: #eef; color: #039; text-decoration: none; }
|
123
|
-
a:hover { background: #039; color: #eef; }
|
124
|
-
|
125
|
-
/* Override the base stylesheets Anchor inside a table cell */
|
126
|
-
td > a {
|
127
|
-
background: transparent;
|
128
|
-
color: #039;
|
129
|
-
text-decoration: none;
|
130
|
-
}
|
131
|
-
|
132
|
-
/* and inside a section title */
|
133
|
-
.section-title > a {
|
134
|
-
background: transparent;
|
135
|
-
color: #eee;
|
136
|
-
text-decoration: none;
|
137
|
-
}
|
138
|
-
|
139
|
-
/* === Structural elements =================================== */
|
140
|
-
|
141
|
-
div#index {
|
142
|
-
margin: 0;
|
143
|
-
margin-left: -40px;
|
144
|
-
padding: 0;
|
145
|
-
font-size: 90%;
|
146
|
-
}
|
147
|
-
|
148
|
-
|
149
|
-
div#index a {
|
150
|
-
margin-left: 0.7em;
|
151
|
-
}
|
152
|
-
|
153
|
-
div#index .section-bar {
|
154
|
-
margin-left: 0px;
|
155
|
-
padding-left: 0.7em;
|
156
|
-
background: #ccc;
|
157
|
-
font-size: small;
|
158
|
-
}
|
159
|
-
|
160
|
-
|
161
|
-
div#classHeader, div#fileHeader {
|
162
|
-
width: auto;
|
163
|
-
color: white;
|
164
|
-
padding: 0.5em 1.5em 0.5em 1.5em;
|
165
|
-
margin: 0;
|
166
|
-
margin-left: -40px;
|
167
|
-
border-bottom: 3px solid #006;
|
168
|
-
}
|
169
|
-
|
170
|
-
div#classHeader a, div#fileHeader a {
|
171
|
-
background: inherit;
|
172
|
-
color: white;
|
173
|
-
}
|
174
|
-
|
175
|
-
div#classHeader td, div#fileHeader td {
|
176
|
-
background: inherit;
|
177
|
-
color: white;
|
178
|
-
}
|
179
|
-
|
180
|
-
|
181
|
-
div#fileHeader {
|
182
|
-
background: #057;
|
183
|
-
}
|
184
|
-
|
185
|
-
div#classHeader {
|
186
|
-
background: #048;
|
187
|
-
}
|
188
|
-
|
189
|
-
|
190
|
-
.class-name-in-header {
|
191
|
-
font-size: 180%;
|
192
|
-
font-weight: bold;
|
193
|
-
}
|
194
|
-
|
195
|
-
|
196
|
-
div#bodyContent {
|
197
|
-
padding: 0 1.5em 0 1.5em;
|
198
|
-
}
|
199
|
-
|
200
|
-
div#description {
|
201
|
-
padding: 0.5em 1.5em;
|
202
|
-
background: #efefef;
|
203
|
-
border: 1px dotted #999;
|
204
|
-
}
|
205
|
-
|
206
|
-
div#description h1,h2,h3,h4,h5,h6 {
|
207
|
-
color: #125;;
|
208
|
-
background: transparent;
|
209
|
-
}
|
210
|
-
|
211
|
-
div#validator-badges {
|
212
|
-
text-align: center;
|
213
|
-
}
|
214
|
-
div#validator-badges img { border: 0; }
|
215
|
-
|
216
|
-
div#copyright {
|
217
|
-
color: #333;
|
218
|
-
background: #efefef;
|
219
|
-
font: 0.75em sans-serif;
|
220
|
-
margin-top: 5em;
|
221
|
-
margin-bottom: 0;
|
222
|
-
padding: 0.5em 2em;
|
223
|
-
}
|
224
|
-
|
225
|
-
|
226
|
-
/* === Classes =================================== */
|
227
|
-
|
228
|
-
table.header-table {
|
229
|
-
color: white;
|
230
|
-
font-size: small;
|
231
|
-
}
|
232
|
-
|
233
|
-
.type-note {
|
234
|
-
font-size: small;
|
235
|
-
color: #DEDEDE;
|
236
|
-
}
|
237
|
-
|
238
|
-
.xxsection-bar {
|
239
|
-
background: #eee;
|
240
|
-
color: #333;
|
241
|
-
padding: 3px;
|
242
|
-
}
|
243
|
-
|
244
|
-
.section-bar {
|
245
|
-
color: #333;
|
246
|
-
border-bottom: 1px solid #999;
|
247
|
-
margin-left: -20px;
|
248
|
-
}
|
249
|
-
|
250
|
-
|
251
|
-
.section-title {
|
252
|
-
background: #79a;
|
253
|
-
color: #eee;
|
254
|
-
padding: 3px;
|
255
|
-
margin-top: 2em;
|
256
|
-
margin-left: -30px;
|
257
|
-
border: 1px solid #999;
|
258
|
-
}
|
259
|
-
|
260
|
-
.top-aligned-row { vertical-align: top }
|
261
|
-
.bottom-aligned-row { vertical-align: bottom }
|
262
|
-
|
263
|
-
/* --- Context section classes ----------------------- */
|
264
|
-
|
265
|
-
.context-row { }
|
266
|
-
.context-item-name { font-family: monospace; font-weight: bold; color: black; }
|
267
|
-
.context-item-value { font-size: small; color: #448; }
|
268
|
-
.context-item-desc { color: #333; padding-left: 2em; }
|
269
|
-
|
270
|
-
/* --- Method classes -------------------------- */
|
271
|
-
.method-detail {
|
272
|
-
background: #efefef;
|
273
|
-
padding: 0;
|
274
|
-
margin-top: 0.5em;
|
275
|
-
margin-bottom: 1em;
|
276
|
-
border: 1px dotted #ccc;
|
277
|
-
}
|
278
|
-
.method-heading {
|
279
|
-
color: black;
|
280
|
-
background: #ccc;
|
281
|
-
border-bottom: 1px solid #666;
|
282
|
-
padding: 0.2em 0.5em 0 0.5em;
|
283
|
-
}
|
284
|
-
.method-signature { color: black; background: inherit; }
|
285
|
-
.method-name { font-weight: bold; }
|
286
|
-
.method-args { font-style: italic; }
|
287
|
-
.method-description { padding: 0 0.5em 0 0.5em; }
|
288
|
-
|
289
|
-
/* --- Source code sections -------------------- */
|
290
|
-
|
291
|
-
a.source-toggle { font-size: 90%; }
|
292
|
-
div.method-source-code {
|
293
|
-
background: #262626;
|
294
|
-
color: #ffdead;
|
295
|
-
margin: 1em;
|
296
|
-
padding: 0.5em;
|
297
|
-
border: 1px dashed #999;
|
298
|
-
overflow: hidden;
|
299
|
-
}
|
300
|
-
|
301
|
-
div.method-source-code pre { color: #ffdead; overflow: hidden; }
|
302
|
-
|
303
|
-
/* --- Ruby keyword styles --------------------- */
|
304
|
-
|
305
|
-
.standalone-code { background: #221111; color: #ffdead; overflow: hidden; }
|
306
|
-
|
307
|
-
.ruby-constant { color: #7fffd4; background: transparent; }
|
308
|
-
.ruby-keyword { color: #00ffff; background: transparent; }
|
309
|
-
.ruby-ivar { color: #eedd82; background: transparent; }
|
310
|
-
.ruby-operator { color: #00ffee; background: transparent; }
|
311
|
-
.ruby-identifier { color: #ffdead; background: transparent; }
|
312
|
-
.ruby-node { color: #ffa07a; background: transparent; }
|
313
|
-
.ruby-comment { color: #b22222; font-weight: bold; background: transparent; }
|
314
|
-
.ruby-regexp { color: #ffa07a; background: transparent; }
|
315
|
-
.ruby-value { color: #7fffd4; background: transparent; }
|
316
|
-
RDOCCSS
|
317
|
-
|
318
|
-
|
319
|
-
# gem_server and gem_server.cgi are equivalent programs that allow
|
320
|
-
# users to serve gems for consumption by `gem --remote-install`.
|
321
|
-
#
|
322
|
-
# gem_server starts an HTTP server on the given port, and serves the folowing:
|
323
|
-
# * "/" - Browsing of gem spec files for installed gems
|
324
|
-
# * "/yaml" - Full yaml dump of metadata for installed gems
|
325
|
-
# * "/gems" - Direct access to download the installable gems
|
326
|
-
#
|
327
|
-
# Usage: gem_server [-p portnum] [-d gem_path]
|
328
|
-
# port_num:: The TCP port the HTTP server will bind to
|
329
|
-
# gem_path::
|
330
|
-
# Root gem directory containing both "cache" and "specifications"
|
331
|
-
# subdirectories.
|
332
|
-
if __FILE__ == $0
|
333
|
-
require 'rubygems'
|
334
|
-
Gem.manage_gems
|
335
|
-
require 'webrick'
|
336
|
-
require 'yaml'
|
337
|
-
require 'optparse'
|
338
|
-
require 'rdoc/template'
|
339
|
-
Socket.do_not_reverse_lookup=true
|
340
|
-
options = {}
|
341
|
-
ARGV.options do |opts|
|
342
|
-
opts.on_tail("--help",
|
343
|
-
"show this message") {puts opts; exit}
|
344
|
-
opts.on('-pPORT','--port=PORT',
|
345
|
-
"Specify the port to listen on") { |options[:port]| }
|
346
|
-
opts.on('-dGEMDIR','--dir=GEMDIR',
|
347
|
-
"Specify the directory from which to serve Gems") { |options[:gemdir]| }
|
348
|
-
opts.parse!
|
349
|
-
end
|
350
|
-
|
351
|
-
s = WEBrick::HTTPServer.new(:Port => options[:port] || 8808)
|
352
|
-
s.mount_proc("/yaml") { |req, res|
|
353
|
-
fn = File.join(options[:gemdir] || Gem.dir, "specifications")
|
354
|
-
res['content-type'] = 'text/plain'
|
355
|
-
res['date'] = File.stat(fn).mtime
|
356
|
-
res.body << Gem::SourceIndex.from_gems_in(fn).to_yaml
|
357
|
-
}
|
358
|
-
|
359
|
-
s.mount_proc("/rdoc-style.css") { |req, res|
|
360
|
-
fn = File.join(options[:gemdir] || Gem.dir, "specifications")
|
361
|
-
res['content-type'] = 'text/css'
|
362
|
-
res['date'] = File.stat(fn).mtime
|
363
|
-
res.body << RDOC_CSS
|
364
|
-
}
|
365
|
-
|
366
|
-
s.mount_proc("/") { |req, res|
|
367
|
-
specs = []
|
368
|
-
specifications_dir = File.join(options[:gemdir] || Gem.dir, "specifications")
|
369
|
-
total_file_count = 0
|
370
|
-
Gem::SourceIndex.from_gems_in(specifications_dir).each do |path, spec|
|
371
|
-
total_file_count += spec.files.size
|
372
|
-
deps = spec.dependencies.collect { |dep|
|
373
|
-
{
|
374
|
-
"name" => dep.name,
|
375
|
-
"version" => dep.version_requirements.to_s,
|
376
|
-
}
|
377
|
-
}
|
378
|
-
deps = deps.sort_by { |dep| [dep["name"].downcase, dep["version"]] }
|
379
|
-
deps.last["is_last"] = true unless deps.empty?
|
380
|
-
|
381
|
-
# executables
|
382
|
-
executables = spec.executables.sort.collect { |exec| {"executable" => exec} }
|
383
|
-
executables = nil if executables.empty?
|
384
|
-
executables.last["is_last"] = true if executables
|
385
|
-
|
386
|
-
specs << {
|
387
|
-
"authors" => spec.authors.sort.join(", "),
|
388
|
-
"date" => spec.date.to_s,
|
389
|
-
"dependencies" => deps,
|
390
|
-
"doc_path" => ('/doc_root/' + spec.full_name + '/rdoc/index.html'),
|
391
|
-
"executables" => executables,
|
392
|
-
"only_one_executable" => (executables && executables.size==1),
|
393
|
-
"full_name" => spec.full_name,
|
394
|
-
"has_deps" => !deps.empty?,
|
395
|
-
"homepage" => spec.homepage,
|
396
|
-
"name" => spec.name,
|
397
|
-
"rdoc_installed" => Gem::DocManager.new(spec).rdoc_installed?,
|
398
|
-
"summary" => spec.summary,
|
399
|
-
"version" => spec.version.to_s,
|
400
|
-
}
|
401
|
-
end
|
402
|
-
specs = specs.sort_by { |spec| [spec["name"].downcase, spec["version"]] }
|
403
|
-
specs.last["is_last"] = true
|
404
|
-
|
405
|
-
# tag all specs with first_name_entry
|
406
|
-
last_spec = nil
|
407
|
-
specs.each do |spec|
|
408
|
-
is_first = last_spec.nil? || (last_spec["name"].downcase != spec["name"].downcase)
|
409
|
-
spec["first_name_entry"] = is_first
|
410
|
-
last_spec = spec
|
411
|
-
end
|
412
|
-
|
413
|
-
# create page from template
|
414
|
-
template = TemplatePage.new(DOC_TEMPLATE)
|
415
|
-
res['content-type'] = 'text/html'
|
416
|
-
template.write_html_on(
|
417
|
-
res.body,
|
418
|
-
{
|
419
|
-
"gem_count" => specs.size.to_s,
|
420
|
-
"specs" => specs,
|
421
|
-
"total_file_count" => total_file_count.to_s,
|
422
|
-
}
|
423
|
-
)
|
424
|
-
|
425
|
-
}
|
426
|
-
{
|
427
|
-
"/gems" => "/cache/",
|
428
|
-
"/doc_root" => "/doc/",
|
429
|
-
}.each do |mount_point, mount_dir|
|
430
|
-
s.mount(
|
431
|
-
mount_point,
|
432
|
-
WEBrick::HTTPServlet::FileHandler,
|
433
|
-
File.join(options[:gemdir] || Gem.dir, mount_dir),
|
434
|
-
true)
|
435
|
-
end
|
436
|
-
trap("INT") { s.shutdown; exit! }
|
437
|
-
s.start
|
438
|
-
end
|
data/bin/gemlock
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
#
|
12
12
|
# Usage: gemlock gem_name-version...
|
13
13
|
#
|
14
|
-
# gemlock will generate a list of
|
14
|
+
# gemlock will generate a list of +gem+ statements that will
|
15
15
|
# lock down the versions for the gem given in the command line. It
|
16
16
|
# will specify exact versions in the requirements list to ensure that
|
17
17
|
# the gems loaded will always be consistent. A full recursive search
|