capistrano 2.2.0 → 2.3.0

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.
Files changed (59) hide show
  1. data/CHANGELOG +29 -0
  2. data/README +4 -7
  3. data/bin/cap +0 -0
  4. data/bin/capify +0 -0
  5. data/lib/capistrano/command.rb +32 -38
  6. data/lib/capistrano/configuration/actions/file_transfer.rb +21 -13
  7. data/lib/capistrano/configuration/actions/invocation.rb +1 -1
  8. data/lib/capistrano/configuration/connections.rb +30 -20
  9. data/lib/capistrano/errors.rb +1 -1
  10. data/lib/capistrano/processable.rb +53 -0
  11. data/lib/capistrano/recipes/deploy/remote_dependency.rb +6 -0
  12. data/lib/capistrano/recipes/deploy/scm/git.rb +26 -11
  13. data/lib/capistrano/recipes/deploy/scm/none.rb +44 -0
  14. data/lib/capistrano/recipes/deploy/strategy/base.rb +6 -0
  15. data/lib/capistrano/recipes/deploy/strategy/copy.rb +74 -3
  16. data/lib/capistrano/recipes/deploy.rb +15 -13
  17. data/lib/capistrano/role.rb +0 -14
  18. data/lib/capistrano/server_definition.rb +5 -0
  19. data/lib/capistrano/shell.rb +21 -17
  20. data/lib/capistrano/ssh.rb +24 -58
  21. data/lib/capistrano/transfer.rb +216 -0
  22. data/lib/capistrano/version.rb +1 -1
  23. data/test/cli/execute_test.rb +1 -1
  24. data/test/cli/help_test.rb +1 -1
  25. data/test/cli/options_test.rb +1 -1
  26. data/test/cli/ui_test.rb +1 -1
  27. data/test/cli_test.rb +1 -1
  28. data/test/command_test.rb +31 -51
  29. data/test/configuration/actions/file_transfer_test.rb +21 -19
  30. data/test/configuration/actions/inspect_test.rb +1 -1
  31. data/test/configuration/actions/invocation_test.rb +6 -6
  32. data/test/configuration/callbacks_test.rb +1 -1
  33. data/test/configuration/connections_test.rb +11 -12
  34. data/test/configuration/execution_test.rb +1 -1
  35. data/test/configuration/loading_test.rb +1 -1
  36. data/test/configuration/namespace_dsl_test.rb +1 -1
  37. data/test/configuration/roles_test.rb +1 -1
  38. data/test/configuration/servers_test.rb +1 -1
  39. data/test/configuration/variables_test.rb +1 -1
  40. data/test/configuration_test.rb +1 -1
  41. data/test/deploy/scm/accurev_test.rb +1 -1
  42. data/test/deploy/scm/base_test.rb +1 -1
  43. data/test/deploy/scm/git_test.rb +10 -6
  44. data/test/deploy/scm/mercurial_test.rb +1 -1
  45. data/test/deploy/strategy/copy_test.rb +120 -27
  46. data/test/extensions_test.rb +1 -1
  47. data/test/logger_test.rb +1 -1
  48. data/test/server_definition_test.rb +1 -1
  49. data/test/shell_test.rb +27 -1
  50. data/test/ssh_test.rb +27 -21
  51. data/test/task_definition_test.rb +1 -1
  52. data/test/transfer_test.rb +160 -0
  53. data/test/utils.rb +30 -34
  54. data/test/version_test.rb +1 -1
  55. metadata +26 -14
  56. data/lib/capistrano/gateway.rb +0 -131
  57. data/lib/capistrano/upload.rb +0 -152
  58. data/test/gateway_test.rb +0 -167
  59. data/test/upload_test.rb +0 -131
data/test/command_test.rb CHANGED
@@ -1,4 +1,4 @@
1
- require "#{File.dirname(__FILE__)}/utils"
1
+ require "utils"
2
2
  require 'capistrano/command'
3
3
 
4
4
  class CommandTest < Test::Unit::TestCase
@@ -20,8 +20,7 @@ class CommandTest < Test::Unit::TestCase
20
20
  end
21
21
 
22
22
  def test_command_with_pty_should_request_pty_and_register_success_callback
23
- session = setup_for_extracting_channel_action(:on_success) do |ch|
24
- ch.expects(:request_pty).with(:want_reply => true)
23
+ session = setup_for_extracting_channel_action(:request_pty, true) do |ch|
25
24
  ch.expects(:exec).with(%(sh -c "ls"))
26
25
  end
27
26
  Capistrano::Command.new("ls", [session], :pty => true)
@@ -128,7 +127,7 @@ class CommandTest < Test::Unit::TestCase
128
127
  end
129
128
 
130
129
  def test_unsuccessful_pty_request_should_close_channel
131
- session = setup_for_extracting_channel_action(:on_failure) do |ch|
130
+ session = setup_for_extracting_channel_action(:request_pty, false) do |ch|
132
131
  ch.expects(:close)
133
132
  end
134
133
  Capistrano::Command.new("ls", [session], :pty => true)
@@ -158,7 +157,7 @@ class CommandTest < Test::Unit::TestCase
158
157
 
159
158
  def test_on_request_should_record_exit_status
160
159
  data = mock(:read_long => 5)
161
- session = setup_for_extracting_channel_action(:on_request, "exit-status", nil, data) do |ch|
160
+ session = setup_for_extracting_channel_action([:on_request, "exit-status"], data) do |ch|
162
161
  ch.expects(:[]=).with(:status, 5)
163
162
  end
164
163
  Capistrano::Command.new("ls", [session])
@@ -172,34 +171,34 @@ class CommandTest < Test::Unit::TestCase
172
171
  end
173
172
 
174
173
  def test_stop_should_close_all_open_channels
175
- sessions = [mock("session", :open_channel => new_channel(false)),
176
- mock("session", :open_channel => new_channel(true)),
177
- mock("session", :open_channel => new_channel(false))]
174
+ sessions = [mock_session(new_channel(false)),
175
+ mock_session(new_channel(true)),
176
+ mock_session(new_channel(false))]
178
177
 
179
178
  cmd = Capistrano::Command.new("ls", sessions)
180
179
  cmd.stop!
181
180
  end
182
181
 
183
182
  def test_process_should_return_cleanly_if_all_channels_have_zero_exit_status
184
- sessions = [mock("session", :open_channel => new_channel(true, 0)),
185
- mock("session", :open_channel => new_channel(true, 0)),
186
- mock("session", :open_channel => new_channel(true, 0))]
183
+ sessions = [mock_session(new_channel(true, 0)),
184
+ mock_session(new_channel(true, 0)),
185
+ mock_session(new_channel(true, 0))]
187
186
  cmd = Capistrano::Command.new("ls", sessions)
188
187
  assert_nothing_raised { cmd.process! }
189
188
  end
190
189
 
191
190
  def test_process_should_raise_error_if_any_channel_has_non_zero_exit_status
192
- sessions = [mock("session", :open_channel => new_channel(true, 0)),
193
- mock("session", :open_channel => new_channel(true, 0)),
194
- mock("session", :open_channel => new_channel(true, 1))]
191
+ sessions = [mock_session(new_channel(true, 0)),
192
+ mock_session(new_channel(true, 0)),
193
+ mock_session(new_channel(true, 1))]
195
194
  cmd = Capistrano::Command.new("ls", sessions)
196
195
  assert_raises(Capistrano::CommandError) { cmd.process! }
197
196
  end
198
197
 
199
198
  def test_command_error_should_include_accessor_with_host_array
200
- sessions = [mock("session", :open_channel => new_channel(true, 0)),
201
- mock("session", :open_channel => new_channel(true, 0)),
202
- mock("session", :open_channel => new_channel(true, 1))]
199
+ sessions = [mock_session(new_channel(true, 0)),
200
+ mock_session(new_channel(true, 0)),
201
+ mock_session(new_channel(true, 1))]
203
202
  cmd = Capistrano::Command.new("ls", sessions)
204
203
 
205
204
  begin
@@ -216,43 +215,13 @@ class CommandTest < Test::Unit::TestCase
216
215
  ch = mock("channel")
217
216
  returns = [false] * (times-1)
218
217
  ch.stubs(:[]).with(:closed).returns(*(returns + [true]))
219
- con = mock("connection")
220
- con.expects(:process).with(true).times(times-1)
221
- ch.expects(:connection).times(times-1).returns(con)
222
218
  ch.expects(:[]).with(:status).returns(0)
223
219
  ch
224
220
  end
225
221
 
226
- sessions = [mock("session", :open_channel => new_channel[5]),
227
- mock("session", :open_channel => new_channel[10]),
228
- mock("session", :open_channel => new_channel[7])]
229
- cmd = Capistrano::Command.new("ls", sessions)
230
- assert_nothing_raised { cmd.process! }
231
- end
232
-
233
- def test_process_should_ping_all_connections_each_second
234
- now = Time.now
235
-
236
- new_channel = Proc.new do
237
- ch = mock("channel")
238
- ch.stubs(:now => now)
239
- def ch.[](key)
240
- case key
241
- when :status then 0
242
- when :closed then Time.now - now < 1.1 ? false : true
243
- else raise "unknown key: #{key}"
244
- end
245
- end
246
- con = mock("connection")
247
- con.stubs(:process)
248
- con.expects(:ping!)
249
- ch.stubs(:connection).returns(con)
250
- ch
251
- end
252
-
253
- sessions = [mock("session", :open_channel => new_channel[]),
254
- mock("session", :open_channel => new_channel[]),
255
- mock("session", :open_channel => new_channel[])]
222
+ sessions = [mock_session(new_channel[5]),
223
+ mock_session(new_channel[10]),
224
+ mock_session(new_channel[7])]
256
225
  cmd = Capistrano::Command.new("ls", sessions)
257
226
  assert_nothing_raised { cmd.process! }
258
227
  end
@@ -281,6 +250,13 @@ class CommandTest < Test::Unit::TestCase
281
250
 
282
251
  private
283
252
 
253
+ def mock_session(channel=nil)
254
+ stub('session', :open_channel => channel,
255
+ :preprocess => true,
256
+ :postprocess => true,
257
+ :listeners => {})
258
+ end
259
+
284
260
  def new_channel(closed, status=nil)
285
261
  ch = mock("channel")
286
262
  ch.expects(:[]).with(:closed).returns(closed)
@@ -300,7 +276,11 @@ class CommandTest < Test::Unit::TestCase
300
276
 
301
277
  channel.stubs(:[]).with(:server).returns(s)
302
278
  channel.stubs(:[]).with(:host).returns(s.host)
303
- channel.expects(action).yields(channel, *args) if action
279
+
280
+ if action
281
+ action = Array(action)
282
+ channel.expects(action.first).with(*action[1..-1]).yields(channel, *args)
283
+ end
304
284
 
305
285
  yield channel if block_given?
306
286
 
@@ -1,9 +1,10 @@
1
- require "#{File.dirname(__FILE__)}/../../utils"
1
+ require "utils"
2
2
  require 'capistrano/configuration/actions/file_transfer'
3
3
 
4
4
  class ConfigurationActionsFileTransferTest < Test::Unit::TestCase
5
5
  class MockConfig
6
6
  include Capistrano::Configuration::Actions::FileTransfer
7
+ attr_accessor :sessions
7
8
  end
8
9
 
9
10
  def setup
@@ -11,30 +12,31 @@ class ConfigurationActionsFileTransferTest < Test::Unit::TestCase
11
12
  @config.stubs(:logger).returns(stub_everything)
12
13
  end
13
14
 
14
- def test_put_should_pass_options_to_execute_on_servers
15
- @config.expects(:execute_on_servers).with(:foo => "bar")
16
- @config.put("some data", "test.txt", :foo => "bar")
15
+ def test_put_should_delegate_to_upload
16
+ @config.expects(:upload).with { |from, to, opts|
17
+ from.string == "some data" && to == "test.txt" && opts == { :permissions => 0777 } }
18
+ @config.put("some data", "test.txt", :mode => 0777)
17
19
  end
18
20
 
19
- def test_put_should_delegate_to_Upload_process
20
- @config.expects(:execute_on_servers).yields(%w(s1 s2 s3).map { |s| mock(:host => s) })
21
- @config.expects(:sessions).times(3).returns(Hash.new{|h,k| h[k] = k.host.to_sym})
22
- Capistrano::Upload.expects(:process).with([:s1,:s2,:s3], "test.txt", :data => "some data", :mode => 0777, :logger => @config.logger)
23
- @config.put("some data", "test.txt", :mode => 0777)
21
+ def test_get_should_delegate_to_download_with_once
22
+ @config.expects(:download).with("testr.txt", "testl.txt", :foo => "bar", :once => true)
23
+ @config.get("testr.txt", "testl.txt", :foo => "bar")
24
24
  end
25
25
 
26
- def test_get_should_pass_options_execute_on_servers_including_once
27
- @config.expects(:execute_on_servers).with(:foo => "bar", :once => true)
28
- @config.get("test.txt", "test.txt", :foo => "bar")
26
+ def test_upload_should_delegate_to_transfer
27
+ @config.expects(:transfer).with(:up, "testl.txt", "testr.txt", :foo => "bar")
28
+ @config.upload("testl.txt", "testr.txt", :foo => "bar")
29
29
  end
30
30
 
31
- def test_get_should_use_sftp_get_file_to_local_path
32
- sftp = mock("sftp", :state => :closed, :connect => true)
33
- sftp.expects(:get_file).with("remote.txt", "local.txt")
31
+ def test_download_should_delegate_to_transfer
32
+ @config.expects(:transfer).with(:down, "testr.txt", "testl.txt", :foo => "bar")
33
+ @config.download("testr.txt", "testl.txt", :foo => "bar")
34
+ end
34
35
 
35
- s = server("capistrano")
36
- @config.expects(:execute_on_servers).yields([s])
37
- @config.expects(:sessions).returns(s => mock("session", :sftp => sftp))
38
- @config.get("remote.txt", "local.txt")
36
+ def test_transfer_should_invoke_transfer_on_matching_servers
37
+ @config.sessions = { :a => 1, :b => 2, :c => 3, :d => 4 }
38
+ @config.expects(:execute_on_servers).with(:foo => "bar").yields([:a, :b, :c])
39
+ Capistrano::Transfer.expects(:process).with(:up, "testl.txt", "testr.txt", [1,2,3], {:foo => "bar", :logger => @config.logger})
40
+ @config.transfer(:up, "testl.txt", "testr.txt", :foo => "bar")
39
41
  end
40
42
  end
@@ -1,4 +1,4 @@
1
- require "#{File.dirname(__FILE__)}/../../utils"
1
+ require "utils"
2
2
  require 'capistrano/configuration/actions/inspect'
3
3
 
4
4
  class ConfigurationActionsInspectTest < Test::Unit::TestCase
@@ -1,4 +1,4 @@
1
- require "#{File.dirname(__FILE__)}/../../utils"
1
+ require "utils"
2
2
  require 'capistrano/configuration/actions/invocation'
3
3
 
4
4
  class ConfigurationActionsInvocationTest < Test::Unit::TestCase
@@ -97,29 +97,29 @@ class ConfigurationActionsInvocationTest < Test::Unit::TestCase
97
97
  end
98
98
 
99
99
  def test_sudo_should_default_to_sudo
100
- @config.expects(:run).with("sudo -p 'sudo password: ' ls", {})
100
+ @config.expects(:run).with("ls", :command_prefix => "sudo -p 'sudo password: '")
101
101
  @config.sudo "ls"
102
102
  end
103
103
 
104
104
  def test_sudo_should_use_sudo_variable_definition
105
- @config.expects(:run).with("/opt/local/bin/sudo -p 'sudo password: ' ls", {})
105
+ @config.expects(:run).with("ls", :command_prefix => "/opt/local/bin/sudo -p 'sudo password: '")
106
106
  @config.options[:sudo] = "/opt/local/bin/sudo"
107
107
  @config.sudo "ls"
108
108
  end
109
109
 
110
110
  def test_sudo_should_interpret_as_option_as_user
111
- @config.expects(:run).with("sudo -p 'sudo password: ' -u app ls", {})
111
+ @config.expects(:run).with("ls", :command_prefix => "sudo -p 'sudo password: ' -u app")
112
112
  @config.sudo "ls", :as => "app"
113
113
  end
114
114
 
115
115
  def test_sudo_should_pass_options_through_to_run
116
- @config.expects(:run).with("sudo -p 'sudo password: ' ls", :foo => "bar")
116
+ @config.expects(:run).with("ls", :command_prefix => "sudo -p 'sudo password: '", :foo => "bar")
117
117
  @config.sudo "ls", :foo => "bar"
118
118
  end
119
119
 
120
120
  def test_sudo_should_interpret_sudo_prompt_variable_as_custom_prompt
121
121
  @config.set :sudo_prompt, "give it to me: "
122
- @config.expects(:run).with("sudo -p 'give it to me: ' ls", {})
122
+ @config.expects(:run).with("ls", :command_prefix => "sudo -p 'give it to me: '")
123
123
  @config.sudo "ls"
124
124
  end
125
125
 
@@ -1,4 +1,4 @@
1
- require "#{File.dirname(__FILE__)}/../utils"
1
+ require "utils"
2
2
  require 'capistrano/configuration/callbacks'
3
3
 
4
4
  class ConfigurationCallbacksTest < Test::Unit::TestCase
@@ -1,4 +1,4 @@
1
- require "#{File.dirname(__FILE__)}/../utils"
1
+ require "utils"
2
2
  require 'capistrano/configuration/connections'
3
3
 
4
4
  class ConfigurationConnectionsTest < Test::Unit::TestCase
@@ -31,7 +31,7 @@ class ConfigurationConnectionsTest < Test::Unit::TestCase
31
31
  @config = MockConfig.new
32
32
  @config.stubs(:logger).returns(stub_everything)
33
33
  @ssh_options = {
34
- :user => "jamis",
34
+ :user => "user",
35
35
  :port => 8080,
36
36
  :password => "g00b3r",
37
37
  :ssh_options => { :debug => :verbose }
@@ -59,17 +59,16 @@ class ConfigurationConnectionsTest < Test::Unit::TestCase
59
59
  end
60
60
 
61
61
  def test_connection_factory_should_return_gateway_instance_if_gateway_variable_is_set
62
- @config.values[:gateway] = "capistrano"
63
- server = server("capistrano")
64
- Capistrano::SSH.expects(:connect).with { |s,| s.host == "capistrano" }.yields(stub_everything)
65
- assert_instance_of Capistrano::Gateway, @config.connection_factory
62
+ @config.values[:gateway] = "j@capistrano"
63
+ Net::SSH::Gateway.expects(:new).with("capistrano", "j", :port => 22, :password => nil, :auth_methods => %w(publickey hostbased)).returns(stub_everything)
64
+ assert_instance_of Capistrano::Configuration::Connections::GatewayConnectionFactory, @config.connection_factory
66
65
  end
67
66
 
68
67
  def test_connection_factory_as_gateway_should_honor_config_options
69
68
  @config.values[:gateway] = "capistrano"
70
69
  @config.values.update(@ssh_options)
71
- Capistrano::SSH.expects(:connect).with { |s,opts| s.host == "capistrano" && opts == @config }.yields(stub_everything)
72
- assert_instance_of Capistrano::Gateway, @config.connection_factory
70
+ Net::SSH::Gateway.expects(:new).with("capistrano", "user", :debug => :verbose, :port => 8080, :password => nil, :auth_methods => %w(publickey hostbased)).returns(stub_everything)
71
+ assert_instance_of Capistrano::Configuration::Connections::GatewayConnectionFactory, @config.connection_factory
73
72
  end
74
73
 
75
74
  def test_establish_connections_to_should_accept_a_single_nonarray_parameter
@@ -194,11 +193,11 @@ class ConfigurationConnectionsTest < Test::Unit::TestCase
194
193
  @config.current_task = mock_task
195
194
  @config.expects(:find_servers_for_task).with(@config.current_task, {}).returns([server("cap1")])
196
195
  Capistrano::SSH.expects(:connect).raises(Exception)
197
- assert_raises(Capistrano::ConnectionError) {
196
+ assert_raises(Capistrano::ConnectionError) do
198
197
  @config.execute_on_servers do
199
198
  flunk "expected an exception to be raised"
200
199
  end
201
- }
200
+ end
202
201
  end
203
202
 
204
203
  def test_execute_servers_should_not_raise_connection_error_on_failure_with_on_errors_continue
@@ -243,14 +242,14 @@ class ConfigurationConnectionsTest < Test::Unit::TestCase
243
242
  end
244
243
  end
245
244
 
246
- def test_execute_on_servers_should_not_try_to_connect_to_hosts_with_upload_errors_with_on_errors_continue
245
+ def test_execute_on_servers_should_not_try_to_connect_to_hosts_with_transfer_errors_with_on_errors_continue
247
246
  cap1 = server("cap1")
248
247
  cap2 = server("cap2")
249
248
  @config.current_task = mock_task(:on_error => :continue)
250
249
  @config.expects(:find_servers_for_task).with(@config.current_task, {}).returns([cap1, cap2])
251
250
  Capistrano::SSH.expects(:connect).times(2).returns(:success)
252
251
  @config.execute_on_servers do |servers|
253
- error = Capistrano::UploadError.new
252
+ error = Capistrano::TransferError.new
254
253
  error.hosts = [cap1]
255
254
  raise error
256
255
  end
@@ -1,4 +1,4 @@
1
- require "#{File.dirname(__FILE__)}/../utils"
1
+ require "utils"
2
2
  require 'capistrano/configuration/execution'
3
3
  require 'capistrano/task_definition'
4
4
 
@@ -1,4 +1,4 @@
1
- require "#{File.dirname(__FILE__)}/../utils"
1
+ require "utils"
2
2
  require 'capistrano/configuration/loading'
3
3
 
4
4
  class ConfigurationLoadingTest < Test::Unit::TestCase
@@ -1,4 +1,4 @@
1
- require "#{File.dirname(__FILE__)}/../utils"
1
+ require "utils"
2
2
  require 'capistrano/configuration/namespaces'
3
3
 
4
4
  class ConfigurationNamespacesDSLTest < Test::Unit::TestCase
@@ -1,4 +1,4 @@
1
- require "#{File.dirname(__FILE__)}/../utils"
1
+ require "utils"
2
2
  require 'capistrano/configuration/roles'
3
3
  require 'capistrano/server_definition'
4
4
 
@@ -1,4 +1,4 @@
1
- require "#{File.dirname(__FILE__)}/../utils"
1
+ require "utils"
2
2
  require 'capistrano/task_definition'
3
3
  require 'capistrano/configuration/servers'
4
4
 
@@ -1,4 +1,4 @@
1
- require "#{File.dirname(__FILE__)}/../utils"
1
+ require "utils"
2
2
  require 'capistrano/configuration/variables'
3
3
 
4
4
  class ConfigurationVariablesTest < Test::Unit::TestCase
@@ -1,4 +1,4 @@
1
- require "#{File.dirname(__FILE__)}/utils"
1
+ require "utils"
2
2
  require 'capistrano/configuration'
3
3
 
4
4
  # These tests are only for testing the integration of the various components
@@ -1,4 +1,4 @@
1
- require "#{File.dirname(__FILE__)}/../../utils"
1
+ require "utils"
2
2
  require 'capistrano/recipes/deploy/scm/accurev'
3
3
 
4
4
  class AccurevTest < Test::Unit::TestCase
@@ -1,4 +1,4 @@
1
- require "#{File.dirname(__FILE__)}/../../utils"
1
+ require "utils"
2
2
  require 'capistrano/recipes/deploy/scm/base'
3
3
 
4
4
  class DeploySCMBaseTest < Test::Unit::TestCase
@@ -1,4 +1,4 @@
1
- require "#{File.dirname(__FILE__)}/../../utils"
1
+ require "utils"
2
2
  require 'capistrano/recipes/deploy/scm/git'
3
3
 
4
4
  class DeploySCMGitTest < Test::Unit::TestCase
@@ -7,7 +7,7 @@ class DeploySCMGitTest < Test::Unit::TestCase
7
7
  end
8
8
 
9
9
  def setup
10
- @config = { }
10
+ @config = { :repository => "." }
11
11
  def @config.exists?(name); key?(name); end
12
12
 
13
13
  @source = TestSCM.new(@config)
@@ -50,7 +50,11 @@ class DeploySCMGitTest < Test::Unit::TestCase
50
50
  end
51
51
 
52
52
  def test_query_revision
53
- assert_equal "git rev-parse HEAD", @source.query_revision('HEAD') { |o| o }
53
+ revision = @source.query_revision('HEAD') do |o|
54
+ assert_equal "git ls-remote . HEAD", o
55
+ "d11006102c07c94e5d54dd0ee63dca825c93ed61\tHEAD"
56
+ end
57
+ assert_equal "d11006102c07c94e5d54dd0ee63dca825c93ed61", revision
54
58
  end
55
59
 
56
60
  def test_command_should_be_backwards_compatible
@@ -62,12 +66,12 @@ class DeploySCMGitTest < Test::Unit::TestCase
62
66
  def test_sync
63
67
  dest = "/var/www"
64
68
  rev = 'c2d9e79'
65
- assert_equal "cd #{dest} && git fetch origin && git reset --hard #{rev}", @source.sync(rev, dest)
69
+ assert_equal "cd #{dest} && git fetch --tags origin && git reset --hard #{rev}", @source.sync(rev, dest)
66
70
 
67
71
  # With :scm_command
68
72
  git = "/opt/local/bin/git"
69
73
  @config[:scm_command] = git
70
- assert_equal "cd #{dest} && #{git} fetch origin && #{git} reset --hard #{rev}", @source.sync(rev, dest)
74
+ assert_equal "cd #{dest} && #{git} fetch --tags origin && #{git} reset --hard #{rev}", @source.sync(rev, dest)
71
75
  end
72
76
 
73
77
  def test_sync_with_remote
@@ -79,7 +83,7 @@ class DeploySCMGitTest < Test::Unit::TestCase
79
83
  @config[:repository] = repository
80
84
  @config[:remote] = remote
81
85
 
82
- assert_equal "cd #{dest} && git config remote.#{remote}.url #{repository} && git config remote.#{remote}.fetch +refs/heads/*:refs/remotes/#{remote}/* && git fetch #{remote} && git reset --hard #{rev}", @source.sync(rev, dest)
86
+ assert_equal "cd #{dest} && git config remote.#{remote}.url #{repository} && git config remote.#{remote}.fetch +refs/heads/*:refs/remotes/#{remote}/* && git fetch --tags #{remote} && git reset --hard #{rev}", @source.sync(rev, dest)
83
87
  end
84
88
 
85
89
  def test_shallow_clone
@@ -1,4 +1,4 @@
1
- require "#{File.dirname(__FILE__)}/../../utils"
1
+ require "utils"
2
2
  require 'capistrano/recipes/deploy/scm/mercurial'
3
3
 
4
4
  class DeploySCMMercurialTest < Test::Unit::TestCase
@@ -1,11 +1,12 @@
1
- require "#{File.dirname(__FILE__)}/../../utils"
1
+ require "utils"
2
2
  require 'capistrano/logger'
3
3
  require 'capistrano/recipes/deploy/strategy/copy'
4
4
  require 'stringio'
5
5
 
6
6
  class DeployStrategyCopyTest < Test::Unit::TestCase
7
7
  def setup
8
- @config = { :logger => Capistrano::Logger.new(:output => StringIO.new),
8
+ @config = { :application => "captest",
9
+ :logger => Capistrano::Logger.new(:output => StringIO.new),
9
10
  :releases_path => "/u/apps/test/releases",
10
11
  :release_path => "/u/apps/test/releases/1234567890",
11
12
  :real_revision => "154" }
@@ -16,44 +17,31 @@ class DeployStrategyCopyTest < Test::Unit::TestCase
16
17
 
17
18
  def test_deploy_with_defaults_should_use_tar_gz_and_checkout
18
19
  Dir.expects(:tmpdir).returns("/temp/dir")
19
- Dir.expects(:chdir).with("/temp/dir").yields
20
20
  @source.expects(:checkout).with("154", "/temp/dir/1234567890").returns(:local_checkout)
21
-
22
21
  @strategy.expects(:system).with(:local_checkout)
23
- @strategy.expects(:system).with("tar czf 1234567890.tar.gz 1234567890")
24
- @strategy.expects(:put).with(:mock_file_contents, "/tmp/1234567890.tar.gz")
25
- @strategy.expects(:run).with("cd /u/apps/test/releases && tar xzf /tmp/1234567890.tar.gz && rm /tmp/1234567890.tar.gz")
26
22
 
27
- mock_file = mock("file")
28
- mock_file.expects(:puts).with("154")
29
- File.expects(:open).with("/temp/dir/1234567890/REVISION", "w").yields(mock_file)
30
- File.expects(:open).with("/temp/dir/1234567890.tar.gz", "rb").yields(StringIO.new).returns(:mock_file_contents)
23
+ prepare_standard_compress_and_copy!
24
+ @strategy.deploy!
25
+ end
31
26
 
32
- FileUtils.expects(:rm).with("/temp/dir/1234567890.tar.gz")
33
- FileUtils.expects(:rm_rf).with("/temp/dir/1234567890")
27
+ def test_deploy_with_exclusions_should_remove_patterns_from_destination
28
+ @config[:copy_exclude] = ".git"
29
+ Dir.expects(:tmpdir).returns("/temp/dir")
30
+ @source.expects(:checkout).with("154", "/temp/dir/1234567890").returns(:local_checkout)
31
+ @strategy.expects(:system).with(:local_checkout)
34
32
 
33
+ FileUtils.expects(:rm_rf).with("/temp/dir/1234567890/.git")
34
+ prepare_standard_compress_and_copy!
35
35
  @strategy.deploy!
36
36
  end
37
37
 
38
38
  def test_deploy_with_export_should_use_tar_gz_and_export
39
39
  Dir.expects(:tmpdir).returns("/temp/dir")
40
- Dir.expects(:chdir).with("/temp/dir").yields
41
40
  @config[:copy_strategy] = :export
42
41
  @source.expects(:export).with("154", "/temp/dir/1234567890").returns(:local_export)
43
-
44
42
  @strategy.expects(:system).with(:local_export)
45
- @strategy.expects(:system).with("tar czf 1234567890.tar.gz 1234567890")
46
- @strategy.expects(:put).with(:mock_file_contents, "/tmp/1234567890.tar.gz")
47
- @strategy.expects(:run).with("cd /u/apps/test/releases && tar xzf /tmp/1234567890.tar.gz && rm /tmp/1234567890.tar.gz")
48
-
49
- mock_file = mock("file")
50
- mock_file.expects(:puts).with("154")
51
- File.expects(:open).with("/temp/dir/1234567890/REVISION", "w").yields(mock_file)
52
- File.expects(:open).with("/temp/dir/1234567890.tar.gz", "rb").yields(StringIO.new).returns(:mock_file_contents)
53
-
54
- FileUtils.expects(:rm).with("/temp/dir/1234567890.tar.gz")
55
- FileUtils.expects(:rm_rf).with("/temp/dir/1234567890")
56
43
 
44
+ prepare_standard_compress_and_copy!
57
45
  @strategy.deploy!
58
46
  end
59
47
 
@@ -79,7 +67,7 @@ class DeployStrategyCopyTest < Test::Unit::TestCase
79
67
  @strategy.deploy!
80
68
  end
81
69
 
82
- def test_deploy_with_bzip2_should_use_zip_and_checkout
70
+ def test_deploy_with_bzip2_should_use_bz2_and_checkout
83
71
  Dir.expects(:tmpdir).returns("/temp/dir")
84
72
  Dir.expects(:chdir).with("/temp/dir").yields
85
73
  @config[:copy_compression] = :bzip2
@@ -144,4 +132,109 @@ class DeployStrategyCopyTest < Test::Unit::TestCase
144
132
 
145
133
  @strategy.deploy!
146
134
  end
135
+
136
+ def test_with_copy_cache_should_checkout_to_cache_if_cache_does_not_exist_and_then_copy
137
+ @config[:copy_cache] = true
138
+
139
+ Dir.stubs(:tmpdir).returns("/temp/dir")
140
+ File.expects(:exists?).with("/temp/dir/captest").returns(false)
141
+ Dir.expects(:chdir).with("/temp/dir/captest").yields
142
+
143
+ @source.expects(:checkout).with("154", "/temp/dir/captest").returns(:local_checkout)
144
+ @strategy.expects(:system).with(:local_checkout)
145
+
146
+ FileUtils.expects(:mkdir_p).with("/temp/dir/1234567890")
147
+
148
+ prepare_directory_tree!("/temp/dir/captest")
149
+
150
+ prepare_standard_compress_and_copy!
151
+ @strategy.deploy!
152
+ end
153
+
154
+ def test_with_copy_cache_should_update_cache_if_cache_exists_and_then_copy
155
+ @config[:copy_cache] = true
156
+
157
+ Dir.stubs(:tmpdir).returns("/temp/dir")
158
+ File.expects(:exists?).with("/temp/dir/captest").returns(true)
159
+ Dir.expects(:chdir).with("/temp/dir/captest").yields
160
+
161
+ @source.expects(:sync).with("154", "/temp/dir/captest").returns(:local_sync)
162
+ @strategy.expects(:system).with(:local_sync)
163
+
164
+ FileUtils.expects(:mkdir_p).with("/temp/dir/1234567890")
165
+
166
+ prepare_directory_tree!("/temp/dir/captest")
167
+
168
+ prepare_standard_compress_and_copy!
169
+ @strategy.deploy!
170
+ end
171
+
172
+ def test_with_copy_cache_with_custom_cache_dir_should_use_specified_cache_dir
173
+ @config[:copy_cache] = "/u/caches/captest"
174
+
175
+ Dir.stubs(:tmpdir).returns("/temp/dir")
176
+ File.expects(:exists?).with("/u/caches/captest").returns(true)
177
+ Dir.expects(:chdir).with("/u/caches/captest").yields
178
+
179
+ @source.expects(:sync).with("154", "/u/caches/captest").returns(:local_sync)
180
+ @strategy.expects(:system).with(:local_sync)
181
+
182
+ FileUtils.expects(:mkdir_p).with("/temp/dir/1234567890")
183
+
184
+ prepare_directory_tree!("/u/caches/captest")
185
+
186
+ prepare_standard_compress_and_copy!
187
+ @strategy.deploy!
188
+ end
189
+
190
+ def test_with_copy_cache_with_excludes_should_not_copy_excluded_files
191
+ @config[:copy_cache] = true
192
+ @config[:copy_exclude] = "*/bar.txt"
193
+
194
+ Dir.stubs(:tmpdir).returns("/temp/dir")
195
+ File.expects(:exists?).with("/temp/dir/captest").returns(true)
196
+ Dir.expects(:chdir).with("/temp/dir/captest").yields
197
+
198
+ @source.expects(:sync).with("154", "/temp/dir/captest").returns(:local_sync)
199
+ @strategy.expects(:system).with(:local_sync)
200
+
201
+ FileUtils.expects(:mkdir_p).with("/temp/dir/1234567890")
202
+
203
+ prepare_directory_tree!("/temp/dir/captest", true)
204
+
205
+ prepare_standard_compress_and_copy!
206
+ @strategy.deploy!
207
+ end
208
+
209
+ private
210
+
211
+ def prepare_directory_tree!(cache, exclude=false)
212
+ Dir.expects(:glob).with("*", File::FNM_DOTMATCH).returns([".", "..", "app", "foo.txt"])
213
+ File.expects(:directory?).with("app").returns(true)
214
+ FileUtils.expects(:mkdir).with("/temp/dir/1234567890/app")
215
+ File.expects(:directory?).with("foo.txt").returns(false)
216
+ FileUtils.expects(:ln).with("#{cache}/foo.txt", "/temp/dir/1234567890/foo.txt")
217
+
218
+ Dir.expects(:glob).with("app/*", File::FNM_DOTMATCH).returns(["app/.", "app/..", "app/bar.txt"])
219
+
220
+ unless exclude
221
+ File.expects(:directory?).with("app/bar.txt").returns(false)
222
+ FileUtils.expects(:ln).with("#{cache}/app/bar.txt", "/temp/dir/1234567890/app/bar.txt")
223
+ end
224
+ end
225
+
226
+ def prepare_standard_compress_and_copy!
227
+ Dir.expects(:chdir).with("/temp/dir").yields
228
+ @strategy.expects(:system).with("tar czf 1234567890.tar.gz 1234567890")
229
+ @strategy.expects(:put).with(:mock_file_contents, "/tmp/1234567890.tar.gz")
230
+ @strategy.expects(:run).with("cd /u/apps/test/releases && tar xzf /tmp/1234567890.tar.gz && rm /tmp/1234567890.tar.gz")
231
+
232
+ mock_file = mock("file")
233
+ mock_file.expects(:puts).with("154")
234
+ File.expects(:open).with("/temp/dir/1234567890/REVISION", "w").yields(mock_file)
235
+ File.expects(:open).with("/temp/dir/1234567890.tar.gz", "rb").yields(StringIO.new).returns(:mock_file_contents)
236
+
237
+ FileUtils.expects(:rm).with("/temp/dir/1234567890.tar.gz")
238
+ FileUtils.expects(:rm_rf).with("/temp/dir/1234567890")
239
+ end
147
240
  end