capistrano 3.0.1 → 3.1.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 (54) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +5 -2
  4. data/CHANGELOG.md +36 -3
  5. data/CONTRIBUTING.md +91 -0
  6. data/Gemfile +9 -0
  7. data/README.md +9 -11
  8. data/capistrano.gemspec +5 -8
  9. data/features/configuration.feature +15 -0
  10. data/features/deploy.feature +1 -0
  11. data/features/deploy_failure.feature +17 -0
  12. data/features/step_definitions/assertions.rb +19 -0
  13. data/features/step_definitions/cap_commands.rb +5 -1
  14. data/features/step_definitions/setup.rb +13 -0
  15. data/features/support/remote_command_helpers.rb +4 -0
  16. data/lib/capistrano/application.rb +41 -3
  17. data/lib/capistrano/configuration.rb +8 -0
  18. data/lib/capistrano/configuration/server.rb +28 -5
  19. data/lib/capistrano/configuration/servers.rb +3 -6
  20. data/lib/capistrano/configuration/servers/host_filter.rb +82 -0
  21. data/lib/capistrano/dsl.rb +16 -1
  22. data/lib/capistrano/dsl/env.rb +11 -1
  23. data/lib/capistrano/dsl/paths.rb +8 -0
  24. data/lib/capistrano/dsl/stages.rb +8 -1
  25. data/lib/capistrano/dsl/task_enhancements.rb +13 -2
  26. data/lib/capistrano/git.rb +35 -0
  27. data/lib/capistrano/hg.rb +32 -0
  28. data/lib/capistrano/i18n.rb +6 -2
  29. data/lib/capistrano/scm.rb +116 -0
  30. data/lib/capistrano/setup.rb +4 -3
  31. data/lib/capistrano/tasks/console.rake +9 -1
  32. data/lib/capistrano/tasks/deploy.rake +17 -15
  33. data/lib/capistrano/tasks/framework.rake +1 -0
  34. data/lib/capistrano/tasks/git.rake +16 -10
  35. data/lib/capistrano/tasks/hg.rake +13 -9
  36. data/lib/capistrano/templates/Capfile +1 -2
  37. data/lib/capistrano/templates/deploy.rb.erb +20 -2
  38. data/lib/capistrano/templates/stage.rb.erb +1 -4
  39. data/lib/capistrano/version.rb +1 -1
  40. data/spec/integration/dsl_spec.rb +147 -2
  41. data/spec/lib/capistrano/application_spec.rb +2 -5
  42. data/spec/lib/capistrano/configuration/server_spec.rb +40 -4
  43. data/spec/lib/capistrano/configuration/servers/host_filter_spec.rb +84 -0
  44. data/spec/lib/capistrano/configuration/servers_spec.rb +35 -0
  45. data/spec/lib/capistrano/configuration_spec.rb +8 -0
  46. data/spec/lib/capistrano/dsl_spec.rb +0 -11
  47. data/spec/lib/capistrano/git_spec.rb +70 -0
  48. data/spec/lib/capistrano/hg_spec.rb +70 -0
  49. data/spec/lib/capistrano/scm_spec.rb +104 -0
  50. data/spec/support/tasks/fail.cap +7 -0
  51. data/spec/support/tasks/failed.cap +5 -0
  52. data/spec/support/test_app.rb +33 -3
  53. metadata +29 -52
  54. data/spec/lib/capistrano/dsl/env_spec.rb +0 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 14835eba6a1dd4641ae3514aba8b5ae19a010745
4
- data.tar.gz: 803ec0a5f10fa2460f1d781e3327458bd38e663c
3
+ metadata.gz: 3783d6041216c4b9c311d09d0e21b4cb59faa047
4
+ data.tar.gz: 9080286b94f6d929467214fe2beb1e4cbfcf69ac
5
5
  SHA512:
6
- metadata.gz: b77178d4e4749b679702d11dd9024d545c4574311d1e31c1c79b2604219297fa21afa3e496ed20bb23bb94abb3609ccb74e98173e77282ff10de3da8e55d9b9a
7
- data.tar.gz: 3aeda119efcdb4abb7ca7e245dab96e684133bf7556430aad99803730eb530b14738606485e0125c5a4dad2a56278b90ea8282e157a8ae07fb60fef95fb74f3d
6
+ metadata.gz: 1bb13c785e02643ee9a9f511f875fd96eb3d6cf0765b412546e7d0a89aaa04b8e46700700fa58ee47de02ad8ef9b1ac79ea37be6fabd895d74544d5b5a3d59f5
7
+ data.tar.gz: 6f00a69f1245900b8b1b88dfa7208b0416681fdd87157831c0c7f1415ee02bfb106b3c4e5b997aadeb7bc86cc79aca7dfc4e0c1cb92a94fee927ac292bc7caf5
data/.gitignore CHANGED
@@ -18,3 +18,4 @@ tmp
18
18
  .rspec-local
19
19
  .ruby-version
20
20
  _site
21
+ .rspec
@@ -1,7 +1,10 @@
1
1
  language: ruby
2
2
  rvm:
3
+ - 2.1.0
3
4
  - 2.0.0
4
5
  - 1.9.3
5
6
  - 1.9.2
6
- - rbx-19mode
7
- script: "rake spec"
7
+ - rbx
8
+ script: bundle exec rake spec
9
+ cache: bundler
10
+ bundler_args: --without cucumber
@@ -2,9 +2,42 @@
2
2
 
3
3
  Reverse Chronological Order:
4
4
 
5
- ## `3.0.1` (Not yet released)
6
-
7
- * capify' not listed as executable (@leehambley)
5
+ ## `3.1.0`
6
+
7
+ Breaking changes:
8
+
9
+ * `deploy:restart` task **is no longer run by default**.
10
+ From this version, developers who restart the app on each deploy need to declare it in their deploy flow (eg `after 'deploy:publishing', 'deploy:restart'`).
11
+
12
+ Please, check https://github.com/capistrano/capistrano/commit/4e6523e1f50707499cf75eb53dce37a89528a9b0 for more information. (@kirs)
13
+
14
+ * Minor changes
15
+ * Tasks that used `linked_dirs` and `linked_files` now run on all roles, not just app roles (@mikespokefire)
16
+ * Tasks `deploy:linked_dirs`, `deploy:make_linked_dirs`, `deploy:linked_files`, `deploy:cleanup_rollback`,
17
+ `deploy:log_revision` and `deploy:revert_release` now use `release_roles()` not `roles()` meaning that they
18
+ will only run on servers where the `no_release` property is not falsy. (@leehambley)
19
+ * Fixed bug when `deploy:cleanup` was executed twice by default (@kirs)
20
+ * Config location can now be changed with `deploy_config_path` and `stage_config_path` options (@seenmyfate)
21
+ * `no_release` option is now available (@seenmyfate)
22
+ * Raise an error if developer tries to define `:all` role, which is reserved (@kirs)
23
+ * `deploy:fallback` hook was added to add some custom behaviour on failed deploy (@seenmyfate)
24
+ * Correctly infer namespace in task enhancements (@seenmyfate)
25
+ * Add SHA to revision log (@blackxored)
26
+ * Allow configuration of multiple servers with same hostname but different ports (@rsslldnphy)
27
+ * Add command line option to control role filtering (@andytinycat)
28
+ * Make use of recent changes in Rake to over-ride the application name (@shime)
29
+ * Readme corrections (@nathanstitt)
30
+ * Allow roles to be fetched with a variable containing an array (@seenmyfate)
31
+ * Improve console (@jage)
32
+ * Add ability to filter tasks to specific servers (host filtering). (@andytinycat)
33
+ * Add a command line option to control role filter (`--roles`) (@andytinycat)
34
+ * Use an SCM object with a pluggable strategy (@coffeeaddict)
35
+
36
+ Big thanks to @Kriechi for his help.
37
+
38
+ ## `3.0.1`
39
+
40
+ * `capify` not listed as executable (@leehambley)
8
41
  * Confirm license as MIT (@leehambley)
9
42
  * Move the git ssh helper to application path (@mpapis)
10
43
 
@@ -0,0 +1,91 @@
1
+ ## CONTRIBUTING
2
+
3
+ **The issue tracker is intended exclusively for things that are genuine bugs,
4
+ or improvements to the code.**
5
+
6
+ If you have a user support query, or you suspect that you might just be holding
7
+ it wrong, drop us a line at [the mailing list]() or on [StackOverflow](). The
8
+ mailing list is moderated to cut down on spam, so please be patient, if you use
9
+ StackOverflow, make sure to tag your post with "Capistrano". (Not forgetting
10
+ any other tags which might relate, rvm, rbenv, Ubuntu, etc.)
11
+
12
+ Wherever you post please be sure to include the version of Capistrano you are
13
+ using, which versions of any plugins (*capistrano-rvm*, *capistrano-bundler*,
14
+ etc.). Proper logs are vital, if you need to redact them, go ahead, but be
15
+ careful not to remove anything important. Please take care to format logs and
16
+ code correctly, ideally wrapped to a sane line length, and in a mono spaced
17
+ font. This all helps us to gather a clear understanding of what is going wrong.
18
+
19
+ **If you really think that you found a bug, or want to enquire about a feature,
20
+ or send us a patch to add a feature, or fix a bug, please keep a few things in
21
+ mind:**
22
+
23
+ ## When Submitting An Issue:
24
+
25
+ If you think there's a bug, please make sure it's really a bug in Capistrano.
26
+ As Capistrano sits on the (sometimes rough) edges between SSH, Git, the
27
+ network, Ruby, RVM, rbenv, chruby, Bundler, your Linux distribution, countless
28
+ shell configuration files on your end, and the server… there's a good chance
29
+ the problem lies somewhere else.
30
+
31
+ Please make sure you have reviewed the FAQs at http://www.capistranorb.com/.
32
+
33
+ It's really important to include as much information as possible, versions of
34
+ everything involved, anything weird you might be doing that might be having
35
+ side effects, include as much as you can in a [GitHub
36
+ Gist](https://gist.github.com/) and link that from the issue, with tools such
37
+ as Gist, we can link to individual lines and help work out what is going wrong.
38
+
39
+ If you are an experienced Ruby programmer, take a few minutes to get our test
40
+ suite running, and do what you can to get a test case written that fails, from
41
+ there we can understand exactly what it takes to reproduce the issue (as it's
42
+ documented with code)
43
+
44
+ ## When Requesting a Feature:
45
+
46
+ We can't make everyone happy all of the time, and we've been around the block
47
+ well enough to know when something doesn't work well, or when your proposed fix
48
+ might impact other things.
49
+
50
+ We prefer to [start with
51
+ "no"](https://gettingreal.37signals.com/ch05_Start_With_No.php), and help you
52
+ find a better way to solve your problem, sometimes the solution is to [build
53
+ faster
54
+ horses](http://blog.cauvin.org/2010/07/henry-fords-faster-horse-quote.html),
55
+ sometimes the solution is to work around it in a neat way that you didn't know
56
+ existed.
57
+
58
+ Please don't be offended if we say no, and don't be afraid to fight your
59
+ corner, try and avoid being one of the [poisonous
60
+ people](https://www.youtube.com/watch?v=Q52kFL8zVoM)
61
+
62
+ ## Submitting A Pull Request:
63
+
64
+ Pull requests are awesome, and if they arrive with decent tests, and conform to
65
+ the guidelines below, we'll merge them in as soon as possible, we'll let you
66
+ know which release we're planning them for (we adhere to
67
+ [semver](http://semver.org/) so please don't be upset if we plan your changes
68
+ for a later release)
69
+
70
+ * The code is MIT licenced, your code will fall under the same license if we merge it.
71
+ * We can't merge it without a [good commit
72
+ message](http://robots.thoughtbot.com/5-useful-tips-for-a-better-commit-message).
73
+ If you do this right, Github will use the commit message as the body of your
74
+ pull request, double win.
75
+ * If you are referencing an improvement to an existing issue (if we have not
76
+ yet merged it )
77
+ * Add an entry to the `CHANGELOG` under the `### master` section, but please
78
+ don't mess with the version.
79
+ * If you add a new feature, please make sure to document it, open a
80
+ corresponding pull request in [the
81
+ documentation](https://github.com/capistrano/documentation) and mention the
82
+ code change pull request over there, and Github will link everything up. If
83
+ it's a simple feature, or a new variable, or something changed, it may be
84
+ appropriate simply to document it in the generated `Capfile` or `deploy.rb`, or
85
+ in the `README`
86
+ * Take care to squash your commit into one single commit with a good message, it
87
+ saves us a lot of work in maintaining the CHANGELOG if we can generate it from
88
+ the commit messages between the release tags!
89
+ * Tests! It's tricky to test some parts of Capistrano, but do your best, it
90
+ might just serve as a starting point for us to build a reliable test on top of,
91
+ and help us understand where you are coming from.
data/Gemfile CHANGED
@@ -2,3 +2,12 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in capistrano.gemspec
4
4
  gemspec
5
+
6
+ group :cucumber do
7
+ gem 'kuroko'
8
+ gem 'cucumber'
9
+ end
10
+
11
+ platforms :rbx do
12
+ gem 'rubysl', '~> 2.0'
13
+ end
data/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
  Add this line to your application's Gemfile:
10
10
 
11
11
  ``` ruby
12
- gem 'capistrano', '~> 3.0.0'
12
+ gem 'capistrano', '~> 3.0.1'
13
13
  ```
14
14
 
15
15
  And then execute:
@@ -65,7 +65,7 @@ server 'example.org', roles: [:db, :workers]
65
65
  desc "Report Uptimes"
66
66
  task :uptime do
67
67
  on roles(:all) do |host|
68
- info "Host #{host} (#{host.roles.join(', ')}):\t#{capture(:uptime)}"
68
+ info "Host #{host} (#{host.roles.to_a.join(', ')}):\t#{capture(:uptime)}"
69
69
  end
70
70
  end
71
71
  ```
@@ -91,7 +91,7 @@ after :finishing, :notify do
91
91
  end
92
92
  ```
93
93
 
94
- If it makes sense for your use-case (often, that means *generating a file*)
94
+ If it makes sense for your use case (often, that means *generating a file*)
95
95
  the Rake prerequisite mechanism can be used:
96
96
 
97
97
  ``` ruby
@@ -126,9 +126,9 @@ This method is widely used.
126
126
  ``` ruby
127
127
  desc "Ask about breakfast"
128
128
  task :breakfast do
129
- breakfast = ask(:breakfast, "What would you like your colleagues to get you for breakfast?")
129
+ ask(:breakfast, "pancakes")
130
130
  on roles(:all) do |h|
131
- execute "echo \"$(whoami) wants #{breakfast} for breakfast!\" | wall"
131
+ execute "echo \"$(whoami) wants #{fetch(:breakfast)} for breakfast!\""
132
132
  end
133
133
  end
134
134
  ```
@@ -184,7 +184,7 @@ DEBUG [9ce34809] leehambley pts/0 2013-06-13 17:11 (port-11262.pppoe.wtn
184
184
 
185
185
  ## A word about PTYs
186
186
 
187
- There is a configuration option which asks the backend driver to as the remote host
187
+ There is a configuration option which asks the backend driver to ask the remote host
188
188
  to assign the connection a *pty*. A *pty* is a pseudo-terminal, which in effect means
189
189
  *tell the backend that this is an **interactive** session*. This is normally a bad idea.
190
190
 
@@ -200,7 +200,7 @@ or at least they are being used incorrectly.
200
200
  Whilst, especially in the case of language runtimes (Ruby, Node, Python and friends in
201
201
  particular) there is a temptation to run multiple versions in parallel on a single server
202
202
  and to switch between them using environmental variables, this is an anti-pattern, and
203
- symptomatic of bad design (i.e. you're testing a second version of Ruby in production because
203
+ symptomatic of bad design (e.g. you're testing a second version of Ruby in production because
204
204
  your company lacks the infrastructure to test this in a staging environment).
205
205
 
206
206
  ## Configuration
@@ -210,9 +210,7 @@ The following variables are settable:
210
210
  | Variable Name | Description | Notes |
211
211
  |:---------------------:|----------------------------------------------------------------------|-----------------------------------------------------------------|
212
212
  | `:repo_url` | The URL of your Git repository | file://, https://, or ssh:// are all supported |
213
- | `:git_https_username` | The (optional) username for accessing your Git repository over HTTPS | if this is an SSH connection, this setting will have no effect. |
214
- | `:git_https_password` | The (optional) password for accessing your Git repository over HTTPS | if this is an SSH connection, this setting will have no effect. |
215
- | `:tmp_dir` | The (optional) temp directory that will be used (default: /tmp) | if you have a shared web host, this setting may need to be set (i.e. /home/user/tmp/capistrano). |
213
+ | `:tmp_dir` | The (optional) temp directory that will be used (default: /tmp) | if you have a shared web host, this setting may need to be set (i.e. /home/user/tmp/capistrano). |
216
214
 
217
215
  __Support removed__ for following variables:
218
216
 
@@ -223,7 +221,7 @@ __Support removed__ for following variables:
223
221
  ## SSHKit
224
222
 
225
223
  [SSHKit](https://github.com/leehambley/sshkit) is the driver for SSH
226
- connections behind the scenes in Capistrano, depending how deep you dig, you
224
+ connections behind the scenes in Capistrano. Depending on how deep you dig, you
227
225
  might run into interfaces that come directly from SSHKit (the configuration is
228
226
  a good example).
229
227
 
@@ -19,19 +19,16 @@ Gem::Specification.new do |gem|
19
19
 
20
20
  gem.licenses = ['MIT']
21
21
 
22
- gem.post_install_message = "If you're updating Capistrano from 2.x.x, we recommend you to read the upgrade guide: http://www.capistranorb.com/documentation/upgrading/"
22
+ gem.post_install_message = <<eos
23
+ Capistrano 3.1 has some breaking changes, like `deploy:restart` callback should be added manually to your deploy.rb. Please, check the CHANGELOG: http://goo.gl/SxB0lr
23
24
 
24
- #gem.signing_key = '/Volumes/SD Card/leehambley-private_key.pem'
25
- #gem.cert_chain = ['capistrano-public_cert.pem', 'leehambley-public_cert.pem']
25
+ If you're upgrading Capistrano from 2.x, we recommend to read the upgrade guide: http://goo.gl/4536kB
26
+ eos
26
27
 
27
- gem.add_dependency 'sshkit', '>= 0.0.23'
28
+ gem.add_dependency 'sshkit', '~> 1.3'
28
29
  gem.add_dependency 'rake', '>= 10.0.0'
29
30
  gem.add_dependency 'i18n'
30
31
 
31
32
  gem.add_development_dependency 'rspec'
32
33
  gem.add_development_dependency 'mocha'
33
- gem.add_development_dependency 'vagrant', '~> 1.0.7'
34
- gem.add_development_dependency 'kuroko'
35
- gem.add_development_dependency 'cucumber'
36
-
37
34
  end
@@ -0,0 +1,15 @@
1
+ Feature: The path to the configuration can be changed, removing the need to
2
+ follow Ruby/Rails conventions
3
+
4
+ Background:
5
+ Given a test app with the default configuration
6
+ And servers with the roles app and web
7
+
8
+ Scenario: Deploying with configuration in default location
9
+ When I run "cap test"
10
+ Then the task is successful
11
+
12
+ Scenario: Deploying with configuration in a custom location
13
+ But the configuration is in a custom location
14
+ When I run "cap test"
15
+ Then the task is successful
@@ -34,6 +34,7 @@ Feature: Deploy
34
34
  Then the task will be successful
35
35
 
36
36
  Scenario: Creating a release
37
+ Given I run cap "deploy:check:directories"
37
38
  When I run cap "git:create_release" as part of a release
38
39
  Then the repo is cloned
39
40
  And the release is created
@@ -0,0 +1,17 @@
1
+ Feature: Deploy failure
2
+
3
+ Background:
4
+ Given a test app with the default configuration
5
+ And a custom task that will simulate a failure
6
+ And a custom task to run in the event of a failure
7
+ And servers with the roles app and web
8
+
9
+ Scenario: Triggering the custom task
10
+ When I run cap "deploy:starting"
11
+ But an error is raised
12
+ Then the failure task will not run
13
+
14
+ Scenario: Triggering the custom task
15
+ When I run cap "deploy"
16
+ But an error is raised
17
+ Then the failure task will run
@@ -88,3 +88,22 @@ end
88
88
  Then(/^it will not recreate the file$/) do
89
89
  #
90
90
  end
91
+
92
+ Then(/^the task is successful$/) do
93
+ expect(@success).to be_true
94
+ end
95
+
96
+ Then(/^the failure task will run$/) do
97
+ failed = TestApp.shared_path.join('failed')
98
+ run_vagrant_command(test_file_exists(failed))
99
+ end
100
+
101
+ Then(/^the failure task will not run$/) do
102
+ failed = TestApp.shared_path.join('failed')
103
+ !run_vagrant_command(test_file_exists(failed))
104
+ end
105
+
106
+ When(/^an error is raised$/) do
107
+ error = TestApp.shared_path.join('fail')
108
+ run_vagrant_command(test_file_exists(error))
109
+ end
@@ -1,8 +1,12 @@
1
1
  When(/^I run cap "(.*?)"$/) do |task|
2
- TestApp.cap(task)
2
+ @success = TestApp.cap(task)
3
3
  end
4
4
 
5
5
  When(/^I run cap "(.*?)" as part of a release$/) do |task|
6
6
  TestApp.cap("deploy:new_release_path #{task}")
7
7
  end
8
8
 
9
+ When(/^I run "(.*?)"$/) do |command|
10
+ @success = TestApp.run(command)
11
+ end
12
+
@@ -23,3 +23,16 @@ Given(/^a custom task to generate a file$/) do
23
23
  TestApp.copy_task_to_test_app('spec/support/tasks/database.cap')
24
24
  end
25
25
 
26
+ Given(/^the configuration is in a custom location$/) do
27
+ TestApp.move_configuration_to_custom_location('app')
28
+ end
29
+
30
+ Given(/^a custom task that will simulate a failure$/) do
31
+ safely_remove_file(TestApp.shared_path.join('failed'))
32
+ TestApp.copy_task_to_test_app('spec/support/tasks/fail.cap')
33
+ end
34
+
35
+ Given(/^a custom task to run in the event of a failure$/) do
36
+ safely_remove_file(TestApp.shared_path.join('failed'))
37
+ TestApp.copy_task_to_test_app('spec/support/tasks/failed.cap')
38
+ end
@@ -15,6 +15,10 @@ module RemoteCommandHelpers
15
15
  def exists?(type, path)
16
16
  %{[ -#{type} "#{path}" ] && echo "#{path} exists." || echo "Error: #{path} does not exist."}
17
17
  end
18
+
19
+ def safely_remove_file(path)
20
+ run_vagrant_command("rm #{test_file}") rescue Vagrant::Errors::VagrantError
21
+ end
18
22
  end
19
23
 
20
24
  World(RemoteCommandHelpers)
@@ -3,22 +3,24 @@ module Capistrano
3
3
 
4
4
  def initialize
5
5
  super
6
- @name = "cap"
7
6
  @rakefiles = %w{capfile Capfile capfile.rb Capfile.rb} << capfile
8
7
  end
9
8
 
9
+ def name
10
+ "cap"
11
+ end
12
+
10
13
  def run
11
14
  Rake.application = self
12
15
  super
13
16
  end
14
17
 
15
18
  def sort_options(options)
16
- options.push(version,dry_run)
19
+ options.push(version, roles, dry_run, hostfilter)
17
20
  super
18
21
  end
19
22
 
20
23
  def load_rakefile
21
- @name = 'cap'
22
24
  super
23
25
  end
24
26
 
@@ -30,8 +32,25 @@ module Capistrano
30
32
  end
31
33
  end
32
34
 
35
+ def exit_because_of_exception(ex)
36
+ if deploying?
37
+ exit_deploy_because_of_exception(ex)
38
+ else
39
+ super
40
+ end
41
+ end
42
+
33
43
  private
34
44
 
45
+ def load_imports
46
+ if options.show_tasks
47
+ invoke 'load:defaults'
48
+ Dir[deploy_config_path, stage_definitions].each { |f| add_import f }
49
+ end
50
+
51
+ super
52
+ end
53
+
35
54
  # allows the `cap install` task to load without a capfile
36
55
  def capfile
37
56
  File.expand_path(File.join(File.dirname(__FILE__),'..','Capfile'))
@@ -55,6 +74,25 @@ module Capistrano
55
74
  }
56
75
  ]
57
76
  end
77
+
78
+ def roles
79
+ ['--roles ROLES', '-r',
80
+ "Filter command to only apply to these roles (separate multiple roles with a comma)",
81
+ lambda { |value|
82
+ Configuration.env.set(:filter, :roles => value.split(","))
83
+ }
84
+ ]
85
+ end
86
+
87
+ def hostfilter
88
+ ['--hosts HOSTS', '-z',
89
+ "Filter command to only apply to these hosts (separate multiple hosts with a comma)",
90
+ lambda { |value|
91
+ Configuration.env.set(:filter, :hosts => value.split(","))
92
+ }
93
+ ]
94
+ end
95
+
58
96
  end
59
97
 
60
98
  end