capistrano 2.5.8 → 2.5.9
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.rdoc +17 -0
- data/README.rdoc +2 -2
- data/Rakefile +3 -3
- data/bin/capify +27 -40
- data/capistrano.gemspec +48 -0
- data/lib/capistrano/cli/execute.rb +4 -4
- data/lib/capistrano/cli/help.txt +4 -1
- data/lib/capistrano/cli/options.rb +13 -0
- data/lib/capistrano/configuration.rb +2 -2
- data/lib/capistrano/configuration/servers.rb +15 -4
- data/lib/capistrano/recipes/deploy.rb +29 -0
- 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 +1 -1
- data/lib/capistrano/recipes/deploy/strategy/copy.rb +5 -2
- data/lib/capistrano/version.rb +1 -1
- data/test/configuration/servers_test.rb +10 -2
- data/test/deploy/scm/subversion_test.rb +32 -0
- data/test/deploy/strategy/copy_test.rb +44 -0
- metadata +11 -21
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
== 2.5.9 / 12 September 2009
|
2
|
+
|
3
|
+
* #105 - Adds skip_hostfilter option to find_servers() [Eric]
|
4
|
+
* #103 - Fixes Using non-master branch fails with Ruby 1.9 [Suraj Kurapati]
|
5
|
+
* #96 - Tweak for 1.9 Compatibility
|
6
|
+
* #79 - Fixes Capistrano hangs on shell command for many computers
|
7
|
+
* #77 - Fixes Copy command doesn't work on Solaris due to tar/gtar
|
8
|
+
* #76 - Fixes Invalid Subversion URL
|
9
|
+
* Improved web:disable task, now suggests a .htaccess block to use suggested by Rafael García
|
10
|
+
* Includes more logger options (can now select stdout, stderr of a file) [Rafael García]
|
11
|
+
* Fixes a couple of documentation problems, typos and worse. [Lee Hambley]
|
12
|
+
|
1
13
|
== 2.5.8 / July 2009
|
2
14
|
|
3
15
|
* Fixes a problem in 2.5.7 where deploy:finalize_update had been badly merged.
|
@@ -5,10 +17,15 @@
|
|
5
17
|
== 2.5.6 & 2.5.7 / July 2009
|
6
18
|
|
7
19
|
* 2.5.7 masks a broken 2.5.6 release that was accidentally mirrored via Rubyforge.
|
20
|
+
|
8
21
|
* Clean the cached git repository [Graeme Mathieson]
|
22
|
+
|
9
23
|
* Fixes perforce issues reported at http://bit.ly/wt0es [Scott Johnson]
|
24
|
+
|
10
25
|
* Improved back-tick handling code in relation to the above.
|
26
|
+
|
11
27
|
* Fixes a Git issue when submodules update upstream. (via mailing list) [sneakin]
|
28
|
+
|
12
29
|
* Capify now creates the config directory in directories without one.
|
13
30
|
|
14
31
|
== 2.5.5 / 24 Feb 2009
|
data/README.rdoc
CHANGED
@@ -64,8 +64,8 @@ If you want to try Capistrano code that hasn't been formerly released yet, this
|
|
64
64
|
|
65
65
|
git clone git://github.com/capistrano/capistrano.git capistrano-capistrano
|
66
66
|
cd capistrano-capsitrano
|
67
|
-
|
68
|
-
sudo gem install capistrano-*.gem
|
67
|
+
rake package
|
68
|
+
sudo gem install pkg/capistrano-*.gem
|
69
69
|
|
70
70
|
This will install the most recent version of capistrano and make it available for both cap, and capify.
|
71
71
|
|
data/Rakefile
CHANGED
@@ -15,8 +15,8 @@ Echoe.new('capistrano', version) do |p|
|
|
15
15
|
p.include_gemspec = true
|
16
16
|
p.changelog = "CHANGELOG.rdoc"
|
17
17
|
|
18
|
-
p.author = "Jamis Buck"
|
19
|
-
p.email = "jamis@jamisbuck.org"
|
18
|
+
p.author = ["Jamis Buck", "Lee Hambley"]
|
19
|
+
p.email = ["jamis@jamisbuck.org", "lee.hambley@gmail.com"]
|
20
20
|
|
21
21
|
p.summary = <<-DESC.strip.gsub(/\n\s+/, " ")
|
22
22
|
Capistrano is a utility and framework for executing commands in parallel
|
@@ -27,7 +27,7 @@ Echoe.new('capistrano', version) do |p|
|
|
27
27
|
p.need_zip = true
|
28
28
|
p.rdoc_pattern = /^(lib|README.rdoc|CHANGELOG.rdoc)/
|
29
29
|
|
30
|
-
p.dependencies = ["net-ssh >=2.0.
|
30
|
+
p.dependencies = ["net-ssh >=2.0.14",
|
31
31
|
"net-sftp >=2.0.0",
|
32
32
|
"net-scp >=1.0.0",
|
33
33
|
"net-ssh-gateway >=1.0.0",
|
data/bin/capify
CHANGED
@@ -39,59 +39,46 @@ files = {
|
|
39
39
|
"Capfile" => unindent(<<-FILE),
|
40
40
|
load 'deploy' if respond_to?(:namespace) # cap2 differentiator
|
41
41
|
Dir['vendor/plugins/*/recipes/*.rb'].each { |plugin| load(plugin) }
|
42
|
-
|
42
|
+
|
43
|
+
load 'config/deploy' # remove this line to skip loading any of the default tasks
|
43
44
|
FILE
|
44
45
|
|
45
|
-
"config/deploy.rb" =>
|
46
|
-
|
47
|
-
set :repository, "set your repository location here"
|
46
|
+
"config/deploy.rb" => 'set :application, "set your application name here"
|
47
|
+
set :repository, "set your repository location here"
|
48
48
|
|
49
|
-
|
50
|
-
|
51
|
-
# migration code, please uncomment the lines you require below
|
52
|
-
|
53
|
-
# If you are deploying a rails app you probably need these:
|
54
|
-
|
55
|
-
# load 'ext/rails-database-migrations.rb'
|
56
|
-
# load 'ext/rails-shared-directories.rb'
|
57
|
-
|
58
|
-
# There are also new utility libaries shipped with the core these
|
59
|
-
# include the following, please see individual files for more
|
60
|
-
# documentation, or run `cap -vT` with the following lines commented
|
61
|
-
# out to see what they make available.
|
62
|
-
|
63
|
-
# load 'ext/spinner.rb' # Designed for use with script/spin
|
64
|
-
# load 'ext/passenger-mod-rails.rb' # Restart task for use with mod_rails
|
65
|
-
# load 'ext/web-disable-enable.rb' # Gives you web:disable and web:enable
|
49
|
+
set :scm, :subversion
|
50
|
+
# Or: `accurev`, `bzr`, `cvs`, `darcs`, `git`, `mercurial`, `perforce`, `subversion` or `none`
|
66
51
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
52
|
+
role :web, "your web-server here" # Your HTTP server, Apache/etc
|
53
|
+
role :app, "your app-server here" # This may be the same as your `Web` server
|
54
|
+
role :db, "your primary db-server here", :primary => true # This is where Rails migrations will run
|
55
|
+
role :db, "your slave db-server here"
|
71
56
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
# see a full list by running "gem contents capistrano | grep 'scm/'"
|
57
|
+
# If you are using Passenger mod_rails uncomment this:
|
58
|
+
# if you\'re still using the script/reapear helper you will need
|
59
|
+
# these http://github.com/rails/irs_process_scripts
|
76
60
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
}
|
61
|
+
# namespace :deploy do
|
62
|
+
# task :start {}
|
63
|
+
# task :stop {}
|
64
|
+
# task :restart, :roles => :app, :except => { :no_release => true } do
|
65
|
+
# run "#{try_sudo} touch #{File.join(current_path,\'tmp\',\'restart.txt\')}"
|
66
|
+
# end
|
67
|
+
# end'}
|
81
68
|
|
82
69
|
base = ARGV.shift
|
83
70
|
files.each do |file, content|
|
84
71
|
file = File.join(base, file)
|
85
72
|
if File.exists?(file)
|
86
|
-
warn "[skip]
|
73
|
+
warn "[skip] '#{file}' already exists"
|
87
74
|
elsif File.exists?(file.downcase)
|
88
|
-
warn "[skip]
|
89
|
-
elsif !File.exists?(File.dirname(file))
|
90
|
-
FileUtils.mkdir(File.dirname(file))
|
91
|
-
retry
|
92
|
-
warn "[skip] directory `#{File.dirname(file)}' did not exist, created."
|
75
|
+
warn "[skip] '#{file.downcase}' exists, which could conflict with `#{file}'"
|
93
76
|
else
|
94
|
-
|
77
|
+
unless File.exists?(File.dirname(file))
|
78
|
+
puts "[add] making directory '#{File.dirname(file)}'"
|
79
|
+
FileUtils.mkdir(File.dirname(file))
|
80
|
+
end
|
81
|
+
puts "[add] writing '#{file}'"
|
95
82
|
File.open(file, "w") { |f| f.write(content) }
|
96
83
|
end
|
97
84
|
end
|
data/capistrano.gemspec
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{capistrano}
|
5
|
+
s.version = "2.5.9"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Jamis Buck, Lee Hambley"]
|
9
|
+
s.date = %q{2009-09-12}
|
10
|
+
s.description = %q{Capistrano is a utility and framework for executing commands in parallel on multiple remote machines, via SSH.}
|
11
|
+
s.email = ["jamis@jamisbuck.org", "lee.hambley@gmail.com"]
|
12
|
+
s.executables = ["cap", "capify"]
|
13
|
+
s.extra_rdoc_files = ["CHANGELOG.rdoc", "lib/capistrano/callback.rb", "lib/capistrano/cli/execute.rb", "lib/capistrano/cli/help.rb", "lib/capistrano/cli/help.txt", "lib/capistrano/cli/options.rb", "lib/capistrano/cli/ui.rb", "lib/capistrano/cli.rb", "lib/capistrano/command.rb", "lib/capistrano/configuration/actions/file_transfer.rb", "lib/capistrano/configuration/actions/inspect.rb", "lib/capistrano/configuration/actions/invocation.rb", "lib/capistrano/configuration/callbacks.rb", "lib/capistrano/configuration/connections.rb", "lib/capistrano/configuration/execution.rb", "lib/capistrano/configuration/loading.rb", "lib/capistrano/configuration/namespaces.rb", "lib/capistrano/configuration/roles.rb", "lib/capistrano/configuration/servers.rb", "lib/capistrano/configuration/variables.rb", "lib/capistrano/configuration.rb", "lib/capistrano/errors.rb", "lib/capistrano/extensions.rb", "lib/capistrano/logger.rb", "lib/capistrano/processable.rb", "lib/capistrano/recipes/compat.rb", "lib/capistrano/recipes/deploy/dependencies.rb", "lib/capistrano/recipes/deploy/local_dependency.rb", "lib/capistrano/recipes/deploy/remote_dependency.rb", "lib/capistrano/recipes/deploy/scm/accurev.rb", "lib/capistrano/recipes/deploy/scm/base.rb", "lib/capistrano/recipes/deploy/scm/bzr.rb", "lib/capistrano/recipes/deploy/scm/cvs.rb", "lib/capistrano/recipes/deploy/scm/darcs.rb", "lib/capistrano/recipes/deploy/scm/git.rb", "lib/capistrano/recipes/deploy/scm/mercurial.rb", "lib/capistrano/recipes/deploy/scm/none.rb", "lib/capistrano/recipes/deploy/scm/perforce.rb", "lib/capistrano/recipes/deploy/scm/subversion.rb", "lib/capistrano/recipes/deploy/scm.rb", "lib/capistrano/recipes/deploy/strategy/base.rb", "lib/capistrano/recipes/deploy/strategy/checkout.rb", "lib/capistrano/recipes/deploy/strategy/copy.rb", "lib/capistrano/recipes/deploy/strategy/export.rb", "lib/capistrano/recipes/deploy/strategy/remote.rb", "lib/capistrano/recipes/deploy/strategy/remote_cache.rb", "lib/capistrano/recipes/deploy/strategy.rb", "lib/capistrano/recipes/deploy/templates/maintenance.rhtml", "lib/capistrano/recipes/deploy.rb", "lib/capistrano/recipes/standard.rb", "lib/capistrano/recipes/templates/maintenance.rhtml", "lib/capistrano/recipes/upgrade.rb", "lib/capistrano/role.rb", "lib/capistrano/server_definition.rb", "lib/capistrano/shell.rb", "lib/capistrano/ssh.rb", "lib/capistrano/task_definition.rb", "lib/capistrano/transfer.rb", "lib/capistrano/version.rb", "lib/capistrano.rb", "README.rdoc"]
|
14
|
+
s.files = ["bin/cap", "bin/capify", "CHANGELOG.rdoc", "examples/sample.rb", "lib/capistrano/callback.rb", "lib/capistrano/cli/execute.rb", "lib/capistrano/cli/help.rb", "lib/capistrano/cli/help.txt", "lib/capistrano/cli/options.rb", "lib/capistrano/cli/ui.rb", "lib/capistrano/cli.rb", "lib/capistrano/command.rb", "lib/capistrano/configuration/actions/file_transfer.rb", "lib/capistrano/configuration/actions/inspect.rb", "lib/capistrano/configuration/actions/invocation.rb", "lib/capistrano/configuration/callbacks.rb", "lib/capistrano/configuration/connections.rb", "lib/capistrano/configuration/execution.rb", "lib/capistrano/configuration/loading.rb", "lib/capistrano/configuration/namespaces.rb", "lib/capistrano/configuration/roles.rb", "lib/capistrano/configuration/servers.rb", "lib/capistrano/configuration/variables.rb", "lib/capistrano/configuration.rb", "lib/capistrano/errors.rb", "lib/capistrano/extensions.rb", "lib/capistrano/logger.rb", "lib/capistrano/processable.rb", "lib/capistrano/recipes/compat.rb", "lib/capistrano/recipes/deploy/dependencies.rb", "lib/capistrano/recipes/deploy/local_dependency.rb", "lib/capistrano/recipes/deploy/remote_dependency.rb", "lib/capistrano/recipes/deploy/scm/accurev.rb", "lib/capistrano/recipes/deploy/scm/base.rb", "lib/capistrano/recipes/deploy/scm/bzr.rb", "lib/capistrano/recipes/deploy/scm/cvs.rb", "lib/capistrano/recipes/deploy/scm/darcs.rb", "lib/capistrano/recipes/deploy/scm/git.rb", "lib/capistrano/recipes/deploy/scm/mercurial.rb", "lib/capistrano/recipes/deploy/scm/none.rb", "lib/capistrano/recipes/deploy/scm/perforce.rb", "lib/capistrano/recipes/deploy/scm/subversion.rb", "lib/capistrano/recipes/deploy/scm.rb", "lib/capistrano/recipes/deploy/strategy/base.rb", "lib/capistrano/recipes/deploy/strategy/checkout.rb", "lib/capistrano/recipes/deploy/strategy/copy.rb", "lib/capistrano/recipes/deploy/strategy/export.rb", "lib/capistrano/recipes/deploy/strategy/remote.rb", "lib/capistrano/recipes/deploy/strategy/remote_cache.rb", "lib/capistrano/recipes/deploy/strategy.rb", "lib/capistrano/recipes/deploy/templates/maintenance.rhtml", "lib/capistrano/recipes/deploy.rb", "lib/capistrano/recipes/standard.rb", "lib/capistrano/recipes/templates/maintenance.rhtml", "lib/capistrano/recipes/upgrade.rb", "lib/capistrano/role.rb", "lib/capistrano/server_definition.rb", "lib/capistrano/shell.rb", "lib/capistrano/ssh.rb", "lib/capistrano/task_definition.rb", "lib/capistrano/transfer.rb", "lib/capistrano/version.rb", "lib/capistrano.rb", "Rakefile", "README.rdoc", "setup.rb", "test/cli/execute_test.rb", "test/cli/help_test.rb", "test/cli/options_test.rb", "test/cli/ui_test.rb", "test/cli_test.rb", "test/command_test.rb", "test/configuration/actions/file_transfer_test.rb", "test/configuration/actions/inspect_test.rb", "test/configuration/actions/invocation_test.rb", "test/configuration/callbacks_test.rb", "test/configuration/connections_test.rb", "test/configuration/execution_test.rb", "test/configuration/loading_test.rb", "test/configuration/namespace_dsl_test.rb", "test/configuration/roles_test.rb", "test/configuration/servers_test.rb", "test/configuration/variables_test.rb", "test/configuration_test.rb", "test/deploy/local_dependency_test.rb", "test/deploy/remote_dependency_test.rb", "test/deploy/scm/accurev_test.rb", "test/deploy/scm/base_test.rb", "test/deploy/scm/git_test.rb", "test/deploy/scm/mercurial_test.rb", "test/deploy/strategy/copy_test.rb", "test/extensions_test.rb", "test/fixtures/cli_integration.rb", "test/fixtures/config.rb", "test/fixtures/custom.rb", "test/logger_test.rb", "test/role_test.rb", "test/server_definition_test.rb", "test/shell_test.rb", "test/ssh_test.rb", "test/task_definition_test.rb", "test/transfer_test.rb", "test/utils.rb", "Manifest", "capistrano.gemspec", "test/deploy/scm/none_test.rb", "test/deploy/scm/subversion_test.rb"]
|
15
|
+
s.has_rdoc = true
|
16
|
+
s.homepage = %q{http://www.capify.org}
|
17
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Capistrano", "--main", "README.rdoc"]
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
s.rubyforge_project = %q{capistrano}
|
20
|
+
s.rubygems_version = %q{1.3.1}
|
21
|
+
s.summary = %q{Capistrano is a utility and framework for executing commands in parallel on multiple remote machines, via SSH.}
|
22
|
+
s.test_files = ["test/cli/execute_test.rb", "test/cli/help_test.rb", "test/cli/options_test.rb", "test/cli/ui_test.rb", "test/cli_test.rb", "test/command_test.rb", "test/configuration/actions/file_transfer_test.rb", "test/configuration/actions/inspect_test.rb", "test/configuration/actions/invocation_test.rb", "test/configuration/callbacks_test.rb", "test/configuration/connections_test.rb", "test/configuration/execution_test.rb", "test/configuration/loading_test.rb", "test/configuration/namespace_dsl_test.rb", "test/configuration/roles_test.rb", "test/configuration/servers_test.rb", "test/configuration/variables_test.rb", "test/configuration_test.rb", "test/deploy/local_dependency_test.rb", "test/deploy/remote_dependency_test.rb", "test/deploy/scm/accurev_test.rb", "test/deploy/scm/base_test.rb", "test/deploy/scm/git_test.rb", "test/deploy/scm/mercurial_test.rb", "test/deploy/scm/none_test.rb", "test/deploy/scm/subversion_test.rb", "test/deploy/strategy/copy_test.rb", "test/extensions_test.rb", "test/logger_test.rb", "test/role_test.rb", "test/server_definition_test.rb", "test/shell_test.rb", "test/ssh_test.rb", "test/task_definition_test.rb", "test/transfer_test.rb"]
|
23
|
+
|
24
|
+
if s.respond_to? :specification_version then
|
25
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
26
|
+
s.specification_version = 2
|
27
|
+
|
28
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
29
|
+
s.add_runtime_dependency(%q<net-ssh>, [">= 2.0.14"])
|
30
|
+
s.add_runtime_dependency(%q<net-sftp>, [">= 2.0.0"])
|
31
|
+
s.add_runtime_dependency(%q<net-scp>, [">= 1.0.0"])
|
32
|
+
s.add_runtime_dependency(%q<net-ssh-gateway>, [">= 1.0.0"])
|
33
|
+
s.add_runtime_dependency(%q<highline>, [">= 0"])
|
34
|
+
else
|
35
|
+
s.add_dependency(%q<net-ssh>, [">= 2.0.14"])
|
36
|
+
s.add_dependency(%q<net-sftp>, [">= 2.0.0"])
|
37
|
+
s.add_dependency(%q<net-scp>, [">= 1.0.0"])
|
38
|
+
s.add_dependency(%q<net-ssh-gateway>, [">= 1.0.0"])
|
39
|
+
s.add_dependency(%q<highline>, [">= 0"])
|
40
|
+
end
|
41
|
+
else
|
42
|
+
s.add_dependency(%q<net-ssh>, [">= 2.0.14"])
|
43
|
+
s.add_dependency(%q<net-sftp>, [">= 2.0.0"])
|
44
|
+
s.add_dependency(%q<net-scp>, [">= 1.0.0"])
|
45
|
+
s.add_dependency(%q<net-ssh-gateway>, [">= 1.0.0"])
|
46
|
+
s.add_dependency(%q<highline>, [">= 0"])
|
47
|
+
end
|
48
|
+
end
|
@@ -21,7 +21,7 @@ module Capistrano
|
|
21
21
|
#
|
22
22
|
# Returns the Configuration instance used, if successful.
|
23
23
|
def execute!
|
24
|
-
config = instantiate_configuration
|
24
|
+
config = instantiate_configuration(options)
|
25
25
|
config.debug = options[:debug]
|
26
26
|
config.dry_run = options[:dry_run]
|
27
27
|
config.logger.level = options[:verbose]
|
@@ -66,8 +66,8 @@ module Capistrano
|
|
66
66
|
|
67
67
|
# Primarily useful for testing, but subclasses of CLI could conceivably
|
68
68
|
# override this method to return a Configuration subclass or replacement.
|
69
|
-
def instantiate_configuration #:nodoc:
|
70
|
-
Capistrano::Configuration.new
|
69
|
+
def instantiate_configuration(options={}) #:nodoc:
|
70
|
+
Capistrano::Configuration.new(options)
|
71
71
|
end
|
72
72
|
|
73
73
|
def handle_error(error) #:nodoc:
|
@@ -81,4 +81,4 @@ module Capistrano
|
|
81
81
|
end
|
82
82
|
end
|
83
83
|
end
|
84
|
-
end
|
84
|
+
end
|
data/lib/capistrano/cli/help.txt
CHANGED
@@ -28,6 +28,9 @@ The following options are understood:
|
|
28
28
|
<%= color '-h, --help', :bold %>
|
29
29
|
Shows a brief summary of these options and exits.
|
30
30
|
|
31
|
+
<%= color '-l, --logger [STDERR|STDOUT|file]', :bold %>
|
32
|
+
Change the file used to print the output. It offers three options: standard error(stderr), standard output and file. Options are not case sensitive. By default Capistrano uses stderr.
|
33
|
+
|
31
34
|
<%= color '-n, --dry-run', :bold %>
|
32
35
|
Causes Capistrano to simply display each remote command, without executing it. In this sense it is similar to --debug, but without the prompt. Note that commands executed locally are still run--only remote commands are skipped.
|
33
36
|
|
@@ -72,4 +75,4 @@ The following options are understood:
|
|
72
75
|
Execute tasks against this comma-separated list of host, but only if the host has the proper role for the task.
|
73
76
|
|
74
77
|
<%= color 'ROLES', :bold %>
|
75
|
-
Execute tasks against this comma-separated list of roles. Hosts which do not have the right roles will be skipped.
|
78
|
+
Execute tasks against this comma-separated list of roles. Hosts which do not have the right roles will be skipped.
|
@@ -54,6 +54,19 @@ module Capistrano
|
|
54
54
|
exit
|
55
55
|
end
|
56
56
|
|
57
|
+
opts.on("-l", "--logger [STDERR|STDOUT|file]",
|
58
|
+
"Choose logger method. STDERR used by default."
|
59
|
+
) do |value|
|
60
|
+
options[:output] = if value.nil? || value.upcase == 'STDERR'
|
61
|
+
# Using default logger.
|
62
|
+
nil
|
63
|
+
elsif value.upcase == 'STDOUT'
|
64
|
+
$stdout
|
65
|
+
else
|
66
|
+
value
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
57
70
|
opts.on("-n", "--dry-run",
|
58
71
|
"Prints out commands without running them."
|
59
72
|
) { |value| options[:dry_run] = true }
|
@@ -21,10 +21,10 @@ module Capistrano
|
|
21
21
|
# The logger instance defined for this configuration.
|
22
22
|
attr_accessor :debug, :logger, :dry_run
|
23
23
|
|
24
|
-
def initialize #:nodoc:
|
24
|
+
def initialize(options={}) #:nodoc:
|
25
25
|
@debug = false
|
26
26
|
@dry_run = false
|
27
|
-
@logger = Logger.new
|
27
|
+
@logger = Logger.new(options)
|
28
28
|
end
|
29
29
|
|
30
30
|
# make the DSL easier to read when using lazy evaluation via lambdas
|
@@ -13,8 +13,10 @@ module Capistrano
|
|
13
13
|
# The options hash may include a :hosts option (which should specify
|
14
14
|
# an array of host names or ServerDefinition instances), a :roles
|
15
15
|
# option (specifying an array of roles), an :only option (specifying
|
16
|
-
# a hash of key/value pairs that any matching server must match),
|
17
|
-
# an :exception option (like :only, but the inverse)
|
16
|
+
# a hash of key/value pairs that any matching server must match),
|
17
|
+
# an :exception option (like :only, but the inverse), and a
|
18
|
+
# :skip_hostfilter option to ignore the HOSTFILTER environment variable
|
19
|
+
# described below.
|
18
20
|
#
|
19
21
|
# Additionally, if the HOSTS environment variable is set, it will take
|
20
22
|
# precedence over any other options. Similarly, the ROLES environment
|
@@ -40,7 +42,11 @@ module Capistrano
|
|
40
42
|
hosts = server_list_from(ENV['HOSTS'] || options[:hosts])
|
41
43
|
|
42
44
|
if hosts.any?
|
43
|
-
|
45
|
+
if options[:skip_hostfilter]
|
46
|
+
hosts.uniq
|
47
|
+
else
|
48
|
+
filter_server_list(hosts.uniq)
|
49
|
+
end
|
44
50
|
else
|
45
51
|
roles = role_list_from(ENV['ROLES'] || options[:roles] || self.roles.keys)
|
46
52
|
only = options[:only] || {}
|
@@ -49,7 +55,12 @@ module Capistrano
|
|
49
55
|
servers = roles.inject([]) { |list, role| list.concat(self.roles[role]) }
|
50
56
|
servers = servers.select { |server| only.all? { |key,value| server.options[key] == value } }
|
51
57
|
servers = servers.reject { |server| except.any? { |key,value| server.options[key] == value } }
|
52
|
-
|
58
|
+
|
59
|
+
if options[:skip_hostfilter]
|
60
|
+
servers.uniq
|
61
|
+
else
|
62
|
+
filter_server_list(servers.uniq)
|
63
|
+
end
|
53
64
|
end
|
54
65
|
end
|
55
66
|
|
@@ -94,9 +94,18 @@ end
|
|
94
94
|
# returns the command output as a string
|
95
95
|
def run_locally(cmd)
|
96
96
|
logger.trace "executing locally: #{cmd.inspect}" if logger
|
97
|
+
command_present?(cmd)
|
97
98
|
`#{cmd}`
|
98
99
|
end
|
99
100
|
|
101
|
+
# tests if the given command is present on the local system
|
102
|
+
def command_present?(cmd)
|
103
|
+
executable = cmd.to_s.split(" ").first
|
104
|
+
unless system("which #{executable}")
|
105
|
+
logger.important "executable '#{executable}' not present or not in $PATH on the local system!"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
100
109
|
# If a command is given, this will try to execute the given command, as
|
101
110
|
# described below. Otherwise, it will return a string for use in embedding in
|
102
111
|
# another command, for executing that command as described below.
|
@@ -291,6 +300,10 @@ namespace :deploy do
|
|
291
300
|
Restarts your application. This works by calling the script/process/reaper \
|
292
301
|
script under the current path.
|
293
302
|
|
303
|
+
If you are deploying a Rails 2.3.x application, you will need to install
|
304
|
+
these http://github.com/rails/irs_process_scripts (more info about why
|
305
|
+
on that page.)
|
306
|
+
|
294
307
|
By default, this will be invoked via sudo as the `app' user. If \
|
295
308
|
you wish to run it as a different user, set the :runner variable to \
|
296
309
|
that user. If you are in an environment where you can't use sudo, set \
|
@@ -299,6 +312,7 @@ namespace :deploy do
|
|
299
312
|
set :use_sudo, false
|
300
313
|
DESC
|
301
314
|
task :restart, :roles => :app, :except => { :no_release => true } do
|
315
|
+
warn "[DEPRECATED] `deploy:restart` is going to be changed to Passenger mod_rails' method after 2.5.9 - see http://is.gd/2BPeA"
|
302
316
|
try_runner "#{current_path}/script/process/reaper"
|
303
317
|
end
|
304
318
|
|
@@ -479,6 +493,7 @@ namespace :deploy do
|
|
479
493
|
the :use_sudo variable to false.
|
480
494
|
DESC
|
481
495
|
task :start, :roles => :app do
|
496
|
+
warn "[DEPRECATED] `deploy:start` is going to be removed after 2.5.9 - see http://is.gd/2BPeA"
|
482
497
|
run "cd #{current_path} && #{try_runner} nohup script/spin"
|
483
498
|
end
|
484
499
|
|
@@ -494,6 +509,7 @@ namespace :deploy do
|
|
494
509
|
the :use_sudo variable to false.
|
495
510
|
DESC
|
496
511
|
task :stop, :roles => :app do
|
512
|
+
warn "[DEPRECATED] `deploy:start` is going to be removed after 2.5.9 - see http://is.gd/2BPeA"
|
497
513
|
run "if [ -f #{current_path}/tmp/pids/dispatch.spawner.pid ]; then #{try_runner} #{current_path}/script/process/reaper -a kill -r dispatch.spawner.pid; fi"
|
498
514
|
try_runner "#{current_path}/script/process/reaper -a kill"
|
499
515
|
end
|
@@ -540,6 +556,19 @@ namespace :deploy do
|
|
540
556
|
require 'erb'
|
541
557
|
on_rollback { run "rm #{shared_path}/system/maintenance.html" }
|
542
558
|
|
559
|
+
warn <<-EOHTACCESS
|
560
|
+
|
561
|
+
# Please add something like this to your site's htaccess to redirect users to the maintenance page.
|
562
|
+
# More Info: http://www.shiftcommathree.com/articles/make-your-rails-maintenance-page-respond-with-a-503
|
563
|
+
|
564
|
+
ErrorDocument 503 /system/maintenance.html
|
565
|
+
RewriteEngine On
|
566
|
+
RewriteCond %{REQUEST_URI} !\.(css|gif|jpg|png)$
|
567
|
+
RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
|
568
|
+
RewriteCond %{SCRIPT_FILENAME} !maintenance.html
|
569
|
+
RewriteRule ^.*$ - [redirect=503,last]
|
570
|
+
EOHTACCESS
|
571
|
+
|
543
572
|
reason = ENV['REASON']
|
544
573
|
deadline = ENV['UNTIL']
|
545
574
|
|
@@ -56,7 +56,7 @@ module Capistrano
|
|
56
56
|
result = yield(command)
|
57
57
|
yaml = YAML.load(result)
|
58
58
|
raise "tried to run `#{command}' and got unexpected result #{result.inspect}" unless Hash === yaml
|
59
|
-
yaml['Last Changed Rev'] || yaml['Revision']
|
59
|
+
[ (yaml['Last Changed Rev'] || 0).to_i, (yaml['Revision'] || 0).to_i ].max
|
60
60
|
end
|
61
61
|
|
62
62
|
# Increments the given revision number and returns it.
|
@@ -50,7 +50,7 @@ module Capistrano
|
|
50
50
|
def system(*args)
|
51
51
|
cmd = args.join(' ')
|
52
52
|
if RUBY_PLATFORM =~ /win32/
|
53
|
-
|
53
|
+
cmd = cmd.split(/\s+/).collect {|w| w.match(/^[\w+]+:\/\//) ? w : w.gsub('/', '\\') }.join(' ') # Split command by spaces, change / by \\ unless element is a some+thing://
|
54
54
|
cmd.gsub!(/^cd /,'cd /D ') # Replace cd with cd /D
|
55
55
|
cmd.gsub!(/&& cd /,'&& cd /D ') # Replace cd with cd /D
|
56
56
|
logger.trace "executing locally: #{cmd}"
|
@@ -182,10 +182,13 @@ module Capistrano
|
|
182
182
|
|
183
183
|
# The compression method to use, defaults to :gzip.
|
184
184
|
def compression
|
185
|
+
remote_tar = configuration[:copy_remote_tar] || 'tar'
|
186
|
+
local_tar = configuration[:copy_local_tar] || 'tar'
|
187
|
+
|
185
188
|
type = configuration[:copy_compression] || :gzip
|
186
189
|
case type
|
187
|
-
when :gzip, :gz then Compression.new("tar.gz",
|
188
|
-
when :bzip2, :bz2 then Compression.new("tar.bz2",
|
190
|
+
when :gzip, :gz then Compression.new("tar.gz", [local_tar, 'czf'], [remote_tar, 'xzf'])
|
191
|
+
when :bzip2, :bz2 then Compression.new("tar.bz2", [local_tar, 'cjf'], [remote_tar, 'xjf'])
|
189
192
|
when :zip then Compression.new("zip", %w(zip -qr), %w(unzip -q))
|
190
193
|
else raise ArgumentError, "invalid compression type #{type.inspect}"
|
191
194
|
end
|
data/lib/capistrano/version.rb
CHANGED
@@ -78,7 +78,7 @@ class ConfigurationServersTest < Test::Unit::TestCase
|
|
78
78
|
ENV.delete('HOSTS')
|
79
79
|
end
|
80
80
|
|
81
|
-
def
|
81
|
+
def test_task_with_hostfilter_environment_variable_should_apply_only_to_those_hosts
|
82
82
|
ENV['HOSTFILTER'] = "app1,web1"
|
83
83
|
task = new_task(:testing)
|
84
84
|
assert_equal %w(app1 web1).sort, @config.find_servers_for_task(task).map { |s| s.host }.sort
|
@@ -86,7 +86,7 @@ class ConfigurationServersTest < Test::Unit::TestCase
|
|
86
86
|
ENV.delete('HOSTFILTER')
|
87
87
|
end
|
88
88
|
|
89
|
-
def
|
89
|
+
def test_task_with_hostfilter_environment_variable_should_filter_hosts_option
|
90
90
|
ENV['HOSTFILTER'] = "foo"
|
91
91
|
task = new_task(:testing, @config, :hosts => %w(foo bar))
|
92
92
|
assert_equal %w(foo).sort, @config.find_servers_for_task(task).map { |s| s.host }.sort
|
@@ -94,6 +94,14 @@ class ConfigurationServersTest < Test::Unit::TestCase
|
|
94
94
|
ENV.delete('HOSTFILTER')
|
95
95
|
end
|
96
96
|
|
97
|
+
def test_task_with_hostfilter_environment_variable_and_skip_hostfilter_should_not_filter_hosts_option
|
98
|
+
ENV['HOSTFILTER'] = "foo"
|
99
|
+
task = new_task(:testing, @config, :hosts => %w(foo bar), :skip_hostfilter => true)
|
100
|
+
assert_equal %w(foo bar).sort, @config.find_servers_for_task(task).map { |s| s.host }.sort
|
101
|
+
ensure
|
102
|
+
ENV.delete('HOSTFILTER')
|
103
|
+
end
|
104
|
+
|
97
105
|
def test_task_with_only_should_apply_only_to_matching_tasks
|
98
106
|
task = new_task(:testing, @config, :roles => :app, :only => { :primary => true })
|
99
107
|
assert_equal %w(app1), @config.find_servers_for_task(task).map { |s| s.host }
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require "utils"
|
2
|
+
require 'capistrano/recipes/deploy/scm/subversion'
|
3
|
+
|
4
|
+
class DeploySCMSubversionTest < Test::Unit::TestCase
|
5
|
+
class TestSCM < Capistrano::Deploy::SCM::Subversion
|
6
|
+
default_command "svn"
|
7
|
+
end
|
8
|
+
|
9
|
+
def setup
|
10
|
+
@config = { :repository => "." }
|
11
|
+
def @config.exists?(name); key?(name); end
|
12
|
+
|
13
|
+
@source = TestSCM.new(@config)
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_query_revision
|
17
|
+
revision = @source.query_revision('HEAD') do |o|
|
18
|
+
assert_equal "svn info . -rHEAD", o
|
19
|
+
%Q{Path: rails_2_3
|
20
|
+
URL: svn+ssh://example.com/var/repos/project/branches/rails_2_3
|
21
|
+
Repository Root: svn+ssh://example.com/var/repos
|
22
|
+
Repository UUID: 2d86388d-c40f-0410-ad6a-a69da6a65d20
|
23
|
+
Revision: 2095
|
24
|
+
Node Kind: directory
|
25
|
+
Last Changed Author: sw
|
26
|
+
Last Changed Rev: 2064
|
27
|
+
Last Changed Date: 2009-03-11 11:04:25 -0700 (Wed, 11 Mar 2009)
|
28
|
+
}
|
29
|
+
end
|
30
|
+
assert_equal 2095, revision
|
31
|
+
end
|
32
|
+
end
|
@@ -14,6 +14,50 @@ 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
|
+
|
18
|
+
def test_deploy_with_defaults_should_use_remote_gtar
|
19
|
+
@config[:copy_remote_tar] = 'gtar'
|
20
|
+
|
21
|
+
Dir.expects(:tmpdir).returns("/temp/dir")
|
22
|
+
@source.expects(:checkout).with("154", "/temp/dir/1234567890").returns(:local_checkout)
|
23
|
+
@strategy.expects(:system).with(:local_checkout)
|
24
|
+
|
25
|
+
Dir.expects(:chdir).with("/temp/dir").yields
|
26
|
+
@strategy.expects(:system).with("tar czf 1234567890.tar.gz 1234567890")
|
27
|
+
@strategy.expects(:upload).with("/temp/dir/1234567890.tar.gz", "/tmp/1234567890.tar.gz")
|
28
|
+
@strategy.expects(:run).with("cd /u/apps/test/releases && gtar xzf /tmp/1234567890.tar.gz && rm /tmp/1234567890.tar.gz")
|
29
|
+
|
30
|
+
mock_file = mock("file")
|
31
|
+
mock_file.expects(:puts).with("154")
|
32
|
+
File.expects(:open).with("/temp/dir/1234567890/REVISION", "w").yields(mock_file)
|
33
|
+
|
34
|
+
FileUtils.expects(:rm).with("/temp/dir/1234567890.tar.gz")
|
35
|
+
FileUtils.expects(:rm_rf).with("/temp/dir/1234567890")
|
36
|
+
|
37
|
+
@strategy.deploy!
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_deploy_with_defaults_should_use_local_gtar
|
41
|
+
@config[:copy_local_tar] = 'gtar'
|
42
|
+
|
43
|
+
Dir.expects(:tmpdir).returns("/temp/dir")
|
44
|
+
@source.expects(:checkout).with("154", "/temp/dir/1234567890").returns(:local_checkout)
|
45
|
+
@strategy.expects(:system).with(:local_checkout)
|
46
|
+
|
47
|
+
Dir.expects(:chdir).with("/temp/dir").yields
|
48
|
+
@strategy.expects(:system).with("gtar czf 1234567890.tar.gz 1234567890")
|
49
|
+
@strategy.expects(:upload).with("/temp/dir/1234567890.tar.gz", "/tmp/1234567890.tar.gz")
|
50
|
+
@strategy.expects(:run).with("cd /u/apps/test/releases && tar xzf /tmp/1234567890.tar.gz && rm /tmp/1234567890.tar.gz")
|
51
|
+
|
52
|
+
mock_file = mock("file")
|
53
|
+
mock_file.expects(:puts).with("154")
|
54
|
+
File.expects(:open).with("/temp/dir/1234567890/REVISION", "w").yields(mock_file)
|
55
|
+
|
56
|
+
FileUtils.expects(:rm).with("/temp/dir/1234567890.tar.gz")
|
57
|
+
FileUtils.expects(:rm_rf).with("/temp/dir/1234567890")
|
58
|
+
|
59
|
+
@strategy.deploy!
|
60
|
+
end
|
17
61
|
|
18
62
|
def test_deploy_with_defaults_should_use_tar_gz_and_checkout
|
19
63
|
Dir.expects(:tmpdir).returns("/temp/dir")
|
metadata
CHANGED
@@ -1,16 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capistrano
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.5.
|
4
|
+
version: 2.5.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
- Jamis Buck
|
8
|
-
- Lee Hambley
|
7
|
+
- Jamis Buck, Lee Hambley
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
11
|
|
13
|
-
date: 2009-
|
12
|
+
date: 2009-09-12 00:00:00 +01:00
|
14
13
|
default_executable:
|
15
14
|
dependencies:
|
16
15
|
- !ruby/object:Gem::Dependency
|
@@ -21,7 +20,7 @@ dependencies:
|
|
21
20
|
requirements:
|
22
21
|
- - ">="
|
23
22
|
- !ruby/object:Gem::Version
|
24
|
-
version: 2.0.
|
23
|
+
version: 2.0.14
|
25
24
|
version:
|
26
25
|
- !ruby/object:Gem::Dependency
|
27
26
|
name: net-sftp
|
@@ -63,18 +62,10 @@ dependencies:
|
|
63
62
|
- !ruby/object:Gem::Version
|
64
63
|
version: "0"
|
65
64
|
version:
|
66
|
-
- !ruby/object:Gem::Dependency
|
67
|
-
name: echoe
|
68
|
-
type: :development
|
69
|
-
version_requirement:
|
70
|
-
version_requirements: !ruby/object:Gem::Requirement
|
71
|
-
requirements:
|
72
|
-
- - ">="
|
73
|
-
- !ruby/object:Gem::Version
|
74
|
-
version: "0"
|
75
|
-
version:
|
76
65
|
description: Capistrano is a utility and framework for executing commands in parallel on multiple remote machines, via SSH.
|
77
|
-
email:
|
66
|
+
email:
|
67
|
+
- jamis@jamisbuck.org
|
68
|
+
- lee.hambley@gmail.com
|
78
69
|
executables:
|
79
70
|
- cap
|
80
71
|
- capify
|
@@ -247,11 +238,9 @@ files:
|
|
247
238
|
- test/transfer_test.rb
|
248
239
|
- test/utils.rb
|
249
240
|
- Manifest
|
250
|
-
-
|
241
|
+
- capistrano.gemspec
|
251
242
|
has_rdoc: true
|
252
243
|
homepage: http://www.capify.org
|
253
|
-
licenses: []
|
254
|
-
|
255
244
|
post_install_message:
|
256
245
|
rdoc_options:
|
257
246
|
- --line-numbers
|
@@ -277,10 +266,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
277
266
|
requirements: []
|
278
267
|
|
279
268
|
rubyforge_project: capistrano
|
280
|
-
rubygems_version: 1.3.
|
269
|
+
rubygems_version: 1.3.1
|
281
270
|
signing_key:
|
282
271
|
specification_version: 2
|
283
|
-
summary:
|
272
|
+
summary: Capistrano is a utility and framework for executing commands in parallel on multiple remote machines, via SSH.
|
284
273
|
test_files:
|
285
274
|
- test/cli/execute_test.rb
|
286
275
|
- test/cli/help_test.rb
|
@@ -307,6 +296,7 @@ test_files:
|
|
307
296
|
- test/deploy/scm/git_test.rb
|
308
297
|
- test/deploy/scm/mercurial_test.rb
|
309
298
|
- test/deploy/scm/none_test.rb
|
299
|
+
- test/deploy/scm/subversion_test.rb
|
310
300
|
- test/deploy/strategy/copy_test.rb
|
311
301
|
- test/extensions_test.rb
|
312
302
|
- test/logger_test.rb
|