capistrano 2.14.2 → 2.15.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.travis.yml +1 -0
- data/CHANGELOG +49 -8
- data/Gemfile +1 -1
- data/README.md +4 -4
- data/capistrano.gemspec +9 -17
- data/lib/capistrano/callback.rb +1 -1
- data/lib/capistrano/cli.rb +1 -1
- data/lib/capistrano/cli/execute.rb +3 -3
- data/lib/capistrano/cli/help.rb +3 -3
- data/lib/capistrano/cli/help.txt +23 -23
- data/lib/capistrano/cli/options.rb +12 -12
- data/lib/capistrano/command.rb +20 -7
- data/lib/capistrano/configuration/actions/invocation.rb +23 -11
- data/lib/capistrano/configuration/connections.rb +22 -15
- data/lib/capistrano/configuration/execution.rb +2 -2
- data/lib/capistrano/configuration/loading.rb +2 -2
- data/lib/capistrano/configuration/log_formatters.rb +5 -1
- data/lib/capistrano/configuration/roles.rb +1 -1
- data/lib/capistrano/configuration/servers.rb +6 -6
- data/lib/capistrano/errors.rb +4 -4
- data/lib/capistrano/ext/multistage.rb +2 -2
- data/lib/capistrano/logger.rb +14 -1
- data/lib/capistrano/recipes/deploy.rb +94 -27
- data/lib/capistrano/recipes/deploy/assets.rb +21 -18
- data/lib/capistrano/recipes/deploy/dependencies.rb +2 -2
- data/lib/capistrano/recipes/deploy/remote_dependency.rb +11 -11
- data/lib/capistrano/recipes/deploy/scm.rb +1 -1
- data/lib/capistrano/recipes/deploy/scm/accurev.rb +6 -6
- data/lib/capistrano/recipes/deploy/scm/cvs.rb +4 -4
- data/lib/capistrano/recipes/deploy/scm/darcs.rb +3 -3
- data/lib/capistrano/recipes/deploy/scm/git.rb +3 -0
- data/lib/capistrano/recipes/deploy/scm/mercurial.rb +3 -3
- data/lib/capistrano/recipes/deploy/scm/none.rb +9 -5
- data/lib/capistrano/recipes/deploy/scm/perforce.rb +5 -5
- data/lib/capistrano/recipes/deploy/scm/subversion.rb +1 -1
- data/lib/capistrano/recipes/deploy/strategy.rb +1 -1
- data/lib/capistrano/recipes/deploy/strategy/base.rb +5 -1
- data/lib/capistrano/recipes/deploy/strategy/copy.rb +14 -2
- data/lib/capistrano/recipes/standard.rb +1 -1
- data/lib/capistrano/server_definition.rb +1 -1
- data/lib/capistrano/shell.rb +4 -1
- data/lib/capistrano/ssh.rb +1 -1
- data/lib/capistrano/version.rb +2 -2
- data/test/cli/options_test.rb +1 -1
- data/test/cli/ui_test.rb +1 -1
- data/test/command_test.rb +11 -1
- data/test/configuration/actions/invocation_test.rb +5 -1
- data/test/configuration/callbacks_test.rb +1 -1
- data/test/configuration/connections_test.rb +19 -0
- data/test/configuration/execution_test.rb +1 -1
- data/test/configuration/namespace_dsl_test.rb +6 -6
- data/test/configuration/roles_test.rb +2 -2
- data/test/configuration/servers_test.rb +12 -12
- data/test/configuration/variables_test.rb +3 -3
- data/test/deploy/scm/bzr_test.rb +1 -1
- data/test/deploy/scm/darcs_test.rb +2 -2
- data/test/deploy/scm/git_test.rb +10 -0
- data/test/deploy/scm/mercurial_test.rb +3 -3
- data/test/deploy/scm/perforce_test.rb +1 -1
- data/test/deploy/strategy/copy_test.rb +25 -1
- data/test/extensions_test.rb +1 -1
- data/test/logger_formatting_test.rb +56 -1
- data/test/recipes_test.rb +1 -1
- data/test/server_definition_test.rb +2 -2
- data/test/shell_test.rb +12 -6
- data/test/transfer_test.rb +1 -1
- metadata +63 -31
@@ -2,6 +2,7 @@ load 'deploy' unless defined?(_cset)
|
|
2
2
|
|
3
3
|
_cset :asset_env, "RAILS_GROUPS=assets"
|
4
4
|
_cset :assets_prefix, "assets"
|
5
|
+
_cset :shared_assets_prefix, "assets"
|
5
6
|
_cset :assets_role, [:web]
|
6
7
|
_cset :expire_assets_after, (3600 * 24 * 7)
|
7
8
|
|
@@ -21,14 +22,15 @@ namespace :deploy do
|
|
21
22
|
mid-deploy mismatches between old application html asking for assets \
|
22
23
|
and getting a 404 file not found error. The assets cache is shared \
|
23
24
|
for efficiency. If you customize the assets path prefix, override the \
|
24
|
-
:assets_prefix variable to match.
|
25
|
+
:assets_prefix variable to match. If you customize shared assets path \
|
26
|
+
prefix, override :shared_assets_prefix variable to match.
|
25
27
|
DESC
|
26
|
-
task :symlink, :roles => assets_role, :except => { :no_release => true } do
|
28
|
+
task :symlink, :roles => lambda { assets_role }, :except => { :no_release => true } do
|
27
29
|
run <<-CMD.compact
|
28
30
|
rm -rf #{latest_release}/public/#{assets_prefix} &&
|
29
31
|
mkdir -p #{latest_release}/public &&
|
30
|
-
mkdir -p #{shared_path}
|
31
|
-
ln -s #{shared_path}
|
32
|
+
mkdir -p #{shared_path}/#{shared_assets_prefix} &&
|
33
|
+
ln -s #{shared_path}/#{shared_assets_prefix} #{latest_release}/public/#{assets_prefix}
|
32
34
|
CMD
|
33
35
|
end
|
34
36
|
|
@@ -42,11 +44,11 @@ namespace :deploy do
|
|
42
44
|
set :rails_env, "production"
|
43
45
|
set :asset_env, "RAILS_GROUPS=assets"
|
44
46
|
DESC
|
45
|
-
task :precompile, :roles => assets_role, :except => { :no_release => true } do
|
47
|
+
task :precompile, :roles => lambda { assets_role }, :except => { :no_release => true } do
|
46
48
|
run <<-CMD.compact
|
47
|
-
cd -- #{latest_release
|
49
|
+
cd -- #{latest_release} &&
|
48
50
|
#{rake} RAILS_ENV=#{rails_env.to_s.shellescape} #{asset_env} assets:precompile &&
|
49
|
-
cp -- #{shared_path.shellescape}/
|
51
|
+
cp -- #{shared_path.shellescape}/#{shared_assets_prefix}/manifest.yml #{current_release.to_s.shellescape}/assets_manifest.yml
|
50
52
|
CMD
|
51
53
|
end
|
52
54
|
|
@@ -54,19 +56,19 @@ namespace :deploy do
|
|
54
56
|
[internal] Updates the mtimes for assets that are required by the current release.
|
55
57
|
This task runs before assets:precompile.
|
56
58
|
DESC
|
57
|
-
task :update_asset_mtimes, :roles => assets_role, :except => { :no_release => true } do
|
59
|
+
task :update_asset_mtimes, :roles => lambda { assets_role }, :except => { :no_release => true } do
|
58
60
|
# Fetch assets/manifest.yml contents.
|
59
|
-
manifest_path = "#{shared_path}/
|
61
|
+
manifest_path = "#{shared_path}/#{shared_assets_prefix}/manifest.yml"
|
60
62
|
manifest_yml = capture("[ -e #{manifest_path.shellescape} ] && cat #{manifest_path.shellescape} || echo").strip
|
61
63
|
|
62
64
|
if manifest_yml != ""
|
63
65
|
manifest = YAML.load(manifest_yml)
|
64
66
|
current_assets = manifest.to_a.flatten.map {|a| [a, "#{a}.gz"] }.flatten
|
65
67
|
logger.info "Updating mtimes for ~#{current_assets.count} assets..."
|
66
|
-
put current_assets.map{|a| "#{shared_path}
|
68
|
+
put current_assets.map{|a| "#{shared_path}/#{shared_assets_prefix}/#{a}" }.join("\n"), "#{deploy_to}/TOUCH_ASSETS", :via => :scp
|
67
69
|
run <<-CMD.compact
|
68
70
|
cat #{deploy_to.shellescape}/TOUCH_ASSETS | while read asset; do
|
69
|
-
touch -
|
71
|
+
touch -c -- "$asset";
|
70
72
|
done &&
|
71
73
|
rm -f -- #{deploy_to.shellescape}/TOUCH_ASSETS
|
72
74
|
CMD
|
@@ -84,7 +86,7 @@ namespace :deploy do
|
|
84
86
|
set :rails_env, "production"
|
85
87
|
set :asset_env, "RAILS_GROUPS=assets"
|
86
88
|
DESC
|
87
|
-
task :clean, :roles => assets_role, :except => { :no_release => true } do
|
89
|
+
task :clean, :roles => lambda { assets_role }, :except => { :no_release => true } do
|
88
90
|
run "cd #{latest_release} && #{rake} RAILS_ENV=#{rails_env} #{asset_env} assets:clean"
|
89
91
|
end
|
90
92
|
|
@@ -94,7 +96,7 @@ namespace :deploy do
|
|
94
96
|
to change the assets expiry time. Assets will only be deleted if they are not required by
|
95
97
|
an existing release.
|
96
98
|
DESC
|
97
|
-
task :clean_expired, :roles => assets_role, :except => { :no_release => true } do
|
99
|
+
task :clean_expired, :roles => lambda { assets_role }, :except => { :no_release => true } do
|
98
100
|
# Fetch all assets_manifest.yml contents.
|
99
101
|
manifests_output = capture <<-CMD.compact
|
100
102
|
for manifest in #{releases_path.shellescape}/*/assets_manifest.yml; do
|
@@ -117,7 +119,7 @@ namespace :deploy do
|
|
117
119
|
# Write the list of required assets to server.
|
118
120
|
logger.info "Writing required assets to #{deploy_to}/REQUIRED_ASSETS..."
|
119
121
|
escaped_assets = current_assets.sort.join("\n").gsub("\"", "\\\"") << "\n"
|
120
|
-
put escaped_assets, "#{deploy_to}/REQUIRED_ASSETS"
|
122
|
+
put escaped_assets, "#{deploy_to}/REQUIRED_ASSETS", :via => :scp
|
121
123
|
|
122
124
|
# Finds all files older than X minutes, then removes them if they are not referenced
|
123
125
|
# in REQUIRED_ASSETS.
|
@@ -125,7 +127,9 @@ namespace :deploy do
|
|
125
127
|
logger.info "Removing assets that haven't been deployed for #{expire_after_mins} minutes..."
|
126
128
|
# LC_COLLATE=C tells the `sort` and `comm` commands to sort files in byte order.
|
127
129
|
run <<-CMD.compact
|
128
|
-
cd -- #{
|
130
|
+
cd -- #{deploy_to.shellescape}/ &&
|
131
|
+
LC_COLLATE=C sort REQUIRED_ASSETS -o REQUIRED_ASSETS &&
|
132
|
+
cd -- #{shared_path.shellescape}/#{shared_assets_prefix}/ &&
|
129
133
|
for f in $(
|
130
134
|
find * -mmin +#{expire_after_mins.to_s.shellescape} -type f | LC_COLLATE=C sort |
|
131
135
|
LC_COLLATE=C comm -23 -- - #{deploy_to.shellescape}/REQUIRED_ASSETS
|
@@ -142,16 +146,15 @@ namespace :deploy do
|
|
142
146
|
Rolls back assets to the previous release by symlinking the release's manifest
|
143
147
|
to shared/assets/manifest.yml, and finally recompiling or regenerating nondigest assets.
|
144
148
|
DESC
|
145
|
-
task :rollback, :roles => assets_role, :except => { :no_release => true } do
|
149
|
+
task :rollback, :roles => lambda { assets_role }, :except => { :no_release => true } do
|
146
150
|
previous_manifest = "#{previous_release}/assets_manifest.yml"
|
147
151
|
if capture("[ -e #{previous_manifest.shellescape} ] && echo true || echo false").strip != 'true'
|
148
152
|
puts "#{previous_manifest} is missing! Cannot roll back assets. " <<
|
149
153
|
"Please run deploy:assets:precompile to update your assets when the rollback is finished."
|
150
|
-
return false
|
151
154
|
else
|
152
155
|
run <<-CMD.compact
|
153
156
|
cd -- #{previous_release.shellescape} &&
|
154
|
-
cp -f -- #{previous_manifest.shellescape} #{shared_path.shellescape}/
|
157
|
+
cp -f -- #{previous_manifest.shellescape} #{shared_path.shellescape}/#{shared_assets_prefix}/manifest.yml &&
|
155
158
|
#{rake} RAILS_ENV=#{rails_env.to_s.shellescape} #{asset_env} assets:precompile:nondigest
|
156
159
|
CMD
|
157
160
|
end
|
@@ -58,31 +58,31 @@ module Capistrano
|
|
58
58
|
def match(command, expect, options={})
|
59
59
|
expect = Regexp.new(Regexp.escape(expect.to_s)) unless expect.is_a?(Regexp)
|
60
60
|
|
61
|
-
output_per_server = {}
|
62
|
-
try("#{command} ", options) do |ch, stream, out|
|
63
|
-
output_per_server[ch[:server]] ||= ''
|
64
|
-
output_per_server[ch[:server]] += out
|
65
|
-
end
|
61
|
+
output_per_server = {}
|
62
|
+
try("#{command} ", options) do |ch, stream, out|
|
63
|
+
output_per_server[ch[:server]] ||= ''
|
64
|
+
output_per_server[ch[:server]] += out
|
65
|
+
end
|
66
66
|
|
67
67
|
# It is possible for some of these commands to return a status != 0
|
68
68
|
# (for example, rake --version exits with a 1). For this check we
|
69
69
|
# just care if the output matches, so we reset the success flag.
|
70
70
|
@success = true
|
71
71
|
|
72
|
-
errored_hosts = []
|
73
|
-
output_per_server.each_pair do |server, output|
|
72
|
+
errored_hosts = []
|
73
|
+
output_per_server.each_pair do |server, output|
|
74
74
|
next if output =~ expect
|
75
|
-
errored_hosts << server
|
76
|
-
end
|
75
|
+
errored_hosts << server
|
76
|
+
end
|
77
77
|
|
78
78
|
if errored_hosts.any?
|
79
79
|
@hosts = errored_hosts.join(', ')
|
80
80
|
output = output_per_server[errored_hosts.first]
|
81
81
|
@message = "the output #{output.inspect} from #{command.inspect} did not match #{expect.inspect}"
|
82
82
|
@success = false
|
83
|
-
end
|
83
|
+
end
|
84
84
|
|
85
|
-
self
|
85
|
+
self
|
86
86
|
end
|
87
87
|
|
88
88
|
def or(message)
|
@@ -14,9 +14,9 @@ module Capistrano
|
|
14
14
|
# * :repository - This should match the depot that code lives in. If your code
|
15
15
|
# exists in a subdirectory, you can append the path depot.
|
16
16
|
# eg. foo-depot/bar_dir
|
17
|
-
# * :stream - The stream in the depot that code should be pulled from. If
|
17
|
+
# * :stream - The stream in the depot that code should be pulled from. If
|
18
18
|
# left blank, the depot stream will be used
|
19
|
-
# * :revision - Should be in the form 'stream/transaction'.
|
19
|
+
# * :revision - Should be in the form 'stream/transaction'.
|
20
20
|
class Accurev < Base
|
21
21
|
include REXML
|
22
22
|
default_command 'accurev'
|
@@ -54,10 +54,10 @@ module Capistrano
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
# Pops a copy of the code for the specified Accurev revision identifier.
|
57
|
+
# Pops a copy of the code for the specified Accurev revision identifier.
|
58
58
|
# The revision identifier is represented as a stream & transaction ID combo.
|
59
59
|
# Accurev can only pop a particular transaction if a stream is created on the server
|
60
|
-
# with a time basis of that transaction id. Therefore, we will create a stream with
|
60
|
+
# with a time basis of that transaction id. Therefore, we will create a stream with
|
61
61
|
# the required criteria and pop that.
|
62
62
|
def export(revision_id, destination)
|
63
63
|
revision = InternalRevision.parse(revision_id)
|
@@ -89,7 +89,7 @@ module Capistrano
|
|
89
89
|
].join(' | ')
|
90
90
|
end
|
91
91
|
|
92
|
-
# Returns the command needed to show the diff between what is deployed and what is
|
92
|
+
# Returns the command needed to show the diff between what is deployed and what is
|
93
93
|
# pending. Because Accurev can not do this task without creating some streams,
|
94
94
|
# two time basis streams will be created for the purposes of doing the diff.
|
95
95
|
def diff(from, to=head)
|
@@ -156,7 +156,7 @@ module Capistrano
|
|
156
156
|
end
|
157
157
|
|
158
158
|
def to_s
|
159
|
-
"#{stream}/#{transaction_id}"
|
159
|
+
"#{stream}/#{transaction_id}"
|
160
160
|
end
|
161
161
|
|
162
162
|
def ==(other)
|
@@ -63,7 +63,7 @@ module Capistrano
|
|
63
63
|
scm cvs_root, :log, range_arg
|
64
64
|
end
|
65
65
|
|
66
|
-
# Unfortunately, cvs doesn't support the concept of a revision number like
|
66
|
+
# Unfortunately, cvs doesn't support the concept of a revision number like
|
67
67
|
# subversion and other SCM's do. For now, we'll rely on getting the timestamp
|
68
68
|
# of the latest checkin under the revision that's passed to us.
|
69
69
|
def query_revision(revision)
|
@@ -99,7 +99,7 @@ module Capistrano
|
|
99
99
|
root << "-d #{repository} " if repository
|
100
100
|
root
|
101
101
|
end
|
102
|
-
|
102
|
+
|
103
103
|
# Constructs the destination dir command-line option
|
104
104
|
def cvs_destination(destination)
|
105
105
|
dest = ""
|
@@ -109,7 +109,7 @@ module Capistrano
|
|
109
109
|
end
|
110
110
|
dest
|
111
111
|
end
|
112
|
-
|
112
|
+
|
113
113
|
# attempts to guess what type of revision we're working with
|
114
114
|
def revision_type(rev)
|
115
115
|
return :date if rev =~ /^\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2} UTC$/ # i.e 2007-05-15 08:13:25 UTC
|
@@ -117,7 +117,7 @@ module Capistrano
|
|
117
117
|
return :revision if rev =~ /^\d/ # i.e. 1.2.1
|
118
118
|
return :tag # i.e. RELEASE_1_2
|
119
119
|
end
|
120
|
-
|
120
|
+
|
121
121
|
# constructs the appropriate command-line switch for specifying a
|
122
122
|
# "revision" in CVS. This could be a tag, branch, revision (i.e. 1.3)
|
123
123
|
# or a date (to be used with -d)
|
@@ -25,13 +25,13 @@ module Capistrano
|
|
25
25
|
"--to-match='hash #{revision}'"
|
26
26
|
end
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
# Returns the command that will check out the given revision to the
|
30
30
|
# given destination. The 'revision' parameter must be the 'hash' value
|
31
31
|
# for the revision in question, as given by 'darcs changes --xml-output'.
|
32
32
|
def checkout(revision, destination)
|
33
|
-
scm :get, *[verbose,
|
34
|
-
"--repo-name=#{destination}",
|
33
|
+
scm :get, *[verbose,
|
34
|
+
"--repo-name=#{destination}",
|
35
35
|
to_match(revision),
|
36
36
|
repository].compact
|
37
37
|
end
|
@@ -134,6 +134,9 @@ module Capistrano
|
|
134
134
|
remote = origin
|
135
135
|
|
136
136
|
args = []
|
137
|
+
|
138
|
+
# Add an option for the branch name so :git_shallow_clone works with branches
|
139
|
+
args << "-b #{variable(:branch)}" unless variable(:branch).nil?
|
137
140
|
args << "-o #{remote}" unless remote == 'origin'
|
138
141
|
if depth = variable(:git_shallow_clone)
|
139
142
|
args << "--depth #{depth}"
|
@@ -89,11 +89,11 @@ module Capistrano
|
|
89
89
|
"yes\n"
|
90
90
|
end
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
private
|
94
94
|
|
95
95
|
# Fine grained mercurial commands
|
96
|
-
def clone(destination)
|
96
|
+
def clone(destination)
|
97
97
|
scm :clone,
|
98
98
|
verbose,
|
99
99
|
"--noupdate", # do not update to tip when cloning is done
|
@@ -124,7 +124,7 @@ module Capistrano
|
|
124
124
|
else "--verbose"
|
125
125
|
end
|
126
126
|
end
|
127
|
-
|
127
|
+
|
128
128
|
# honor Cap 2.1+'s :scm_prefer_prompt if present
|
129
129
|
def scm_password_or_prompt
|
130
130
|
@scm_password_or_prompt ||= variable(:scm_password) ||
|
@@ -18,6 +18,11 @@ module Capistrano
|
|
18
18
|
# set :repository, "."
|
19
19
|
# set :scm, :none
|
20
20
|
# set :deploy_via, :copy
|
21
|
+
#
|
22
|
+
# Dereference symbolic links. Copy files instead. Handy when you
|
23
|
+
# reference files and directory outside of your deployment root.
|
24
|
+
# set :copy_dereference_symlink, true
|
25
|
+
|
21
26
|
class None < Base
|
22
27
|
# No versioning, thus, no head. Returns the empty string.
|
23
28
|
def head
|
@@ -27,9 +32,8 @@ module Capistrano
|
|
27
32
|
# Simply does a copy from the :repository directory to the
|
28
33
|
# :destination directory.
|
29
34
|
def checkout(revision, destination)
|
30
|
-
!Capistrano::Deploy::LocalDependency.on_windows? ? "cp -R #{repository} #{destination}" : "xcopy #{repository} \"#{destination}\" /S/I/Y/Q/E"
|
35
|
+
!Capistrano::Deploy::LocalDependency.on_windows? ? "cp -R#{configuration[:copy_dereference_symlink]?'L':''} #{repository} #{destination}" : "xcopy #{repository} \"#{destination}\" /S/I/Y/Q/E"
|
31
36
|
end
|
32
|
-
|
33
37
|
alias_method :export, :checkout
|
34
38
|
|
35
39
|
# No versioning, so this just returns the argument, with no
|
@@ -37,13 +41,13 @@ module Capistrano
|
|
37
41
|
def query_revision(revision)
|
38
42
|
revision
|
39
43
|
end
|
40
|
-
|
44
|
+
|
41
45
|
# log: There's no log, so it just echos from and to.
|
42
|
-
|
46
|
+
|
43
47
|
def log(from="", to="")
|
44
48
|
"No SCM: #{from} - #{to}"
|
45
49
|
end
|
46
|
-
|
50
|
+
|
47
51
|
end
|
48
52
|
|
49
53
|
end
|
@@ -69,13 +69,13 @@ module Capistrano
|
|
69
69
|
def handle_data(state, stream, text)
|
70
70
|
case text
|
71
71
|
when /\(P4PASSWD\) invalid or unset\./i
|
72
|
-
|
72
|
+
raise Capistrano::Error, "scm_password (or p4passwd) is incorrect or unset"
|
73
73
|
when /Can.t create a new user.*/i
|
74
|
-
|
74
|
+
raise Capistrano::Error, "scm_username (or p4user) is incorrect or unset"
|
75
75
|
when /Perforce client error\:/i
|
76
|
-
|
76
|
+
raise Capistrano::Error, "p4port is incorrect or unset"
|
77
77
|
when /Client \'[\w\-\_\.]+\' unknown.*/i
|
78
|
-
|
78
|
+
raise Capistrano::Error, "p4client is incorrect or unset"
|
79
79
|
end
|
80
80
|
end
|
81
81
|
|
@@ -113,7 +113,7 @@ module Capistrano
|
|
113
113
|
def p4passwd
|
114
114
|
variable(:p4passwd) || variable(:scm_password)
|
115
115
|
end
|
116
|
-
|
116
|
+
|
117
117
|
def p4charset
|
118
118
|
variable(:p4charset)
|
119
119
|
end
|
@@ -69,7 +69,7 @@ module Capistrano
|
|
69
69
|
# etc. are handled here.
|
70
70
|
def handle_data(state, stream, text)
|
71
71
|
host = state[:channel][:host]
|
72
|
-
|
72
|
+
logger.info "[#{host} :: #{stream}] #{text}"
|
73
73
|
case text
|
74
74
|
when /\bpassword.*:/i
|
75
75
|
# subversion is prompting for a password
|
@@ -29,7 +29,11 @@ module Capistrano
|
|
29
29
|
# is setup such that a deploy could succeed.
|
30
30
|
def check!
|
31
31
|
Dependencies.new(configuration) do |d|
|
32
|
-
|
32
|
+
if exists?(:stage)
|
33
|
+
d.remote.directory(configuration[:releases_path]).or("`#{configuration[:releases_path]}' does not exist. Please run `cap #{configuration[:stage]} deploy:setup'.")
|
34
|
+
else
|
35
|
+
d.remote.directory(configuration[:releases_path]).or("`#{configuration[:releases_path]}' does not exist. Please run `cap deploy:setup'.")
|
36
|
+
end
|
33
37
|
d.remote.writable(configuration[:deploy_to]).or("You do not have permissions to write to `#{configuration[:deploy_to]}'.")
|
34
38
|
d.remote.writable(configuration[:releases_path]).or("You do not have permissions to write to `#{configuration[:releases_path]}'.")
|
35
39
|
end
|
@@ -39,6 +39,11 @@ module Capistrano
|
|
39
39
|
# :zip, and which specifies how the source should be compressed for
|
40
40
|
# transmission to each host.
|
41
41
|
#
|
42
|
+
# By default, files will be transferred across to the remote machines via 'sftp'. If you prefer
|
43
|
+
# to use 'scp' you can set the :copy_via variable to :scp.
|
44
|
+
#
|
45
|
+
# set :copy_via, :scp
|
46
|
+
#
|
42
47
|
# There is a possibility to pass a build command that will get
|
43
48
|
# executed if your code needs to be compiled or something needs to be
|
44
49
|
# done before the code is ready to run.
|
@@ -174,7 +179,11 @@ module Capistrano
|
|
174
179
|
end
|
175
180
|
|
176
181
|
def pattern_for directory
|
177
|
-
!directory.nil? ? "#{directory}/*" : "*"
|
182
|
+
!directory.nil? ? "#{escape_globs(directory)}/*" : "*"
|
183
|
+
end
|
184
|
+
|
185
|
+
def escape_globs path
|
186
|
+
path.gsub(/[*?{}\[\]]/, '\\\\\\&')
|
178
187
|
end
|
179
188
|
|
180
189
|
def excluded_files_contain? file
|
@@ -316,7 +325,10 @@ module Capistrano
|
|
316
325
|
|
317
326
|
# Distributes the file to the remote servers
|
318
327
|
def distribute!
|
319
|
-
|
328
|
+
args = [filename, remote_filename]
|
329
|
+
args << { :via => configuration[:copy_via] } if configuration[:copy_via]
|
330
|
+
|
331
|
+
upload(*args)
|
320
332
|
decompress_remote_file
|
321
333
|
end
|
322
334
|
end
|