capistrano 2.5.18 → 2.5.20
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +60 -42
- data/Gemfile +17 -0
- data/README.mdown +65 -0
- data/Rakefile +10 -14
- data/VERSION +1 -1
- data/bin/capify +3 -3
- data/lib/capistrano/command.rb +6 -3
- data/lib/capistrano/configuration/actions/file_transfer.rb +1 -1
- data/lib/capistrano/recipes/deploy/remote_dependency.rb +6 -0
- data/lib/capistrano/recipes/deploy/scm/cvs.rb +2 -1
- data/lib/capistrano/recipes/deploy/scm/git.rb +1 -1
- data/lib/capistrano/recipes/deploy/scm/subversion.rb +1 -1
- data/lib/capistrano/recipes/deploy/strategy/base.rb +11 -2
- data/lib/capistrano/recipes/deploy/strategy/copy.rb +13 -8
- data/lib/capistrano/recipes/deploy/strategy/remote_cache.rb +1 -0
- data/lib/capistrano/recipes/deploy.rb +27 -19
- data/test/configuration/actions/file_transfer_test.rb +3 -3
- data/test/deploy/remote_dependency_test.rb +22 -1
- data/test/deploy/scm/git_test.rb +2 -2
- data/test/deploy/strategy/copy_test.rb +16 -16
- metadata +148 -34
- data/.gitignore +0 -9
- data/README +0 -102
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'benchmark'
|
1
2
|
require 'yaml'
|
2
3
|
require 'capistrano/recipes/deploy/scm'
|
3
4
|
require 'capistrano/recipes/deploy/strategy'
|
@@ -27,6 +28,9 @@ _cset :deploy_via, :checkout
|
|
27
28
|
_cset(:deploy_to) { "/u/apps/#{application}" }
|
28
29
|
_cset(:revision) { source.head }
|
29
30
|
|
31
|
+
# Maintenance base filename
|
32
|
+
_cset :maintenance_basename, "maintenance"
|
33
|
+
|
30
34
|
# =========================================================================
|
31
35
|
# These variables should NOT be changed unless you are very confident in
|
32
36
|
# what you are doing. Make sure you understand all the implications of your
|
@@ -51,13 +55,13 @@ _cset(:shared_path) { File.join(deploy_to, shared_dir) }
|
|
51
55
|
_cset(:current_path) { File.join(deploy_to, current_dir) }
|
52
56
|
_cset(:release_path) { File.join(releases_path, release_name) }
|
53
57
|
|
54
|
-
_cset(:releases) { capture("ls -x #{releases_path}").split.sort }
|
58
|
+
_cset(:releases) { capture("ls -x #{releases_path}", :except => { :no_release => true }).split.sort }
|
55
59
|
_cset(:current_release) { File.join(releases_path, releases.last) }
|
56
60
|
_cset(:previous_release) { releases.length > 1 ? File.join(releases_path, releases[-2]) : nil }
|
57
61
|
|
58
|
-
_cset(:current_revision) { capture("cat #{current_path}/REVISION").chomp }
|
59
|
-
_cset(:latest_revision) { capture("cat #{current_release}/REVISION").chomp }
|
60
|
-
_cset(:previous_revision) { capture("cat #{previous_release}/REVISION").chomp }
|
62
|
+
_cset(:current_revision) { capture("cat #{current_path}/REVISION", :except => { :no_release => true }).chomp }
|
63
|
+
_cset(:latest_revision) { capture("cat #{current_release}/REVISION", :except => { :no_release => true }).chomp }
|
64
|
+
_cset(:previous_revision) { capture("cat #{previous_release}/REVISION", :except => { :no_release => true }).chomp if previous_release }
|
61
65
|
|
62
66
|
_cset(:run_method) { fetch(:use_sudo, true) ? :sudo : :run }
|
63
67
|
|
@@ -95,10 +99,14 @@ end
|
|
95
99
|
# returns the command output as a string
|
96
100
|
def run_locally(cmd)
|
97
101
|
logger.trace "executing locally: #{cmd.inspect}" if logger
|
98
|
-
output_on_stdout =
|
102
|
+
output_on_stdout = nil
|
103
|
+
elapsed = Benchmark.realtime do
|
104
|
+
output_on_stdout = `#{cmd}`
|
105
|
+
end
|
99
106
|
if $?.to_i > 0 # $? is command exit code (posix style)
|
100
107
|
raise Capistrano::LocalArgumentError, "Command #{cmd} returned status code #{$?}"
|
101
108
|
end
|
109
|
+
logger.trace "command finished in #{(elapsed * 1000).round}ms" if logger
|
102
110
|
output_on_stdout
|
103
111
|
end
|
104
112
|
|
@@ -224,7 +232,8 @@ namespace :deploy do
|
|
224
232
|
public/stylesheets, and public/javascripts so that the times are \
|
225
233
|
consistent (so that asset timestamping works). This touch process \
|
226
234
|
is only carried out if the :normalize_asset_timestamps variable is \
|
227
|
-
set to true, which is the default
|
235
|
+
set to true, which is the default The asset directories can be overridden \
|
236
|
+
using the :public_children variable.
|
228
237
|
DESC
|
229
238
|
task :finalize_update, :except => { :no_release => true } do
|
230
239
|
run "chmod -R g+w #{latest_release}" if fetch(:group_writable, true)
|
@@ -242,7 +251,7 @@ namespace :deploy do
|
|
242
251
|
|
243
252
|
if fetch(:normalize_asset_timestamps, true)
|
244
253
|
stamp = Time.now.utc.strftime("%Y%m%d%H%M.%S")
|
245
|
-
asset_paths = %w(images stylesheets javascripts).map { |p| "#{latest_release}/public/#{p}" }.join(" ")
|
254
|
+
asset_paths = fetch(:public_children, %w(images stylesheets javascripts)).map { |p| "#{latest_release}/public/#{p}" }.join(" ")
|
246
255
|
run "find #{asset_paths} -exec touch -t #{stamp} {} ';'; true", :env => { "TZ" => "UTC" }
|
247
256
|
end
|
248
257
|
end
|
@@ -382,11 +391,10 @@ namespace :deploy do
|
|
382
391
|
|
383
392
|
directory = case migrate_target.to_sym
|
384
393
|
when :current then current_path
|
385
|
-
when :latest then
|
394
|
+
when :latest then latest_release
|
386
395
|
else raise ArgumentError, "unknown migration target #{migrate_target.inspect}"
|
387
396
|
end
|
388
397
|
|
389
|
-
puts "#{migrate_target} => #{directory}"
|
390
398
|
run "cd #{directory}; #{rake} RAILS_ENV=#{rails_env} #{migrate_env} db:migrate"
|
391
399
|
end
|
392
400
|
|
@@ -536,7 +544,7 @@ namespace :deploy do
|
|
536
544
|
namespace :web do
|
537
545
|
desc <<-DESC
|
538
546
|
Present a maintenance page to visitors. Disables your application's web \
|
539
|
-
interface by writing a "
|
547
|
+
interface by writing a "#{maintenance_basename}.html" file to each web server. The \
|
540
548
|
servers must be configured to detect the presence of this file, and if \
|
541
549
|
it is present, always display it instead of performing the request.
|
542
550
|
|
@@ -552,18 +560,18 @@ namespace :deploy do
|
|
552
560
|
DESC
|
553
561
|
task :disable, :roles => :web, :except => { :no_release => true } do
|
554
562
|
require 'erb'
|
555
|
-
on_rollback { run "rm #{shared_path}/system
|
563
|
+
on_rollback { run "rm #{shared_path}/system/#{maintenance_basename}.html" }
|
556
564
|
|
557
565
|
warn <<-EOHTACCESS
|
558
|
-
|
566
|
+
|
559
567
|
# Please add something like this to your site's htaccess to redirect users to the maintenance page.
|
560
568
|
# More Info: http://www.shiftcommathree.com/articles/make-your-rails-maintenance-page-respond-with-a-503
|
561
|
-
|
562
|
-
ErrorDocument 503 /system
|
569
|
+
|
570
|
+
ErrorDocument 503 /system/#{maintenance_basename}.html
|
563
571
|
RewriteEngine On
|
564
572
|
RewriteCond %{REQUEST_URI} !\.(css|gif|jpg|png)$
|
565
|
-
RewriteCond %{DOCUMENT_ROOT}/system
|
566
|
-
RewriteCond %{SCRIPT_FILENAME}
|
573
|
+
RewriteCond %{DOCUMENT_ROOT}/system/#{maintenance_basename}.html -f
|
574
|
+
RewriteCond %{SCRIPT_FILENAME} !#{maintenance_basename}.html
|
567
575
|
RewriteRule ^.*$ - [redirect=503,last]
|
568
576
|
EOHTACCESS
|
569
577
|
|
@@ -573,17 +581,17 @@ namespace :deploy do
|
|
573
581
|
template = File.read(File.join(File.dirname(__FILE__), "templates", "maintenance.rhtml"))
|
574
582
|
result = ERB.new(template).result(binding)
|
575
583
|
|
576
|
-
put result, "#{shared_path}/system
|
584
|
+
put result, "#{shared_path}/system/#{maintenance_basename}.html", :mode => 0644
|
577
585
|
end
|
578
586
|
|
579
587
|
desc <<-DESC
|
580
588
|
Makes the application web-accessible again. Removes the \
|
581
|
-
"
|
589
|
+
"#{maintenance_basename}.html" page generated by deploy:web:disable, which (if your \
|
582
590
|
web servers are configured correctly) will make your application \
|
583
591
|
web-accessible again.
|
584
592
|
DESC
|
585
593
|
task :enable, :roles => :web, :except => { :no_release => true } do
|
586
|
-
run "rm #{shared_path}/system
|
594
|
+
run "rm #{shared_path}/system/#{maintenance_basename}.html"
|
587
595
|
end
|
588
596
|
end
|
589
597
|
end
|
@@ -37,13 +37,13 @@ class ConfigurationActionsFileTransferTest < Test::Unit::TestCase
|
|
37
37
|
|
38
38
|
def test_upload_with_mode_should_try_to_chmod
|
39
39
|
@config.expects(:transfer).with(:up, "testl.txt", "testr.txt", :foo => "bar")
|
40
|
-
@config.expects(:run).with("chmod 775 testr.txt")
|
40
|
+
@config.expects(:run).with("chmod 775 testr.txt", {:foo => "bar"})
|
41
41
|
@config.upload("testl.txt", "testr.txt", :mode => 0775, :foo => "bar")
|
42
42
|
end
|
43
43
|
|
44
44
|
def test_upload_with_symbolic_mode_should_try_to_chmod
|
45
45
|
@config.expects(:transfer).with(:up, "testl.txt", "testr.txt", :foo => "bar")
|
46
|
-
@config.expects(:run).with("chmod g+w testr.txt")
|
46
|
+
@config.expects(:run).with("chmod g+w testr.txt", {:foo => "bar"})
|
47
47
|
@config.upload("testl.txt", "testr.txt", :mode => "g+w", :foo => "bar")
|
48
48
|
end
|
49
49
|
|
@@ -58,4 +58,4 @@ class ConfigurationActionsFileTransferTest < Test::Unit::TestCase
|
|
58
58
|
Capistrano::Transfer.expects(:process).with(:up, "testl.txt", "testr.txt", [1,2,3], {:foo => "bar", :logger => @config.logger})
|
59
59
|
@config.transfer(:up, "testl.txt", "testr.txt", :foo => "bar")
|
60
60
|
end
|
61
|
-
end
|
61
|
+
end
|
@@ -37,6 +37,12 @@ class RemoteDependencyTest < Test::Unit::TestCase
|
|
37
37
|
assert_equal "gem `capistrano' 9.9 could not be found (host)", @dependency.message
|
38
38
|
end
|
39
39
|
|
40
|
+
def test_should_use_standard_error_message_for_deb
|
41
|
+
setup_for_a_configuration_deb_run("dpkg", "1.15", false)
|
42
|
+
@dependency.deb("dpkg", "1.15")
|
43
|
+
assert_equal "package `dpkg' 1.15 could not be found (host)", @dependency.message
|
44
|
+
end
|
45
|
+
|
40
46
|
def test_should_fail_if_directory_not_found
|
41
47
|
setup_for_a_configuration_run("test -d /data", false)
|
42
48
|
assert !@dependency.directory("/data").pass?
|
@@ -52,7 +58,7 @@ class RemoteDependencyTest < Test::Unit::TestCase
|
|
52
58
|
assert !@dependency.file("/data/foo.txt").pass?
|
53
59
|
end
|
54
60
|
|
55
|
-
def
|
61
|
+
def test_should_pass_if_file_found
|
56
62
|
setup_for_a_configuration_run("test -f /data/foo.txt", true)
|
57
63
|
assert @dependency.file("/data/foo.txt").pass?
|
58
64
|
end
|
@@ -87,6 +93,16 @@ class RemoteDependencyTest < Test::Unit::TestCase
|
|
87
93
|
assert @dependency.gem("capistrano", 9.9).pass?
|
88
94
|
end
|
89
95
|
|
96
|
+
def test_should_pass_if_deb_found
|
97
|
+
setup_for_a_configuration_deb_run("dpkg", "1.15", true)
|
98
|
+
assert @dependency.deb("dpkg", "1.15").pass?
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_should_fail_if_deb_not_found
|
102
|
+
setup_for_a_configuration_deb_run("dpkg", "1.15", false)
|
103
|
+
assert !@dependency.deb("dpkg", "1.15").pass?
|
104
|
+
end
|
105
|
+
|
90
106
|
def test_should_use_alternative_message_if_provided
|
91
107
|
setup_for_a_configuration_run("which cat", false)
|
92
108
|
@dependency.command("cat").or("Sorry")
|
@@ -111,4 +127,9 @@ class RemoteDependencyTest < Test::Unit::TestCase
|
|
111
127
|
find_gem_cmd = "gem specification --version '#{version}' #{name} 2>&1 | awk 'BEGIN { s = 0 } /^name:/ { s = 1; exit }; END { if(s == 0) exit 1 }'"
|
112
128
|
setup_for_a_configuration_run(find_gem_cmd, passing)
|
113
129
|
end
|
130
|
+
|
131
|
+
def setup_for_a_configuration_deb_run(name, version, passing)
|
132
|
+
find_deb_cmd = "dpkg -s #{name} | grep '^Version: #{version}'"
|
133
|
+
setup_for_a_configuration_run(find_deb_cmd, passing)
|
134
|
+
end
|
114
135
|
end
|
data/test/deploy/scm/git_test.rb
CHANGED
@@ -40,7 +40,7 @@ class DeploySCMGitTest < Test::Unit::TestCase
|
|
40
40
|
|
41
41
|
# with submodules
|
42
42
|
@config[:git_enable_submodules] = true
|
43
|
-
assert_equal "#{git} clone -q git@somehost.com:project.git /var/www && cd /var/www && #{git} checkout -q -b deploy #{rev} && #{git} submodule -q init && #{git} submodule -q sync && #{git} submodule -q update", @source.checkout(rev, dest)
|
43
|
+
assert_equal "#{git} clone -q git@somehost.com:project.git /var/www && cd /var/www && #{git} checkout -q -b deploy #{rev} && #{git} submodule -q init && #{git} submodule -q sync && #{git} submodule -q update --recursive", @source.checkout(rev, dest)
|
44
44
|
end
|
45
45
|
|
46
46
|
def test_checkout_with_verbose_should_not_use_q_switch
|
@@ -138,7 +138,7 @@ class DeploySCMGitTest < Test::Unit::TestCase
|
|
138
138
|
@config[:git_enable_submodules] = true
|
139
139
|
dest = "/var/www"
|
140
140
|
rev = 'c2d9e79'
|
141
|
-
assert_equal "git clone -q -o username git@somehost.com:project.git /var/www && cd /var/www && git checkout -q -b deploy #{rev} && git submodule -q init && git submodule -q sync && git submodule -q update", @source.checkout(rev, dest)
|
141
|
+
assert_equal "git clone -q -o username git@somehost.com:project.git /var/www && cd /var/www && git checkout -q -b deploy #{rev} && git submodule -q init && git submodule -q sync && git submodule -q update --recursive", @source.checkout(rev, dest)
|
142
142
|
end
|
143
143
|
|
144
144
|
# Tests from base_test.rb, makin' sure we didn't break anything up there!
|
@@ -14,16 +14,16 @@ class DeployStrategyCopyTest < Test::Unit::TestCase
|
|
14
14
|
@config.stubs(:source).returns(@source)
|
15
15
|
@strategy = Capistrano::Deploy::Strategy::Copy.new(@config)
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
def test_deploy_with_defaults_should_use_remote_gtar
|
19
19
|
@config[:copy_remote_tar] = 'gtar'
|
20
|
-
|
20
|
+
|
21
21
|
Dir.expects(:tmpdir).returns("/temp/dir")
|
22
22
|
@source.expects(:checkout).with("154", "/temp/dir/1234567890").returns(:local_checkout)
|
23
23
|
@strategy.expects(:system).with(:local_checkout)
|
24
24
|
|
25
25
|
Dir.expects(:chdir).with("/temp/dir").yields
|
26
|
-
@strategy.expects(:system).with("tar
|
26
|
+
@strategy.expects(:system).with("tar chzf 1234567890.tar.gz 1234567890")
|
27
27
|
@strategy.expects(:upload).with("/temp/dir/1234567890.tar.gz", "/tmp/1234567890.tar.gz")
|
28
28
|
@strategy.expects(:run).with("cd /u/apps/test/releases && gtar xzf /tmp/1234567890.tar.gz && rm /tmp/1234567890.tar.gz")
|
29
29
|
|
@@ -33,19 +33,19 @@ class DeployStrategyCopyTest < Test::Unit::TestCase
|
|
33
33
|
|
34
34
|
FileUtils.expects(:rm).with("/temp/dir/1234567890.tar.gz")
|
35
35
|
FileUtils.expects(:rm_rf).with("/temp/dir/1234567890")
|
36
|
-
|
36
|
+
|
37
37
|
@strategy.deploy!
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
def test_deploy_with_defaults_should_use_local_gtar
|
41
41
|
@config[:copy_local_tar] = 'gtar'
|
42
|
-
|
42
|
+
|
43
43
|
Dir.expects(:tmpdir).returns("/temp/dir")
|
44
44
|
@source.expects(:checkout).with("154", "/temp/dir/1234567890").returns(:local_checkout)
|
45
45
|
@strategy.expects(:system).with(:local_checkout)
|
46
46
|
|
47
47
|
Dir.expects(:chdir).with("/temp/dir").yields
|
48
|
-
@strategy.expects(:system).with("gtar
|
48
|
+
@strategy.expects(:system).with("gtar chzf 1234567890.tar.gz 1234567890")
|
49
49
|
@strategy.expects(:upload).with("/temp/dir/1234567890.tar.gz", "/tmp/1234567890.tar.gz")
|
50
50
|
@strategy.expects(:run).with("cd /u/apps/test/releases && tar xzf /tmp/1234567890.tar.gz && rm /tmp/1234567890.tar.gz")
|
51
51
|
|
@@ -55,9 +55,9 @@ class DeployStrategyCopyTest < Test::Unit::TestCase
|
|
55
55
|
|
56
56
|
FileUtils.expects(:rm).with("/temp/dir/1234567890.tar.gz")
|
57
57
|
FileUtils.expects(:rm_rf).with("/temp/dir/1234567890")
|
58
|
-
|
58
|
+
|
59
59
|
@strategy.deploy!
|
60
|
-
end
|
60
|
+
end
|
61
61
|
|
62
62
|
def test_deploy_with_defaults_should_use_tar_gz_and_checkout
|
63
63
|
Dir.expects(:tmpdir).returns("/temp/dir")
|
@@ -130,7 +130,7 @@ class DeployStrategyCopyTest < Test::Unit::TestCase
|
|
130
130
|
@source.expects(:checkout).with("154", "/temp/dir/1234567890").returns(:local_checkout)
|
131
131
|
|
132
132
|
@strategy.expects(:system).with(:local_checkout)
|
133
|
-
@strategy.expects(:system).with("tar
|
133
|
+
@strategy.expects(:system).with("tar chjf 1234567890.tar.bz2 1234567890")
|
134
134
|
@strategy.expects(:upload).with("/temp/dir/1234567890.tar.bz2", "/tmp/1234567890.tar.bz2")
|
135
135
|
@strategy.expects(:run).with("cd /u/apps/test/releases && tar xjf /tmp/1234567890.tar.bz2 && rm /tmp/1234567890.tar.bz2")
|
136
136
|
|
@@ -143,17 +143,17 @@ class DeployStrategyCopyTest < Test::Unit::TestCase
|
|
143
143
|
|
144
144
|
@strategy.deploy!
|
145
145
|
end
|
146
|
-
|
146
|
+
|
147
147
|
def test_deploy_with_unknown_compression_type_should_error
|
148
148
|
@config[:copy_compression] = :bogus
|
149
149
|
Dir.expects(:tmpdir).returns("/temp/dir")
|
150
150
|
@source.expects(:checkout).with("154", "/temp/dir/1234567890").returns(:local_checkout)
|
151
151
|
@strategy.stubs(:system)
|
152
152
|
File.stubs(:open)
|
153
|
-
|
153
|
+
|
154
154
|
assert_raises(ArgumentError) { @strategy.deploy! }
|
155
155
|
end
|
156
|
-
|
156
|
+
|
157
157
|
def test_deploy_with_custom_copy_dir_should_use_that_as_tmpdir
|
158
158
|
Dir.expects(:tmpdir).never
|
159
159
|
Dir.expects(:chdir).with("/other/path").yields
|
@@ -161,7 +161,7 @@ class DeployStrategyCopyTest < Test::Unit::TestCase
|
|
161
161
|
@source.expects(:checkout).with("154", "/other/path/1234567890").returns(:local_checkout)
|
162
162
|
|
163
163
|
@strategy.expects(:system).with(:local_checkout)
|
164
|
-
@strategy.expects(:system).with("tar
|
164
|
+
@strategy.expects(:system).with("tar chzf 1234567890.tar.gz 1234567890")
|
165
165
|
@strategy.expects(:upload).with("/other/path/1234567890.tar.gz", "/tmp/1234567890.tar.gz")
|
166
166
|
@strategy.expects(:run).with("cd /u/apps/test/releases && tar xzf /tmp/1234567890.tar.gz && rm /tmp/1234567890.tar.gz")
|
167
167
|
|
@@ -182,7 +182,7 @@ class DeployStrategyCopyTest < Test::Unit::TestCase
|
|
182
182
|
@source.expects(:checkout).returns(:local_checkout)
|
183
183
|
|
184
184
|
@strategy.expects(:system).with(:local_checkout)
|
185
|
-
@strategy.expects(:system).with("tar
|
185
|
+
@strategy.expects(:system).with("tar chzf 1234567890.tar.gz 1234567890")
|
186
186
|
@strategy.expects(:upload).with("/temp/dir/1234567890.tar.gz", "/somewhere/else/1234567890.tar.gz")
|
187
187
|
@strategy.expects(:run).with("cd /u/apps/test/releases && tar xzf /somewhere/else/1234567890.tar.gz && rm /somewhere/else/1234567890.tar.gz")
|
188
188
|
|
@@ -288,7 +288,7 @@ class DeployStrategyCopyTest < Test::Unit::TestCase
|
|
288
288
|
|
289
289
|
def prepare_standard_compress_and_copy!
|
290
290
|
Dir.expects(:chdir).with("/temp/dir").yields
|
291
|
-
@strategy.expects(:system).with("tar
|
291
|
+
@strategy.expects(:system).with("tar chzf 1234567890.tar.gz 1234567890")
|
292
292
|
@strategy.expects(:upload).with("/temp/dir/1234567890.tar.gz", "/tmp/1234567890.tar.gz")
|
293
293
|
@strategy.expects(:run).with("cd /u/apps/test/releases && tar xzf /tmp/1234567890.tar.gz && rm /tmp/1234567890.tar.gz")
|
294
294
|
|
metadata
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capistrano
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 51
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 2
|
8
|
+
- 5
|
9
|
+
- 20
|
10
|
+
version: 2.5.20
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
7
13
|
- Jamis Buck
|
@@ -10,69 +16,171 @@ autorequire:
|
|
10
16
|
bindir: bin
|
11
17
|
cert_chain: []
|
12
18
|
|
13
|
-
date:
|
19
|
+
date: 2011-03-16 00:00:00 +01:00
|
14
20
|
default_executable:
|
15
21
|
dependencies:
|
16
22
|
- !ruby/object:Gem::Dependency
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ">="
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
hash: 3
|
31
|
+
segments:
|
32
|
+
- 0
|
33
|
+
version: "0"
|
17
34
|
name: net-ssh
|
35
|
+
requirement: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
18
37
|
type: :runtime
|
19
|
-
|
20
|
-
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
21
41
|
requirements:
|
22
42
|
- - ">="
|
23
43
|
- !ruby/object:Gem::Version
|
24
|
-
|
25
|
-
|
44
|
+
hash: 3
|
45
|
+
segments:
|
46
|
+
- 0
|
47
|
+
version: "0"
|
48
|
+
name: net-ssh-gateway
|
49
|
+
requirement: *id002
|
26
50
|
- !ruby/object:Gem::Dependency
|
51
|
+
type: :runtime
|
52
|
+
prerelease: false
|
53
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
hash: 3
|
59
|
+
segments:
|
60
|
+
- 0
|
61
|
+
version: "0"
|
27
62
|
name: net-sftp
|
63
|
+
requirement: *id003
|
64
|
+
- !ruby/object:Gem::Dependency
|
65
|
+
type: :runtime
|
66
|
+
prerelease: false
|
67
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
hash: 3
|
73
|
+
segments:
|
74
|
+
- 0
|
75
|
+
version: "0"
|
76
|
+
name: net-scp
|
77
|
+
requirement: *id004
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
type: :runtime
|
80
|
+
prerelease: false
|
81
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
hash: 3
|
87
|
+
segments:
|
88
|
+
- 0
|
89
|
+
version: "0"
|
90
|
+
name: highline
|
91
|
+
requirement: *id005
|
92
|
+
- !ruby/object:Gem::Dependency
|
28
93
|
type: :runtime
|
29
|
-
|
30
|
-
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
prerelease: false
|
95
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
96
|
+
none: false
|
31
97
|
requirements:
|
32
98
|
- - ">="
|
33
99
|
- !ruby/object:Gem::Version
|
100
|
+
hash: 19
|
101
|
+
segments:
|
102
|
+
- 2
|
103
|
+
- 0
|
104
|
+
- 14
|
105
|
+
version: 2.0.14
|
106
|
+
name: net-ssh
|
107
|
+
requirement: *id006
|
108
|
+
- !ruby/object:Gem::Dependency
|
109
|
+
type: :runtime
|
110
|
+
prerelease: false
|
111
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
112
|
+
none: false
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
hash: 15
|
117
|
+
segments:
|
118
|
+
- 2
|
119
|
+
- 0
|
120
|
+
- 0
|
34
121
|
version: 2.0.0
|
35
|
-
|
122
|
+
name: net-sftp
|
123
|
+
requirement: *id007
|
36
124
|
- !ruby/object:Gem::Dependency
|
37
|
-
name: net-scp
|
38
125
|
type: :runtime
|
39
|
-
|
40
|
-
version_requirements: !ruby/object:Gem::Requirement
|
126
|
+
prerelease: false
|
127
|
+
version_requirements: &id008 !ruby/object:Gem::Requirement
|
128
|
+
none: false
|
41
129
|
requirements:
|
42
130
|
- - ">="
|
43
131
|
- !ruby/object:Gem::Version
|
132
|
+
hash: 23
|
133
|
+
segments:
|
134
|
+
- 1
|
135
|
+
- 0
|
136
|
+
- 0
|
44
137
|
version: 1.0.0
|
45
|
-
|
138
|
+
name: net-scp
|
139
|
+
requirement: *id008
|
46
140
|
- !ruby/object:Gem::Dependency
|
47
|
-
name: net-ssh-gateway
|
48
141
|
type: :runtime
|
49
|
-
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
142
|
+
prerelease: false
|
143
|
+
version_requirements: &id009 !ruby/object:Gem::Requirement
|
144
|
+
none: false
|
51
145
|
requirements:
|
52
146
|
- - ">="
|
53
147
|
- !ruby/object:Gem::Version
|
148
|
+
hash: 23
|
149
|
+
segments:
|
150
|
+
- 1
|
151
|
+
- 0
|
152
|
+
- 0
|
54
153
|
version: 1.0.0
|
55
|
-
|
154
|
+
name: net-ssh-gateway
|
155
|
+
requirement: *id009
|
56
156
|
- !ruby/object:Gem::Dependency
|
57
|
-
name: highline
|
58
157
|
type: :runtime
|
59
|
-
|
60
|
-
version_requirements: !ruby/object:Gem::Requirement
|
158
|
+
prerelease: false
|
159
|
+
version_requirements: &id010 !ruby/object:Gem::Requirement
|
160
|
+
none: false
|
61
161
|
requirements:
|
62
162
|
- - ">="
|
63
163
|
- !ruby/object:Gem::Version
|
164
|
+
hash: 3
|
165
|
+
segments:
|
166
|
+
- 0
|
64
167
|
version: "0"
|
65
|
-
|
168
|
+
name: highline
|
169
|
+
requirement: *id010
|
66
170
|
- !ruby/object:Gem::Dependency
|
67
|
-
name: mocha
|
68
171
|
type: :development
|
69
|
-
|
70
|
-
version_requirements: !ruby/object:Gem::Requirement
|
172
|
+
prerelease: false
|
173
|
+
version_requirements: &id011 !ruby/object:Gem::Requirement
|
174
|
+
none: false
|
71
175
|
requirements:
|
72
176
|
- - ">="
|
73
177
|
- !ruby/object:Gem::Version
|
178
|
+
hash: 3
|
179
|
+
segments:
|
180
|
+
- 0
|
74
181
|
version: "0"
|
75
|
-
|
182
|
+
name: mocha
|
183
|
+
requirement: *id011
|
76
184
|
description: Capistrano is a utility and framework for executing commands in parallel on multiple remote machines, via SSH.
|
77
185
|
email:
|
78
186
|
- jamis@jamisbuck.org
|
@@ -83,11 +191,11 @@ executables:
|
|
83
191
|
extensions: []
|
84
192
|
|
85
193
|
extra_rdoc_files:
|
86
|
-
- README
|
194
|
+
- README.mdown
|
87
195
|
files:
|
88
|
-
- .gitignore
|
89
196
|
- CHANGELOG
|
90
|
-
-
|
197
|
+
- Gemfile
|
198
|
+
- README.mdown
|
91
199
|
- Rakefile
|
92
200
|
- VERSION
|
93
201
|
- bin/cap
|
@@ -196,29 +304,35 @@ homepage: http://github.com/capistrano/capistrano
|
|
196
304
|
licenses: []
|
197
305
|
|
198
306
|
post_install_message:
|
199
|
-
rdoc_options:
|
200
|
-
|
307
|
+
rdoc_options: []
|
308
|
+
|
201
309
|
require_paths:
|
202
310
|
- lib
|
203
311
|
required_ruby_version: !ruby/object:Gem::Requirement
|
312
|
+
none: false
|
204
313
|
requirements:
|
205
314
|
- - ">="
|
206
315
|
- !ruby/object:Gem::Version
|
316
|
+
hash: 3
|
317
|
+
segments:
|
318
|
+
- 0
|
207
319
|
version: "0"
|
208
|
-
version:
|
209
320
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
321
|
+
none: false
|
210
322
|
requirements:
|
211
323
|
- - ">="
|
212
324
|
- !ruby/object:Gem::Version
|
325
|
+
hash: 3
|
326
|
+
segments:
|
327
|
+
- 0
|
213
328
|
version: "0"
|
214
|
-
version:
|
215
329
|
requirements: []
|
216
330
|
|
217
331
|
rubyforge_project:
|
218
|
-
rubygems_version: 1.3.
|
332
|
+
rubygems_version: 1.3.7
|
219
333
|
signing_key:
|
220
334
|
specification_version: 3
|
221
|
-
summary:
|
335
|
+
summary: Capistrano - Welcome to easy deployment with Ruby over SSH
|
222
336
|
test_files:
|
223
337
|
- test/cli/execute_test.rb
|
224
338
|
- test/cli/help_test.rb
|