le1t0-capistrano 2.5.18.016 → 2.5.18.017
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 +5 -0
- data/VERSION +1 -1
- data/le1t0-capistrano.gemspec +2 -2
- data/lib/capistrano/configuration/roles.rb +7 -1
- data/lib/capistrano/configuration/variables.rb +80 -18
- data/lib/capistrano/transfer.rb +13 -8
- metadata +3 -3
data/CHANGELOG
CHANGED
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
2.5.18.
|
|
1
|
+
2.5.18.017
|
data/le1t0-capistrano.gemspec
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
Gem::Specification.new do |s|
|
|
7
7
|
s.name = %q{le1t0-capistrano}
|
|
8
|
-
s.version = "2.5.18.
|
|
8
|
+
s.version = "2.5.18.017"
|
|
9
9
|
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
11
11
|
s.authors = ["Le1t0"]
|
|
12
|
-
s.date = %q{2010-08-
|
|
12
|
+
s.date = %q{2010-08-13}
|
|
13
13
|
s.description = %q{Capistrano is a utility and framework for executing commands in parallel on multiple remote machines, via SSH.}
|
|
14
14
|
s.email = ["dev@ewout.to"]
|
|
15
15
|
s.executables = ["capify", "cap"]
|
|
@@ -63,10 +63,16 @@ module Capistrano
|
|
|
63
63
|
# the roles as the remaining parameters:
|
|
64
64
|
#
|
|
65
65
|
# server "master.example.com", :web, :app
|
|
66
|
-
def server(host, *roles)
|
|
66
|
+
def server(host, *roles, &block)
|
|
67
67
|
options = roles.last.is_a?(Hash) ? roles.pop : {}
|
|
68
|
+
old_scope = @scope
|
|
69
|
+
@scope = host if block_given?
|
|
68
70
|
raise ArgumentError, "you must associate a server with at least one role" if roles.empty?
|
|
69
71
|
roles.each { |name| role(name, host, options) }
|
|
72
|
+
if block_given?
|
|
73
|
+
yield
|
|
74
|
+
@scope = old_scope
|
|
75
|
+
end
|
|
70
76
|
end
|
|
71
77
|
end
|
|
72
78
|
end
|
|
@@ -16,6 +16,13 @@ module Capistrano
|
|
|
16
16
|
# instance.
|
|
17
17
|
attr_reader :variables
|
|
18
18
|
|
|
19
|
+
def scope(scope_name, &block)
|
|
20
|
+
old_scope = @scope
|
|
21
|
+
@scope = scope_name
|
|
22
|
+
yield
|
|
23
|
+
@scope = old_scope
|
|
24
|
+
end
|
|
25
|
+
|
|
19
26
|
# Set a variable to the given value.
|
|
20
27
|
def set(variable, *args, &block)
|
|
21
28
|
if variable.to_s !~ /^[_a-z]/
|
|
@@ -32,7 +39,14 @@ module Capistrano
|
|
|
32
39
|
|
|
33
40
|
value = args.empty? ? block : args.first
|
|
34
41
|
sym = variable.to_sym
|
|
35
|
-
protect(sym) {
|
|
42
|
+
protect(sym) {
|
|
43
|
+
if @scope
|
|
44
|
+
@variables[@scope] ||= {}
|
|
45
|
+
@variables[@scope][sym] = value
|
|
46
|
+
else
|
|
47
|
+
@variables[sym] = value
|
|
48
|
+
end
|
|
49
|
+
}
|
|
36
50
|
end
|
|
37
51
|
|
|
38
52
|
alias :[]= :set
|
|
@@ -41,14 +55,29 @@ module Capistrano
|
|
|
41
55
|
def unset(variable)
|
|
42
56
|
sym = variable.to_sym
|
|
43
57
|
protect(sym) do
|
|
44
|
-
@
|
|
45
|
-
|
|
58
|
+
if @scope
|
|
59
|
+
if @original_procs[@scope] && @original_procs[@scope][sym]
|
|
60
|
+
@original_procs[@scope].delete(sym)
|
|
61
|
+
@original_procs.delete(@scope) if @original_procs[@scope].empty?
|
|
62
|
+
else
|
|
63
|
+
@original_procs.delete(sym)
|
|
64
|
+
end
|
|
65
|
+
if @variables[@scope] && @variables[@scope][sym]
|
|
66
|
+
@variables[@scope].delete(sym)
|
|
67
|
+
@variables.delete(@scope) if @variables[@scope].empty?
|
|
68
|
+
else
|
|
69
|
+
@variables.delete(sym)
|
|
70
|
+
end
|
|
71
|
+
else
|
|
72
|
+
@original_procs.delete(sym)
|
|
73
|
+
@variables.delete(sym)
|
|
74
|
+
end
|
|
46
75
|
end
|
|
47
76
|
end
|
|
48
77
|
|
|
49
78
|
# Returns true if the variable has been defined, and false otherwise.
|
|
50
79
|
def exists?(variable)
|
|
51
|
-
@variables.key?(variable.to_sym)
|
|
80
|
+
(@scope && @variables[@scope] && @variables[@scope].key?(variable.to_sym)) || @variables.key?(variable.to_sym)
|
|
52
81
|
end
|
|
53
82
|
|
|
54
83
|
# If the variable was originally a proc value, it will be reset to it's
|
|
@@ -57,7 +86,11 @@ module Capistrano
|
|
|
57
86
|
def reset!(variable)
|
|
58
87
|
sym = variable.to_sym
|
|
59
88
|
protect(sym) do
|
|
60
|
-
if @original_procs.key?(sym)
|
|
89
|
+
if @scope && @original_procs[@scope] && @original_procs[@scope].key?(sym)
|
|
90
|
+
@variables[@scope] ||= {}
|
|
91
|
+
@variables[@scope][sym] = @original_procs[@scope].delete(sym)
|
|
92
|
+
true
|
|
93
|
+
elsif @original_procs.key?(sym)
|
|
61
94
|
@variables[sym] = @original_procs.delete(sym)
|
|
62
95
|
true
|
|
63
96
|
else
|
|
@@ -76,29 +109,53 @@ module Capistrano
|
|
|
76
109
|
|
|
77
110
|
sym = variable.to_sym
|
|
78
111
|
protect(sym) do
|
|
79
|
-
if
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
@
|
|
87
|
-
|
|
112
|
+
if @scope
|
|
113
|
+
if !exists?(variable)
|
|
114
|
+
return args.first unless args.empty?
|
|
115
|
+
return yield(variable) if block_given?
|
|
116
|
+
raise IndexError, "`#{variable}' not found"
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
if @variables[@scope] && @variables[@scope].respond_to?(:call)
|
|
120
|
+
@original_procs[@scope] ||= {}
|
|
121
|
+
@variables[@scope] ||= {}
|
|
122
|
+
@original_procs[@scope][sym] = @variables[@scope][sym]
|
|
123
|
+
@variables[@scope][sym] = @variables[@scope][sym].call
|
|
124
|
+
elsif @variables[sym].respond_to?(:call)
|
|
125
|
+
@original_procs[sym] = @variables[sym]
|
|
126
|
+
@variables[sym] = @variables[sym].call
|
|
127
|
+
end
|
|
128
|
+
else
|
|
129
|
+
if !@variables.key?(sym)
|
|
130
|
+
return args.first unless args.empty?
|
|
131
|
+
return yield(variable) if block_given?
|
|
132
|
+
raise IndexError, "`#{variable}' not found"
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
if @variables[sym].respond_to?(:call)
|
|
136
|
+
@original_procs[sym] = @variables[sym]
|
|
137
|
+
@variables[sym] = @variables[sym].call
|
|
138
|
+
end
|
|
88
139
|
end
|
|
89
140
|
end
|
|
90
141
|
|
|
91
|
-
@variables[sym]
|
|
142
|
+
(@scope && @variables[@scope] && @variables[@scope][sym]) || @variables[sym]
|
|
92
143
|
end
|
|
93
144
|
|
|
94
145
|
def [](variable)
|
|
95
146
|
fetch(variable, nil)
|
|
96
147
|
end
|
|
148
|
+
|
|
149
|
+
def variables_has_key?(key)
|
|
150
|
+
(@scope && @variables[@scope] && @variables[@scope].has_key?(key)) || @variables.has_key?(key)
|
|
151
|
+
end
|
|
97
152
|
|
|
98
153
|
def initialize_with_variables(*args) #:nodoc:
|
|
99
154
|
initialize_without_variables(*args)
|
|
155
|
+
@scope = nil
|
|
100
156
|
@variables = {}
|
|
101
157
|
@original_procs = {}
|
|
158
|
+
@scoped_variable_locks = {}
|
|
102
159
|
@variable_locks = Hash.new { |h,k| h[k] = Mutex.new }
|
|
103
160
|
|
|
104
161
|
set :ssh_options, {}
|
|
@@ -107,16 +164,21 @@ module Capistrano
|
|
|
107
164
|
private :initialize_with_variables
|
|
108
165
|
|
|
109
166
|
def protect(variable)
|
|
110
|
-
@
|
|
167
|
+
if @scope && @scoped_variable_locks[@scope] && @scoped_variable_locks[@scope][variable.to_sym]
|
|
168
|
+
@scoped_variable_locks[@scope] ||= Hash.new { |h,k| h[k] = Mutex.new }
|
|
169
|
+
@scoped_variable_locks[@scope][variable.to_sym].synchronize { yield }
|
|
170
|
+
else
|
|
171
|
+
@variable_locks[variable.to_sym].synchronize { yield }
|
|
172
|
+
end
|
|
111
173
|
end
|
|
112
174
|
private :protect
|
|
113
175
|
|
|
114
176
|
def respond_to_with_variables?(sym, include_priv=false) #:nodoc:
|
|
115
|
-
|
|
177
|
+
variables_has_key?(sym) || respond_to_without_variables?(sym, include_priv)
|
|
116
178
|
end
|
|
117
179
|
|
|
118
180
|
def method_missing_with_variables(sym, *args, &block) #:nodoc:
|
|
119
|
-
if args.length == 0 && block.nil? &&
|
|
181
|
+
if args.length == 0 && block.nil? && variables_has_key?(sym)
|
|
120
182
|
self[sym]
|
|
121
183
|
else
|
|
122
184
|
method_missing_without_variables(sym, *args, &block)
|
data/lib/capistrano/transfer.rb
CHANGED
|
@@ -28,6 +28,7 @@ module Capistrano
|
|
|
28
28
|
@from = from
|
|
29
29
|
@to = to
|
|
30
30
|
@sessions = sessions
|
|
31
|
+
proc = options.delete(:proc)
|
|
31
32
|
@options = options
|
|
32
33
|
@callback = block
|
|
33
34
|
|
|
@@ -36,7 +37,7 @@ module Capistrano
|
|
|
36
37
|
|
|
37
38
|
@session_map = {}
|
|
38
39
|
|
|
39
|
-
prepare_transfers
|
|
40
|
+
prepare_transfers(proc)
|
|
40
41
|
end
|
|
41
42
|
|
|
42
43
|
def process!
|
|
@@ -97,7 +98,7 @@ module Capistrano
|
|
|
97
98
|
@session_map
|
|
98
99
|
end
|
|
99
100
|
|
|
100
|
-
def prepare_transfers
|
|
101
|
+
def prepare_transfers(proc)
|
|
101
102
|
logger.info "#{transport} #{operation} #{from} -> #{to}" if logger
|
|
102
103
|
|
|
103
104
|
@transfers = sessions.map do |session|
|
|
@@ -106,21 +107,23 @@ module Capistrano
|
|
|
106
107
|
|
|
107
108
|
session_map[session] = case transport
|
|
108
109
|
when :sftp
|
|
109
|
-
prepare_sftp_transfer(session_from, session_to, session)
|
|
110
|
+
prepare_sftp_transfer(session_from, session_to, session, proc)
|
|
110
111
|
when :scp
|
|
111
|
-
prepare_scp_transfer(session_from, session_to, session)
|
|
112
|
+
prepare_scp_transfer(session_from, session_to, session, proc)
|
|
112
113
|
else
|
|
113
114
|
raise ArgumentError, "unsupported transport type: #{transport.inspect}"
|
|
114
115
|
end
|
|
115
116
|
end
|
|
116
117
|
end
|
|
117
118
|
|
|
118
|
-
def prepare_scp_transfer(from, to, session)
|
|
119
|
+
def prepare_scp_transfer(from, to, session, proc)
|
|
119
120
|
real_callback = callback || Proc.new do |channel, name, sent, total|
|
|
120
121
|
logger.trace "[#{channel[:host]}] #{name}" if logger && sent == 0
|
|
121
122
|
end
|
|
122
123
|
|
|
123
|
-
if
|
|
124
|
+
if proc.is_a?(Proc)
|
|
125
|
+
from = proc.call(from.is_a?(StringIO) ? from.string : from, session.xserver.host)
|
|
126
|
+
elsif direction == :up && from.is_a?(StringIO) && from.string =~ /%\{host\}/
|
|
124
127
|
from_string = from.string.gsub(/%\{host\}/, session.xserver.host)
|
|
125
128
|
from = File.exist?(from_string) ? from_string : StringIO.new(from_string)
|
|
126
129
|
end
|
|
@@ -166,7 +169,7 @@ module Capistrano
|
|
|
166
169
|
end
|
|
167
170
|
end
|
|
168
171
|
|
|
169
|
-
def prepare_sftp_transfer(from, to, session)
|
|
172
|
+
def prepare_sftp_transfer(from, to, session, proc)
|
|
170
173
|
SFTPTransferWrapper.new(session) do |sftp|
|
|
171
174
|
real_callback = Proc.new do |event, op, *args|
|
|
172
175
|
if callback
|
|
@@ -183,7 +186,9 @@ module Capistrano
|
|
|
183
186
|
:server => session.xserver,
|
|
184
187
|
:host => session.xserver.host)
|
|
185
188
|
|
|
186
|
-
if
|
|
189
|
+
if proc.is_a?(Proc)
|
|
190
|
+
from = proc.call(from.is_a?(StringIO) ? from.string : from, session.xserver.host)
|
|
191
|
+
elsif direction == :up && from.is_a?(StringIO) && from.string =~ /%\{host\}/
|
|
187
192
|
from_string = from.string.gsub(/%\{host\}/, session.xserver.host)
|
|
188
193
|
from = File.exist?(from_string) ? from_string : StringIO.new(from_string)
|
|
189
194
|
end
|
metadata
CHANGED
|
@@ -6,8 +6,8 @@ version: !ruby/object:Gem::Version
|
|
|
6
6
|
- 2
|
|
7
7
|
- 5
|
|
8
8
|
- 18
|
|
9
|
-
-
|
|
10
|
-
version: 2.5.18.
|
|
9
|
+
- 17
|
|
10
|
+
version: 2.5.18.017
|
|
11
11
|
platform: ruby
|
|
12
12
|
authors:
|
|
13
13
|
- Le1t0
|
|
@@ -15,7 +15,7 @@ autorequire:
|
|
|
15
15
|
bindir: bin
|
|
16
16
|
cert_chain: []
|
|
17
17
|
|
|
18
|
-
date: 2010-08-
|
|
18
|
+
date: 2010-08-13 00:00:00 +02:00
|
|
19
19
|
default_executable:
|
|
20
20
|
dependencies:
|
|
21
21
|
- !ruby/object:Gem::Dependency
|