rvm-capistrano 1.4.4 → 1.5.0.rc1
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/History.md +7 -0
- data/README.md +1 -0
- data/lib/rvm/capistrano/alias_and_wrapp.rb +3 -1
- data/lib/rvm/capistrano/base.rb +36 -13
- data/lib/rvm/capistrano/create_gemset.rb +3 -1
- data/lib/rvm/capistrano/empty_gemset.rb +3 -1
- data/lib/rvm/capistrano/gem_install_uninstall.rb +6 -2
- data/lib/rvm/capistrano/gemset_import_export.rb +0 -7
- data/lib/rvm/capistrano/helpers/run_silent_curl.rb +2 -2
- data/lib/rvm/capistrano/helpers/rvm_if_sudo.rb +35 -16
- data/lib/rvm/capistrano/helpers/rvm_methods.rb +20 -2
- data/lib/rvm/capistrano/helpers/with_rvm_group.rb +4 -5
- data/lib/rvm/capistrano/install_ruby.rb +6 -8
- data/lib/rvm/capistrano/install_rvm.rb +1 -1
- data/lib/rvm/capistrano/version.rb +1 -1
- data/spec/create_gemset_spec.rb +44 -0
- data/spec/empty_gemset_spec.rb +32 -0
- data/spec/install_ruby_spec.rb +124 -0
- data/spec/rvm_paths_spec.rb +93 -0
- data/spec/spec_helper.rb +3 -2
- data/spec/support/abort_matcher.rb +42 -0
- data/spec/support/capistrano.rb +24 -0
- metadata +69 -11
data/History.md
CHANGED
data/README.md
CHANGED
@@ -175,6 +175,7 @@ end
|
|
175
175
|
- `:system` - RVM installed in `/usr/local`, multiuser installation
|
176
176
|
- (some other values permitted for backwards compatability only)
|
177
177
|
|
178
|
+
- `:rvm_user` - arguments to pass to `rvm user`, to enable mixed mode (e.g. system rubies and user gemsets). Based on whether rvm_user includes :gemsets it also helps determine the correct path for importing/exporting gemsets, and similarly, whether to use sudo for gemset creation/deletion and other operations.
|
178
179
|
- `:rvm_autolibs_flag` - control autolibs, read more `rvm help autolibs`
|
179
180
|
- `:disable` - fully disable autolibs, limit automated tasks
|
180
181
|
- `:read` - autolibs only in read only mode, do not change anything in system
|
@@ -16,7 +16,9 @@ rvm_with_capistrano do
|
|
16
16
|
|
17
17
|
desc "Create application wrappers"
|
18
18
|
rvm_task :create_wrappers do
|
19
|
-
run_rvm("wrapper #{rvm_ruby_string_evaluated} --no-prefix --all",
|
19
|
+
run_rvm("wrapper #{rvm_ruby_string_evaluated} --no-prefix --all",
|
20
|
+
:with_rvm_group => true,
|
21
|
+
:subject_class => :wrappers)
|
20
22
|
end
|
21
23
|
|
22
24
|
end
|
data/lib/rvm/capistrano/base.rb
CHANGED
@@ -22,34 +22,57 @@ rvm_with_capistrano do
|
|
22
22
|
|
23
23
|
# Let users set the type of their rvm install.
|
24
24
|
_cset(:rvm_type, :user)
|
25
|
+
_cset(:rvm_user, [])
|
26
|
+
if rvm_type == :mixed
|
27
|
+
abort "When rvm_type is :mixed, you must also set rvm_user." if rvm_user.empty?
|
28
|
+
abort "rvm_user must be an Array of values, e.g. [ :gemsets ]" unless rvm_user.is_a? Array
|
29
|
+
valid = [ :gemsets, :rubies, :hooks, :pkgs, :wrappers ]
|
30
|
+
invalid = rvm_user - valid - [:all, :none ]
|
31
|
+
abort "Invalid value(s) in rvm_user: " + invalid.join(', ') unless invalid.empty?
|
32
|
+
if rvm_user.size > 1
|
33
|
+
abort "rvm_user cannot mix :none with other values." if rvm_user.include? :none
|
34
|
+
abort "rvm_user cannot mix :all with other values." if rvm_user.include? :all
|
35
|
+
elsif rvm_user == [ :all ]
|
36
|
+
set(:rvm_user) { valid }
|
37
|
+
end
|
38
|
+
else
|
39
|
+
if ! rvm_user.empty?
|
40
|
+
abort "rvm_user must not be set unless rvm_type is :mixed (was #{rvm_user})."
|
41
|
+
end
|
42
|
+
end
|
25
43
|
|
26
|
-
# Define
|
44
|
+
# Define rvm system and user paths
|
27
45
|
# This is used in the default_shell command to pass the required variable to rvm-shell, allowing
|
28
46
|
# rvm to boostrap using the proper path. This is being lost in Capistrano due to the lack of a
|
29
47
|
# full environment.
|
48
|
+
_cset(:rvm_system_path, "/usr/local/rvm")
|
49
|
+
_cset(:rvm_user_path, "$HOME/.rvm")
|
50
|
+
|
30
51
|
_cset(:rvm_path) do
|
31
52
|
case rvm_type
|
32
|
-
when :root, :system
|
33
|
-
|
53
|
+
when :root, :system, :mixed
|
54
|
+
rvm_system_path
|
34
55
|
when :local, :user, :default
|
35
|
-
|
56
|
+
rvm_user_path
|
36
57
|
else
|
37
|
-
rvm_type.to_s.empty? ?
|
58
|
+
rvm_type.to_s.empty? ? rvm_user_path : rvm_type.to_s
|
38
59
|
end
|
39
60
|
end
|
40
61
|
|
41
62
|
# Let users override the rvm_bin_path
|
42
|
-
_cset(:rvm_bin_path)
|
63
|
+
_cset(:rvm_bin_path) { "#{rvm_path}/bin" }
|
64
|
+
|
65
|
+
# Let users configure a path to export/import gemsets
|
66
|
+
_cset(:rvm_gemset_path) do
|
43
67
|
case rvm_type
|
44
|
-
when :root, :system
|
45
|
-
|
46
|
-
when :
|
47
|
-
|
68
|
+
when :root, :system, :local, :user, :default
|
69
|
+
rvm_path
|
70
|
+
when :mixed
|
71
|
+
rvm_user.include?(:gemsets) ? rvm_user_path : rvm_system_path
|
48
72
|
else
|
49
|
-
|
50
|
-
end
|
73
|
+
rvm_path
|
74
|
+
end + "/gemsets"
|
51
75
|
end
|
52
|
-
|
53
76
|
# evaluate :rvm_ruby_string => :local
|
54
77
|
set :rvm_ruby_string_evaluated do
|
55
78
|
value = fetch(:rvm_ruby_string, :default)
|
@@ -15,7 +15,9 @@ gemset can not be created when using :rvm_ruby_string => :#{ruby}
|
|
15
15
|
"
|
16
16
|
else
|
17
17
|
if gemset
|
18
|
-
run_rvm("rvm gemset create #{gemset}",
|
18
|
+
run_rvm("rvm gemset create #{gemset}",
|
19
|
+
:with_rvm_group => true, :with_ruby => ruby,
|
20
|
+
:subject_class => :gemsets)
|
19
21
|
end
|
20
22
|
end
|
21
23
|
end
|
@@ -12,7 +12,9 @@ rvm_with_capistrano do
|
|
12
12
|
raise "gemset can not be emptied when using :rvm_ruby_string => :#{ruby}"
|
13
13
|
else
|
14
14
|
if gemset
|
15
|
-
run_rvm("rvm --force gemset empty #{gemset}",
|
15
|
+
run_rvm("rvm --force gemset empty #{gemset}",
|
16
|
+
:with_rvm_group => true, :with_ruby => ruby,
|
17
|
+
:subject_class => :gemsets)
|
16
18
|
end
|
17
19
|
end
|
18
20
|
end
|
@@ -5,12 +5,16 @@ rvm_with_capistrano do
|
|
5
5
|
|
6
6
|
desc "Install a gem, 'cap rvm:install_gem GEM=my_gem'."
|
7
7
|
rvm_task :install_gem do
|
8
|
-
run_rvm("gem install #{ENV['GEM']}",
|
8
|
+
run_rvm("gem install #{ENV['GEM']}",
|
9
|
+
:with_ruby => rvm_ruby_string_evaluated,
|
10
|
+
:subject_class => :gemsets)
|
9
11
|
end
|
10
12
|
|
11
13
|
desc "Uninstall a gem, 'cap rvm:uninstall_gem GEM=my_gem'."
|
12
14
|
rvm_task :uninstall_gem do
|
13
|
-
run_rvm("gem uninstall --no-executables #{ENV['GEM']}",
|
15
|
+
run_rvm("gem uninstall --no-executables #{ENV['GEM']}",
|
16
|
+
:with_ruby => rvm_ruby_string_evaluated,
|
17
|
+
:subject_class => :gemsets)
|
14
18
|
end
|
15
19
|
|
16
20
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'rvm/capistrano/base'
|
2
2
|
|
3
3
|
rvm_with_capistrano do
|
4
|
-
def run_silent_curl(command)
|
5
|
-
run_without_rvm(<<-EOF.gsub(/[\s]+/, ' '))
|
4
|
+
def run_silent_curl(command, options={})
|
5
|
+
run_without_rvm(<<-EOF.gsub(/[\s]+/, ' '), options)
|
6
6
|
__LAST_STATUS=0;
|
7
7
|
export CURL_HOME="${TMPDIR:-${HOME}}/.rvm-curl-config.$$";
|
8
8
|
mkdir ${CURL_HOME}/;
|
@@ -8,35 +8,54 @@ rvm_with_capistrano do
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def rvm_if_sudo(options = {})
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
return '' unless need_root(options)
|
12
|
+
prohibited = sudo_prohibited(options)
|
13
|
+
return prohibited if prohibited # will cause a deferred error
|
14
|
+
return "#{sudo} "
|
15
|
+
end
|
16
|
+
|
17
|
+
def need_root(options = {})
|
18
|
+
return true if rvm_type == :root || rvm_type == :system
|
19
|
+
return false unless rvm_type == :mixed # must be user installation
|
20
|
+
|
21
|
+
# Finally deal with mixed installations. Whether we need sudo
|
22
|
+
# depends on what we're trying to do.
|
23
|
+
# If rvm_user config variable contains :gemsets (say), and we're
|
24
|
+
# operating on gemsets, then we don't need root. However, the
|
25
|
+
# most common use case for sudo is for installing rubies, so we
|
26
|
+
# default to that to keep the code simpler.
|
27
|
+
options[:subject_class] ||= :rubies
|
28
|
+
|
29
|
+
# rvm is installed system-wide in mixed installations
|
30
|
+
return true if options[:subject_class] == :rvm
|
31
|
+
|
32
|
+
return ! rvm_user.include?(options[:subject_class])
|
33
|
+
end
|
34
|
+
|
35
|
+
def sudo_prohibited(options = {})
|
36
|
+
return false if fetch(:use_sudo, true) || rvm_install_with_sudo
|
37
|
+
|
38
|
+
explanation = <<-EXPLANATION
|
15
39
|
You can enable use_sudo within rvm for use only by this install operation by adding to deploy.rb:
|
16
40
|
|
17
41
|
set :rvm_install_with_sudo, true
|
18
42
|
|
19
|
-
|
20
|
-
|
21
|
-
|
43
|
+
EXPLANATION
|
44
|
+
|
45
|
+
if options[:deferred]
|
46
|
+
<<-DEFERRED_ERROR.gsub(/\n/, " ; ")
|
22
47
|
echo "
|
23
48
|
Neither :use_sudo or :rvm_install_with_sudo was set and installation would ended up in using 'sudo'
|
24
49
|
#{explanation}
|
25
50
|
" >&2
|
26
51
|
exit 1
|
27
|
-
|
28
|
-
|
29
|
-
|
52
|
+
DEFERRED_ERROR
|
53
|
+
else
|
54
|
+
raise "
|
30
55
|
|
31
56
|
:use_sudo is set to 'false' but sudo is needed to install rvm_type: #{rvm_type}.
|
32
57
|
#{explanation}
|
33
58
|
"
|
34
|
-
end
|
35
|
-
else
|
36
|
-
"#{sudo} "
|
37
|
-
end
|
38
|
-
else
|
39
|
-
''
|
40
59
|
end
|
41
60
|
end
|
42
61
|
|
@@ -22,12 +22,30 @@ module Capistrano
|
|
22
22
|
# shortcut to binary rvm #{command}
|
23
23
|
# - use :with_rvm_group => true - to wrap it all in `with_rvm_group(...)` call
|
24
24
|
# - use :with_ruby => 'with_ruby' - to extend to `.../bin/rvm #{with_ruby} do`
|
25
|
+
# - use :subject_class => :gemsets to indicate that the subject of the operation
|
26
|
+
# will be a gemset; valid values are any values which can be contained in
|
27
|
+
# the rvm_user config variable Array. This allows us to determine whether
|
28
|
+
# the subject is persisted system-wide or just per-user, and as a result
|
29
|
+
# whether sudo is required.
|
25
30
|
def run_rvm(command, options={})
|
26
|
-
|
27
|
-
cmd =
|
31
|
+
rvm_bin = path_to_bin_rvm(options)
|
32
|
+
cmd = "#{rvm_bin} #{command}"
|
33
|
+
cmd = with_rvm_group(cmd, options) if options[:with_rvm_group]
|
34
|
+
cmd = rvm_user_command(options) + cmd
|
28
35
|
run_without_rvm(cmd)
|
29
36
|
end
|
30
37
|
|
38
|
+
# If we're operating on something affected by the rvm user mode,
|
39
|
+
# we need to make sure that the server has the right rvm user mode.
|
40
|
+
# This returns a shell command to prepend to an existing command
|
41
|
+
# in order to achieve this.
|
42
|
+
def rvm_user_command(options={})
|
43
|
+
return '' unless rvm_type == :mixed && options[:subject_class]
|
44
|
+
rvm_user_args = rvm_user.empty? ? 'none' : rvm_user.map(&:to_s).join(' ')
|
45
|
+
rvm_bin = path_to_bin_rvm({ :with_ruby => true }.merge(options))
|
46
|
+
"#{rvm_bin} rvm user #{rvm_user_args} ; "
|
47
|
+
end
|
48
|
+
|
31
49
|
# helper to find path to rvm binary
|
32
50
|
def path_to_bin_rvm(options={})
|
33
51
|
result = File.join(rvm_bin_path, "rvm")
|
@@ -4,13 +4,12 @@ require 'rvm/capistrano/helpers/quote_and_escape'
|
|
4
4
|
|
5
5
|
rvm_with_capistrano do
|
6
6
|
|
7
|
-
def with_rvm_group(command)
|
8
|
-
|
9
|
-
|
10
|
-
<<-CODE
|
7
|
+
def with_rvm_group(command, options = {})
|
8
|
+
if need_root(options)
|
9
|
+
rvm_user_command + <<-CODE
|
11
10
|
if id | grep ' groups=.*(rvm)' >/dev/null ;
|
12
11
|
then #{command} ;
|
13
|
-
else #{rvm_if_sudo(:deferred=>true)} sg rvm -c #{quote_and_escape(command)} ;
|
12
|
+
else #{rvm_if_sudo(options.merge(:deferred => true))} sg rvm -c #{quote_and_escape(command)} ;
|
14
13
|
fi
|
15
14
|
CODE
|
16
15
|
else
|
@@ -40,7 +40,7 @@ ruby can not be installed when using :rvm_ruby_string => :#{ruby}
|
|
40
40
|
|
41
41
|
"
|
42
42
|
else
|
43
|
-
command_install =
|
43
|
+
command_install = rvm_user_command(:subject_class => :rubies, :with_ruby=>ruby)
|
44
44
|
|
45
45
|
autolibs_flag = fetch(:rvm_autolibs_flag, 2).to_s
|
46
46
|
autolibs_flag_no_requirements = %w(
|
@@ -48,23 +48,21 @@ ruby can not be installed when using :rvm_ruby_string => :#{ruby}
|
|
48
48
|
1 read read-only
|
49
49
|
2 fail read-fail
|
50
50
|
).include?( autolibs_flag )
|
51
|
+
autolibs_flag = "1" unless autolibs_flag_no_requirements
|
51
52
|
|
52
53
|
install_ruby_threads = fetch(:rvm_install_ruby_threads,nil).nil? ? '' : "-j #{rvm_install_ruby_threads}"
|
53
|
-
|
54
|
-
if autolibs_flag_no_requirements
|
55
|
-
command_install << with_rvm_group("#{path_to_bin_rvm} --autolibs=#{autolibs_flag} #{rvm_install_ruby} #{ruby} #{install_ruby_threads} #{rvm_install_ruby_params}")
|
56
|
-
else
|
54
|
+
unless autolibs_flag_no_requirements
|
57
55
|
command_install << "#{rvm_if_sudo} #{path_to_bin_rvm} --autolibs=#{autolibs_flag} requirements #{ruby}"
|
58
56
|
command_install << "; "
|
59
|
-
command_install << with_rvm_group("#{path_to_bin_rvm} --autolibs=1 #{rvm_install_ruby} #{ruby} #{install_ruby_threads} #{rvm_install_ruby_params}")
|
60
57
|
end
|
58
|
+
command_install << with_rvm_group("#{path_to_bin_rvm} --autolibs=#{autolibs_flag} #{rvm_install_ruby} #{ruby} #{install_ruby_threads} #{rvm_install_ruby_params}", :subject_class => :rubies)
|
61
59
|
|
62
60
|
if gemset
|
63
61
|
command_install << "; "
|
64
|
-
command_install << with_rvm_group("#{path_to_bin_rvm(:with_ruby=>ruby)} rvm gemset create #{gemset}")
|
62
|
+
command_install << with_rvm_group("#{path_to_bin_rvm(:with_ruby=>ruby)} rvm gemset create #{gemset}", :subject_class => :gemsets)
|
65
63
|
end
|
66
64
|
|
67
|
-
run_silent_curl
|
65
|
+
run_silent_curl(command_install, :subject_class => :rubies)
|
68
66
|
end
|
69
67
|
end
|
70
68
|
|
@@ -28,7 +28,7 @@ rvm_with_capistrano do
|
|
28
28
|
EOF
|
29
29
|
rvm_task :install_rvm do
|
30
30
|
command_fetch = "curl -L get.rvm.io"
|
31
|
-
command_install = rvm_if_sudo
|
31
|
+
command_install = rvm_if_sudo(:subject_class => :rvm)
|
32
32
|
command_install << "#{rvm_install_shell} -s #{rvm_install_type} --path #{rvm_path}"
|
33
33
|
case rvm_type
|
34
34
|
when :root, :system
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "rvm:create_gemset task" do
|
4
|
+
include_context "Capistrano::Configuration"
|
5
|
+
|
6
|
+
before {
|
7
|
+
@gemset = 'mygemset'
|
8
|
+
@configuration.set :rvm_ruby_string, '2.0.0@' + @gemset
|
9
|
+
@task = @configuration.find_task 'rvm:create_gemset'
|
10
|
+
}
|
11
|
+
|
12
|
+
it "should create a gemset in $HOME" do
|
13
|
+
@configuration.trigger :load
|
14
|
+
expected = "$HOME/.rvm/bin/rvm 2.0.0 do rvm gemset create #{@gemset}"
|
15
|
+
@task.namespace.should_receive(:run_without_rvm).with(expected)
|
16
|
+
@configuration.execute_task @task
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should create a system-wide gemset" do
|
20
|
+
@configuration.set :rvm_type, :system
|
21
|
+
@configuration.trigger :load
|
22
|
+
expected = <<-EOSHELL.gsub(/^ /, '')
|
23
|
+
if id | grep ' groups=.*(rvm)' >/dev/null ;
|
24
|
+
then /usr/local/rvm/bin/rvm 2.0.0 do rvm gemset create #{@gemset} ;
|
25
|
+
else sudo -p 'sudo password: ' sg rvm -c '/usr/local/rvm/bin/rvm 2.0.0 do rvm gemset create #{@gemset}' ;
|
26
|
+
fi
|
27
|
+
EOSHELL
|
28
|
+
@task.namespace.should_receive(:run_without_rvm).with(expected)
|
29
|
+
@configuration.execute_task @task
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should create a gemset in $HOME in mixed mode" do
|
33
|
+
@configuration.set :rvm_ruby_string, '2.0.0@' + @gemset
|
34
|
+
@configuration.set :rvm_type, :mixed
|
35
|
+
@configuration.set :rvm_user, [ :gemsets ]
|
36
|
+
@configuration.trigger :load
|
37
|
+
task = @configuration.find_task 'rvm:create_gemset'
|
38
|
+
expected = \
|
39
|
+
"/usr/local/rvm/bin/rvm 2.0.0 do rvm user gemsets ; " +
|
40
|
+
"/usr/local/rvm/bin/rvm 2.0.0 do rvm gemset create #{@gemset}"
|
41
|
+
task.namespace.should_receive(:run_without_rvm).with(expected)
|
42
|
+
@configuration.execute_task task
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "rvm:create_gemset task" do
|
4
|
+
include_context "Capistrano::Configuration"
|
5
|
+
|
6
|
+
before {
|
7
|
+
@configuration.require 'rvm/capistrano/empty_gemset'
|
8
|
+
@gemset = 'mygemset'
|
9
|
+
@configuration.set :rvm_ruby_string, '2.0.0@' + @gemset
|
10
|
+
@task = @configuration.find_task 'rvm:empty_gemset'
|
11
|
+
}
|
12
|
+
|
13
|
+
it "should empty a gemset in $HOME" do
|
14
|
+
@configuration.trigger :load
|
15
|
+
expected = "$HOME/.rvm/bin/rvm 2.0.0 do rvm --force gemset empty #{@gemset}"
|
16
|
+
@task.namespace.should_receive(:run_without_rvm).with(expected)
|
17
|
+
@configuration.execute_task @task
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should empty a system-wide gemset" do
|
21
|
+
@configuration.set :rvm_type, :system
|
22
|
+
@configuration.trigger :load
|
23
|
+
expected = <<-EOSHELL.gsub(/^ /, '')
|
24
|
+
if id | grep ' groups=.*(rvm)' >/dev/null ;
|
25
|
+
then /usr/local/rvm/bin/rvm 2.0.0 do rvm --force gemset empty #{@gemset} ;
|
26
|
+
else sudo -p 'sudo password: ' sg rvm -c '/usr/local/rvm/bin/rvm 2.0.0 do rvm --force gemset empty #{@gemset}' ;
|
27
|
+
fi
|
28
|
+
EOSHELL
|
29
|
+
@task.namespace.should_receive(:run_without_rvm).with(expected)
|
30
|
+
@configuration.execute_task @task
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "rvm:install_ruby task" do
|
4
|
+
include_context "Capistrano::Configuration"
|
5
|
+
|
6
|
+
before {
|
7
|
+
@gemset = 'mygemset'
|
8
|
+
@configuration.set :rvm_ruby_string, '2.0.0@' + @gemset
|
9
|
+
@task = @configuration.find_task 'rvm:install_ruby'
|
10
|
+
}
|
11
|
+
|
12
|
+
it "should install a ruby in $HOME" do
|
13
|
+
@configuration.trigger :load
|
14
|
+
expected = ' ' + <<-EOSHELL.gsub(/^\s+/, '').gsub("\n", ' ')
|
15
|
+
__LAST_STATUS=0;
|
16
|
+
export CURL_HOME=\"${TMPDIR:-${HOME}}/.rvm-curl-config.$$\";
|
17
|
+
mkdir ${CURL_HOME}/;
|
18
|
+
{
|
19
|
+
[[ -r ${HOME}/.curlrc ]] && cat ${HOME}/.curlrc;
|
20
|
+
echo \"silent\";
|
21
|
+
echo \"show-error\";
|
22
|
+
} > $CURL_HOME/.curlrc;
|
23
|
+
$HOME/.rvm/bin/rvm --autolibs=2 install 2.0.0 ;
|
24
|
+
$HOME/.rvm/bin/rvm 2.0.0 do rvm gemset create mygemset || __LAST_STATUS=$?;
|
25
|
+
rm -rf $CURL_HOME;
|
26
|
+
exit ${__LAST_STATUS}
|
27
|
+
EOSHELL
|
28
|
+
@configuration.should_receive(:run_without_rvm) \
|
29
|
+
.with(expected, :subject_class => :rubies)
|
30
|
+
@configuration.execute_task @task
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should install a ruby system-wide" do
|
34
|
+
@configuration.set :rvm_type, :system
|
35
|
+
@configuration.trigger :load
|
36
|
+
expected = ' ' + <<-EOSHELL.gsub(/^\s+/, '').gsub("\n", ' ')
|
37
|
+
__LAST_STATUS=0;
|
38
|
+
export CURL_HOME=\"${TMPDIR:-${HOME}}/.rvm-curl-config.$$\";
|
39
|
+
mkdir ${CURL_HOME}/;
|
40
|
+
{
|
41
|
+
[[ -r ${HOME}/.curlrc ]] && cat ${HOME}/.curlrc;
|
42
|
+
echo \"silent\";
|
43
|
+
echo \"show-error\";
|
44
|
+
} > $CURL_HOME/.curlrc;
|
45
|
+
if id | grep ' groups=.*(rvm)' >/dev/null ; then
|
46
|
+
/usr/local/rvm/bin/rvm --autolibs=2 install 2.0.0 ;
|
47
|
+
else
|
48
|
+
sudo -p 'sudo password: ' sg rvm -c '/usr/local/rvm/bin/rvm --autolibs=2 install 2.0.0 ' ;
|
49
|
+
fi ;
|
50
|
+
if id | grep ' groups=.*(rvm)' >/dev/null ; then
|
51
|
+
/usr/local/rvm/bin/rvm 2.0.0 do rvm gemset create mygemset ;
|
52
|
+
else
|
53
|
+
sudo -p 'sudo password: ' sg rvm -c '/usr/local/rvm/bin/rvm 2.0.0 do rvm gemset create mygemset' ;
|
54
|
+
fi || __LAST_STATUS=$?;
|
55
|
+
rm -rf $CURL_HOME;
|
56
|
+
exit ${__LAST_STATUS}
|
57
|
+
EOSHELL
|
58
|
+
@configuration.should_receive(:run_without_rvm) \
|
59
|
+
.with(expected, :subject_class => :rubies)
|
60
|
+
@configuration.execute_task @task
|
61
|
+
end
|
62
|
+
|
63
|
+
context "in mixed mode with user gemsets" do
|
64
|
+
before do
|
65
|
+
@configuration.set :rvm_type, :mixed
|
66
|
+
@configuration.set :rvm_user, [ :gemsets ]
|
67
|
+
@configuration.trigger :load
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should install a ruby system-wide and create a user gemset" do
|
71
|
+
expected = ' ' + <<-EOSHELL.gsub(/^\s+/, '').gsub("\n", ' ')
|
72
|
+
__LAST_STATUS=0;
|
73
|
+
export CURL_HOME=\"${TMPDIR:-${HOME}}/.rvm-curl-config.$$\";
|
74
|
+
mkdir ${CURL_HOME}/;
|
75
|
+
{
|
76
|
+
[[ -r ${HOME}/.curlrc ]] && cat ${HOME}/.curlrc;
|
77
|
+
echo \"silent\";
|
78
|
+
echo \"show-error\";
|
79
|
+
} > $CURL_HOME/.curlrc;
|
80
|
+
/usr/local/rvm/bin/rvm 2.0.0 do rvm user gemsets ;
|
81
|
+
if id | grep ' groups=.*(rvm)' >/dev/null ; then
|
82
|
+
/usr/local/rvm/bin/rvm --autolibs=2 install 2.0.0 ;
|
83
|
+
else
|
84
|
+
sudo -p 'sudo password: ' sg rvm -c '/usr/local/rvm/bin/rvm --autolibs=2 install 2.0.0 ' ;
|
85
|
+
fi ;
|
86
|
+
/usr/local/rvm/bin/rvm 2.0.0 do rvm gemset create mygemset || __LAST_STATUS=$?;
|
87
|
+
rm -rf $CURL_HOME;
|
88
|
+
exit ${__LAST_STATUS}
|
89
|
+
EOSHELL
|
90
|
+
@configuration.should_receive(:run_without_rvm) \
|
91
|
+
.with(expected, :subject_class => :rubies)
|
92
|
+
@configuration.execute_task @task
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context "in mixed mode with user rubies and gemsets" do
|
97
|
+
before do
|
98
|
+
@configuration.set :rvm_type, :mixed
|
99
|
+
@configuration.set :rvm_user, [ :rubies, :gemsets ]
|
100
|
+
@configuration.trigger :load
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should install a ruby and create a gemset in $HOME" do
|
104
|
+
expected = ' ' + <<-EOSHELL.gsub(/^\s+/, '').gsub("\n", ' ')
|
105
|
+
__LAST_STATUS=0;
|
106
|
+
export CURL_HOME=\"${TMPDIR:-${HOME}}/.rvm-curl-config.$$\";
|
107
|
+
mkdir ${CURL_HOME}/;
|
108
|
+
{
|
109
|
+
[[ -r ${HOME}/.curlrc ]] && cat ${HOME}/.curlrc;
|
110
|
+
echo \"silent\";
|
111
|
+
echo \"show-error\";
|
112
|
+
} > $CURL_HOME/.curlrc;
|
113
|
+
/usr/local/rvm/bin/rvm 2.0.0 do rvm user rubies gemsets ;
|
114
|
+
/usr/local/rvm/bin/rvm --autolibs=2 install 2.0.0 ;
|
115
|
+
/usr/local/rvm/bin/rvm 2.0.0 do rvm gemset create mygemset || __LAST_STATUS=$?;
|
116
|
+
rm -rf $CURL_HOME;
|
117
|
+
exit ${__LAST_STATUS}
|
118
|
+
EOSHELL
|
119
|
+
@configuration.should_receive(:run_without_rvm) \
|
120
|
+
.with(expected, :subject_class => :rubies)
|
121
|
+
@configuration.execute_task @task
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "rvm paths" do
|
4
|
+
include_context "Capistrano::Configuration"
|
5
|
+
|
6
|
+
describe "default values" do
|
7
|
+
before { @configuration.trigger(:load) }
|
8
|
+
|
9
|
+
it "should return default system path" do
|
10
|
+
@configuration.fetch(:rvm_system_path).should == '/usr/local/rvm'
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should return default user path" do
|
14
|
+
@configuration.fetch(:rvm_user_path).should == '$HOME/.rvm'
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should return default installation mode" do
|
18
|
+
@configuration.fetch(:rvm_type).should == :user
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should return default path" do
|
22
|
+
@configuration.fetch(:rvm_path).should == '$HOME/.rvm'
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should return default bin path" do
|
26
|
+
@configuration.fetch(:rvm_bin_path).should == '$HOME/.rvm/bin'
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should return default gemset path" do
|
30
|
+
@configuration.fetch(:rvm_gemset_path).should == '$HOME/.rvm/gemsets'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "system mode" do
|
35
|
+
before do
|
36
|
+
@configuration.set(:rvm_type, :system)
|
37
|
+
@configuration.trigger(:load)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should return default path" do
|
41
|
+
@configuration.fetch(:rvm_path).should == '/usr/local/rvm'
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should return system bin path" do
|
45
|
+
@configuration.fetch(:rvm_bin_path).should == '/usr/local/rvm/bin'
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should return system gemset path" do
|
49
|
+
@configuration.fetch(:rvm_gemset_path).should == '/usr/local/rvm/gemsets'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "invalid configuration values" do
|
54
|
+
context "in :mixed mode" do
|
55
|
+
before { @configuration.set(:rvm_type, :mixed) }
|
56
|
+
|
57
|
+
it "should abort if rvm_type is :mixed and rvm_user empty" do
|
58
|
+
expect { @configuration.trigger(:load) }.to \
|
59
|
+
abort_with_error(/When rvm_type is :mixed, you must also set rvm_user/)
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should abort if rvm_user isn't an Array" do
|
63
|
+
@configuration.set(:rvm_user, "a string")
|
64
|
+
expect { @configuration.trigger(:load) }.to \
|
65
|
+
abort_with_error(/rvm_user must be an Array/)
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should abort if rvm_user contains an invalid value" do
|
69
|
+
@configuration.set(:rvm_user, [ :invalid_value ])
|
70
|
+
expect { @configuration.trigger(:load) }.to \
|
71
|
+
abort_with_error(/Invalid value\(s\) in rvm_user: invalid_value/)
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should abort if rvm_user mixes :none with other values" do
|
75
|
+
@configuration.set(:rvm_user, [ :none, :gemsets ])
|
76
|
+
expect { @configuration.trigger(:load) }.to \
|
77
|
+
abort_with_error(/rvm_user cannot mix :none with other values/)
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should abort if rvm_user mixes :all with other values" do
|
81
|
+
@configuration.set(:rvm_user, [ :gemsets, :all ])
|
82
|
+
expect { @configuration.trigger(:load) }.to \
|
83
|
+
abort_with_error(/rvm_user cannot mix :all with other values/)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should abort if rvm_user is set and rvm_type isn't :mixed" do
|
88
|
+
@configuration.set(:rvm_user, [ :gemsets ])
|
89
|
+
expect { @configuration.trigger(:load) }.to \
|
90
|
+
abort_with_error(/rvm_user must not be set unless rvm_type is :mixed/)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,2 +1,3 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# Requires supporting files with custom matchers and macros, etc,
|
2
|
+
# in ./support/ and its subdirectories.
|
3
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'rspec/expectations'
|
2
|
+
|
3
|
+
RSpec::Matchers.define :abort_with_error do |message|
|
4
|
+
match do |block|
|
5
|
+
@block = block
|
6
|
+
with_fake_stderr do
|
7
|
+
@got_system_exit = false
|
8
|
+
begin
|
9
|
+
block.call
|
10
|
+
rescue SystemExit
|
11
|
+
@got_system_exit = true
|
12
|
+
@stderr = $stderr.string
|
13
|
+
message ? message === @stderr : true
|
14
|
+
else
|
15
|
+
false
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
description do
|
21
|
+
"blahhh"
|
22
|
+
end
|
23
|
+
|
24
|
+
failure_message_for_should do |actual|
|
25
|
+
if @got_system_exit
|
26
|
+
"expected STDERR to match " + \
|
27
|
+
((message.is_a?(Regexp) ? "/%s/" : "'%s'") % message) + \
|
28
|
+
" but got:\n#{@stderr}"
|
29
|
+
else
|
30
|
+
"expected #{@block} to raise SystemExit"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Fake STDERR and return a string written to it.
|
35
|
+
def with_fake_stderr
|
36
|
+
original_stderr = $stderr
|
37
|
+
$stderr = StringIO.new
|
38
|
+
yield
|
39
|
+
ensure
|
40
|
+
$stderr = original_stderr
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'capistrano-spec'
|
2
|
+
require 'capistrano'
|
3
|
+
|
4
|
+
RSpec.configure do |config|
|
5
|
+
config.include Capistrano::Spec::Matchers
|
6
|
+
config.include Capistrano::Spec::Helpers
|
7
|
+
end
|
8
|
+
|
9
|
+
shared_context "Capistrano::Configuration" do
|
10
|
+
before do
|
11
|
+
@configuration = Capistrano::Configuration.new
|
12
|
+
$:.unshift File.dirname(__FILE__) + '/../../lib'
|
13
|
+
# @configuration.load_paths.unshift File.dirname(__FILE__) + '/../../lib'
|
14
|
+
Capistrano::Configuration.instance = @configuration
|
15
|
+
|
16
|
+
# define _cset etc. from capistrano
|
17
|
+
@configuration.load 'deploy'
|
18
|
+
|
19
|
+
# load rvm/capistrano/base etc.
|
20
|
+
@configuration.require 'rvm/capistrano'
|
21
|
+
|
22
|
+
@configuration.extend(Capistrano::Spec::ConfigurationExtension)
|
23
|
+
end
|
24
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rvm-capistrano
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 1792655073
|
5
|
+
prerelease: 6
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
-
|
10
|
-
|
8
|
+
- 5
|
9
|
+
- 0
|
10
|
+
- rc
|
11
|
+
- 1
|
12
|
+
version: 1.5.0.rc1
|
11
13
|
platform: ruby
|
12
14
|
authors:
|
13
15
|
- Wayne E. Seguin
|
@@ -16,7 +18,7 @@ autorequire:
|
|
16
18
|
bindir: bin
|
17
19
|
cert_chain: []
|
18
20
|
|
19
|
-
date: 2013-08-
|
21
|
+
date: 2013-08-18 00:00:00 Z
|
20
22
|
dependencies:
|
21
23
|
- !ruby/object:Gem::Dependency
|
22
24
|
name: capistrano
|
@@ -49,7 +51,7 @@ dependencies:
|
|
49
51
|
type: :development
|
50
52
|
version_requirements: *id002
|
51
53
|
- !ruby/object:Gem::Dependency
|
52
|
-
name:
|
54
|
+
name: rspec
|
53
55
|
prerelease: false
|
54
56
|
requirement: &id003 !ruby/object:Gem::Requirement
|
55
57
|
none: false
|
@@ -62,6 +64,48 @@ dependencies:
|
|
62
64
|
version: "0"
|
63
65
|
type: :development
|
64
66
|
version_requirements: *id003
|
67
|
+
- !ruby/object:Gem::Dependency
|
68
|
+
name: capistrano-spec
|
69
|
+
prerelease: false
|
70
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
71
|
+
none: false
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
hash: 3
|
76
|
+
segments:
|
77
|
+
- 0
|
78
|
+
version: "0"
|
79
|
+
type: :development
|
80
|
+
version_requirements: *id004
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: guard-rspec
|
83
|
+
prerelease: false
|
84
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
hash: 3
|
90
|
+
segments:
|
91
|
+
- 0
|
92
|
+
version: "0"
|
93
|
+
type: :development
|
94
|
+
version_requirements: *id005
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: guard-bundler
|
97
|
+
prerelease: false
|
98
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
hash: 3
|
104
|
+
segments:
|
105
|
+
- 0
|
106
|
+
version: "0"
|
107
|
+
type: :development
|
108
|
+
version_requirements: *id006
|
65
109
|
description: RVM / Capistrano Integration Gem
|
66
110
|
email:
|
67
111
|
- wayneeseguin@gmail.com
|
@@ -99,6 +143,12 @@ files:
|
|
99
143
|
- lib/rvm/capistrano/helpers/rvm_methods.rb
|
100
144
|
- lib/rvm/capistrano/helpers/with_rvm_group.rb
|
101
145
|
- spec/spec_helper.rb
|
146
|
+
- spec/create_gemset_spec.rb
|
147
|
+
- spec/install_ruby_spec.rb
|
148
|
+
- spec/empty_gemset_spec.rb
|
149
|
+
- spec/support/capistrano.rb
|
150
|
+
- spec/support/abort_matcher.rb
|
151
|
+
- spec/rvm_paths_spec.rb
|
102
152
|
homepage: https://github.com/wayneeseguin/rvm-capistrano
|
103
153
|
licenses:
|
104
154
|
- MIT
|
@@ -119,12 +169,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
119
169
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
170
|
none: false
|
121
171
|
requirements:
|
122
|
-
- - "
|
172
|
+
- - ">"
|
123
173
|
- !ruby/object:Gem::Version
|
124
|
-
hash:
|
174
|
+
hash: 25
|
125
175
|
segments:
|
126
|
-
-
|
127
|
-
|
176
|
+
- 1
|
177
|
+
- 3
|
178
|
+
- 1
|
179
|
+
version: 1.3.1
|
128
180
|
requirements: []
|
129
181
|
|
130
182
|
rubyforge_project:
|
@@ -134,3 +186,9 @@ specification_version: 3
|
|
134
186
|
summary: RVM / Capistrano Integration Gem
|
135
187
|
test_files:
|
136
188
|
- spec/spec_helper.rb
|
189
|
+
- spec/create_gemset_spec.rb
|
190
|
+
- spec/install_ruby_spec.rb
|
191
|
+
- spec/empty_gemset_spec.rb
|
192
|
+
- spec/support/capistrano.rb
|
193
|
+
- spec/support/abort_matcher.rb
|
194
|
+
- spec/rvm_paths_spec.rb
|