capistrano-rbenv 1.0.0rc1 → 1.0.0rc2

Sign up to get free protection for your applications and to get access to all the features.
@@ -17,8 +17,22 @@ module Capistrano
17
17
  _cset(:rbenv_bin) {
18
18
  File.join(rbenv_bin_path, "rbenv")
19
19
  }
20
- _cset(:rbenv_cmd) {
21
- "env RBENV_VERSION=#{rbenv_ruby_version.dump} #{rbenv_bin}"
20
+ def rbenv_command(options={})
21
+ environment = rbenv_environment.merge(options.fetch(:env, {}))
22
+ environment["RBENV_VERSION"] = options[:version] if options.key?(:version)
23
+ if environment.empty?
24
+ rbenv_bin
25
+ else
26
+ env = (["env"] + environment.map { |k, v| "#{k}=#{v.dump}" }).join(" ")
27
+ "#{env} #{rbenv_bin}"
28
+ end
29
+ end
30
+ _cset(:rbenv_cmd) { rbenv_command(:version => rbenv_ruby_version) } # this declares RBENV_VERSION.
31
+ _cset(:rbenv_environment) {
32
+ {
33
+ "RBENV_ROOT" => rbenv_path,
34
+ "PATH" => [ rbenv_shims_path, rbenv_bin_path, "$PATH" ].join(":"),
35
+ }
22
36
  }
23
37
  _cset(:rbenv_repository, 'git://github.com/sstephenson/rbenv.git')
24
38
  _cset(:rbenv_branch, 'master')
@@ -60,13 +74,25 @@ module Capistrano
60
74
 
61
75
  desc("Setup rbenv.")
62
76
  task(:setup, :except => { :no_release => true }) {
77
+ #
78
+ # skip installation if the requested version has been installed.
79
+ #
80
+ begin
81
+ installed = rbenv_ruby_versions.include?(rbenv_ruby_version)
82
+ rescue
83
+ installed = false
84
+ end
85
+ _setup unless installed
86
+ configure if rbenv_setup_shell
87
+ setup_bundler if rbenv_install_bundler
88
+ }
89
+ after "deploy:setup", "rbenv:setup"
90
+
91
+ task(:_setup, :except => { :no_release => true }) {
63
92
  dependencies if rbenv_install_dependencies
64
93
  update
65
- configure if rbenv_setup_shell
66
94
  build
67
- setup_bundler if rbenv_install_bundler
68
95
  }
69
- after 'deploy:setup', 'rbenv:setup'
70
96
 
71
97
  def _update_repository(destination, options={})
72
98
  configuration = Capistrano::Configuration.new()
@@ -106,10 +132,7 @@ module Capistrano
106
132
  }
107
133
 
108
134
  def _setup_default_environment
109
- env = fetch(:default_environment, {}).dup
110
- env["RBENV_ROOT"] = rbenv_path
111
- env["PATH"] = [ rbenv_shims_path, rbenv_bin_path, env.fetch("PATH", "$PATH") ].join(":")
112
- set(:default_environment, env)
135
+ set(:default_environment, default_environment.merge(rbenv_environment))
113
136
  end
114
137
 
115
138
  _cset(:rbenv_setup_default_environment) {
@@ -278,69 +301,66 @@ module Capistrano
278
301
  rbenv.install(rbenv_ruby_version)
279
302
  end
280
303
  rbenv.exec("#{ruby} --version") # check if ruby is executable
281
- rbenv.global(rbenv_ruby_version)
304
+ rbenv.global(rbenv_ruby_version) if fetch(:rbenv_setup_global_version, true)
282
305
  }
283
306
 
284
307
  _cset(:rbenv_bundler_gem, 'bundler')
285
308
  task(:setup_bundler, :except => { :no_release => true }) {
286
309
  gem = "#{rbenv_cmd} exec gem"
287
- if v = fetch(:rbenv_bundler_version, nil)
288
- q = "-n #{rbenv_bundler_gem} -v #{v}"
289
- f = "fgrep #{rbenv_bundler_gem} | fgrep #{v}"
290
- i = "-v #{v} #{rbenv_bundler_gem}"
310
+ if version = fetch(:rbenv_bundler_version, nil)
311
+ query_args = "-i -n #{rbenv_bundler_gem.dump} -v #{version.dump}"
312
+ install_args = "-v #{version.dump} #{rbenv_bundler_gem.dump}"
291
313
  else
292
- q = "-n #{rbenv_bundler_gem}"
293
- f = "fgrep #{rbenv_bundler_gem}"
294
- i = "#{rbenv_bundler_gem}"
314
+ query_args = "-i -n #{rbenv_bundler_gem.dump}"
315
+ install_args = "#{rbenv_bundler_gem.dump}"
295
316
  end
296
- run("unset -v GEM_HOME; #{gem} query #{q} 2>/dev/null | #{f} || #{gem} install -q #{i}")
317
+ run("unset -v GEM_HOME; #{gem} query #{query_args} 2>/dev/null || #{gem} install -q #{install_args}")
297
318
  rbenv.rehash
298
319
  run("#{bundle_cmd} version")
299
320
  }
300
321
 
301
322
  # call `rbenv rehash` to update shims.
302
323
  def rehash(options={})
303
- run("#{rbenv_cmd} rehash", options)
324
+ invoke_command("#{rbenv_command} rehash", options)
304
325
  end
305
326
 
306
327
  def global(version, options={})
307
- run("#{rbenv_cmd} global #{version.dump}", options)
328
+ invoke_command("#{rbenv_command} global #{version.dump}", options)
308
329
  end
309
330
 
310
331
  def local(version, options={})
311
332
  path = options.delete(:path)
312
- if path
313
- run("cd #{path.dump} && #{rbenv_cmd} local #{version.dump}", options)
314
- else
315
- run("#{rbenv_cmd} local #{version.dump}", options)
316
- end
333
+ execute = []
334
+ execute << "cd #{path.dump}" if path
335
+ execute << "#{rbenv_command} local #{version.dump}"
336
+ invoke_command(execute.join(" && "), options)
317
337
  end
318
338
 
319
339
  def which(command, options={})
320
340
  path = options.delete(:path)
321
- if path
322
- capture("cd #{path.dump} && #{rbenv_cmd} which #{command.dump}", options).strip
323
- else
324
- capture("#{rbenv_cmd} which #{command.dump}", options).strip
325
- end
341
+ version = ( options.delete(:version) || rbenv_ruby_version )
342
+ execute = []
343
+ execute << "cd #{path.dump}" if path
344
+ execute << "#{rbenv_command(:version => version)} which #{command.dump}"
345
+ capture(execute.join(" && "), options).strip
326
346
  end
327
347
 
328
348
  def exec(command, options={})
329
349
  # users of rbenv.exec must sanitize their command line.
330
350
  path = options.delete(:path)
331
- if path
332
- run("cd #{path.dump} && #{rbenv_cmd} exec #{command}", options)
333
- else
334
- run("#{rbenv_cmd} exec #{command}", options)
335
- end
351
+ version = ( options.delete(:version) || rbenv_ruby_version )
352
+ execute = []
353
+ execute << "cd #{path.dump}" if path
354
+ execute << "#{rbenv_command(:version => version)} exec #{command}"
355
+ invoke_command(execute.join(" && "), options)
336
356
  end
337
357
 
338
358
  def versions(options={})
339
- capture("#{rbenv_cmd} versions --bare", options).split(/(?:\r?\n)+/)
359
+ capture("#{rbenv_command} versions --bare", options).split(/(?:\r?\n)+/)
340
360
  end
341
361
 
342
362
  def available_versions(options={})
343
- capture("#{rbenv_cmd} install --complete", options).split(/(?:\r?\n)+/)
363
+ capture("#{rbenv_command} install --complete", options).split(/(?:\r?\n)+/)
344
364
  end
345
365
 
346
366
  _cset(:rbenv_install_ruby_threads) {
@@ -348,15 +368,16 @@ module Capistrano
348
368
  }
349
369
  # create build processes as many as processor count
350
370
  _cset(:rbenv_make_options) { "-j #{rbenv_install_ruby_threads}" }
371
+ _cset(:rbenv_configure_options, nil)
351
372
  def install(version, options={})
352
- execute = []
353
- execute << "export MAKE_OPTS=#{rbenv_make_options.dump}" if rbenv_make_options
354
- execute << "#{rbenv_cmd} install #{version.dump}"
355
- run(execute.join(" && "), options)
373
+ environment = {}
374
+ environment["CONFIGURE_OPTS"] = rbenv_configure_options.to_s if rbenv_configure_options
375
+ environment["MAKE_OPTS"] = rbenv_make_options.to_s if rbenv_make_options
376
+ invoke_command("#{rbenv_command(:env => environment)} install #{version.dump}", options)
356
377
  end
357
378
 
358
379
  def uninstall(version, options={})
359
- run("#{rbenv_cmd} uninstall -f #{version.dump}", options)
380
+ invoke_command("#{rbenv_command} uninstall -f #{version.dump}", options)
360
381
  end
361
382
  }
362
383
  }
@@ -1,5 +1,5 @@
1
1
  module Capistrano
2
2
  module RbEnv
3
- VERSION = "1.0.0rc1"
3
+ VERSION = "1.0.0rc2"
4
4
  end
5
5
  end
@@ -20,25 +20,115 @@ role :db, "192.168.33.10", :primary => true
20
20
  $LOAD_PATH.push(File.expand_path("../../lib", File.dirname(__FILE__)))
21
21
  require "capistrano-rbenv"
22
22
 
23
- namespace(:test_all) {
23
+ task(:test_all) {
24
+ find_and_execute_task("test_default")
25
+ find_and_execute_task("test_without_global")
26
+ }
27
+
28
+ namespace(:test_default) {
24
29
  task(:default) {
25
- find_and_execute_task("rbenv:setup")
26
30
  methods.grep(/^test_/).each do |m|
27
31
  send(m)
28
32
  end
29
- find_and_execute_task("rbenv:purge")
33
+ }
34
+ before "test_default", "test_default:setup"
35
+ after "test_default", "test_default:teardown"
36
+
37
+ task(:setup) {
38
+ find_and_execute_task("rbenv:setup")
30
39
  }
31
40
 
32
- task(:test_rbenv_is_installed) {
41
+ task(:teardown) {
42
+ }
43
+
44
+ task(:test_rbenv) {
33
45
  run("rbenv --version")
34
46
  }
35
47
 
36
- task(:test_ruby_is_installed) {
48
+ ## standard
49
+ task(:test_rbenv_exec) {
50
+ rbenv.exec("ruby --version")
51
+ }
52
+
53
+ task(:test_run_rbenv_exec) {
37
54
  run("rbenv exec ruby --version")
38
55
  }
39
56
 
40
- task(:test_bundler_is_installed) {
41
- run("rbenv exec bundle version")
57
+ ## with path
58
+ task(:test_rbenv_exec_with_path) {
59
+ rbenv.exec("ruby -e 'exit(Dir.pwd==%{/}?0:1)'", :path => "/")
60
+ }
61
+
62
+ # task(:test_rbenv_exec_ruby_via_sudo_with_path) {
63
+ # # capistrano does not provide safer way to invoke multiple commands via sudo.
64
+ # rbenv.exec("ruby -e 'exit(Dir.pwd==%{/}&&Process.uid==0?0:1'", :path => "/", :via => :sudo )
65
+ # }
66
+
67
+ ## via sudo
68
+ task(:test_rbenv_exec_via_sudo) {
69
+ rbenv.exec("ruby -e 'exit(Process.uid==0?0:1)'", :via => :sudo)
70
+ }
71
+
72
+ task(:test_run_sudo_rbenv_exec) {
73
+ # we may not be able to invoke rbenv since sudo may reset $PATH.
74
+ # if you prefer to invoke rbenv via sudo, call it with absolute path.
75
+ # run("#{sudo} rbenv exec ruby -e 'exit(Process.uid==0?0:1)'")
76
+ run("#{sudo} #{rbenv_cmd} exec ruby -e 'exit(Process.uid==0?0:1)'")
77
+ }
78
+
79
+ task(:test_sudo_rbenv_exec) {
80
+ sudo("#{rbenv_cmd} exec ruby -e 'exit(Process.uid==0?0:1)'")
81
+ }
82
+
83
+ ## bundler
84
+ task(:test_run_bundle) {
85
+ run("#{bundle_cmd} version")
86
+ }
87
+
88
+ task(:test_run_sudo_bundle) {
89
+ run("#{sudo} #{bundle_cmd} version")
90
+ }
91
+
92
+ task(:test_sudo_bundle) {
93
+ sudo("#{bundle_cmd} version")
94
+ }
95
+ }
96
+
97
+ namespace(:test_without_global) {
98
+ task(:default) {
99
+ methods.grep(/^test_/).each do |m|
100
+ send(m)
101
+ end
102
+ }
103
+ before "test_without_global", "test_without_global:setup"
104
+ after "test_without_global", "test_without_global:teardown"
105
+
106
+ task(:setup) {
107
+ version_file = File.join(rbenv_path, "version")
108
+ run("mv -f #{version_file} #{version_file}.orig")
109
+ set(:rbenv_setup_global_version, false)
110
+ find_and_execute_task("rbenv:setup")
111
+ run("test \! -f #{version_file.dump}")
112
+ }
113
+
114
+ task(:teardown) {
115
+ version_file = File.join(rbenv_path, "version")
116
+ run("mv -f #{version_file}.orig #{version_file}")
117
+ }
118
+
119
+ ## standard
120
+ task(:test_rbenv_exec_ruby) {
121
+ rbenv.exec("ruby --version")
122
+ }
123
+
124
+ ## with path
125
+ task(:test_rbenv_exec_ruby_with_path) {
126
+ rbenv.exec("ruby -e 'exit(Dir.pwd==%{/}?0:1)'", :path => "/")
127
+ }
128
+
129
+ ## via sudo
130
+ task(:test_rbenv_exec_ruby_via_sudo) {
131
+ rbenv.exec("ruby -e 'exit(Process.uid==0?0:1)'", :via => :sudo)
42
132
  }
43
133
  }
44
134
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano-rbenv
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0rc1
4
+ version: 1.0.0rc2
5
5
  prerelease: 5
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-11 00:00:00.000000000 Z
12
+ date: 2013-03-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: capistrano