capistrano 2.5.18 → 2.5.20
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/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
|