capistrano 2.9.0 → 2.11.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,6 @@
1
+ language: ruby
1
2
  rvm:
2
3
  - 1.8.7
3
4
  - 1.9.2
5
+ - 1.9.3
4
6
  - ree
data/CHANGELOG CHANGED
@@ -1,3 +1,53 @@
1
+ ## 2.11.2 / Febuary 22 2012
2
+
3
+ Fixes some bugs with the now deprecated `deploy:symlink` fallback option.
4
+
5
+ ## 2.11.0 / Febuary 20 2012
6
+
7
+ This release replaces and fixes a broken 2.10.0 release (see below for
8
+ information)
9
+
10
+ This release includes all fixes as documented for 2.10.0, plus additional code
11
+ cleanup (SHA: 3eecac2), as well as changing the public API from
12
+ `deploy:symlink`, to `deploy:create_symlink`
13
+
14
+ * Remove a testing dependency on `ruby-debug` (Lee Hambley, reported by Serg
15
+ Podtynnyi)
16
+
17
+ * Formerly deprecate `deploy:symlink`, this move was prompted by the Rake
18
+ namespace fiasco of their 0.9.0 release, and is replaced by
19
+ `deploy:create_symlink`. If you are looking for a place to hook asset related
20
+ tasks, please consider `deploy:finalize_update`. Replaced by
21
+ `deploy:create_symlink`, `deploy:symlink` now raises a deprecation warning,
22
+ and defers to `deploy:symlink`. (Lee Hambley)
23
+
24
+ * Update the 2.10.0 changelog. (Lee Hambley, reported by Jérémy Lecour)
25
+
26
+ ## 2.10.0 / Febuary 19 2012
27
+
28
+ If you are reading this after Febuary 20th 2012, do not be surprised when you
29
+ cannot find 2.10.0 on Rubygems.org, it has been removed because of a breaking
30
+ API change. It is replaced logically enough by 2.11.0 where the API is still
31
+ changed, but now issues a warning and falls back to the expected behaviour.
32
+
33
+ The CHANGELOG for this release was updated retrospectively, I'm sorry I missed
34
+ that when releasing the gem, 2.10.0 apparently not my finest hour as a
35
+ maintainer.
36
+
37
+ Ths fixes in this release include
38
+
39
+ * Include sample NGinx config for `deploy:web:disable`(added by Roger Ertesvåg)
40
+
41
+ * Fix gemspec time format warning (reported by Tony Arcieri, fixed by building the Gem against Ruby-1.9.3)
42
+
43
+ * Finally removed deprecated `before_` and `after_` tasks. (Lee Hambley)
44
+
45
+ * Rake 0.9.x compatibility (reported by James Miller, fixed by Lee Hambley)
46
+
47
+ * More detailed logging output (fixed by Huang Liang)
48
+
49
+ * Includes multistage, without `capistrano-ext`. `require 'capistrano/ext/multistage'` (fixed by Lee Hambley)
50
+
1
51
  ## 2.9.0 / September 24 2011
2
52
 
3
53
  A vairly heavy release, including some new features which most of you won't
data/Gemfile CHANGED
@@ -9,6 +9,4 @@ gemspec
9
9
  #
10
10
  group :development do
11
11
  gem 'rake', '0.8.7'
12
- gem 'ruby-debug', :platform => :mri_18
13
- gem 'ruby-debug19', :platform => :mri_19
14
12
  end
@@ -67,7 +67,7 @@ tasks.
67
67
  * Push to your branch - `git push origin my_branch`
68
68
  * Create a Pull Request from your branch, include as much documentation
69
69
  as you can in the commit message/pull request, following these
70
- [guidelies on writing a good commit message](http://spheredev.org/wiki/Git_for_the_lazy#Writing_good_commit_messages)
70
+ [guidelines on writing a good commit message](http://spheredev.org/wiki/Git_for_the_lazy#Writing_good_commit_messages)
71
71
  * That's it!
72
72
 
73
73
 
data/bin/capify CHANGED
@@ -37,7 +37,8 @@ end
37
37
 
38
38
  files = {
39
39
  "Capfile" => unindent(<<-FILE),
40
- load 'deploy' if respond_to?(:namespace) # cap2 differentiator
40
+
41
+ load 'deploy'
41
42
 
42
43
  # Uncomment if you are using Rails' asset pipeline
43
44
  # load 'deploy/assets'
@@ -3,6 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
3
3
  require "capistrano/version"
4
4
 
5
5
  Gem::Specification.new do |s|
6
+
6
7
  s.name = "capistrano"
7
8
  s.version = Capistrano::Version.to_s
8
9
  s.platform = Gem::Platform::RUBY
@@ -1,3 +1,5 @@
1
+ require 'capistrano/fix_rake_deprecated_dsl'
2
+
1
3
  require 'capistrano/configuration'
2
4
  require 'capistrano/extensions'
3
5
  require 'capistrano/ext/string'
@@ -219,6 +219,8 @@ module Capistrano
219
219
  command_line = [environment, shell, cmd].compact.join(" ")
220
220
  ch[:command] = command_line
221
221
 
222
+ logger.trace command_line, ch[:server] if logger
223
+
222
224
  ch.exec(command_line)
223
225
  ch.send_data(options[:data]) if options[:data]
224
226
  else
@@ -261,7 +263,10 @@ module Capistrano
261
263
  end
262
264
 
263
265
  def replace_placeholders(command, channel)
264
- command.gsub(/\$CAPISTRANO:HOST\$/, channel[:host])
266
+ roles = @tree.configuration && @tree.configuration.role_names_for_host(channel[:server])
267
+ command = command.gsub(/\$CAPISTRANO:HOST\$/, channel[:host])
268
+ command.gsub!(/\$CAPISTRANO:HOSTROLES\$/, roles.join(',')) if roles
269
+ command
265
270
  end
266
271
 
267
272
  # prepare a space-separated sequence of variables assignments
@@ -1,5 +1,6 @@
1
1
  require 'capistrano/logger'
2
2
 
3
+ require 'capistrano/configuration/alias_task'
3
4
  require 'capistrano/configuration/callbacks'
4
5
  require 'capistrano/configuration/connections'
5
6
  require 'capistrano/configuration/execution'
@@ -33,7 +34,7 @@ module Capistrano
33
34
 
34
35
  # The includes must come at the bottom, since they may redefine methods
35
36
  # defined in the base class.
36
- include Connections, Execution, Loading, Namespaces, Roles, Servers, Variables
37
+ include AliasTask, Connections, Execution, Loading, Namespaces, Roles, Servers, Variables
37
38
 
38
39
  # Mix in the actions
39
40
  include Actions::FileTransfer, Actions::Inspect, Actions::Invocation
@@ -0,0 +1,25 @@
1
+ module Capistrano
2
+ class Configuration
3
+ module AliasTask
4
+ # Attempts to find the task at the given fully-qualified path, and
5
+ # alias it. If arguments don't have correct task names, an ArgumentError
6
+ # wil be raised. If no such task exists, a Capistrano::NoSuchTaskError
7
+ # will be raised.
8
+ #
9
+ # Usage:
10
+ #
11
+ # alias_task :original_deploy, :deploy
12
+ #
13
+ def alias_task(new_name, old_name)
14
+ if !new_name.respond_to?(:to_sym) or !old_name.respond_to?(:to_sym)
15
+ raise ArgumentError, "expected a valid task name"
16
+ end
17
+
18
+ task = find_task(old_name) or raise NoSuchTaskError, "the task `#{old_name}' does not exist"
19
+ task.name = new_name
20
+
21
+ define_task(task)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -19,18 +19,13 @@ module Capistrano
19
19
  end
20
20
 
21
21
  def invoke_task_directly_with_callbacks(task) #:nodoc:
22
- before = find_hook(task, :before)
23
- execute_task(before) if before
24
-
22
+
25
23
  trigger :before, task
26
24
 
27
25
  result = invoke_task_directly_without_callbacks(task)
28
26
 
29
27
  trigger :after, task
30
28
 
31
- after = find_hook(task, :after)
32
- execute_task(after) if after
33
-
34
29
  return result
35
30
  end
36
31
 
@@ -129,20 +124,6 @@ module Capistrano
129
124
  end
130
125
  end
131
126
 
132
- private
133
-
134
- # Looks for before_foo or after_foo tasks. This method of extending tasks
135
- # is now discouraged (though not formally deprecated). You should use the
136
- # before and after methods to declare hooks for such callbacks.
137
- def find_hook(task, hook)
138
- if task == task.namespace.default_task
139
- result = task.namespace.search_task("#{hook}_#{task.namespace.name}")
140
- return result if result
141
- end
142
-
143
- task.namespace.search_task("#{hook}_#{task.name}")
144
- end
145
-
146
127
  end
147
128
  end
148
- end
129
+ end
@@ -140,4 +140,4 @@ module Capistrano
140
140
  end
141
141
  end
142
142
  end
143
- end
143
+ end
@@ -97,12 +97,17 @@ module Capistrano
97
97
  raise ArgumentError, "defining a task named `#{name}' would shadow an existing #{thing} with that name"
98
98
  end
99
99
 
100
- tasks[name] = TaskDefinition.new(name, self, {:desc => next_description(:reset)}.merge(options), &block)
101
100
 
102
- if !task_already_defined
103
- metaclass = class << self; self; end
104
- metaclass.send(:define_method, name) { execute_task(tasks[name]) }
105
- end
101
+ task = TaskDefinition.new(name, self, {:desc => next_description(:reset)}.merge(options), &block)
102
+
103
+ define_task(task)
104
+ end
105
+
106
+ def define_task(task)
107
+ tasks[task.name] = task
108
+
109
+ metaclass = class << self; self; end
110
+ metaclass.send(:define_method, task.name) { execute_task(tasks[task.name]) }
106
111
  end
107
112
 
108
113
  # Find the task with the given name, where name is the fully-qualified
@@ -151,7 +156,7 @@ module Capistrano
151
156
  return nil if parent.nil?
152
157
  return tasks[DEFAULT_TASK]
153
158
  end
154
-
159
+
155
160
  # Returns the tasks in this namespace as an array of TaskDefinition
156
161
  # objects. If a non-false parameter is given, all tasks in all
157
162
  # namespaces under this namespace will be returned as well.
@@ -189,9 +194,10 @@ module Capistrano
189
194
  end
190
195
  end
191
196
 
197
+ include Capistrano::Configuration::AliasTask
192
198
  include Capistrano::Configuration::Namespaces
193
199
  undef :desc, :next_description
194
200
  end
195
201
  end
196
202
  end
197
- end
203
+ end
@@ -68,6 +68,10 @@ module Capistrano
68
68
  raise ArgumentError, "you must associate a server with at least one role" if roles.empty?
69
69
  roles.each { |name| role(name, host, options) }
70
70
  end
71
+
72
+ def role_names_for_host(host)
73
+ roles.map {|role_name, role| role_name if role.include?(host) }.compact || []
74
+ end
71
75
  end
72
76
  end
73
77
  end
@@ -0,0 +1,62 @@
1
+ require 'fileutils'
2
+
3
+ unless Capistrano::Configuration.respond_to?(:instance)
4
+ abort "capistrano/ext/multistage requires Capistrano 2"
5
+ end
6
+
7
+ Capistrano::Configuration.instance.load do
8
+ location = fetch(:stage_dir, "config/deploy")
9
+
10
+ unless exists?(:stages)
11
+ set :stages, Dir["#{location}/*.rb"].map { |f| File.basename(f, ".rb") }
12
+ end
13
+
14
+ stages.each do |name|
15
+ desc "Set the target stage to `#{name}'."
16
+ task(name) do
17
+ set :stage, name.to_sym
18
+ load "#{location}/#{stage}"
19
+ end
20
+ end
21
+
22
+ on :load do
23
+ if stages.include?(ARGV.first)
24
+ # Execute the specified stage so that recipes required in stage can contribute to task list
25
+ find_and_execute_task(ARGV.first) if ARGV.any?{ |option| option =~ /-T|--tasks|-e|--explain/ }
26
+ else
27
+ # Execute the default stage so that recipes required in stage can contribute tasks
28
+ find_and_execute_task(default_stage) if exists?(:default_stage)
29
+ end
30
+ end
31
+
32
+ namespace :multistage do
33
+ desc "[internal] Ensure that a stage has been selected."
34
+ task :ensure do
35
+ if !exists?(:stage)
36
+ if exists?(:default_stage)
37
+ logger.important "Defaulting to `#{default_stage}'"
38
+ find_and_execute_task(default_stage)
39
+ else
40
+ abort "No stage specified. Please specify one of: #{stages.join(', ')} (e.g. `cap #{stages.first} #{ARGV.last}')"
41
+ end
42
+ end
43
+ end
44
+
45
+ desc "Stub out the staging config files."
46
+ task :prepare do
47
+ FileUtils.mkdir_p(location)
48
+ stages.each do |name|
49
+ file = File.join(location, name + ".rb")
50
+ unless File.exists?(file)
51
+ File.open(file, "w") do |f|
52
+ f.puts "# #{name.upcase}-specific deployment configuration"
53
+ f.puts "# please put general deployment config in config/deploy.rb"
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+
60
+ on :start, "multistage:ensure", :except => stages + ['multistage:prepare']
61
+
62
+ end
@@ -0,0 +1,8 @@
1
+ #
2
+ # See https://github.com/jimweirich/rake/issues/81
3
+ #
4
+ if defined?(Rake::DeprecatedObjectDSL)
5
+ Rake::DeprecatedObjectDSL.private_instance_methods.each do |m|
6
+ Rake::DeprecatedObjectDSL.send("undef_method", m)
7
+ end
8
+ end
@@ -32,6 +32,7 @@ _cset :rails_env, "production"
32
32
  _cset :rake, "rake"
33
33
 
34
34
  _cset :maintenance_basename, "maintenance"
35
+ _cset(:maintenance_template_path) { File.join(File.dirname(__FILE__), "templates", "maintenance.rhtml") }
35
36
 
36
37
  # =========================================================================
37
38
  # These variables should NOT be changed unless you are very confident in
@@ -49,7 +50,7 @@ _cset(:release_name) { set :deploy_timestamped, true; Time.now.utc.strftime
49
50
 
50
51
  _cset :version_dir, "releases"
51
52
  _cset :shared_dir, "shared"
52
- _cset :shared_children, %w(system log pids)
53
+ _cset :shared_children, %w(public/system log tmp/pids)
53
54
  _cset :current_dir, "current"
54
55
 
55
56
  _cset(:releases_path) { File.join(deploy_to, version_dir) }
@@ -184,7 +185,7 @@ namespace :deploy do
184
185
  DESC
185
186
  task :setup, :except => { :no_release => true } do
186
187
  dirs = [deploy_to, releases_path, shared_path]
187
- dirs += shared_children.map { |d| File.join(shared_path, d) }
188
+ dirs += shared_children.map { |d| File.join(shared_path, d.split('/').last) }
188
189
  run "#{try_sudo} mkdir -p #{dirs.join(' ')}"
189
190
  run "#{try_sudo} chmod g+w #{dirs.join(' ')}" if fetch(:group_writable, true)
190
191
  end
@@ -200,7 +201,7 @@ namespace :deploy do
200
201
  task :update do
201
202
  transaction do
202
203
  update_code
203
- symlink
204
+ create_symlink
204
205
  end
205
206
  end
206
207
 
@@ -246,11 +247,11 @@ namespace :deploy do
246
247
  run <<-CMD
247
248
  rm -rf #{latest_release}/log #{latest_release}/public/system #{latest_release}/tmp/pids &&
248
249
  mkdir -p #{latest_release}/public &&
249
- mkdir -p #{latest_release}/tmp &&
250
- ln -s #{shared_path}/log #{latest_release}/log &&
251
- ln -s #{shared_path}/system #{latest_release}/public/system &&
252
- ln -s #{shared_path}/pids #{latest_release}/tmp/pids
250
+ mkdir -p #{latest_release}/tmp
253
251
  CMD
252
+ shared_children.map do |d|
253
+ run "ln -s #{shared_path}/#{d.split('/').last} #{latest_release}/#{d}"
254
+ end
254
255
 
255
256
  if fetch(:normalize_asset_timestamps, true)
256
257
  stamp = Time.now.utc.strftime("%Y%m%d%H%M.%S")
@@ -259,6 +260,13 @@ namespace :deploy do
259
260
  end
260
261
  end
261
262
 
263
+ desc <<-DESC
264
+ Deprecated API. This has become deploy:create_symlink, please update your recipes
265
+ DESC
266
+ task :symlink, :except => { :no_release => true } do
267
+ Kernel.warn "[Deprecation Warning] This API has changed, please hook `deploy:create_symlink` instead of `deploy:symlink`."
268
+ end
269
+
262
270
  desc <<-DESC
263
271
  Updates the symlink to the most recently deployed version. Capistrano works \
264
272
  by putting each new release of your application in its own directory. When \
@@ -268,7 +276,10 @@ namespace :deploy do
268
276
  deploy, including `restart') or the 'update' task (which does everything \
269
277
  except `restart').
270
278
  DESC
271
- task :symlink, :except => { :no_release => true } do
279
+ task :create_symlink, :except => { :no_release => true } do
280
+
281
+ symlink # (Deprecated)
282
+
272
283
  on_rollback do
273
284
  if previous_release
274
285
  run "rm -f #{current_path}; ln -s #{previous_release} #{current_path}; true"
@@ -375,6 +386,8 @@ namespace :deploy do
375
386
  set :migrate_target, :latest
376
387
  DESC
377
388
  task :migrate, :roles => :db, :only => { :primary => true } do
389
+ rake = fetch(:rake, "rake")
390
+ rails_env = fetch(:rails_env, "production")
378
391
  migrate_env = fetch(:migrate_env, "")
379
392
  migrate_target = fetch(:migrate_target, :latest)
380
393
 
@@ -398,7 +411,7 @@ namespace :deploy do
398
411
  set :migrate_target, :latest
399
412
  update_code
400
413
  migrate
401
- symlink
414
+ create_symlink
402
415
  restart
403
416
  end
404
417
 
@@ -411,12 +424,12 @@ namespace :deploy do
411
424
  DESC
412
425
  task :cleanup, :except => { :no_release => true } do
413
426
  count = fetch(:keep_releases, 5).to_i
414
- if count >= releases.length
427
+ local_releases = capture("ls -xt #{releases_path}").split.reverse
428
+ if count >= local_releases.length
415
429
  logger.important "no old releases to clean up"
416
430
  else
417
- logger.info "keeping #{count} of #{releases.length} deployed releases"
418
-
419
- directories = (releases - releases.last(count)).map { |release|
431
+ logger.info "keeping #{count} of #{local_releases.length} deployed releases"
432
+ directories = (local_releases - local_releases.last(count)).map { |release|
420
433
  File.join(releases_path, release) }.join(" ")
421
434
 
422
435
  try_sudo "rm -rf #{directories}"
@@ -527,6 +540,10 @@ namespace :deploy do
527
540
  REASON="hardware upgrade" \\
528
541
  UNTIL="12pm Central Time"
529
542
 
543
+ You can use a different template for the maintenance page by setting the \
544
+ :maintenance_template_path variable in your deploy.rb file. The template file \
545
+ should either be a plaintext or an erb file.
546
+
530
547
  Further customization will require that you write your own task.
531
548
  DESC
532
549
  task :disable, :roles => :web, :except => { :no_release => true } do
@@ -535,7 +552,7 @@ namespace :deploy do
535
552
 
536
553
  warn <<-EOHTACCESS
537
554
 
538
- # Please add something like this to your site's htaccess to redirect users to the maintenance page.
555
+ # Please add something like this to your site's Apache htaccess to redirect users to the maintenance page.
539
556
  # More Info: http://www.shiftcommathree.com/articles/make-your-rails-maintenance-page-respond-with-a-503
540
557
 
541
558
  ErrorDocument 503 /system/#{maintenance_basename}.html
@@ -544,12 +561,23 @@ namespace :deploy do
544
561
  RewriteCond %{DOCUMENT_ROOT}/system/#{maintenance_basename}.html -f
545
562
  RewriteCond %{SCRIPT_FILENAME} !#{maintenance_basename}.html
546
563
  RewriteRule ^.*$ - [redirect=503,last]
564
+
565
+ # Or if you are using Nginx add this to your server config:
566
+
567
+ if (-f $document_root/system/maintenance.html) {
568
+ return 503;
569
+ }
570
+ error_page 503 @maintenance;
571
+ location @maintenance {
572
+ rewrite ^(.*)$ /system/maintenance.html last;
573
+ break;
574
+ }
547
575
  EOHTACCESS
548
576
 
549
577
  reason = ENV['REASON']
550
578
  deadline = ENV['UNTIL']
551
579
 
552
- template = File.read(File.join(File.dirname(__FILE__), "templates", "maintenance.rhtml"))
580
+ template = File.read(maintenance_template_path)
553
581
  result = ERB.new(template).result(binding)
554
582
 
555
583
  put result, "#{shared_path}/system/#{maintenance_basename}.html", :mode => 0644
@@ -3,6 +3,8 @@ load 'deploy' unless defined?(_cset)
3
3
  _cset :asset_env, "RAILS_GROUPS=assets"
4
4
  _cset :assets_prefix, "assets"
5
5
 
6
+ _cset :normalize_asset_timestamps, false
7
+
6
8
  before 'deploy:finalize_update', 'deploy:assets:symlink'
7
9
  after 'deploy:update_code', 'deploy:assets:precompile'
8
10
 
@@ -76,7 +76,7 @@ module Capistrano
76
76
  if revision == :head || revision.nil?
77
77
  nil
78
78
  else
79
- "-r #{revision}"
79
+ "-r #{revision}".chomp
80
80
  end
81
81
  end
82
82
  end
@@ -38,6 +38,16 @@ module Capistrano
38
38
  # :copy_compression, which must be one of :gzip, :bz2, or
39
39
  # :zip, and which specifies how the source should be compressed for
40
40
  # transmission to each host.
41
+ #
42
+ # There is a possibility to pass a build command that will get
43
+ # executed if your code needs to be compiled or something needs to be
44
+ # done before the code is ready to run.
45
+ #
46
+ # set :build_script, "make all"
47
+ #
48
+ # Note that if you use :copy_cache, the :build_script is used on the
49
+ # cache and thus you get faster compilation if your script does not
50
+ # recompile everything.
41
51
  class Copy < Base
42
52
  # Obtains a copy of the source code locally (via the #command method),
43
53
  # compresses it to a single file, copies that file to all target
@@ -58,6 +68,8 @@ module Capistrano
58
68
  raise Capistrano::Error, "shell command failed with return code #{$?}"
59
69
  end
60
70
 
71
+ build(copy_cache)
72
+
61
73
  FileUtils.mkdir_p(destination)
62
74
 
63
75
  logger.debug "copying cache to deployment staging area #{destination}"
@@ -84,6 +96,8 @@ module Capistrano
84
96
  logger.debug "getting (via #{copy_strategy}) revision #{revision} to #{destination}"
85
97
  system(command)
86
98
 
99
+ build(destination)
100
+
87
101
  if copy_exclude.any?
88
102
  logger.debug "processing exclusions..."
89
103
 
@@ -107,6 +121,18 @@ module Capistrano
107
121
  FileUtils.rm_rf destination rescue nil
108
122
  end
109
123
 
124
+ def build(directory)
125
+ return unless configuration[:build_script]
126
+
127
+ Dir.chdir(directory) do
128
+ self.system(configuration[:build_script])
129
+ # Check the return code of last system command and rollback if not 0
130
+ unless $? == 0
131
+ raise Capistrano::Error, "shell command failed with return code #{$?}"
132
+ end
133
+ end
134
+ end
135
+
110
136
  def check!
111
137
  super.check do |d|
112
138
  d.local.command(source.local.command) if source.local.command
@@ -191,9 +217,9 @@ module Capistrano
191
217
 
192
218
  type = configuration[:copy_compression] || :gzip
193
219
  case type
194
- when :gzip, :gz then Compression.new("tar.gz", [local_tar, 'chzf'], [remote_tar, 'xzf'])
195
- when :bzip2, :bz2 then Compression.new("tar.bz2", [local_tar, 'chjf'], [remote_tar, 'xjf'])
196
- when :zip then Compression.new("zip", %w(zip -qr), %w(unzip -q))
220
+ when :gzip, :gz then Compression.new("tar.gz", [local_tar, 'czf'], [remote_tar, 'xzf'])
221
+ when :bzip2, :bz2 then Compression.new("tar.bz2", [local_tar, 'cjf'], [remote_tar, 'xjf'])
222
+ when :zip then Compression.new("zip", %w(zip -qyr), %w(unzip -q))
197
223
  else raise ArgumentError, "invalid compression type #{type.inspect}"
198
224
  end
199
225
  end
@@ -1,9 +1,3 @@
1
- begin
2
- require 'rubygems'
3
- gem 'net-ssh', ">= 2.0.10"
4
- rescue LoadError, NameError
5
- end
6
-
7
1
  require 'net/ssh'
8
2
 
9
3
  module Capistrano
@@ -1,22 +1,18 @@
1
1
  require 'capistrano/server_definition'
2
2
 
3
3
  module Capistrano
4
- # Represents the definition of a single task.
4
+
5
5
  class TaskDefinition
6
+
6
7
  attr_reader :name, :namespace, :options, :body, :desc, :on_error, :max_hosts
7
8
 
8
9
  def initialize(name, namespace, options={}, &block)
9
-
10
- if name.to_s =~ /^(?:before_|after_)/
11
- Kernel.warn("[Deprecation Warning] Naming tasks with before_ and after_ is deprecated, please see the new before() and after() methods. (Offending task name was #{name})")
12
- end
13
-
14
10
  @name, @namespace, @options = name, namespace, options
15
- @desc = @options.delete(:desc)
16
- @on_error = options.delete(:on_error)
11
+ @desc = @options.delete(:desc)
12
+ @on_error = options.delete(:on_error)
17
13
  @max_hosts = options[:max_hosts] && options[:max_hosts].to_i
18
- @body = block or raise ArgumentError, "a task requires a block"
19
- @servers = nil
14
+ @body = block or raise ArgumentError, "a task requires a block"
15
+ @servers = nil
20
16
  end
21
17
 
22
18
  # Returns the task's fully-qualified name, including the namespace
@@ -30,6 +26,11 @@ module Capistrano
30
26
  end
31
27
  end
32
28
 
29
+ def name=(value)
30
+ raise ArgumentError, "expected a valid task name" if !value.respond_to?(:to_sym)
31
+ @name = value.to_sym
32
+ end
33
+
33
34
  # Returns the description for this task, with newlines collapsed and
34
35
  # whitespace stripped. Returns the empty string if there is no
35
36
  # description for this task.
@@ -71,5 +72,6 @@ module Capistrano
71
72
  def continue_on_error?
72
73
  @on_error == :continue
73
74
  end
75
+
74
76
  end
75
77
  end
@@ -117,7 +117,7 @@ module Capistrano
117
117
 
118
118
  def prepare_scp_transfer(from, to, session)
119
119
  real_callback = callback || Proc.new do |channel, name, sent, total|
120
- logger.trace "[#{channel[:host]}] #{name}" if logger && sent == 0
120
+ logger.trace "#{transport} #{operation} #{from} -> #{to}", channel[:host] if logger && sent == 0
121
121
  end
122
122
 
123
123
  channel = case direction
@@ -167,9 +167,9 @@ module Capistrano
167
167
  if callback
168
168
  callback.call(event, op, *args)
169
169
  elsif event == :open
170
- logger.trace "[#{op[:host]}] #{args[0].remote}"
170
+ logger.trace "#{transport} #{operation} #{from} -> #{to}", op[:host]
171
171
  elsif event == :finish
172
- logger.trace "[#{op[:host]}] done"
172
+ logger.trace "#{transport} #{operation} #{from} -> #{to} done", op[:host]
173
173
  end
174
174
  end
175
175
 
@@ -203,6 +203,8 @@ module Capistrano
203
203
  end
204
204
 
205
205
  def handle_error(error)
206
+ raise error if error.message.include?('expected a file to upload')
207
+
206
208
  transfer = session_map[error.session]
207
209
  transfer[:error] = error
208
210
  transfer[:failed] = true
@@ -4,8 +4,8 @@ module Capistrano
4
4
  class Version
5
5
 
6
6
  MAJOR = 2
7
- MINOR = 9
8
- PATCH = 0
7
+ MINOR = 11
8
+ PATCH = 2
9
9
 
10
10
  def self.to_s
11
11
  "#{MAJOR}.#{MINOR}.#{PATCH}"
@@ -226,13 +226,27 @@ class CommandTest < Test::Unit::TestCase
226
226
  Capistrano::Command.process("ls -l", %w(a b c), :foo => "bar")
227
227
  end
228
228
 
229
- def test_process_with_host_placeholder_should_substitute_placeholder_with_each_host
229
+ def test_process_with_host_placeholder_should_substitute_host_placeholder_with_each_host
230
230
  session = setup_for_extracting_channel_action do |ch|
231
231
  ch.expects(:exec).with(%(sh -c 'echo capistrano'))
232
232
  end
233
233
  Capistrano::Command.new("echo $CAPISTRANO:HOST$", [session])
234
234
  end
235
235
 
236
+ class MockConfig
237
+ include Capistrano::Configuration::Roles
238
+ end
239
+
240
+ def test_hostroles_substitution
241
+ @config = MockConfig.new
242
+ @config.server "capistrano", :db, :worker
243
+ server = @config.roles[:db].servers.first
244
+ channel = {:server => server, :host => 'capistrano'}
245
+ tree = Capistrano::Command::Tree.new(@config) { |t| t.else("echo $CAPISTRANO:HOSTROLES$") }
246
+ result = Capistrano::Command.new(tree, []).send(:replace_placeholders, "echo $CAPISTRANO:HOSTROLES$", channel)
247
+ assert result == "echo db,worker" || result == "echo worker,db"
248
+ end
249
+
236
250
  def test_process_with_unknown_placeholder_should_not_replace_placeholder
237
251
  session = setup_for_extracting_channel_action do |ch|
238
252
  ch.expects(:exec).with(%(sh -c 'echo $CAPISTRANO:OTHER$'))
@@ -0,0 +1,110 @@
1
+ require 'utils'
2
+ require 'capistrano/configuration/alias_task'
3
+ require 'capistrano/configuration/execution'
4
+ require 'capistrano/configuration/namespaces'
5
+ require 'capistrano/task_definition'
6
+
7
+ class AliasTaskTest < Test::Unit::TestCase
8
+ class MockConfig
9
+ attr_reader :options
10
+ attr_accessor :logger
11
+
12
+ def initialize(options={})
13
+ @options = {}
14
+ @logger = options.delete(:logger)
15
+ end
16
+
17
+ include Capistrano::Configuration::AliasTask
18
+ include Capistrano::Configuration::Execution
19
+ include Capistrano::Configuration::Namespaces
20
+ end
21
+
22
+ def setup
23
+ @config = MockConfig.new( :logger => stub(:debug => nil, :info => nil, :important => nil) )
24
+ end
25
+
26
+ def test_makes_a_copy_of_the_task
27
+ @config.task(:foo) { 42 }
28
+ @config.alias_task 'new_foo', 'foo'
29
+
30
+ assert @config.tasks.key?(:new_foo)
31
+ end
32
+
33
+ def test_aliased_task_do_the_same
34
+ @config.task(:foo) { 42 }
35
+ @config.alias_task 'new_foo', 'foo'
36
+
37
+ assert_equal 42, @config.find_and_execute_task('new_foo')
38
+ end
39
+
40
+ def test_aliased_task_should_preserve_description
41
+ @config.task(:foo, :desc => "the Ultimate Question of Life, the Universe, and Everything" ) { 42 }
42
+ @config.alias_task 'new_foo', 'foo'
43
+
44
+ task = @config.find_task('foo')
45
+ new_task = @config.find_task('new_foo')
46
+
47
+ assert_equal task.description, new_task.description
48
+ end
49
+
50
+ def test_aliased_task_should_preserve_on_error
51
+ @config.task(:foo, :on_error => :continue) { 42 }
52
+ @config.alias_task 'new_foo', 'foo'
53
+
54
+ task = @config.find_task('foo')
55
+ new_task = @config.find_task('new_foo')
56
+
57
+ assert_equal task.on_error, new_task.on_error
58
+ end
59
+
60
+ def test_aliased_task_should_preserve_max_hosts
61
+ @config.task(:foo, :max_hosts => 5) { 42 }
62
+ @config.alias_task 'new_foo', 'foo'
63
+
64
+ task = @config.find_task('foo')
65
+ new_task = @config.find_task('new_foo')
66
+
67
+ assert_equal task.max_hosts, new_task.max_hosts
68
+ end
69
+
70
+ def test_raise_exception_when_task_doesnt_exist
71
+ assert_raises(Capistrano::NoSuchTaskError) { @config.alias_task 'non_existant_task', 'fail_miserably' }
72
+ end
73
+
74
+ def test_convert_task_names_using_to_str
75
+ @config.task(:foo, :role => :app) { 42 }
76
+
77
+ @config.alias_task 'one', 'foo'
78
+ @config.alias_task :two, 'foo'
79
+ @config.alias_task 'three', :foo
80
+ @config.alias_task :four, :foo
81
+
82
+ assert @config.tasks.key?(:one)
83
+ assert @config.tasks.key?(:two)
84
+ assert @config.tasks.key?(:three)
85
+ assert @config.tasks.key?(:four)
86
+ end
87
+
88
+ def test_raise_an_exception_when_task_names_can_not_be_converted
89
+ @config.task(:foo, :role => :app) { 42 }
90
+
91
+ assert_raises(ArgumentError) { @config.alias_task mock('x'), :foo }
92
+ end
93
+
94
+ def test_should_include_namespace
95
+ @config.namespace(:outer) do
96
+ task(:foo) { 42 }
97
+ alias_task 'new_foo', 'foo'
98
+
99
+ namespace(:inner) do
100
+ task(:foo) { 43 }
101
+ alias_task 'new_foo', 'foo'
102
+ end
103
+ end
104
+
105
+ assert_equal 42, @config.find_and_execute_task('outer:new_foo')
106
+ assert_equal 42, @config.find_and_execute_task('outer:foo')
107
+ assert_equal 43, @config.find_and_execute_task('outer:inner:new_foo')
108
+ assert_equal 43, @config.find_and_execute_task('outer:inner:foo')
109
+ end
110
+ end
@@ -174,47 +174,4 @@ class ConfigurationCallbacksTest < Test::Unit::TestCase
174
174
  assert_equal [task], @config.called
175
175
  end
176
176
 
177
- def test_execute_task_with_named_before_hook_should_call_named_before_hook
178
- ns = stub("namespace", :default_task => nil, :name => "old", :fully_qualified_name => "any:old")
179
- task = stub(:fully_qualified_name => "any:old:thing", :name => "thing", :namespace => ns)
180
- before_task = stub(:fully_qualified_name => "any:old:before_thing", :name => "before_thing", :namespace => ns)
181
-
182
- ns.stubs(:search_task).returns(nil)
183
- ns.expects(:search_task).with("before_thing").returns(before_task)
184
-
185
- @config.execute_task(task)
186
- assert_equal [before_task, task], @config.called
187
- end
188
-
189
- def test_execute_task_with_named_after_hook_should_call_named_after_hook
190
- ns = stub("namespace", :default_task => nil, :name => "old", :fully_qualified_name => "any:old")
191
- task = stub(:fully_qualified_name => "any:old:thing", :name => "thing", :namespace => ns)
192
- after_task = stub(:fully_qualified_name => "any:old:after_thing", :name => "after_thing", :namespace => ns)
193
-
194
- ns.stubs(:search_task).returns(nil)
195
- ns.expects(:search_task).with("after_thing").returns(after_task)
196
-
197
- @config.execute_task(task)
198
- assert_equal [task, after_task], @config.called
199
- end
200
-
201
- def test_execute_task_with_on_hooks_should_trigger_hooks_around_task
202
- ns = stub("namespace", :default_task => nil, :name => "old", :fully_qualified_name => "any:old")
203
- task = stub(:fully_qualified_name => "any:old:thing", :name => "thing", :namespace => ns)
204
- before_task = stub(:fully_qualified_name => "any:old:before_thing", :name => "before_thing", :namespace => ns)
205
- after_task = stub(:fully_qualified_name => "any:old:after_thing", :name => "after_thing", :namespace => ns)
206
-
207
- ns.stubs(:search_task).returns(nil)
208
- ns.expects(:search_task).with("before_thing").returns(before_task)
209
- ns.expects(:search_task).with("after_thing").returns(after_task)
210
-
211
- @config.before("any:old:thing", :first_this, :then_this)
212
- @config.after("any:old:thing", :and_then_this, :lastly_this)
213
-
214
- [:first_this, :then_this, :and_then_this, :lastly_this].each do |t|
215
- @config.expects(:find_and_execute_task).with(t)
216
- end
217
-
218
- @config.execute_task(task)
219
- end
220
177
  end
@@ -21,6 +21,19 @@ class ConfigurationRolesTest < Test::Unit::TestCase
21
21
  assert @config.original_initialize_called
22
22
  assert @config.roles.empty?
23
23
  end
24
+
25
+ def test_roles_for_host_with_one_role
26
+ @config.role :app, "app1.capistrano.test"
27
+ @config.role :not_app, "not-app.capistrano.test"
28
+ app_server = @config.roles[:app].servers.first
29
+ assert @config.role_names_for_host(app_server)==[ :app ]
30
+ end
31
+
32
+ def test_roles_for_host_with_multiple_roles
33
+ @config.server "www.capistrano.test", :db, :worker
34
+ db_server = @config.roles[:db].servers.first
35
+ assert_equal @config.role_names_for_host(db_server).map(&:to_s).sort, [ 'db', 'worker' ]
36
+ end
24
37
 
25
38
  def test_role_should_allow_empty_list
26
39
  @config.role :app
@@ -74,15 +74,4 @@ class ConfigurationTest < Test::Unit::TestCase
74
74
  assert !@config[:called_inner_first]
75
75
  end
76
76
 
77
- def test_hooks_for_default_task_should_be_found_if_named_after_the_namespace
78
- @config.namespace(:outer) do
79
- task(:default) { set :called_default, true }
80
- task(:before_outer) { set :called_before_outer, true }
81
- task(:after_outer) { set :called_after_outer, true }
82
- end
83
- @config.outer.default
84
- assert @config[:called_before_outer]
85
- assert @config[:called_default]
86
- assert @config[:called_after_outer]
87
- end
88
77
  end
@@ -23,7 +23,7 @@ class DeployStrategyCopyTest < Test::Unit::TestCase
23
23
  @strategy.expects(:system).with(:local_checkout)
24
24
 
25
25
  Dir.expects(:chdir).with("/temp/dir").yields
26
- @strategy.expects(:system).with("tar chzf 1234567890.tar.gz 1234567890")
26
+ @strategy.expects(:system).with("tar czf 1234567890.tar.gz 1234567890")
27
27
  @strategy.expects(:upload).with("/temp/dir/1234567890.tar.gz", "/tmp/1234567890.tar.gz")
28
28
  @strategy.expects(:run).with("cd /u/apps/test/releases && gtar xzf /tmp/1234567890.tar.gz && rm /tmp/1234567890.tar.gz")
29
29
 
@@ -45,7 +45,7 @@ class DeployStrategyCopyTest < Test::Unit::TestCase
45
45
  @strategy.expects(:system).with(:local_checkout)
46
46
 
47
47
  Dir.expects(:chdir).with("/temp/dir").yields
48
- @strategy.expects(:system).with("gtar chzf 1234567890.tar.gz 1234567890")
48
+ @strategy.expects(:system).with("gtar czf 1234567890.tar.gz 1234567890")
49
49
  @strategy.expects(:upload).with("/temp/dir/1234567890.tar.gz", "/tmp/1234567890.tar.gz")
50
50
  @strategy.expects(:run).with("cd /u/apps/test/releases && tar xzf /tmp/1234567890.tar.gz && rm /tmp/1234567890.tar.gz")
51
51
 
@@ -109,7 +109,7 @@ class DeployStrategyCopyTest < Test::Unit::TestCase
109
109
  @source.expects(:checkout).with("154", "/temp/dir/1234567890").returns(:local_checkout)
110
110
 
111
111
  @strategy.expects(:system).with(:local_checkout)
112
- @strategy.expects(:system).with("zip -qr 1234567890.zip 1234567890")
112
+ @strategy.expects(:system).with("zip -qyr 1234567890.zip 1234567890")
113
113
  @strategy.expects(:upload).with("/temp/dir/1234567890.zip", "/tmp/1234567890.zip")
114
114
  @strategy.expects(:run).with("cd /u/apps/test/releases && unzip -q /tmp/1234567890.zip && rm /tmp/1234567890.zip")
115
115
 
@@ -130,7 +130,7 @@ class DeployStrategyCopyTest < Test::Unit::TestCase
130
130
  @source.expects(:checkout).with("154", "/temp/dir/1234567890").returns(:local_checkout)
131
131
 
132
132
  @strategy.expects(:system).with(:local_checkout)
133
- @strategy.expects(:system).with("tar chjf 1234567890.tar.bz2 1234567890")
133
+ @strategy.expects(:system).with("tar cjf 1234567890.tar.bz2 1234567890")
134
134
  @strategy.expects(:upload).with("/temp/dir/1234567890.tar.bz2", "/tmp/1234567890.tar.bz2")
135
135
  @strategy.expects(:run).with("cd /u/apps/test/releases && tar xjf /tmp/1234567890.tar.bz2 && rm /tmp/1234567890.tar.bz2")
136
136
 
@@ -161,7 +161,7 @@ class DeployStrategyCopyTest < Test::Unit::TestCase
161
161
  @source.expects(:checkout).with("154", "/other/path/1234567890").returns(:local_checkout)
162
162
 
163
163
  @strategy.expects(:system).with(:local_checkout)
164
- @strategy.expects(:system).with("tar chzf 1234567890.tar.gz 1234567890")
164
+ @strategy.expects(:system).with("tar czf 1234567890.tar.gz 1234567890")
165
165
  @strategy.expects(:upload).with("/other/path/1234567890.tar.gz", "/tmp/1234567890.tar.gz")
166
166
  @strategy.expects(:run).with("cd /u/apps/test/releases && tar xzf /tmp/1234567890.tar.gz && rm /tmp/1234567890.tar.gz")
167
167
 
@@ -182,7 +182,7 @@ class DeployStrategyCopyTest < Test::Unit::TestCase
182
182
  @source.expects(:checkout).returns(:local_checkout)
183
183
 
184
184
  @strategy.expects(:system).with(:local_checkout)
185
- @strategy.expects(:system).with("tar chzf 1234567890.tar.gz 1234567890")
185
+ @strategy.expects(:system).with("tar czf 1234567890.tar.gz 1234567890")
186
186
  @strategy.expects(:upload).with("/temp/dir/1234567890.tar.gz", "/somewhere/else/1234567890.tar.gz")
187
187
  @strategy.expects(:run).with("cd /u/apps/test/releases && tar xzf /somewhere/else/1234567890.tar.gz && rm /somewhere/else/1234567890.tar.gz")
188
188
 
@@ -288,6 +288,20 @@ class DeployStrategyCopyTest < Test::Unit::TestCase
288
288
  @strategy.deploy!
289
289
  end
290
290
 
291
+ def test_with_build_script_should_run_script
292
+ @config[:build_script] = "mkdir bin"
293
+
294
+ Dir.expects(:tmpdir).returns("/temp/dir")
295
+ @source.expects(:checkout).with("154", "/temp/dir/1234567890").returns(:local_checkout)
296
+ @strategy.expects(:system).with(:local_checkout)
297
+
298
+ Dir.expects(:chdir).with("/temp/dir/1234567890").yields
299
+ @strategy.expects(:system).with("mkdir bin")
300
+
301
+ prepare_standard_compress_and_copy!
302
+ @strategy.deploy!
303
+ end
304
+
291
305
  private
292
306
 
293
307
  def prepare_directory_tree!(cache, exclude=false)
@@ -307,7 +321,7 @@ class DeployStrategyCopyTest < Test::Unit::TestCase
307
321
 
308
322
  def prepare_standard_compress_and_copy!
309
323
  Dir.expects(:chdir).with("/temp/dir").yields
310
- @strategy.expects(:system).with("tar chzf 1234567890.tar.gz 1234567890")
324
+ @strategy.expects(:system).with("tar czf 1234567890.tar.gz 1234567890")
311
325
  @strategy.expects(:upload).with("/temp/dir/1234567890.tar.gz", "/tmp/1234567890.tar.gz")
312
326
  @strategy.expects(:run).with("cd /u/apps/test/releases && tar xzf /tmp/1234567890.tar.gz && rm /tmp/1234567890.tar.gz")
313
327
 
@@ -25,16 +25,17 @@ class TaskDefinitionTest < Test::Unit::TestCase
25
25
  assert_equal "default", task.fully_qualified_name
26
26
  end
27
27
 
28
- def test_deprecation_warning_on_method_name_beginning_with_before_underscore
29
- name = "before_test"
30
- Kernel.expects(:warn).with("[Deprecation Warning] Naming tasks with before_ and after_ is deprecated, please see the new before() and after() methods. (Offending task name was #{name})")
31
- new_task(name)
28
+ def test_name_should_change_task_name
29
+ task = new_task(:foo)
30
+ task.name = :bar
31
+
32
+ assert_equal :bar, task.name
32
33
  end
33
34
 
34
- def test_deprecation_warning_on_method_name_beginning_with_after_underscore
35
- name = "after_test"
36
- Kernel.expects(:warn).with("[Deprecation Warning] Naming tasks with before_ and after_ is deprecated, please see the new before() and after() methods. (Offending task name was #{name})")
37
- new_task(name)
35
+ def test_raise_an_exception_when_task_names_can_not_be_converted
36
+ task = new_task('valid task name')
37
+
38
+ assert_raises(ArgumentError) { task.name = ['invalid task name'] }
38
39
  end
39
40
 
40
41
  def test_fqn_in_namespace_when_default_should_be_namespace_fqn
@@ -113,4 +114,4 @@ class TaskDefinitionTest < Test::Unit::TestCase
113
114
  task = new_task(:testing, @namespace, :desc => "Take file.txt and copy it. Then do something else.")
114
115
  assert_equal "Take file.txt and copy it.", task.brief_description
115
116
  end
116
- end
117
+ end
@@ -133,6 +133,14 @@ class TransferTest < Test::Unit::TestCase
133
133
  transfer.process!
134
134
  end
135
135
 
136
+ def test_uploading_a_non_existing_file_should_raise_an_understandable_error
137
+ s = session('app1')
138
+ error = Capistrano::Processable::SessionAssociation.on(ArgumentError.new('expected a file to upload'), s)
139
+ transfer = Capistrano::Transfer.new(:up, "from", "to", [], :via => :scp)
140
+ transfer.expects(:process_iteration).raises(error)
141
+ assert_raise(ArgumentError, 'expected a file to upload') { transfer.process! }
142
+ end
143
+
136
144
  private
137
145
 
138
146
  class ExceptionWithSession < ::Exception
@@ -1,7 +1,6 @@
1
1
  require 'rubygems'
2
2
  require 'bundler/setup'
3
3
 
4
- require 'ruby-debug'
5
4
  require 'test/unit'
6
5
  require 'mocha'
7
6
 
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.9.0
4
+ version: 2.11.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-09-24 00:00:00.000000000Z
13
+ date: 2012-02-22 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: highline
17
- requirement: &70363620892360 !ruby/object:Gem::Requirement
17
+ requirement: &70157295072440 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '0'
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *70363620892360
25
+ version_requirements: *70157295072440
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: net-ssh
28
- requirement: &70363620908220 !ruby/object:Gem::Requirement
28
+ requirement: &70157295071180 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: 2.0.14
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *70363620908220
36
+ version_requirements: *70157295071180
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: net-sftp
39
- requirement: &70363620907740 !ruby/object:Gem::Requirement
39
+ requirement: &70157295069420 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: 2.0.0
45
45
  type: :runtime
46
46
  prerelease: false
47
- version_requirements: *70363620907740
47
+ version_requirements: *70157295069420
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: net-scp
50
- requirement: &70363620907260 !ruby/object:Gem::Requirement
50
+ requirement: &70157295068700 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: 1.0.0
56
56
  type: :runtime
57
57
  prerelease: false
58
- version_requirements: *70363620907260
58
+ version_requirements: *70157295068700
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: net-ssh-gateway
61
- requirement: &70363620906780 !ruby/object:Gem::Requirement
61
+ requirement: &70157295058440 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ! '>='
@@ -66,10 +66,10 @@ dependencies:
66
66
  version: 1.1.0
67
67
  type: :runtime
68
68
  prerelease: false
69
- version_requirements: *70363620906780
69
+ version_requirements: *70157295058440
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: mocha
72
- requirement: &70363620906300 !ruby/object:Gem::Requirement
72
+ requirement: &70157295056280 !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - ! '>='
@@ -77,7 +77,7 @@ dependencies:
77
77
  version: '0'
78
78
  type: :development
79
79
  prerelease: false
80
- version_requirements: *70363620906300
80
+ version_requirements: *70157295056280
81
81
  description: Capistrano is a utility and framework for executing commands in parallel
82
82
  on multiple remote machines, via SSH.
83
83
  email:
@@ -91,7 +91,6 @@ extra_rdoc_files:
91
91
  - README.mdown
92
92
  files:
93
93
  - .gitignore
94
- - .rvmrc
95
94
  - .travis.yml
96
95
  - CHANGELOG
97
96
  - Gemfile
@@ -113,6 +112,7 @@ files:
113
112
  - lib/capistrano/configuration/actions/file_transfer.rb
114
113
  - lib/capistrano/configuration/actions/inspect.rb
115
114
  - lib/capistrano/configuration/actions/invocation.rb
115
+ - lib/capistrano/configuration/alias_task.rb
116
116
  - lib/capistrano/configuration/callbacks.rb
117
117
  - lib/capistrano/configuration/connections.rb
118
118
  - lib/capistrano/configuration/execution.rb
@@ -122,8 +122,10 @@ files:
122
122
  - lib/capistrano/configuration/servers.rb
123
123
  - lib/capistrano/configuration/variables.rb
124
124
  - lib/capistrano/errors.rb
125
+ - lib/capistrano/ext/multistage.rb
125
126
  - lib/capistrano/ext/string.rb
126
127
  - lib/capistrano/extensions.rb
128
+ - lib/capistrano/fix_rake_deprecated_dsl.rb
127
129
  - lib/capistrano/logger.rb
128
130
  - lib/capistrano/processable.rb
129
131
  - lib/capistrano/recipes/compat.rb
@@ -160,7 +162,6 @@ files:
160
162
  - lib/capistrano/task_definition.rb
161
163
  - lib/capistrano/transfer.rb
162
164
  - lib/capistrano/version.rb
163
- - rvmrc.sample
164
165
  - test/cli/execute_test.rb
165
166
  - test/cli/help_test.rb
166
167
  - test/cli/options_test.rb
@@ -170,6 +171,7 @@ files:
170
171
  - test/configuration/actions/file_transfer_test.rb
171
172
  - test/configuration/actions/inspect_test.rb
172
173
  - test/configuration/actions/invocation_test.rb
174
+ - test/configuration/alias_task_test.rb
173
175
  - test/configuration/callbacks_test.rb
174
176
  - test/configuration/connections_test.rb
175
177
  - test/configuration/execution_test.rb
@@ -224,7 +226,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
224
226
  version: '0'
225
227
  requirements: []
226
228
  rubyforge_project:
227
- rubygems_version: 1.8.7
229
+ rubygems_version: 1.8.10
228
230
  signing_key:
229
231
  specification_version: 3
230
232
  summary: Capistrano - Welcome to easy deployment with Ruby over SSH
@@ -238,6 +240,7 @@ test_files:
238
240
  - test/configuration/actions/file_transfer_test.rb
239
241
  - test/configuration/actions/inspect_test.rb
240
242
  - test/configuration/actions/invocation_test.rb
243
+ - test/configuration/alias_task_test.rb
241
244
  - test/configuration/callbacks_test.rb
242
245
  - test/configuration/connections_test.rb
243
246
  - test/configuration/execution_test.rb
data/.rvmrc DELETED
@@ -1 +0,0 @@
1
- rvm use 1.8.7
@@ -1 +0,0 @@
1
- rvm use 1.8.7@capistrano-devel --create