capistrano 2.5.3 → 2.5.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,18 @@
1
+ == 2.5.4 / 4 Feb 2009
2
+
3
+ * When using rsync with the remote_cache strategy include -t switch to preserve file times [Kevin McCarthy]
4
+
5
+ * Bump Net::SSH dependency to version 2.0.10 [Jamis Buck]
6
+
7
+ * Use 'user' from .ssh/config appropriately [Jamis Buck]
8
+
9
+ * Allow respond_to?() method to accept optional second parameter (include_priv) [Matthias Marschall]
10
+
11
+ * Make sure sudo prompts are retried correctly even if "try again" and the prompt appear in the same text chunk from the server [Jamis Buck]
12
+
13
+ * Add supported environment variables to -H output [François Beausoleil]
14
+
15
+
1
16
  == 2.5.3 / December 6, 2008
2
17
 
3
18
  * Make previous_release return nil if there is no previous release [Mathias Meyer]
data/Rakefile CHANGED
@@ -26,7 +26,7 @@ Echoe.new('capistrano', version) do |p|
26
26
  p.need_zip = true
27
27
  p.rdoc_pattern = /^(lib|README.rdoc|CHANGELOG.rdoc)/
28
28
 
29
- p.dependencies = ["net-ssh >=2.0.0",
29
+ p.dependencies = ["net-ssh >=2.0.10",
30
30
  "net-sftp >=2.0.0",
31
31
  "net-scp >=1.0.0",
32
32
  "net-ssh-gateway >=1.0.0",
@@ -1,10 +1,10 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = %q{capistrano}
3
- s.version = "2.5.3"
3
+ s.version = "2.5.4"
4
4
 
5
5
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
6
6
  s.authors = ["Jamis Buck"]
7
- s.date = %q{2008-12-06}
7
+ s.date = %q{2009-02-04}
8
8
  s.description = %q{Capistrano is a utility and framework for executing commands in parallel on multiple remote machines, via SSH.}
9
9
  s.email = %q{jamis@jamisbuck.org}
10
10
  s.executables = ["cap", "capify"]
@@ -24,14 +24,14 @@ Gem::Specification.new do |s|
24
24
  s.specification_version = 2
25
25
 
26
26
  if current_version >= 3 then
27
- s.add_runtime_dependency(%q<net-ssh>, [">= 2.0.0"])
27
+ s.add_runtime_dependency(%q<net-ssh>, [">= 2.0.10"])
28
28
  s.add_runtime_dependency(%q<net-sftp>, [">= 2.0.0"])
29
29
  s.add_runtime_dependency(%q<net-scp>, [">= 1.0.0"])
30
30
  s.add_runtime_dependency(%q<net-ssh-gateway>, [">= 1.0.0"])
31
31
  s.add_runtime_dependency(%q<highline>, [">= 0"])
32
32
  s.add_development_dependency(%q<echoe>, [">= 0"])
33
33
  else
34
- s.add_dependency(%q<net-ssh>, [">= 2.0.0"])
34
+ s.add_dependency(%q<net-ssh>, [">= 2.0.10"])
35
35
  s.add_dependency(%q<net-sftp>, [">= 2.0.0"])
36
36
  s.add_dependency(%q<net-scp>, [">= 1.0.0"])
37
37
  s.add_dependency(%q<net-ssh-gateway>, [">= 1.0.0"])
@@ -39,7 +39,7 @@ Gem::Specification.new do |s|
39
39
  s.add_dependency(%q<echoe>, [">= 0"])
40
40
  end
41
41
  else
42
- s.add_dependency(%q<net-ssh>, [">= 2.0.0"])
42
+ s.add_dependency(%q<net-ssh>, [">= 2.0.10"])
43
43
  s.add_dependency(%q<net-sftp>, [">= 2.0.0"])
44
44
  s.add_dependency(%q<net-scp>, [">= 1.0.0"])
45
45
  s.add_dependency(%q<net-ssh-gateway>, [">= 1.0.0"])
@@ -60,3 +60,16 @@ The following options are understood:
60
60
 
61
61
  <%= color '-x, --skip-user-config', :bold %>
62
62
  By default, cap will look for and (if it exists) load the user-specific configuration file located in $HOME/.caprc. If you don't want cap to load that file, give this option.
63
+
64
+ -----------------------------
65
+ <%= color('Environment Variables', :bold) %>
66
+ -----------------------------
67
+
68
+ <%= color 'HOSTS', :bold %>
69
+ Execute the tasks against this comma-separated list of hosts. Effectively, this makes the host(s) part of every roles.
70
+
71
+ <%= color 'HOSTFILTER', :bold %>
72
+ Execute tasks against this comma-separated list of host, but only if the host has the proper role for the task.
73
+
74
+ <%= color 'ROLES', :bold %>
75
+ Execute tasks against this comma-separated list of roles. Hosts which do not have the right roles will be skipped.
@@ -43,7 +43,7 @@ module Capistrano
43
43
  "A recipe file to load. May be given more than once."
44
44
  ) { |value| options[:recipes] << value }
45
45
 
46
- opts.on("-H", "--long-help", "Explain these options.") do
46
+ opts.on("-H", "--long-help", "Explain these options and environment variables.") do
47
47
  long_help
48
48
  exit
49
49
  end
@@ -26,10 +26,57 @@ module Capistrano
26
26
  set :default_run_options, {}
27
27
  end
28
28
 
29
+ # Executes different commands in parallel. This is useful for commands
30
+ # that need to be different on different hosts, but which could be
31
+ # otherwise run in parallel.
32
+ #
33
+ # The +options+ parameter is currently unused.
34
+ #
35
+ # Example:
36
+ #
37
+ # task :restart_everything do
38
+ # parallel do |session|
39
+ # session.when "in?(:app)", "/path/to/restart/mongrel"
40
+ # session.when "in?(:web)", "/path/to/restart/apache"
41
+ # session.when "in?(:db)", "/path/to/restart/mysql"
42
+ # end
43
+ # end
44
+ #
45
+ # Each command may have its own callback block, for capturing and
46
+ # responding to output, with semantics identical to #run:
47
+ #
48
+ # session.when "in?(:app)", "/path/to/restart/mongrel" do |ch, stream, data|
49
+ # # ch is the SSH channel for this command, used to send data
50
+ # # back to the command (e.g. ch.send_data("password\n"))
51
+ # # stream is either :out or :err, for which stream the data arrived on
52
+ # # data is a string containing data sent from the remote command
53
+ # end
54
+ #
55
+ # Also, you can specify a fallback command, to use when none of the
56
+ # conditions match a server:
57
+ #
58
+ # session.else "/execute/something/else"
59
+ #
60
+ # The string specified as the first argument to +when+ may be any valid
61
+ # Ruby code. It has access to the following variables and methods:
62
+ #
63
+ # * +in?(role)+ returns true if the server participates in the given role
64
+ # * +server+ is the ServerDefinition object for the server. This can be
65
+ # used to get the host-name, etc.
66
+ # * +configuration+ is the current Capistrano::Configuration object, which
67
+ # you can use to get the value of variables, etc.
68
+ #
69
+ # For example:
70
+ #
71
+ # session.when "server.host =~ /app/", "/some/command"
72
+ # session.when "server.host == configuration[:some_var]", "/another/command"
73
+ # session.when "in?(:web) || in?(:app)", "/more/commands"
74
+ #
75
+ # See #run for a description of the valid +options+.
29
76
  def parallel(options={})
30
77
  raise ArgumentError, "parallel() requires a block" unless block_given?
31
78
  tree = Command::Tree.new(self) { |t| yield t }
32
- run_tree(tree)
79
+ run_tree(tree, options)
33
80
  end
34
81
 
35
82
  # Invokes the given command. If a +via+ key is given, it will be used
@@ -48,13 +95,58 @@ module Capistrano
48
95
  # channel (which may be used to send data back to the remote process),
49
96
  # the stream identifier (<tt>:err</tt> for stderr, and <tt>:out</tt> for
50
97
  # stdout), and the data that was received.
98
+ #
99
+ # The +options+ hash may include any of the following keys:
100
+ #
101
+ # * :hosts - this is either a string (for a single target host) or an array
102
+ # of strings, indicating which hosts the command should run on. By default,
103
+ # the hosts are determined from the task definition.
104
+ # * :roles - this is either a string or symbol (for a single target role) or
105
+ # an array of strings or symbols, indicating which roles the command should
106
+ # run on. If :hosts is specified, :roles will be ignored.
107
+ # * :only - specifies a condition limiting which hosts will be selected to
108
+ # run the command. This should refer to values set in the role definition.
109
+ # For example, if a role is defined with :primary => true, then you could
110
+ # select only hosts with :primary true by setting :only => { :primary => true }.
111
+ # * :except - specifies a condition limiting which hosts will be selected to
112
+ # run the command. This is the inverse of :only (hosts that do _not_ match
113
+ # the condition will be selected).
114
+ # * :once - if true, only the first matching server will be selected. The default
115
+ # is false (all matching servers will be selected).
116
+ # * :max_hosts - specifies the maximum number of hosts that should be selected
117
+ # at a time. If this value is less than the number of hosts that are selected
118
+ # to run, then the hosts will be run in groups of max_hosts. The default is nil,
119
+ # which indicates that there is no maximum host limit.
120
+ # * :shell - says which shell should be used to invoke commands. This
121
+ # defaults to "sh". Setting this to false causes Capistrano to invoke
122
+ # the commands directly, without wrapping them in a shell invocation.
123
+ # * :data - if not nil (the default), this should be a string that will
124
+ # be passed to the command's stdin stream.
125
+ # * :pty - if true, a pseudo-tty will be allocated for each command. The
126
+ # default is false. Note that there are benefits and drawbacks both ways.
127
+ # Empirically, it appears that if a pty is allocated, the SSH server daemon
128
+ # will _not_ read user shell start-up scripts (e.g. bashrc, etc.). However,
129
+ # if a pty is _not_ allocated, some commands will refuse to run in
130
+ # interactive mode and will not prompt for (e.g.) passwords.
131
+ # * :env - a hash of environment variable mappings that should be made
132
+ # available to the command. The keys should be environment variable names,
133
+ # and the values should be their corresponding values. The default is
134
+ # empty, but may be modified by changing the +default_environment+
135
+ # Capistrano variable.
136
+ #
137
+ # Note that if you set these keys in the +default_run_options+ Capistrano
138
+ # variable, they will apply for all invocations of #run, #invoke_command,
139
+ # and #parallel.
51
140
  def run(cmd, options={}, &block)
52
141
  block ||= self.class.default_io_proc
53
142
  tree = Command::Tree.new(self) { |t| t.else(cmd, &block) }
54
143
  run_tree(tree, options)
55
144
  end
56
145
 
57
- def run_tree(tree, options={})
146
+ # Executes a Capistrano::Command::Tree object. This is not for direct
147
+ # use, but should instead be called indirectly, via #run or #parallel,
148
+ # or #invoke_command.
149
+ def run_tree(tree, options={}) #:nodoc:
58
150
  if tree.branches.empty? && tree.fallback
59
151
  logger.debug "executing #{tree.fallback}"
60
152
  elsif tree.branches.any?
@@ -98,6 +190,12 @@ module Capistrano
98
190
  # executable on the remote machine:
99
191
  #
100
192
  # set :sudo, "/opt/local/bin/sudo"
193
+ #
194
+ # If you know what you're doing, you can also set <tt>:sudo_prompt</tt>,
195
+ # which tells capistrano which prompt sudo should use when asking for
196
+ # a password. (This is so that capistrano knows what prompt to look for
197
+ # in the output.) If you set :sudo_prompt to an empty string, Capistrano
198
+ # will not send a preferred prompt.
101
199
  def sudo(*parameters, &block)
102
200
  options = parameters.last.is_a?(Hash) ? parameters.pop.dup : {}
103
201
  command = parameters.first
@@ -125,14 +223,16 @@ module Capistrano
125
223
  prompt_host = nil
126
224
 
127
225
  Proc.new do |ch, stream, out|
128
- if out =~ /^#{Regexp.escape(sudo_prompt)}/
129
- ch.send_data "#{self[:password]}\n"
130
- elsif out =~ /^Sorry, try again/
226
+ if out =~ /^Sorry, try again/
131
227
  if prompt_host.nil? || prompt_host == ch[:server]
132
228
  prompt_host = ch[:server]
133
229
  logger.important out, "#{stream} :: #{ch[:server]}"
134
230
  reset! :password
135
231
  end
232
+ end
233
+
234
+ if out =~ /^#{Regexp.escape(sudo_prompt)}/
235
+ ch.send_data "#{self[:password]}\n"
136
236
  elsif fallback
137
237
  fallback.call(ch, stream, out)
138
238
  end
@@ -177,8 +177,8 @@ module Capistrano
177
177
  raise NotImplementedError, "roles cannot be defined in a namespace"
178
178
  end
179
179
 
180
- def respond_to?(sym)
181
- super || parent.respond_to?(sym)
180
+ def respond_to?(sym, include_priv=false)
181
+ super || parent.respond_to?(sym, include_priv)
182
182
  end
183
183
 
184
184
  def method_missing(sym, *args, &block)
@@ -111,8 +111,8 @@ module Capistrano
111
111
  end
112
112
  private :protect
113
113
 
114
- def respond_to_with_variables?(sym) #:nodoc:
115
- @variables.has_key?(sym) || respond_to_without_variables?(sym)
114
+ def respond_to_with_variables?(sym, include_priv=false) #:nodoc:
115
+ @variables.has_key?(sym) || respond_to_without_variables?(sym, include_priv)
116
116
  end
117
117
 
118
118
  def method_missing_with_variables(sym, *args, &block) #:nodoc:
@@ -208,7 +208,7 @@ module Capistrano
208
208
  # Getting the actual commit id, in case we were passed a tag
209
209
  # or partial sha or something - it will return the sha if you pass a sha, too
210
210
  def query_revision(revision)
211
- raise ArgumentError, "Deploying remote branches has been deprecated. Specify the remote branch as a local branch for the git repository you're deploying from (ie: '#{revision.gsub('origin/', '')}' rather than '#{revision}')." if revision =~ /^origin\//
211
+ raise ArgumentError, "Deploying remote branches is no longer supported. Specify the remote branch as a local branch for the git repository you're deploying from (ie: '#{revision.gsub('origin/', '')}' rather than '#{revision}')." if revision =~ /^origin\//
212
212
  return revision if revision =~ /^[0-9a-f]{40}$/
213
213
  command = scm('ls-remote', repository, revision)
214
214
  result = yield(command)
@@ -42,7 +42,7 @@ module Capistrano
42
42
  run "cp -RPp #{repository_cache} #{configuration[:release_path]} && #{mark}"
43
43
  else
44
44
  exclusions = copy_exclude.map { |e| "--exclude=\"#{e}\"" }.join(' ')
45
- run "rsync -lrp #{exclusions} #{repository_cache}/* #{configuration[:release_path]} && #{mark}"
45
+ run "rsync -lrpt #{exclusions} #{repository_cache}/* #{configuration[:release_path]} && #{mark}"
46
46
  end
47
47
  end
48
48
 
@@ -1,6 +1,6 @@
1
1
  begin
2
2
  require 'rubygems'
3
- gem 'net-ssh', ">= 1.99.1"
3
+ gem 'net-ssh', ">= 2.0.10"
4
4
  rescue LoadError, NameError
5
5
  end
6
6
 
@@ -55,12 +55,32 @@ module Capistrano
55
55
  methods = [ %w(publickey hostbased), %w(password keyboard-interactive) ]
56
56
  password_value = nil
57
57
 
58
- ssh_options = (server.options[:ssh_options] || {}).merge(options[:ssh_options] || {})
59
- user = server.user || options[:user] || ssh_options[:username] || ServerDefinition.default_user
60
- port = server.port || options[:port] || ssh_options[:port]
58
+ # construct the hash of ssh options that should be passed more-or-less
59
+ # directly to Net::SSH. This will be the general ssh options, merged with
60
+ # the server-specific ssh-options.
61
+ ssh_options = (options[:ssh_options] || {}).merge(server.options[:ssh_options] || {})
62
+
63
+ # load any SSH configuration files that were specified in the SSH options. This
64
+ # will load from ~/.ssh/config and /etc/ssh_config by default (see Net::SSH
65
+ # for details). Merge the explicitly given ssh_options over the top of the info
66
+ # from the config file.
67
+ ssh_options = Net::SSH.configuration_for(server.host, ssh_options.fetch(:config, true)).merge(ssh_options)
68
+
69
+ # Once we've loaded the config, we don't need Net::SSH to do it again.
70
+ ssh_options[:config] = false
71
+
72
+ user = server.user || options[:user] || ssh_options[:username] ||
73
+ ssh_options[:user] || ServerDefinition.default_user
74
+ port = server.port || options[:port] || ssh_options[:port]
75
+
76
+ # the .ssh/config file might have changed the host-name on us
77
+ host = ssh_options.fetch(:host_name, server.host)
61
78
 
62
79
  ssh_options[:port] = port if port
80
+
81
+ # delete these, since we've determined which username to use by this point
63
82
  ssh_options.delete(:username)
83
+ ssh_options.delete(:user)
64
84
 
65
85
  begin
66
86
  connection_options = ssh_options.merge(
@@ -68,7 +88,7 @@ module Capistrano
68
88
  :auth_methods => ssh_options[:auth_methods] || methods.shift
69
89
  )
70
90
 
71
- yield server.host, user, connection_options
91
+ yield host, user, connection_options
72
92
  rescue Net::SSH::AuthenticationFailed
73
93
  raise if methods.empty? || ssh_options[:auth_methods]
74
94
  password_value = options[:password]
@@ -6,7 +6,7 @@ module Capistrano
6
6
  class Version < Net::SSH::Version
7
7
  MAJOR = 2
8
8
  MINOR = 5
9
- TINY = 3
9
+ TINY = 4
10
10
 
11
11
  # The current version, as a Version instance
12
12
  CURRENT = new(MAJOR, MINOR, TINY)
@@ -166,6 +166,20 @@ class ConfigurationActionsInvocationTest < Test::Unit::TestCase
166
166
  callback[ch, nil, "Sorry, try again."]
167
167
  end
168
168
 
169
+ def test_sudo_behavior_callback_should_reset_password_and_prompt_again_if_output_includes_both_cues
170
+ ch = mock("channel")
171
+ ch.stubs(:[]).with(:host).returns("capistrano")
172
+ ch.stubs(:[]).with(:server).returns(server("capistrano"))
173
+ ch.expects(:send_data, "password!\n").times(2)
174
+
175
+ @config.set(:password, "password!")
176
+ @config.expects(:reset!).with(:password)
177
+
178
+ callback = @config.sudo_behavior_callback(nil)
179
+ callback[ch, :out, "sudo password: "]
180
+ callback[ch, :out, "Sorry, try again.\nsudo password: "]
181
+ end
182
+
169
183
  def test_sudo_behavior_callback_should_defer_to_fallback_for_other_output
170
184
  callback = @config.sudo_behavior_callback(inspectable_proc)
171
185
 
@@ -30,6 +30,7 @@ class ConfigurationConnectionsTest < Test::Unit::TestCase
30
30
  def setup
31
31
  @config = MockConfig.new
32
32
  @config.stubs(:logger).returns(stub_everything)
33
+ Net::SSH.stubs(:configuration_for).returns({})
33
34
  @ssh_options = {
34
35
  :user => "user",
35
36
  :port => 8080,
@@ -60,29 +61,29 @@ class ConfigurationConnectionsTest < Test::Unit::TestCase
60
61
 
61
62
  def test_should_connect_through_gateway_if_gateway_variable_is_set
62
63
  @config.values[:gateway] = "j@gateway"
63
- Net::SSH::Gateway.expects(:new).with("gateway", "j", :password => nil, :auth_methods => %w(publickey hostbased)).returns(stub_everything)
64
+ Net::SSH::Gateway.expects(:new).with("gateway", "j", :password => nil, :auth_methods => %w(publickey hostbased), :config => false).returns(stub_everything)
64
65
  assert_instance_of Capistrano::Configuration::Connections::GatewayConnectionFactory, @config.connection_factory
65
66
  end
66
67
 
67
68
  def test_connection_factory_as_gateway_should_honor_config_options
68
69
  @config.values[:gateway] = "gateway"
69
70
  @config.values.update(@ssh_options)
70
- Net::SSH::Gateway.expects(:new).with("gateway", "user", :debug => :verbose, :port => 8080, :password => nil, :auth_methods => %w(publickey hostbased)).returns(stub_everything)
71
+ Net::SSH::Gateway.expects(:new).with("gateway", "user", :debug => :verbose, :port => 8080, :password => nil, :auth_methods => %w(publickey hostbased), :config => false).returns(stub_everything)
71
72
  assert_instance_of Capistrano::Configuration::Connections::GatewayConnectionFactory, @config.connection_factory
72
73
  end
73
74
 
74
75
  def test_connection_factory_as_gateway_should_chain_gateways_if_gateway_variable_is_an_array
75
76
  @config.values[:gateway] = ["j@gateway1", "k@gateway2"]
76
77
  gateway1 = mock
77
- Net::SSH::Gateway.expects(:new).with("gateway1", "j", :password => nil, :auth_methods => %w(publickey hostbased)).returns(gateway1)
78
+ Net::SSH::Gateway.expects(:new).with("gateway1", "j", :password => nil, :auth_methods => %w(publickey hostbased), :config => false).returns(gateway1)
78
79
  gateway1.expects(:open).returns(65535)
79
- Net::SSH::Gateway.expects(:new).with("127.0.0.1", "k", :port => 65535, :password => nil, :auth_methods => %w(publickey hostbased)).returns(stub_everything)
80
+ Net::SSH::Gateway.expects(:new).with("127.0.0.1", "k", :port => 65535, :password => nil, :auth_methods => %w(publickey hostbased), :config => false).returns(stub_everything)
80
81
  assert_instance_of Capistrano::Configuration::Connections::GatewayConnectionFactory, @config.connection_factory
81
82
  end
82
83
 
83
84
  def test_connection_factory_as_gateway_should_share_gateway_between_connections
84
85
  @config.values[:gateway] = "j@gateway"
85
- Net::SSH::Gateway.expects(:new).once.with("gateway", "j", :password => nil, :auth_methods => %w(publickey hostbased)).returns(stub_everything)
86
+ Net::SSH::Gateway.expects(:new).once.with("gateway", "j", :password => nil, :auth_methods => %w(publickey hostbased), :config => false).returns(stub_everything)
86
87
  Capistrano::SSH.stubs(:connect).returns(stub_everything)
87
88
  assert_instance_of Capistrano::Configuration::Connections::GatewayConnectionFactory, @config.connection_factory
88
89
  @config.establish_connections_to(server("capistrano"))
@@ -238,6 +238,12 @@ class ConfigurationNamespacesDSLTest < Test::Unit::TestCase
238
238
  ns = @config.namespaces[:outer]
239
239
  assert ns.respond_to?(:original_initialize_called)
240
240
  end
241
+
242
+ def test_namespace_should_accept_respond_to_with_include_priv_parameter
243
+ @config.namespace(:outer) {}
244
+ ns = @config.namespaces[:outer]
245
+ assert ns.respond_to?(:original_initialize_called, true)
246
+ end
241
247
 
242
248
  def test_namespace_should_delegate_unknown_messages_to_its_parent
243
249
  @config.namespace(:outer) {}
@@ -53,6 +53,10 @@ class ConfigurationVariablesTest < Test::Unit::TestCase
53
53
  @config[:sample] = :value
54
54
  assert @config.respond_to?(:sample)
55
55
  end
56
+
57
+ def test_respond_to_with_include_priv_paramter
58
+ assert !@config.respond_to?(:sample, true)
59
+ end
56
60
 
57
61
  def test_set_should_require_value
58
62
  assert_raises(ArgumentError) do
@@ -5,8 +5,10 @@ class SSHTest < Test::Unit::TestCase
5
5
  def setup
6
6
  Capistrano::ServerDefinition.stubs(:default_user).returns("default-user")
7
7
  @options = { :password => nil,
8
- :auth_methods => %w(publickey hostbased) }
8
+ :auth_methods => %w(publickey hostbased),
9
+ :config => false }
9
10
  @server = server("capistrano")
11
+ Net::SSH.stubs(:configuration_for).returns({})
10
12
  end
11
13
 
12
14
  def test_connect_with_bare_server_without_options_or_config_with_public_key_succeeding_should_only_loop_once
@@ -69,8 +71,8 @@ class SSHTest < Test::Unit::TestCase
69
71
  end
70
72
 
71
73
  def test_connect_with_ssh_options_should_use_ssh_options
72
- ssh_options = { :username => "JamisMan", :port => 8125 }
73
- Net::SSH.expects(:start).with(@server.host, "JamisMan", @options.merge(:port => 8125)).returns(success = Object.new)
74
+ ssh_options = { :username => "JamisMan", :port => 8125, :config => false }
75
+ Net::SSH.expects(:start).with(@server.host, "JamisMan", @options.merge(:port => 8125, :config => false)).returns(success = Object.new)
74
76
  assert_equal success, Capistrano::SSH.connect(@server, {:ssh_options => ssh_options})
75
77
  end
76
78
 
@@ -83,7 +85,7 @@ class SSHTest < Test::Unit::TestCase
83
85
  def test_connect_with_ssh_options_should_see_server_options_override_ssh_options
84
86
  ssh_options = { :username => "JamisMan", :port => 8125, :forward_agent => true }
85
87
  server = server("jamis@capistrano:1235")
86
- Net::SSH.expects(:start).with(server.host, "jamis", @options.merge(:port => 1235, :forward_agent => true)).returns(success = Object.new)
88
+ Net::SSH.expects(:start).with(server.host, "jamis", @options.merge(:port => 1235, :forward_agent => true, :config => false)).returns(success = Object.new)
87
89
  assert_equal success, Capistrano::SSH.connect(server, {:ssh_options => ssh_options})
88
90
  end
89
91
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.3
4
+ version: 2.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jamis Buck
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-12-06 00:00:00 -07:00
12
+ date: 2009-02-04 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -20,7 +20,7 @@ dependencies:
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 2.0.0
23
+ version: 2.0.10
24
24
  version:
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: net-sftp