bundler_package_git 1.1.pre.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. data/.gitignore +22 -0
  2. data/.rvmrc +1 -0
  3. data/CHANGELOG.md +659 -0
  4. data/ISSUES.md +47 -0
  5. data/LICENSE +23 -0
  6. data/README.md +29 -0
  7. data/Rakefile +167 -0
  8. data/UPGRADING.md +103 -0
  9. data/bin/bundle +22 -0
  10. data/bundler.gemspec +30 -0
  11. data/lib/bundler.rb +283 -0
  12. data/lib/bundler/capistrano.rb +11 -0
  13. data/lib/bundler/cli.rb +490 -0
  14. data/lib/bundler/definition.rb +429 -0
  15. data/lib/bundler/dependency.rb +130 -0
  16. data/lib/bundler/deployment.rb +53 -0
  17. data/lib/bundler/dsl.rb +243 -0
  18. data/lib/bundler/environment.rb +47 -0
  19. data/lib/bundler/fetcher.rb +101 -0
  20. data/lib/bundler/gem_helper.rb +146 -0
  21. data/lib/bundler/graph.rb +130 -0
  22. data/lib/bundler/index.rb +131 -0
  23. data/lib/bundler/installer.rb +117 -0
  24. data/lib/bundler/lazy_specification.rb +71 -0
  25. data/lib/bundler/lockfile_parser.rb +108 -0
  26. data/lib/bundler/remote_specification.rb +57 -0
  27. data/lib/bundler/resolver.rb +470 -0
  28. data/lib/bundler/rubygems_ext.rb +226 -0
  29. data/lib/bundler/runtime.rb +201 -0
  30. data/lib/bundler/settings.rb +117 -0
  31. data/lib/bundler/setup.rb +16 -0
  32. data/lib/bundler/shared_helpers.rb +167 -0
  33. data/lib/bundler/source.rb +675 -0
  34. data/lib/bundler/spec_set.rb +134 -0
  35. data/lib/bundler/templates/Executable +16 -0
  36. data/lib/bundler/templates/Gemfile +4 -0
  37. data/lib/bundler/templates/newgem/Gemfile.tt +4 -0
  38. data/lib/bundler/templates/newgem/Rakefile.tt +2 -0
  39. data/lib/bundler/templates/newgem/bin/newgem.tt +3 -0
  40. data/lib/bundler/templates/newgem/gitignore.tt +4 -0
  41. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +7 -0
  42. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +7 -0
  43. data/lib/bundler/templates/newgem/newgem.gemspec.tt +21 -0
  44. data/lib/bundler/ui.rb +73 -0
  45. data/lib/bundler/vendor/net/http/faster.rb +27 -0
  46. data/lib/bundler/vendor/net/http/persistent.rb +464 -0
  47. data/lib/bundler/vendor/thor.rb +319 -0
  48. data/lib/bundler/vendor/thor/actions.rb +297 -0
  49. data/lib/bundler/vendor/thor/actions/create_file.rb +105 -0
  50. data/lib/bundler/vendor/thor/actions/directory.rb +93 -0
  51. data/lib/bundler/vendor/thor/actions/empty_directory.rb +134 -0
  52. data/lib/bundler/vendor/thor/actions/file_manipulation.rb +229 -0
  53. data/lib/bundler/vendor/thor/actions/inject_into_file.rb +104 -0
  54. data/lib/bundler/vendor/thor/base.rb +556 -0
  55. data/lib/bundler/vendor/thor/core_ext/file_binary_read.rb +9 -0
  56. data/lib/bundler/vendor/thor/core_ext/hash_with_indifferent_access.rb +75 -0
  57. data/lib/bundler/vendor/thor/core_ext/ordered_hash.rb +100 -0
  58. data/lib/bundler/vendor/thor/error.rb +30 -0
  59. data/lib/bundler/vendor/thor/invocation.rb +168 -0
  60. data/lib/bundler/vendor/thor/parser.rb +4 -0
  61. data/lib/bundler/vendor/thor/parser/argument.rb +67 -0
  62. data/lib/bundler/vendor/thor/parser/arguments.rb +161 -0
  63. data/lib/bundler/vendor/thor/parser/option.rb +120 -0
  64. data/lib/bundler/vendor/thor/parser/options.rb +174 -0
  65. data/lib/bundler/vendor/thor/shell.rb +88 -0
  66. data/lib/bundler/vendor/thor/shell/basic.rb +275 -0
  67. data/lib/bundler/vendor/thor/shell/color.rb +108 -0
  68. data/lib/bundler/vendor/thor/shell/html.rb +121 -0
  69. data/lib/bundler/vendor/thor/task.rb +114 -0
  70. data/lib/bundler/vendor/thor/util.rb +229 -0
  71. data/lib/bundler/vendor/thor/version.rb +3 -0
  72. data/lib/bundler/version.rb +6 -0
  73. data/lib/bundler/vlad.rb +9 -0
  74. data/man/bundle-config.ronn +90 -0
  75. data/man/bundle-exec.ronn +111 -0
  76. data/man/bundle-install.ronn +314 -0
  77. data/man/bundle-package.ronn +59 -0
  78. data/man/bundle-update.ronn +176 -0
  79. data/man/bundle.ronn +80 -0
  80. data/man/gemfile.5.ronn +279 -0
  81. data/man/index.txt +6 -0
  82. data/spec/cache/gems_spec.rb +219 -0
  83. data/spec/cache/git_spec.rb +9 -0
  84. data/spec/cache/path_spec.rb +27 -0
  85. data/spec/cache/platform_spec.rb +57 -0
  86. data/spec/install/deploy_spec.rb +197 -0
  87. data/spec/install/deprecated_spec.rb +37 -0
  88. data/spec/install/gems/c_ext_spec.rb +48 -0
  89. data/spec/install/gems/dependency_api_spec.rb +85 -0
  90. data/spec/install/gems/env_spec.rb +107 -0
  91. data/spec/install/gems/flex_spec.rb +313 -0
  92. data/spec/install/gems/groups_spec.rb +245 -0
  93. data/spec/install/gems/packed_spec.rb +84 -0
  94. data/spec/install/gems/platform_spec.rb +208 -0
  95. data/spec/install/gems/resolving_spec.rb +72 -0
  96. data/spec/install/gems/simple_case_spec.rb +715 -0
  97. data/spec/install/gems/standalone_spec.rb +162 -0
  98. data/spec/install/gems/sudo_spec.rb +73 -0
  99. data/spec/install/gems/win32_spec.rb +26 -0
  100. data/spec/install/gemspec_spec.rb +108 -0
  101. data/spec/install/git_spec.rb +571 -0
  102. data/spec/install/invalid_spec.rb +17 -0
  103. data/spec/install/path_spec.rb +353 -0
  104. data/spec/install/upgrade_spec.rb +26 -0
  105. data/spec/lock/git_spec.rb +35 -0
  106. data/spec/lock/lockfile_spec.rb +683 -0
  107. data/spec/other/check_spec.rb +221 -0
  108. data/spec/other/clean_spec.rb +202 -0
  109. data/spec/other/config_spec.rb +40 -0
  110. data/spec/other/console_spec.rb +54 -0
  111. data/spec/other/exec_spec.rb +241 -0
  112. data/spec/other/ext_spec.rb +16 -0
  113. data/spec/other/gem_helper_spec.rb +128 -0
  114. data/spec/other/help_spec.rb +38 -0
  115. data/spec/other/init_spec.rb +40 -0
  116. data/spec/other/newgem_spec.rb +24 -0
  117. data/spec/other/open_spec.rb +35 -0
  118. data/spec/other/show_spec.rb +82 -0
  119. data/spec/pack/gems_spec.rb +54 -0
  120. data/spec/quality_spec.rb +58 -0
  121. data/spec/resolver/basic_spec.rb +20 -0
  122. data/spec/resolver/platform_spec.rb +82 -0
  123. data/spec/runtime/executable_spec.rb +110 -0
  124. data/spec/runtime/load_spec.rb +107 -0
  125. data/spec/runtime/platform_spec.rb +90 -0
  126. data/spec/runtime/require_spec.rb +231 -0
  127. data/spec/runtime/setup_spec.rb +688 -0
  128. data/spec/runtime/with_clean_env_spec.rb +15 -0
  129. data/spec/spec_helper.rb +85 -0
  130. data/spec/support/artifice/endpoint.rb +50 -0
  131. data/spec/support/artifice/endpoint_fallback.rb +22 -0
  132. data/spec/support/artifice/endpoint_marshal_fail.rb +11 -0
  133. data/spec/support/artifice/endpoint_redirect.rb +11 -0
  134. data/spec/support/builders.rb +574 -0
  135. data/spec/support/fakeweb/rack-1.0.0.marshal +2 -0
  136. data/spec/support/fakeweb/windows.rb +23 -0
  137. data/spec/support/helpers.rb +246 -0
  138. data/spec/support/indexes.rb +112 -0
  139. data/spec/support/matchers.rb +89 -0
  140. data/spec/support/path.rb +73 -0
  141. data/spec/support/platforms.rb +53 -0
  142. data/spec/support/ruby_ext.rb +20 -0
  143. data/spec/support/rubygems_ext.rb +35 -0
  144. data/spec/support/rubygems_hax/platform.rb +11 -0
  145. data/spec/support/sudo.rb +21 -0
  146. data/spec/update/gems_spec.rb +121 -0
  147. data/spec/update/git_spec.rb +196 -0
  148. data/spec/update/source_spec.rb +51 -0
  149. metadata +294 -0
@@ -0,0 +1,11 @@
1
+ # Capistrano task for Bundler.
2
+ #
3
+ # Just add "require 'bundler/capistrano'" in your Capistrano deploy.rb, and
4
+ # Bundler will be activated after each new deployment.
5
+ require 'bundler/deployment'
6
+
7
+ Capistrano::Configuration.instance(:must_exist).load do
8
+ after "deploy:update_code", "bundle:install"
9
+ Bundler::Deployment.define_task(self, :task, :except => { :no_release => true })
10
+ set :rake, 'bundle exec rake'
11
+ end
@@ -0,0 +1,490 @@
1
+ $:.unshift File.expand_path('../vendor', __FILE__)
2
+ require 'thor'
3
+ require 'thor/actions'
4
+ require 'rubygems/user_interaction'
5
+ require 'rubygems/config_file'
6
+
7
+ # Work around a RubyGems bug
8
+ Gem.configuration
9
+
10
+ module Bundler
11
+ class CLI < Thor
12
+ include Thor::Actions
13
+
14
+ def initialize(*)
15
+ super
16
+ the_shell = (options["no-color"] ? Thor::Shell::Basic.new : shell)
17
+ Bundler.ui = UI::Shell.new(the_shell)
18
+ Bundler.ui.debug! if options["verbose"]
19
+ Gem::DefaultUserInteraction.ui = UI::RGProxy.new(Bundler.ui)
20
+ end
21
+
22
+ check_unknown_options! unless ARGV.include?("exec") || ARGV.include?("config")
23
+
24
+ default_task :install
25
+ class_option "no-color", :type => :boolean, :banner => "Disable colorization in output"
26
+ class_option "verbose", :type => :boolean, :banner => "Enable verbose output mode", :aliases => "-V"
27
+
28
+ def help(cli = nil)
29
+ case cli
30
+ when "gemfile" then command = "gemfile.5"
31
+ when nil then command = "bundle"
32
+ else command = "bundle-#{cli}"
33
+ end
34
+
35
+ manpages = %w(
36
+ bundle
37
+ bundle-config
38
+ bundle-exec
39
+ bundle-install
40
+ bundle-package
41
+ bundle-update
42
+ gemfile.5)
43
+
44
+ if manpages.include?(command)
45
+ root = File.expand_path("../man", __FILE__)
46
+
47
+ if have_groff? && root !~ %r{^file:/.+!/META-INF/jruby.home/.+}
48
+ groff = "groff -Wall -mtty-char -mandoc -Tascii"
49
+ pager = ENV['MANPAGER'] || ENV['PAGER'] || 'less'
50
+
51
+ Kernel.exec "#{groff} #{root}/#{command} | #{pager}"
52
+ else
53
+ puts File.read("#{root}/#{command}.txt")
54
+ end
55
+ else
56
+ super
57
+ end
58
+ end
59
+
60
+ desc "init", "Generates a Gemfile into the current working directory"
61
+ long_desc <<-D
62
+ Init generates a default Gemfile in the current working directory. When adding a
63
+ Gemfile to a gem with a gemspec, the --gemspec option will automatically add each
64
+ dependency listed in the gemspec file to the newly created Gemfile.
65
+ D
66
+ method_option "gemspec", :type => :string, :banner => "Use the specified .gemspec to create the Gemfile"
67
+ def init
68
+ opts = options.dup
69
+ if File.exist?("Gemfile")
70
+ Bundler.ui.error "Gemfile already exists at #{Dir.pwd}/Gemfile"
71
+ exit 1
72
+ end
73
+
74
+ if opts[:gemspec]
75
+ gemspec = File.expand_path(opts[:gemspec])
76
+ unless File.exist?(gemspec)
77
+ Bundler.ui.error "Gem specification #{gemspec} doesn't exist"
78
+ exit 1
79
+ end
80
+ spec = Gem::Specification.load(gemspec)
81
+ puts "Writing new Gemfile to #{Dir.pwd}/Gemfile"
82
+ File.open('Gemfile', 'wb') do |file|
83
+ file << "# Generated from #{gemspec}\n"
84
+ file << spec.to_gemfile
85
+ end
86
+ else
87
+ puts "Writing new Gemfile to #{Dir.pwd}/Gemfile"
88
+ FileUtils.cp(File.expand_path('../templates/Gemfile', __FILE__), 'Gemfile')
89
+ end
90
+ end
91
+
92
+ desc "check", "Checks if the dependencies listed in Gemfile are satisfied by currently installed gems"
93
+ long_desc <<-D
94
+ Check searches the local machine for each of the gems requested in the Gemfile. If
95
+ all gems are found, Bundler prints a success message and exits with a status of 0.
96
+ If not, the first missing gem is listed and Bundler exits status 1.
97
+ D
98
+ method_option "gemfile", :type => :string, :banner =>
99
+ "Use the specified gemfile instead of Gemfile"
100
+ def check
101
+ ENV['BUNDLE_GEMFILE'] = File.expand_path(options[:gemfile]) if options[:gemfile]
102
+ begin
103
+ not_installed = Bundler.definition.missing_specs
104
+ rescue GemNotFound, VersionConflict
105
+ Bundler.ui.error "Your Gemfile's dependencies could not be satisfied"
106
+ Bundler.ui.warn "Install missing gems with `bundle install`"
107
+ exit 1
108
+ end
109
+
110
+ if not_installed.any?
111
+ Bundler.ui.error "The following gems are missing"
112
+ not_installed.each { |s| Bundler.ui.error " * #{s.name} (#{s.version})" }
113
+ Bundler.ui.warn "Install missing gems with `bundle install`"
114
+ exit 1
115
+ else
116
+ Bundler.load.lock
117
+ Bundler.ui.info "The Gemfile's dependencies are satisfied"
118
+ end
119
+ end
120
+
121
+ desc "install", "Install the current environment to the system"
122
+ long_desc <<-D
123
+ Install will install all of the gems in the current bundle, making them available
124
+ for use. In a freshly checked out repository, this command will give you the same
125
+ gem versions as the last person who updated the Gemfile and ran `bundle update`.
126
+
127
+ Passing [DIR] to install (e.g. vendor) will cause the unpacked gems to be installed
128
+ into the [DIR] directory rather than into system gems.
129
+
130
+ If the bundle has already been installed, bundler will tell you so and then exit.
131
+ D
132
+ method_option "without", :type => :array, :banner =>
133
+ "Exclude gems that are part of the specified named group."
134
+ method_option "gemfile", :type => :string, :banner =>
135
+ "Use the specified gemfile instead of Gemfile"
136
+ method_option "no-prune", :type => :boolean, :banner =>
137
+ "Don't remove stale gems from the cache."
138
+ method_option "no-cache", :type => :boolean, :banner =>
139
+ "Don't update the existing gem cache."
140
+ method_option "quiet", :type => :boolean, :banner =>
141
+ "Only output warnings and errors."
142
+ method_option "local", :type => :boolean, :banner =>
143
+ "Do not attempt to fetch gems remotely and use the gem cache instead"
144
+ method_option "binstubs", :type => :string, :lazy_default => "bin", :banner =>
145
+ "Generate bin stubs for bundled gems to ./bin"
146
+ method_option "path", :type => :string, :banner =>
147
+ "Specify a different path than the system default ($BUNDLE_PATH or $GEM_HOME). Bundler will remember this value for future installs on this machine"
148
+ method_option "system", :type => :boolean, :banner =>
149
+ "Install to the system location ($BUNDLE_PATH or $GEM_HOME) even if the bundle was previously installed somewhere else for this application"
150
+ method_option "frozen", :type => :boolean, :banner =>
151
+ "Do not allow the Gemfile.lock to be updated after this install"
152
+ method_option "deployment", :type => :boolean, :banner =>
153
+ "Install using defaults tuned for deployment environments"
154
+ method_option "standalone", :type => :array, :lazy_default => [], :banner =>
155
+ "Make a bundle that can work without the Bundler runtime"
156
+ def install
157
+ opts = options.dup
158
+ opts[:without] ||= []
159
+ if opts[:without].size == 1
160
+ opts[:without].map!{|g| g.split(" ") }
161
+ opts[:without].flatten!
162
+ end
163
+ opts[:without].map!{|g| g.to_sym }
164
+
165
+ ENV['BUNDLE_GEMFILE'] = File.expand_path(opts[:gemfile]) if opts[:gemfile]
166
+ ENV['RB_USER_INSTALL'] = '1' if Bundler::FREEBSD
167
+
168
+ # Just disable color in deployment mode
169
+ Bundler.ui.shell = Thor::Shell::Basic.new if opts[:deployment]
170
+
171
+ if (opts[:path] || opts[:deployment]) && opts[:system]
172
+ Bundler.ui.error "You have specified both a path to install your gems to, \n" \
173
+ "as well as --system. Please choose."
174
+ exit 1
175
+ end
176
+
177
+ if opts[:deployment] || opts[:frozen]
178
+ unless Bundler.default_lockfile.exist?
179
+ flag = opts[:deployment] ? '--deployment' : '--frozen'
180
+ raise ProductionError, "The #{flag} flag requires a Gemfile.lock. Please make " \
181
+ "sure you have checked your Gemfile.lock into version control " \
182
+ "before deploying."
183
+ end
184
+
185
+ if Bundler.root.join("vendor/cache").exist?
186
+ opts[:local] = true
187
+ end
188
+
189
+ Bundler.settings[:frozen] = '1'
190
+ end
191
+
192
+ # Can't use Bundler.settings for this because settings needs gemfile.dirname
193
+ Bundler.settings[:path] = nil if opts[:system]
194
+ Bundler.settings[:path] = "vendor/bundle" if opts[:deployment]
195
+ Bundler.settings[:path] = opts[:path] if opts[:path]
196
+ Bundler.settings[:path] ||= "bundle" if opts[:standalone]
197
+ Bundler.settings[:bin] = opts["binstubs"] if opts[:binstubs]
198
+ Bundler.settings[:disable_shared_gems] = '1' if Bundler.settings[:path]
199
+ Bundler.settings.without = opts[:without] unless opts[:without].empty?
200
+ Bundler.ui.be_quiet! if opts[:quiet]
201
+
202
+ Installer.install(Bundler.root, Bundler.definition, opts)
203
+ Bundler.load.cache if Bundler.root.join("vendor/cache").exist? && !options["no-cache"]
204
+
205
+ if Bundler.settings[:path]
206
+ relative_path = Bundler.settings[:path]
207
+ relative_path = "./" + relative_path unless relative_path[0] == ?/
208
+ Bundler.ui.confirm "Your bundle is complete! " +
209
+ "It was installed into #{relative_path}"
210
+ else
211
+ Bundler.ui.confirm "Your bundle is complete! " +
212
+ "Use `bundle show [gemname]` to see where a bundled gem is installed."
213
+ end
214
+ rescue GemNotFound => e
215
+ if opts[:local]
216
+ Bundler.ui.warn "Some gems seem to be missing from your vendor/cache directory."
217
+ end
218
+
219
+ if Bundler.definition.no_sources?
220
+ Bundler.ui.warn "Your Gemfile doesn't have any sources. You can add one with a line like 'source :rubygems'"
221
+ end
222
+ raise e
223
+ end
224
+
225
+ desc "update", "update the current environment"
226
+ long_desc <<-D
227
+ Update will install the newest versions of the gems listed in the Gemfile. Use
228
+ update when you have changed the Gemfile, or if you want to get the newest
229
+ possible versions of the gems in the bundle.
230
+ D
231
+ method_option "source", :type => :array, :banner => "Update a specific source (and all gems associated with it)"
232
+ method_option "local", :type => :boolean, :banner =>
233
+ "Do not attempt to fetch gems remotely and use the gem cache instead"
234
+ def update(*gems)
235
+ sources = Array(options[:source])
236
+
237
+ if gems.empty? && sources.empty?
238
+ # We're doing a full update
239
+ Bundler.definition(true)
240
+ else
241
+ Bundler.definition(:gems => gems, :sources => sources)
242
+ end
243
+
244
+ opts = {"update" => true, "local" => options[:local]}
245
+ Installer.install Bundler.root, Bundler.definition, opts
246
+ Bundler.load.cache if Bundler.root.join("vendor/cache").exist?
247
+ Bundler.ui.confirm "Your bundle is updated! " +
248
+ "Use `bundle show [gemname]` to see where a bundled gem is installed."
249
+ end
250
+
251
+ desc "show [GEM]", "Shows all gems that are part of the bundle, or the path to a given gem"
252
+ long_desc <<-D
253
+ Show lists the names and versions of all gems that are required by your Gemfile.
254
+ Calling show with [GEM] will list the exact location of that gem on your machine.
255
+ D
256
+ def show(gem_name = nil)
257
+ Bundler.load.lock
258
+
259
+ if gem_name
260
+ Bundler.ui.info locate_gem(gem_name)
261
+ else
262
+ Bundler.ui.info "Gems included by the bundle:"
263
+ Bundler.load.specs.sort_by { |s| s.name }.each do |s|
264
+ Bundler.ui.info " * #{s.name} (#{s.version}#{s.git_version})"
265
+ end
266
+ end
267
+ end
268
+ map %w(list) => "show"
269
+
270
+ desc "cache", "Cache all the gems to vendor/cache", :hide => true
271
+ method_option "no-prune", :type => :boolean, :banner => "Don't remove stale gems from the cache."
272
+ def cache
273
+ Bundler.definition.resolve_with_cache!
274
+ Bundler.load.cache
275
+ Bundler.settings[:no_prune] = true if options[:no_prune]
276
+ Bundler.load.lock
277
+ rescue GemNotFound => e
278
+ Bundler.ui.error(e.message)
279
+ Bundler.ui.warn "Run `bundle install` to install missing gems."
280
+ exit 128
281
+ end
282
+
283
+ desc "package", "Locks and then caches all of the gems into vendor/cache"
284
+ method_option "no-prune", :type => :boolean, :banner => "Don't remove stale gems from the cache."
285
+ long_desc <<-D
286
+ The package command will copy the .gem files for every gem in the bundle into the
287
+ directory ./vendor/cache. If you then check that directory into your source
288
+ control repository, others who check out your source will be able to install the
289
+ bundle without having to download any additional gems.
290
+ D
291
+ def package
292
+ install
293
+ # TODO: move cache contents here now that all bundles are locked
294
+ Bundler.load.cache
295
+ end
296
+ map %w(pack) => :package
297
+
298
+ desc "exec", "Run the command in context of the bundle"
299
+ long_desc <<-D
300
+ Exec runs a command, providing it access to the gems in the bundle. While using
301
+ bundle exec you can require and call the bundled gems as if they were installed
302
+ into the systemwide Rubygems repository.
303
+ D
304
+ def exec(*)
305
+ ARGV.delete("exec")
306
+
307
+ Bundler.setup
308
+
309
+ begin
310
+ # Run
311
+ Kernel.exec(*ARGV)
312
+ rescue Errno::EACCES
313
+ Bundler.ui.error "bundler: not executable: #{ARGV.first}"
314
+ exit 126
315
+ rescue Errno::ENOENT
316
+ Bundler.ui.error "bundler: command not found: #{ARGV.first}"
317
+ Bundler.ui.warn "Install missing gem binaries with `bundle install`"
318
+ exit 127
319
+ end
320
+ end
321
+
322
+ desc "config NAME [VALUE]", "retrieve or set a configuration value"
323
+ long_desc <<-D
324
+ Retrieves or sets a configuration value. If only parameter is provided, retrieve the value. If two parameters are provided, replace the
325
+ existing value with the newly provided one.
326
+
327
+ By default, setting a configuration value sets it for all projects
328
+ on the machine.
329
+
330
+ If a global setting is superceded by local configuration, this command
331
+ will show the current value, as well as any superceded values and
332
+ where they were specified.
333
+ D
334
+ def config(name = nil, *args)
335
+ values = ARGV.dup
336
+ values.shift # remove config
337
+ values.shift # remove the name
338
+
339
+ unless name
340
+ Bundler.ui.confirm "Settings are listed in order of priority. The top value will be used.\n"
341
+
342
+ Bundler.settings.all.each do |setting|
343
+ Bundler.ui.confirm "#{setting}"
344
+ with_padding do
345
+ Bundler.settings.pretty_values_for(setting).each do |line|
346
+ Bundler.ui.info line
347
+ end
348
+ end
349
+ Bundler.ui.confirm ""
350
+ end
351
+ return
352
+ end
353
+
354
+ if values.empty?
355
+ Bundler.ui.confirm "Settings for `#{name}` in order of priority. The top value will be used"
356
+ with_padding do
357
+ Bundler.settings.pretty_values_for(name).each { |line| Bundler.ui.info line }
358
+ end
359
+ else
360
+ locations = Bundler.settings.locations(name)
361
+
362
+ if local = locations[:local]
363
+ Bundler.ui.info "Your application has set #{name} to #{local.inspect}. This will override the " \
364
+ "system value you are currently setting"
365
+ end
366
+
367
+ if global = locations[:global]
368
+ Bundler.ui.info "You are replacing the current system value of #{name}, which is currently #{global}"
369
+ end
370
+
371
+ if env = locations[:env]
372
+ Bundler.ui.info "You have set a bundler environment variable for #{env}. This will take precedence " \
373
+ "over the system value you are setting"
374
+ end
375
+
376
+ Bundler.settings.set_global(name, values.join(" "))
377
+ end
378
+ end
379
+
380
+ desc "open GEM", "Opens the source directory of the given bundled gem"
381
+ def open(name)
382
+ editor = [ENV['BUNDLER_EDITOR'], ENV['VISUAL'], ENV['EDITOR']].find{|e| !e.nil? && !e.empty? }
383
+ if editor
384
+ gem_path = locate_gem(name)
385
+ Dir.chdir(gem_path) do
386
+ command = "#{editor} #{gem_path}"
387
+ success = system(command)
388
+ Bundler.ui.info "Could not run '#{command}'" unless success
389
+ end
390
+ else
391
+ Bundler.ui.info("To open a bundled gem, set $EDITOR or $BUNDLER_EDITOR")
392
+ end
393
+ end
394
+
395
+ desc "console [GROUP]", "Opens an IRB session with the bundle pre-loaded"
396
+ def console(group = nil)
397
+ group ? Bundler.require(:default, *(group.split.map! {|g| g.to_sym })) : Bundler.require
398
+ ARGV.clear
399
+
400
+ require 'irb'
401
+ IRB.start
402
+ end
403
+
404
+ desc "version", "Prints the bundler's version information"
405
+ def version
406
+ Bundler.ui.info "Bundler version #{Bundler::VERSION}"
407
+ end
408
+ map %w(-v --version) => :version
409
+
410
+ desc 'viz', "Generates a visual dependency graph"
411
+ long_desc <<-D
412
+ Viz generates a PNG file of the current Gemfile as a dependency graph.
413
+ Viz requires the ruby-graphviz gem (and its dependencies).
414
+ The associated gems must also be installed via 'bundle install'.
415
+ D
416
+ method_option :file, :type => :string, :default => 'gem_graph.png', :aliases => '-f', :banner => "The name to use for the generated png file."
417
+ method_option :version, :type => :boolean, :default => false, :aliases => '-v', :banner => "Set to show each gem version."
418
+ method_option :requirements, :type => :boolean, :default => false, :aliases => '-r', :banner => "Set to show the version of each required dependency."
419
+ def viz
420
+ output_file = File.expand_path(options[:file])
421
+ graph = Graph.new( Bundler.load )
422
+
423
+ begin
424
+ graph.viz(output_file, options[:version], options[:requirements])
425
+ Bundler.ui.info output_file
426
+ rescue LoadError => e
427
+ Bundler.ui.error e.inspect
428
+ Bundler.ui.warn "Make sure you have the graphviz ruby gem. You can install it with:"
429
+ Bundler.ui.warn "`gem install ruby-graphviz`"
430
+ rescue StandardError => e
431
+ if e.message =~ /GraphViz not installed or dot not in PATH/
432
+ Bundler.ui.error e.message
433
+ Bundler.ui.warn "The ruby graphviz gem requires GraphViz to be installed"
434
+ else
435
+ raise
436
+ end
437
+ end
438
+ end
439
+
440
+ desc "gem GEM", "Creates a skeleton for creating a rubygem"
441
+ method_option :bin, :type => :boolean, :default => false, :aliases => '-b', :banner => "Generate a binary for your library."
442
+ def gem(name)
443
+ target = File.join(Dir.pwd, name)
444
+ constant_name = name.split('_').map{|p| p.capitalize}.join
445
+ constant_name = constant_name.split('-').map{|q| q.capitalize}.join('::') if constant_name =~ /-/
446
+ constant_array = constant_name.split('::')
447
+ FileUtils.mkdir_p(File.join(target, 'lib', name))
448
+ opts = {:name => name, :constant_name => constant_name, :constant_array => constant_array}
449
+ template(File.join("newgem/Gemfile.tt"), File.join(target, "Gemfile"), opts)
450
+ template(File.join("newgem/Rakefile.tt"), File.join(target, "Rakefile"), opts)
451
+ template(File.join("newgem/gitignore.tt"), File.join(target, ".gitignore"), opts)
452
+ template(File.join("newgem/newgem.gemspec.tt"), File.join(target, "#{name}.gemspec"), opts)
453
+ template(File.join("newgem/lib/newgem.rb.tt"), File.join(target, "lib/#{name}.rb"), opts)
454
+ template(File.join("newgem/lib/newgem/version.rb.tt"), File.join(target, "lib/#{name}/version.rb"), opts)
455
+ if options[:bin]
456
+ template(File.join("newgem/bin/newgem.tt"), File.join(target, 'bin', name), opts)
457
+ end
458
+ Bundler.ui.info "Initializating git repo in #{target}"
459
+ Dir.chdir(target) { `git init`; `git add .` }
460
+ end
461
+
462
+ def self.source_root
463
+ File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
464
+ end
465
+
466
+ desc "clean", "Cleans up unused gems in your bundler directory"
467
+ def clean
468
+ clean_output = Bundler.load.clean
469
+ if !clean_output
470
+ Bundler.ui.error "Can only use bundle clean when --path is set"
471
+ end
472
+ end
473
+
474
+ private
475
+
476
+ def have_groff?
477
+ !(`which groff` rescue '').empty?
478
+ end
479
+
480
+ def locate_gem(name)
481
+ spec = Bundler.load.specs.find{|s| s.name == name }
482
+ raise GemNotFound, "Could not find gem '#{name}' in the current bundle." unless spec
483
+ if spec.name == 'bundler'
484
+ return File.expand_path('../../../', __FILE__)
485
+ end
486
+ spec.full_gem_path
487
+ end
488
+
489
+ end
490
+ end