stickler 0.1.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/COPYING +339 -0
- data/HISTORY +4 -0
- data/LICENSE +54 -0
- data/README +86 -0
- data/bin/stickler +58 -0
- data/data/stickler.yml +14 -0
- data/gemspec.rb +62 -0
- data/lib/stickler.rb +19 -0
- data/lib/stickler/cli.rb +302 -0
- data/lib/stickler/configuration.rb +74 -0
- data/lib/stickler/console.rb +72 -0
- data/lib/stickler/paths.rb +62 -0
- data/lib/stickler/repository.rb +502 -0
- data/lib/stickler/source.rb +76 -0
- data/lib/stickler/source_group.rb +365 -0
- data/lib/stickler/spec_lite.rb +48 -0
- data/lib/stickler/version.rb +36 -0
- data/spec/configuration_spec.rb +68 -0
- data/spec/paths_spec.rb +25 -0
- data/spec/repository_spec.rb +55 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/version_spec.rb +17 -0
- data/tasks/announce.rake +39 -0
- data/tasks/config.rb +107 -0
- data/tasks/distribution.rake +38 -0
- data/tasks/documentation.rake +31 -0
- data/tasks/rspec.rake +29 -0
- data/tasks/rubyforge.rake +51 -0
- data/tasks/utils.rb +80 -0
- metadata +156 -0
data/bin/stickler
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'stickler'
|
5
|
+
rescue LoadError
|
6
|
+
require 'rubygems'
|
7
|
+
$: << File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
|
8
|
+
require 'stickler'
|
9
|
+
end
|
10
|
+
|
11
|
+
cli = Stickler::CLI.new(ARGV, ENV)
|
12
|
+
begin
|
13
|
+
cli.run
|
14
|
+
rescue => e
|
15
|
+
$stderr.puts "ERROR: #{e}"
|
16
|
+
$stderr.puts cli.usage.to_s
|
17
|
+
end
|
18
|
+
|
19
|
+
__END__
|
20
|
+
gem = ARGV.shift
|
21
|
+
ver = ARGV.shift || Gem::Requirement.default
|
22
|
+
|
23
|
+
require 'rubygems/source_info_cache'
|
24
|
+
require 'rubygems/dependency_list'
|
25
|
+
|
26
|
+
original_dep = Gem::Dependency.new( gem, ver )
|
27
|
+
|
28
|
+
# actually search through and find the ones for this platform
|
29
|
+
def spec_from_dependency(dep)
|
30
|
+
spec_and_source = Gem::SourceInfoCache.search_with_source(dep).reverse.first
|
31
|
+
spec = spec_and_source.first
|
32
|
+
return spec
|
33
|
+
end
|
34
|
+
|
35
|
+
dep_stack = []
|
36
|
+
dep_stack.push(spec_from_dependency(original_dep))
|
37
|
+
dep_list = Gem::DependencyList.new
|
38
|
+
seen = {}
|
39
|
+
|
40
|
+
until dep_stack.empty?
|
41
|
+
spec = dep_stack.pop
|
42
|
+
next if spec.nil? or seen[spec.name]
|
43
|
+
puts "---> #{spec.full_name}"
|
44
|
+
seen[spec.name] = true
|
45
|
+
|
46
|
+
spec.dependencies.each do |dep|
|
47
|
+
d = spec_from_dependency(dep)
|
48
|
+
next if seen[d.name]
|
49
|
+
puts "<--- #{d.full_name}"
|
50
|
+
dep_stack.push(d)
|
51
|
+
end
|
52
|
+
dep_list.add spec
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
dep_list.dependency_order.reverse.each do |s|
|
57
|
+
puts "Install #{s.full_name}"
|
58
|
+
end
|
data/data/stickler.yml
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#
|
2
|
+
# Stickler Respository configuration, this is a superset of a Gem configuration
|
3
|
+
# file so it has the same keys as Gem::ConfigFile plus some more used by
|
4
|
+
# Stickler
|
5
|
+
#
|
6
|
+
|
7
|
+
# The source that other rubygems installations will use to access the gems
|
8
|
+
# collected and managed by stickler.
|
9
|
+
downstream_source: "http://gems.example.com/"
|
10
|
+
|
11
|
+
# The upstream locations that stickler should look for gems.
|
12
|
+
sources:
|
13
|
+
- http://gems.rubyforge.org
|
14
|
+
|
data/gemspec.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'stickler/version'
|
3
|
+
require 'tasks/config'
|
4
|
+
|
5
|
+
Stickler::GEM_SPEC = Gem::Specification.new do |spec|
|
6
|
+
proj = Configuration.for('project')
|
7
|
+
spec.name = proj.name
|
8
|
+
spec.version = Stickler::VERSION
|
9
|
+
|
10
|
+
spec.author = proj.author
|
11
|
+
spec.email = proj.email
|
12
|
+
spec.homepage = proj.homepage
|
13
|
+
spec.summary = proj.summary
|
14
|
+
spec.description = proj.description
|
15
|
+
spec.platform = Gem::Platform::RUBY
|
16
|
+
|
17
|
+
spec.post_install_message = <<-msg
|
18
|
+
============================================================
|
19
|
+
|
20
|
+
Thank you for installing Stickler!
|
21
|
+
|
22
|
+
* Create a new stickler repository:
|
23
|
+
stickler setup /path/to/repo
|
24
|
+
|
25
|
+
* Look at the help:
|
26
|
+
stickler help
|
27
|
+
|
28
|
+
============================================================
|
29
|
+
msg
|
30
|
+
|
31
|
+
|
32
|
+
spec.required_rubygems_version = [ ">= 1.2.0" ]
|
33
|
+
|
34
|
+
spec.add_runtime_dependency( 'highline', "~> 1.4" )
|
35
|
+
spec.add_runtime_dependency( 'logging', "~> 0.9" )
|
36
|
+
spec.add_runtime_dependency( 'main', "~> 2.8" )
|
37
|
+
|
38
|
+
spec.add_development_dependency( 'rake', "~> 0.8" )
|
39
|
+
spec.add_development_dependency( 'rspec', "~> 1.1" )
|
40
|
+
spec.add_development_dependency( 'configuration', "~> 0.0" )
|
41
|
+
|
42
|
+
pkg = Configuration.for('packaging')
|
43
|
+
spec.files = pkg.files.all
|
44
|
+
spec.executables = pkg.files.bin.collect { |b| File.basename(b) }
|
45
|
+
|
46
|
+
if rdoc = Configuration.for_if_exist?('rdoc') then
|
47
|
+
spec.has_rdoc = true
|
48
|
+
spec.extra_rdoc_files = pkg.files.rdoc
|
49
|
+
spec.rdoc_options = rdoc.options + [ "--main" , rdoc.main_page ]
|
50
|
+
else
|
51
|
+
spec.has_rdoc = false
|
52
|
+
end
|
53
|
+
|
54
|
+
if test = Configuration.for_if_exist?('testing') then
|
55
|
+
spec.test_files = test.files
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
if rf = Configuration.for_if_exist?('rubyforge') then
|
60
|
+
spec.rubyforge_project = rf.project
|
61
|
+
end
|
62
|
+
end
|
data/lib/stickler.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2008 Jeremy Hinegardner
|
3
|
+
# All rights reserved. Licensed under the same terms as Ruby. No warranty is
|
4
|
+
# provided. See LICENSE and COPYING for details.
|
5
|
+
#++
|
6
|
+
|
7
|
+
require 'logging'
|
8
|
+
|
9
|
+
module Stickler
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'stickler/paths'
|
13
|
+
require 'stickler/version'
|
14
|
+
require 'stickler/console'
|
15
|
+
require 'stickler/source'
|
16
|
+
require 'stickler/repository'
|
17
|
+
require 'stickler/spec_lite'
|
18
|
+
require 'stickler/configuration'
|
19
|
+
require 'stickler/cli'
|
data/lib/stickler/cli.rb
ADDED
@@ -0,0 +1,302 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2008 Jeremy Hinegardner
|
3
|
+
# All rights reserved. Licensed under the same terms as Ruby. No warranty is
|
4
|
+
# provided. See LICENSE and COPYING for details.
|
5
|
+
#++
|
6
|
+
|
7
|
+
require 'main'
|
8
|
+
require 'stickler'
|
9
|
+
|
10
|
+
module Stickler
|
11
|
+
|
12
|
+
#
|
13
|
+
# Convert the Parameters::List that exists as the parameters from Main
|
14
|
+
#
|
15
|
+
def self.params_to_hash( params )
|
16
|
+
h = Hash.new
|
17
|
+
params.each do |p|
|
18
|
+
h [p.names.first ] = p.value
|
19
|
+
end
|
20
|
+
return h
|
21
|
+
end
|
22
|
+
|
23
|
+
#
|
24
|
+
# ::Main.create returns a class that is instantiated with ARGV and ENV as
|
25
|
+
# parameters. The Cli is then used as:
|
26
|
+
#
|
27
|
+
# Cli.new( ARGV, ENV ).run
|
28
|
+
#
|
29
|
+
CLI = ::Main.create {
|
30
|
+
|
31
|
+
author "Copyright (c) 2008 Jeremy Hinegardner <jeremy@copiousfreetime.org>"
|
32
|
+
version Stickler::VERSION
|
33
|
+
|
34
|
+
description <<-txt
|
35
|
+
Stickler is a tool to organize and maintain an internal gem
|
36
|
+
distribution server. It synchronizes locally distriubted gems
|
37
|
+
with their upstream version, and locks the local version to a
|
38
|
+
particular version.
|
39
|
+
|
40
|
+
run 'stickler help modename' for more info.
|
41
|
+
txt
|
42
|
+
|
43
|
+
examples <<-txt
|
44
|
+
. stickler setup
|
45
|
+
. stickler remove gem rails
|
46
|
+
. stickler add gem ramaze
|
47
|
+
. stickler add gem keybox --version 1.2.1
|
48
|
+
. stickler sync
|
49
|
+
. stickler info
|
50
|
+
. stickler generate index
|
51
|
+
txt
|
52
|
+
|
53
|
+
option( :quiet, "q" ) {
|
54
|
+
description 'be quiet about logging to stdout'
|
55
|
+
default false
|
56
|
+
}
|
57
|
+
|
58
|
+
option( :debug ) {
|
59
|
+
description 'be verbose about logging in general'
|
60
|
+
default false
|
61
|
+
}
|
62
|
+
|
63
|
+
run { help! }
|
64
|
+
|
65
|
+
mode( :setup ) {
|
66
|
+
description 'setup a directory as a stickler repository'
|
67
|
+
argument( 'directory' ) {
|
68
|
+
description "the stickler repository directory"
|
69
|
+
default Stickler::Repository.default_directory
|
70
|
+
}
|
71
|
+
|
72
|
+
examples <<-txt
|
73
|
+
. stickler setup
|
74
|
+
. stickler setup /tmp/stickler
|
75
|
+
txt
|
76
|
+
|
77
|
+
mixin :option_force
|
78
|
+
|
79
|
+
run {
|
80
|
+
Stickler::Repository.new( Stickler.params_to_hash( params ) ).setup
|
81
|
+
}
|
82
|
+
}
|
83
|
+
|
84
|
+
mode( :info ) {
|
85
|
+
description 'report information about the stickler repository'
|
86
|
+
|
87
|
+
examples <<-txt
|
88
|
+
. stickler info
|
89
|
+
txt
|
90
|
+
|
91
|
+
mixin :option_directory
|
92
|
+
|
93
|
+
run { Stickler::Repository.new( Stickler.params_to_hash( params ) ).info }
|
94
|
+
}
|
95
|
+
|
96
|
+
mode( :add ) do
|
97
|
+
description <<-desc
|
98
|
+
Add a gem and all dependencies or a source to the repository.
|
99
|
+
desc
|
100
|
+
|
101
|
+
examples <<-txt
|
102
|
+
. stickler add gem heel
|
103
|
+
. stickler add gem ramaze -v 0.3.5
|
104
|
+
. stickler add source http://gems.github.com/
|
105
|
+
txt
|
106
|
+
|
107
|
+
mode( :gem ) do
|
108
|
+
description <<-desc
|
109
|
+
Add a gem and all its dependencies to the repository. Run from
|
110
|
+
within the stickler repository or use the --directory option
|
111
|
+
desc
|
112
|
+
|
113
|
+
examples <<-txt
|
114
|
+
. stickler add gem heel
|
115
|
+
. stickler add gem ramaze -v 2008.06 --directory /var/stickler
|
116
|
+
txt
|
117
|
+
|
118
|
+
argument( 'gem_name' ) { description "The gem to add" }
|
119
|
+
mixin :option_directory
|
120
|
+
mixin :option_version
|
121
|
+
|
122
|
+
option( :requirements ) {
|
123
|
+
desc <<-desc
|
124
|
+
Satisfy dependency requirements using minimum or the maximum version
|
125
|
+
that satisfies the dependency. For instance if you had a gem that
|
126
|
+
dependend on rake >= 0.8.1, if you used --requirements minimum then
|
127
|
+
stickler will download rake-0.8.1. If you used --requrements maximum
|
128
|
+
then stickler will download the latest version of rake.
|
129
|
+
desc
|
130
|
+
|
131
|
+
argument( :required )
|
132
|
+
validate { |r| %w[ maximum minimum ].include?( r.downcase ) }
|
133
|
+
default 'maximum'
|
134
|
+
}
|
135
|
+
|
136
|
+
run {
|
137
|
+
p = Stickler.params_to_hash( params )
|
138
|
+
repo = Stickler::Repository.new( p )
|
139
|
+
repo.add_gem( p['gem_name'], p['version'] || :latest )
|
140
|
+
}
|
141
|
+
end
|
142
|
+
|
143
|
+
mode( :source ) do
|
144
|
+
description <<-desc
|
145
|
+
Add a source the repository. This makes that source available
|
146
|
+
for use within the repository. Run from within the stickler
|
147
|
+
repository or use the --directory option.
|
148
|
+
desc
|
149
|
+
|
150
|
+
examples <<-txt
|
151
|
+
. stickler add source http://gems.github.com/
|
152
|
+
txt
|
153
|
+
|
154
|
+
argument( 'source_uri' ) { description "the source uri to add" }
|
155
|
+
|
156
|
+
mixin :option_directory
|
157
|
+
|
158
|
+
run {
|
159
|
+
p = Stickler.params_to_hash( params )
|
160
|
+
repo = Stickler::Repository.new( p )
|
161
|
+
repo.add_source( p['source_uri'] )
|
162
|
+
}
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
mode( :remove ) do
|
167
|
+
description 'remove a gem or source from the repository'
|
168
|
+
example <<-txt
|
169
|
+
. stickler remove gem mongrel
|
170
|
+
. stickler remove gem rails
|
171
|
+
. stickler remove source htp://gems.github.com/
|
172
|
+
txt
|
173
|
+
|
174
|
+
mode( :gem ) do
|
175
|
+
description <<-desc
|
176
|
+
Remove a gem and all other gems that depend on it from the repository.
|
177
|
+
Run from within the stickler repository or use the --directory option
|
178
|
+
desc
|
179
|
+
|
180
|
+
example <<-txt
|
181
|
+
. stickler remove gem mongrel
|
182
|
+
. stickler remove gem rails
|
183
|
+
txt
|
184
|
+
|
185
|
+
mixin :option_directory
|
186
|
+
mixin :option_version
|
187
|
+
|
188
|
+
argument( 'gem_name' ) { description "The gem to remove" }
|
189
|
+
|
190
|
+
run {
|
191
|
+
p = Stickler.params_to_hash( params )
|
192
|
+
repo = Stickler::Repository.new( p )
|
193
|
+
repo.remove_gem( p['gem_name'], p['version'] || :all )
|
194
|
+
}
|
195
|
+
end
|
196
|
+
|
197
|
+
mode( :source ) do
|
198
|
+
description <<-desc
|
199
|
+
Remove a source and all is gems from the repository.
|
200
|
+
Run from within the stickler repository or use the --directory option
|
201
|
+
desc
|
202
|
+
|
203
|
+
example <<-txt
|
204
|
+
. stickler remove source htp://gems.github.com/
|
205
|
+
txt
|
206
|
+
|
207
|
+
mixin :option_directory
|
208
|
+
argument( 'source_uri' ) { description "The source to remove" }
|
209
|
+
|
210
|
+
run {
|
211
|
+
p = Stickler.params_to_hash( params )
|
212
|
+
repo = Stickler::Repository.new( p )
|
213
|
+
repo.remove_source( p['source_uri'] )
|
214
|
+
}
|
215
|
+
end
|
216
|
+
|
217
|
+
end
|
218
|
+
|
219
|
+
mode( 'sync' ) do
|
220
|
+
description <<-desc
|
221
|
+
check and make sure all the gems in the configuration file are available.
|
222
|
+
desc
|
223
|
+
|
224
|
+
example <<-txt
|
225
|
+
. sticker sync --rebuild
|
226
|
+
txt
|
227
|
+
|
228
|
+
mixin :option_directory
|
229
|
+
option( :rebuild ) {
|
230
|
+
description "Rebuild the repository from scratch"
|
231
|
+
default false
|
232
|
+
}
|
233
|
+
|
234
|
+
|
235
|
+
run {
|
236
|
+
p = Stickler.params_to_hash( params )
|
237
|
+
repo = Stickler::Repository.new( p )
|
238
|
+
repo.sync( p['rebuild'] )
|
239
|
+
}
|
240
|
+
end
|
241
|
+
|
242
|
+
mode( 'generate' ) do
|
243
|
+
mode( 'sysconfig' ) do
|
244
|
+
description <<-desc
|
245
|
+
generate the system wide configuration for use by rubygem clients that should use
|
246
|
+
the repository stickler creates.
|
247
|
+
desc
|
248
|
+
|
249
|
+
example <<-txt
|
250
|
+
. stickler generate sysconfig
|
251
|
+
txt
|
252
|
+
|
253
|
+
mixin :option_directory
|
254
|
+
run {
|
255
|
+
p = Stickler.params_to_hash( params )
|
256
|
+
repo = Stickler::Repository.new( p )
|
257
|
+
repo.generate_sysconfig
|
258
|
+
}
|
259
|
+
end
|
260
|
+
|
261
|
+
mode( 'index' ) do
|
262
|
+
description <<-desc
|
263
|
+
generate the rubygems index of the gems to distribute in this repository.
|
264
|
+
This is the same as doing a 'gem generate_index' but with a scope limited
|
265
|
+
to just the gems in this repository.
|
266
|
+
desc
|
267
|
+
|
268
|
+
example <<-txt
|
269
|
+
. stickler generate index
|
270
|
+
txt
|
271
|
+
|
272
|
+
mixin :option_directory
|
273
|
+
run {
|
274
|
+
p = Stickler.params_to_hash( params )
|
275
|
+
repo = Stickler::Repository.new( p )
|
276
|
+
repo.generate_index
|
277
|
+
}
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
##
|
282
|
+
# common options used by more than one commands
|
283
|
+
#
|
284
|
+
mixin :option_directory do
|
285
|
+
option( :directory, "d" ) {
|
286
|
+
argument :required
|
287
|
+
default Dir.pwd
|
288
|
+
}
|
289
|
+
end
|
290
|
+
|
291
|
+
mixin :option_force do
|
292
|
+
option( :force ) { default false }
|
293
|
+
end
|
294
|
+
|
295
|
+
mixin :option_version do
|
296
|
+
option( :version, "v" ) {
|
297
|
+
argument :required
|
298
|
+
}
|
299
|
+
end
|
300
|
+
|
301
|
+
}
|
302
|
+
end
|