capistrano 2.15.11 → 3.0.0.pre
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.
- checksums.yaml +5 -5
- data/.gitignore +17 -8
- data/Gemfile +1 -12
- data/LICENSE.txt +18 -0
- data/README.md +65 -68
- data/Rakefile +4 -10
- data/bin/cap +2 -3
- data/bin/capify +7 -91
- data/capistrano.gemspec +20 -34
- data/lib/Capfile +2 -0
- data/lib/capistrano/application.rb +28 -0
- data/lib/capistrano/bundler.rb +1 -0
- data/lib/capistrano/configuration/question.rb +42 -0
- data/lib/capistrano/configuration/server.rb +24 -0
- data/lib/capistrano/configuration/servers.rb +43 -95
- data/lib/capistrano/configuration.rb +81 -44
- data/lib/capistrano/console.rb +1 -0
- data/lib/capistrano/defaults.rb +11 -0
- data/lib/capistrano/deploy.rb +3 -0
- data/lib/capistrano/dotfile.rb +3 -0
- data/lib/capistrano/dsl/env.rb +57 -0
- data/lib/capistrano/dsl/paths.rb +74 -0
- data/lib/capistrano/dsl/stages.rb +15 -0
- data/lib/capistrano/dsl/task_enhancements.rb +15 -0
- data/lib/capistrano/dsl.rb +38 -0
- data/lib/capistrano/git.rb +1 -0
- data/lib/capistrano/i18n.rb +33 -0
- data/lib/capistrano/install.rb +1 -0
- data/lib/capistrano/setup.rb +17 -0
- data/lib/capistrano/tasks/bundler.rake +13 -0
- data/lib/capistrano/tasks/console.rake +21 -0
- data/lib/capistrano/tasks/deploy.rake +153 -0
- data/lib/capistrano/tasks/framework.rake +45 -0
- data/lib/capistrano/tasks/git.rake +65 -0
- data/lib/capistrano/tasks/install.rake +39 -0
- data/lib/capistrano/templates/Capfile +43 -0
- data/lib/capistrano/templates/deploy.rb.erb +17 -0
- data/lib/capistrano/templates/stage.rb.erb +20 -0
- data/lib/capistrano/version.rb +1 -11
- data/lib/capistrano.rb +9 -3
- data/spec/lib/capistrano/configuration/question_spec.rb +54 -0
- data/spec/lib/capistrano/configuration/server_spec.rb +48 -0
- data/spec/lib/capistrano/configuration/servers_spec.rb +79 -0
- data/spec/lib/capistrano/configuration_spec.rb +80 -0
- data/spec/lib/capistrano/dsl/env_spec.rb +83 -0
- data/spec/lib/capistrano/dsl/paths_spec.rb +69 -0
- data/spec/lib/capistrano/dsl_spec.rb +51 -0
- data/spec/lib/capistrano_spec.rb +8 -0
- data/spec/spec_helper.rb +14 -0
- metadata +89 -215
- data/.travis.yml +0 -9
- data/CHANGELOG +0 -1203
- data/lib/capistrano/callback.rb +0 -45
- data/lib/capistrano/cli/execute.rb +0 -85
- data/lib/capistrano/cli/help.rb +0 -125
- data/lib/capistrano/cli/help.txt +0 -81
- data/lib/capistrano/cli/options.rb +0 -243
- data/lib/capistrano/cli/ui.rb +0 -40
- data/lib/capistrano/cli.rb +0 -47
- data/lib/capistrano/command.rb +0 -303
- data/lib/capistrano/configuration/actions/file_transfer.rb +0 -50
- data/lib/capistrano/configuration/actions/inspect.rb +0 -46
- data/lib/capistrano/configuration/actions/invocation.rb +0 -329
- data/lib/capistrano/configuration/alias_task.rb +0 -26
- data/lib/capistrano/configuration/callbacks.rb +0 -147
- data/lib/capistrano/configuration/connections.rb +0 -237
- data/lib/capistrano/configuration/execution.rb +0 -142
- data/lib/capistrano/configuration/loading.rb +0 -205
- data/lib/capistrano/configuration/log_formatters.rb +0 -75
- data/lib/capistrano/configuration/namespaces.rb +0 -223
- data/lib/capistrano/configuration/roles.rb +0 -83
- data/lib/capistrano/configuration/variables.rb +0 -127
- data/lib/capistrano/errors.rb +0 -19
- data/lib/capistrano/ext/multistage.rb +0 -67
- data/lib/capistrano/ext/string.rb +0 -5
- data/lib/capistrano/extensions.rb +0 -57
- data/lib/capistrano/fix_rake_deprecated_dsl.rb +0 -8
- data/lib/capistrano/logger.rb +0 -166
- data/lib/capistrano/processable.rb +0 -55
- data/lib/capistrano/recipes/compat.rb +0 -32
- data/lib/capistrano/recipes/deploy/assets.rb +0 -202
- data/lib/capistrano/recipes/deploy/dependencies.rb +0 -44
- data/lib/capistrano/recipes/deploy/local_dependency.rb +0 -54
- data/lib/capistrano/recipes/deploy/remote_dependency.rb +0 -117
- data/lib/capistrano/recipes/deploy/scm/accurev.rb +0 -169
- data/lib/capistrano/recipes/deploy/scm/base.rb +0 -200
- data/lib/capistrano/recipes/deploy/scm/bzr.rb +0 -86
- data/lib/capistrano/recipes/deploy/scm/cvs.rb +0 -153
- data/lib/capistrano/recipes/deploy/scm/darcs.rb +0 -96
- data/lib/capistrano/recipes/deploy/scm/git.rb +0 -299
- data/lib/capistrano/recipes/deploy/scm/mercurial.rb +0 -137
- data/lib/capistrano/recipes/deploy/scm/none.rb +0 -55
- data/lib/capistrano/recipes/deploy/scm/perforce.rb +0 -152
- data/lib/capistrano/recipes/deploy/scm/subversion.rb +0 -121
- data/lib/capistrano/recipes/deploy/scm.rb +0 -19
- data/lib/capistrano/recipes/deploy/strategy/base.rb +0 -92
- data/lib/capistrano/recipes/deploy/strategy/checkout.rb +0 -20
- data/lib/capistrano/recipes/deploy/strategy/copy.rb +0 -338
- data/lib/capistrano/recipes/deploy/strategy/export.rb +0 -20
- data/lib/capistrano/recipes/deploy/strategy/remote.rb +0 -52
- data/lib/capistrano/recipes/deploy/strategy/remote_cache.rb +0 -57
- data/lib/capistrano/recipes/deploy/strategy/unshared_remote_cache.rb +0 -21
- data/lib/capistrano/recipes/deploy/strategy.rb +0 -20
- data/lib/capistrano/recipes/deploy.rb +0 -625
- data/lib/capistrano/recipes/standard.rb +0 -37
- data/lib/capistrano/recipes/templates/maintenance.rhtml +0 -53
- data/lib/capistrano/role.rb +0 -102
- data/lib/capistrano/server_definition.rb +0 -56
- data/lib/capistrano/shell.rb +0 -265
- data/lib/capistrano/ssh.rb +0 -95
- data/lib/capistrano/task_definition.rb +0 -77
- data/lib/capistrano/transfer.rb +0 -218
- data/test/cli/execute_test.rb +0 -132
- data/test/cli/help_test.rb +0 -165
- data/test/cli/options_test.rb +0 -329
- data/test/cli/ui_test.rb +0 -28
- data/test/cli_test.rb +0 -17
- data/test/command_test.rb +0 -322
- data/test/configuration/actions/file_transfer_test.rb +0 -61
- data/test/configuration/actions/inspect_test.rb +0 -76
- data/test/configuration/actions/invocation_test.rb +0 -306
- data/test/configuration/alias_task_test.rb +0 -118
- data/test/configuration/callbacks_test.rb +0 -201
- data/test/configuration/connections_test.rb +0 -439
- data/test/configuration/execution_test.rb +0 -175
- data/test/configuration/loading_test.rb +0 -148
- data/test/configuration/namespace_dsl_test.rb +0 -332
- data/test/configuration/roles_test.rb +0 -157
- data/test/configuration/servers_test.rb +0 -183
- data/test/configuration/variables_test.rb +0 -190
- data/test/configuration_test.rb +0 -77
- data/test/deploy/local_dependency_test.rb +0 -76
- data/test/deploy/remote_dependency_test.rb +0 -146
- data/test/deploy/scm/accurev_test.rb +0 -23
- data/test/deploy/scm/base_test.rb +0 -55
- data/test/deploy/scm/bzr_test.rb +0 -51
- data/test/deploy/scm/darcs_test.rb +0 -37
- data/test/deploy/scm/git_test.rb +0 -274
- data/test/deploy/scm/mercurial_test.rb +0 -134
- data/test/deploy/scm/none_test.rb +0 -35
- data/test/deploy/scm/perforce_test.rb +0 -23
- data/test/deploy/scm/subversion_test.rb +0 -68
- data/test/deploy/strategy/copy_test.rb +0 -360
- data/test/extensions_test.rb +0 -69
- data/test/fixtures/cli_integration.rb +0 -5
- data/test/fixtures/config.rb +0 -5
- data/test/fixtures/custom.rb +0 -3
- data/test/logger_formatting_test.rb +0 -149
- data/test/logger_test.rb +0 -134
- data/test/recipes_test.rb +0 -25
- data/test/role_test.rb +0 -11
- data/test/server_definition_test.rb +0 -121
- data/test/shell_test.rb +0 -96
- data/test/ssh_test.rb +0 -113
- data/test/task_definition_test.rb +0 -117
- data/test/transfer_test.rb +0 -168
- data/test/utils.rb +0 -37
- data/test/version_test.rb +0 -11
data/lib/capistrano/command.rb
DELETED
|
@@ -1,303 +0,0 @@
|
|
|
1
|
-
require 'benchmark'
|
|
2
|
-
require 'capistrano/errors'
|
|
3
|
-
require 'capistrano/processable'
|
|
4
|
-
|
|
5
|
-
module Capistrano
|
|
6
|
-
|
|
7
|
-
# This class encapsulates a single command to be executed on a set of remote
|
|
8
|
-
# machines, in parallel.
|
|
9
|
-
class Command
|
|
10
|
-
include Processable
|
|
11
|
-
|
|
12
|
-
class Tree
|
|
13
|
-
attr_reader :configuration
|
|
14
|
-
attr_reader :branches
|
|
15
|
-
attr_reader :fallback
|
|
16
|
-
|
|
17
|
-
include Enumerable
|
|
18
|
-
|
|
19
|
-
class Branch
|
|
20
|
-
attr_accessor :command, :callback, :condition
|
|
21
|
-
attr_reader :options
|
|
22
|
-
|
|
23
|
-
def initialize(command, options, callback)
|
|
24
|
-
@command = command.strip.gsub(/\r?\n/, "\\\n")
|
|
25
|
-
@callback = callback || Capistrano::Configuration.default_io_proc
|
|
26
|
-
@options = options
|
|
27
|
-
@skip = false
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def last?
|
|
31
|
-
options[:last]
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def skip?
|
|
35
|
-
@skip
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def skip!
|
|
39
|
-
@skip = true
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def match(server)
|
|
43
|
-
true
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def to_s(parallel=false)
|
|
47
|
-
if parallel && @condition
|
|
48
|
-
"#{condition.inspect} :: #{command.inspect}"
|
|
49
|
-
else
|
|
50
|
-
command.inspect
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
class ConditionBranch < Branch
|
|
56
|
-
attr_accessor :configuration
|
|
57
|
-
|
|
58
|
-
class Evaluator
|
|
59
|
-
attr_reader :configuration, :condition, :server
|
|
60
|
-
|
|
61
|
-
def initialize(config, condition, server)
|
|
62
|
-
@configuration = config
|
|
63
|
-
@condition = condition
|
|
64
|
-
@server = server
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def in?(role)
|
|
68
|
-
configuration.roles[role].include?(server)
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
def result
|
|
72
|
-
eval(condition, binding)
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def method_missing(sym, *args, &block)
|
|
76
|
-
if server.respond_to?(sym)
|
|
77
|
-
server.send(sym, *args, &block)
|
|
78
|
-
elsif configuration.respond_to?(sym)
|
|
79
|
-
configuration.send(sym, *args, &block)
|
|
80
|
-
else
|
|
81
|
-
super
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
def initialize(configuration, condition, command, options, callback)
|
|
87
|
-
@configuration = configuration
|
|
88
|
-
@condition = condition
|
|
89
|
-
super(command, options, callback)
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
def match(server)
|
|
93
|
-
Evaluator.new(configuration, condition, server).result
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
class ElseBranch < Branch
|
|
98
|
-
def initialize(command, options, callback)
|
|
99
|
-
@condition = "else"
|
|
100
|
-
super(command, options, callback)
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
def initialize(config)
|
|
105
|
-
@configuration = config
|
|
106
|
-
@branches = []
|
|
107
|
-
yield self if block_given?
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
def when(condition, command, options={}, &block)
|
|
111
|
-
branches << ConditionBranch.new(configuration, condition, command, options, block)
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
def else(command, &block)
|
|
115
|
-
@fallback = ElseBranch.new(command, {}, block)
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
def branches_for(server)
|
|
119
|
-
seen_last = false
|
|
120
|
-
matches = branches.select do |branch|
|
|
121
|
-
success = !seen_last && !branch.skip? && branch.match(server)
|
|
122
|
-
seen_last = success && branch.last?
|
|
123
|
-
success
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
matches << fallback if matches.empty? && fallback
|
|
127
|
-
return matches
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
def each
|
|
131
|
-
branches.each { |branch| yield branch }
|
|
132
|
-
yield fallback if fallback
|
|
133
|
-
return self
|
|
134
|
-
end
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
attr_reader :tree, :sessions, :options
|
|
138
|
-
|
|
139
|
-
def self.process(tree, sessions, options={})
|
|
140
|
-
new(tree, sessions, options).process!
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
# Instantiates a new command object. The +command+ must be a string
|
|
144
|
-
# containing the command to execute. +sessions+ is an array of Net::SSH
|
|
145
|
-
# session instances, and +options+ must be a hash containing any of the
|
|
146
|
-
# following keys:
|
|
147
|
-
#
|
|
148
|
-
# * +logger+: (optional), a Capistrano::Logger instance
|
|
149
|
-
# * +data+: (optional), a string to be sent to the command via it's stdin
|
|
150
|
-
# * +env+: (optional), a string or hash to be interpreted as environment
|
|
151
|
-
# variables that should be defined for this command invocation.
|
|
152
|
-
def initialize(tree, sessions, options={}, &block)
|
|
153
|
-
if String === tree
|
|
154
|
-
tree = Tree.new(nil) { |t| t.else(tree, &block) }
|
|
155
|
-
elsif block
|
|
156
|
-
raise ArgumentError, "block given with tree argument"
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
@tree = tree
|
|
160
|
-
@sessions = sessions
|
|
161
|
-
@options = options
|
|
162
|
-
@channels = open_channels
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
# Processes the command in parallel on all specified hosts. If the command
|
|
166
|
-
# fails (non-zero return code) on any of the hosts, this will raise a
|
|
167
|
-
# Capistrano::CommandError.
|
|
168
|
-
def process!
|
|
169
|
-
elapsed = Benchmark.realtime do
|
|
170
|
-
loop do
|
|
171
|
-
break unless process_iteration { @channels.any? { |ch| !ch[:closed] } }
|
|
172
|
-
end
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
logger.trace "command finished in #{(elapsed * 1000).round}ms" if logger
|
|
176
|
-
|
|
177
|
-
if (failed = @channels.select { |ch| ch[:status] != 0 }).any?
|
|
178
|
-
commands = failed.inject({}) { |map, ch| (map[ch[:command]] ||= []) << ch[:server]; map }
|
|
179
|
-
message = commands.map { |command, list| "#{command.inspect} on #{list.join(',')}" }.join("; ")
|
|
180
|
-
error = CommandError.new("failed: #{message}")
|
|
181
|
-
error.hosts = commands.values.flatten
|
|
182
|
-
raise error
|
|
183
|
-
end
|
|
184
|
-
|
|
185
|
-
self
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
# Force the command to stop processing, by closing all open channels
|
|
189
|
-
# associated with this command.
|
|
190
|
-
def stop!
|
|
191
|
-
@channels.each do |ch|
|
|
192
|
-
ch.close unless ch[:closed]
|
|
193
|
-
end
|
|
194
|
-
end
|
|
195
|
-
|
|
196
|
-
private
|
|
197
|
-
|
|
198
|
-
def logger
|
|
199
|
-
options[:logger]
|
|
200
|
-
end
|
|
201
|
-
|
|
202
|
-
def open_channels
|
|
203
|
-
sessions.map do |session|
|
|
204
|
-
server = session.xserver
|
|
205
|
-
tree.branches_for(server).map do |branch|
|
|
206
|
-
session.open_channel do |channel|
|
|
207
|
-
channel[:server] = server
|
|
208
|
-
channel[:host] = server.host
|
|
209
|
-
channel[:options] = options
|
|
210
|
-
channel[:branch] = branch
|
|
211
|
-
|
|
212
|
-
request_pty_if_necessary(channel) do |ch, success|
|
|
213
|
-
if success
|
|
214
|
-
logger.trace "executing command", ch[:server] if logger
|
|
215
|
-
cmd = replace_placeholders(channel[:branch].command, ch)
|
|
216
|
-
|
|
217
|
-
if options[:shell] == false
|
|
218
|
-
shell = nil
|
|
219
|
-
else
|
|
220
|
-
shell = "#{options[:shell] || "sh"} -c"
|
|
221
|
-
cmd = cmd.gsub(/'/) { |m| "'\\''" }
|
|
222
|
-
cmd = "'#{cmd}'"
|
|
223
|
-
end
|
|
224
|
-
|
|
225
|
-
command_line = [environment, shell, cmd].compact.join(" ")
|
|
226
|
-
ch[:command] = command_line
|
|
227
|
-
|
|
228
|
-
ch.exec(command_line)
|
|
229
|
-
ch.send_data(options[:data]) if options[:data]
|
|
230
|
-
ch.eof! if options[:eof]
|
|
231
|
-
else
|
|
232
|
-
# just log it, don't actually raise an exception, since the
|
|
233
|
-
# process method will see that the status is not zero and will
|
|
234
|
-
# raise an exception then.
|
|
235
|
-
logger.important "could not open channel", ch[:server] if logger
|
|
236
|
-
ch.close
|
|
237
|
-
end
|
|
238
|
-
end
|
|
239
|
-
|
|
240
|
-
channel.on_data do |ch, data|
|
|
241
|
-
ch[:branch].callback[ch, :out, data]
|
|
242
|
-
end
|
|
243
|
-
|
|
244
|
-
channel.on_extended_data do |ch, type, data|
|
|
245
|
-
ch[:branch].callback[ch, :err, data]
|
|
246
|
-
end
|
|
247
|
-
|
|
248
|
-
channel.on_request("exit-status") do |ch, data|
|
|
249
|
-
ch[:status] = data.read_long
|
|
250
|
-
end
|
|
251
|
-
|
|
252
|
-
channel.on_request("exit-signal") do |ch, data|
|
|
253
|
-
if logger
|
|
254
|
-
exit_signal = data.read_string
|
|
255
|
-
logger.important "command received signal #{exit_signal}", ch[:server]
|
|
256
|
-
end
|
|
257
|
-
end
|
|
258
|
-
|
|
259
|
-
channel.on_close do |ch|
|
|
260
|
-
ch[:closed] = true
|
|
261
|
-
end
|
|
262
|
-
end
|
|
263
|
-
end
|
|
264
|
-
end.flatten
|
|
265
|
-
end
|
|
266
|
-
|
|
267
|
-
def request_pty_if_necessary(channel)
|
|
268
|
-
if options[:pty]
|
|
269
|
-
channel.request_pty do |ch, success|
|
|
270
|
-
yield ch, success
|
|
271
|
-
end
|
|
272
|
-
else
|
|
273
|
-
yield channel, true
|
|
274
|
-
end
|
|
275
|
-
end
|
|
276
|
-
|
|
277
|
-
def replace_placeholders(command, channel)
|
|
278
|
-
roles = @tree.configuration && @tree.configuration.role_names_for_host(channel[:server])
|
|
279
|
-
command = command.gsub(/\$CAPISTRANO:HOST\$/, channel[:host])
|
|
280
|
-
command.gsub!(/\$CAPISTRANO:HOSTROLES\$/, roles.join(',')) if roles
|
|
281
|
-
command
|
|
282
|
-
end
|
|
283
|
-
|
|
284
|
-
# prepare a space-separated sequence of variables assignments
|
|
285
|
-
# intended to be prepended to a command, so the shell sets
|
|
286
|
-
# the environment before running the command.
|
|
287
|
-
# i.e.: options[:env] = {'PATH' => '/opt/ruby/bin:$PATH',
|
|
288
|
-
# 'TEST' => '( "quoted" )'}
|
|
289
|
-
# environment returns:
|
|
290
|
-
# "env TEST=(\ \"quoted\"\ ) PATH=/opt/ruby/bin:$PATH"
|
|
291
|
-
def environment
|
|
292
|
-
return if options[:env].nil? || options[:env].empty?
|
|
293
|
-
@environment ||= if String === options[:env]
|
|
294
|
-
"env #{options[:env]}"
|
|
295
|
-
else
|
|
296
|
-
options[:env].inject("env") do |string, (name, value)|
|
|
297
|
-
value = value.to_s.gsub(/[ "]/) { |m| "\\#{m}" }
|
|
298
|
-
string << " #{name}=#{value}"
|
|
299
|
-
end
|
|
300
|
-
end
|
|
301
|
-
end
|
|
302
|
-
end
|
|
303
|
-
end
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
require 'capistrano/transfer'
|
|
2
|
-
|
|
3
|
-
module Capistrano
|
|
4
|
-
class Configuration
|
|
5
|
-
module Actions
|
|
6
|
-
module FileTransfer
|
|
7
|
-
|
|
8
|
-
# Store the given data at the given location on all servers targetted
|
|
9
|
-
# by the current task. If <tt>:mode</tt> is specified it is used to
|
|
10
|
-
# set the mode on the file.
|
|
11
|
-
def put(data, path, options={})
|
|
12
|
-
opts = options.dup
|
|
13
|
-
upload(StringIO.new(data), path, opts)
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
# Get file remote_path from FIRST server targeted by
|
|
17
|
-
# the current task and transfer it to local machine as path.
|
|
18
|
-
#
|
|
19
|
-
# get "#{deploy_to}/current/log/production.log", "log/production.log.web"
|
|
20
|
-
def get(remote_path, path, options={}, &block)
|
|
21
|
-
download(remote_path, path, options.merge(:once => true), &block)
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def upload(from, to, options={}, &block)
|
|
25
|
-
mode = options.delete(:mode)
|
|
26
|
-
transfer(:up, from, to, options, &block)
|
|
27
|
-
if mode
|
|
28
|
-
mode = mode.is_a?(Numeric) ? mode.to_s(8) : mode.to_s
|
|
29
|
-
run "chmod #{mode} #{to}", options
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def download(from, to, options={}, &block)
|
|
34
|
-
transfer(:down, from, to, options, &block)
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def transfer(direction, from, to, options={}, &block)
|
|
38
|
-
if dry_run
|
|
39
|
-
return logger.debug "transfering: #{[direction, from, to] * ', '}"
|
|
40
|
-
end
|
|
41
|
-
execute_on_servers(options) do |servers|
|
|
42
|
-
targets = servers.map { |s| sessions[s] }
|
|
43
|
-
Transfer.process(direction, from, to, targets, options.merge(:logger => logger), &block)
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
end
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
require 'capistrano/errors'
|
|
2
|
-
|
|
3
|
-
module Capistrano
|
|
4
|
-
class Configuration
|
|
5
|
-
module Actions
|
|
6
|
-
module Inspect
|
|
7
|
-
|
|
8
|
-
# Streams the result of the command from all servers that are the
|
|
9
|
-
# target of the current task. All these streams will be joined into a
|
|
10
|
-
# single one, so you can, say, watch 10 log files as though they were
|
|
11
|
-
# one. Do note that this is quite expensive from a bandwidth
|
|
12
|
-
# perspective, so use it with care.
|
|
13
|
-
#
|
|
14
|
-
# The command is invoked via #invoke_command.
|
|
15
|
-
#
|
|
16
|
-
# Usage:
|
|
17
|
-
#
|
|
18
|
-
# desc "Run a tail on multiple log files at the same time"
|
|
19
|
-
# task :tail_fcgi, :roles => :app do
|
|
20
|
-
# stream "tail -f #{shared_path}/log/fastcgi.crash.log"
|
|
21
|
-
# end
|
|
22
|
-
def stream(command, options={})
|
|
23
|
-
invoke_command(command, options.merge(:eof => !command.include?(sudo))) do |ch, stream, out|
|
|
24
|
-
puts out if stream == :out
|
|
25
|
-
warn "[err :: #{ch[:server]}] #{out}" if stream == :err
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# Executes the given command on the first server targetted by the
|
|
30
|
-
# current task, collects it's stdout into a string, and returns the
|
|
31
|
-
# string. The command is invoked via #invoke_command.
|
|
32
|
-
def capture(command, options={})
|
|
33
|
-
output = ""
|
|
34
|
-
invoke_command(command, options.merge(:once => true, :eof => !command.include?(sudo))) do |ch, stream, data|
|
|
35
|
-
case stream
|
|
36
|
-
when :out then output << data
|
|
37
|
-
when :err then warn "[err :: #{ch[:server]}] #{data}"
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
output
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
end
|