capistrano 3.1.0 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +25 -2
  4. data/CONTRIBUTING.md +3 -1
  5. data/README.md +57 -13
  6. data/features/configuration.feature +13 -0
  7. data/features/step_definitions/assertions.rb +4 -0
  8. data/features/step_definitions/cap_commands.rb +1 -1
  9. data/features/step_definitions/setup.rb +8 -4
  10. data/lib/capistrano/application.rb +5 -8
  11. data/lib/capistrano/configuration.rb +6 -4
  12. data/lib/capistrano/configuration/server.rb +5 -1
  13. data/lib/capistrano/defaults.rb +1 -1
  14. data/lib/capistrano/dsl.rb +0 -11
  15. data/lib/capistrano/dsl/paths.rb +1 -0
  16. data/lib/capistrano/dsl/stages.rb +0 -3
  17. data/lib/capistrano/dsl/task_enhancements.rb +4 -2
  18. data/lib/capistrano/git.rb +5 -1
  19. data/lib/capistrano/hg.rb +4 -0
  20. data/lib/capistrano/i18n.rb +1 -0
  21. data/lib/capistrano/scm.rb +16 -4
  22. data/lib/capistrano/svn.rb +38 -0
  23. data/lib/capistrano/tasks/deploy.rake +25 -6
  24. data/lib/capistrano/tasks/git.rake +12 -2
  25. data/lib/capistrano/tasks/hg.rake +9 -0
  26. data/lib/capistrano/tasks/svn.rake +52 -0
  27. data/lib/capistrano/templates/Capfile +1 -1
  28. data/lib/capistrano/templates/deploy.rb.erb +1 -1
  29. data/lib/capistrano/templates/stage.rb.erb +20 -14
  30. data/lib/capistrano/version.rb +1 -1
  31. data/spec/integration/dsl_spec.rb +7 -5
  32. data/spec/lib/capistrano/configuration/server_spec.rb +9 -9
  33. data/spec/lib/capistrano/configuration/servers_spec.rb +12 -6
  34. data/spec/lib/capistrano/configuration_spec.rb +42 -0
  35. data/spec/lib/capistrano/git_spec.rb +1 -1
  36. data/spec/lib/capistrano/svn_spec.rb +69 -0
  37. data/spec/support/tasks/{database.cap → database.rake} +0 -0
  38. data/spec/support/tasks/{fail.cap → fail.rake} +0 -0
  39. data/spec/support/tasks/{failed.cap → failed.rake} +0 -0
  40. data/spec/support/test_app.rb +9 -2
  41. metadata +12 -9
  42. data/capistrano-public_cert.pem +0 -22
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3783d6041216c4b9c311d09d0e21b4cb59faa047
4
- data.tar.gz: 9080286b94f6d929467214fe2beb1e4cbfcf69ac
3
+ metadata.gz: 59f8fb6442e27e32704d86292e1e22a6c67daa61
4
+ data.tar.gz: 7ecf7b387a1c3cbf2c0bc2685e3ec6b6a1336d9b
5
5
  SHA512:
6
- metadata.gz: 1bb13c785e02643ee9a9f511f875fd96eb3d6cf0765b412546e7d0a89aaa04b8e46700700fa58ee47de02ad8ef9b1ac79ea37be6fabd895d74544d5b5a3d59f5
7
- data.tar.gz: 6f00a69f1245900b8b1b88dfa7208b0416681fdd87157831c0c7f1415ee02bfb106b3c4e5b997aadeb7bc86cc79aca7dfc4e0c1cb92a94fee927ac292bc7caf5
6
+ metadata.gz: 4a03a957b09b8b2c28f29e8f3bb81f099fdaca0f4cec6d1741591a82a24617e36416c3e8aa2ba3ff29ae6b9cb612162d8e13bb32bfb04f816fe86736aed5ca12
7
+ data.tar.gz: 383b341deed499908407ade22a77432bef14797a70247c5e1fc48b19103cd20e3fe4ba5b23256b5b8155ae754b4e5626cd20b2a6aa09a4bab98faffa7358872a
data/.gitignore CHANGED
@@ -19,3 +19,4 @@ tmp
19
19
  .ruby-version
20
20
  _site
21
21
  .rspec
22
+ *.swp
@@ -2,8 +2,27 @@
2
2
 
3
3
  Reverse Chronological Order:
4
4
 
5
+ ## master
6
+
7
+ https://github.com/capistrano/capistrano/compare/v3.2.0...HEAD
8
+
9
+ ## `3.2.0``
10
+
11
+ The changelog entries here are incomplete, because many authors choose not to
12
+ be credited for their work, check the tag comparison link for Github.
13
+
14
+ https://github.com/capistrano/capistrano/compare/v3.1.0...v3.2.0
15
+
16
+ * Minor changes:
17
+ * Added `keys` method to Server properties to allow introspection of automatically added
18
+ properties.
19
+ * Compatibility with Rake 10.2.0 - `ensure_task` is now added to `@top_level_tasks` as a string. (@dmarkow)
20
+ * Amended the git check command, "ls-remote", to use "-h", limiting the list to refs/heads
21
+
5
22
  ## `3.1.0`
6
23
 
24
+ https://github.com/capistrano/capistrano/compare/v3.0.1...v3.1.0
25
+
7
26
  Breaking changes:
8
27
 
9
28
  * `deploy:restart` task **is no longer run by default**.
@@ -20,7 +39,7 @@ Breaking changes:
20
39
  * Config location can now be changed with `deploy_config_path` and `stage_config_path` options (@seenmyfate)
21
40
  * `no_release` option is now available (@seenmyfate)
22
41
  * 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)
42
+ * `deploy:failed` hook was added to add some custom behaviour on failed deploy (@seenmyfate)
24
43
  * Correctly infer namespace in task enhancements (@seenmyfate)
25
44
  * Add SHA to revision log (@blackxored)
26
45
  * Allow configuration of multiple servers with same hostname but different ports (@rsslldnphy)
@@ -37,12 +56,16 @@ Big thanks to @Kriechi for his help.
37
56
 
38
57
  ## `3.0.1`
39
58
 
59
+ https://github.com/capistrano/capistrano/compare/v3.0.0...v3.0.1
60
+
40
61
  * `capify` not listed as executable (@leehambley)
41
62
  * Confirm license as MIT (@leehambley)
42
63
  * Move the git ssh helper to application path (@mpapis)
43
64
 
44
65
  ## `3.0.0`
45
66
 
67
+ https://github.com/capistrano/capistrano/compare/2.15.5...v3.0.0
68
+
46
69
  If you are coming here to wonder why your Capfile doesn't work anymore, please
47
70
  vendor lock your Capistrano at 2.x, whichever version was working for you
48
71
  until today.
@@ -79,7 +102,7 @@ extension the trusted contributors and IRC regulars) were able to test for.
79
102
  There's a more extensive post about my failure to be able to keep up with the
80
103
  demands of maintaining v2 whilst trying to build something which is appropriate
81
104
  for the current landscape. If you are affected by the unsupported 2 branch,
82
- please contact me (Lee Hambley) to dicsuss how my company can help support you.
105
+ please contact me (Lee Hambley) to discuss how my company can help support you.
83
106
  Otherwise, please try v3, we're sure you'll like it, and the code is designed
84
107
  to be so simple that anyone can work on it.
85
108
 
@@ -4,11 +4,13 @@
4
4
  or improvements to the code.**
5
5
 
6
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
7
+ it wrong, drop us a line at [the mailing list](https://groups.google.com/forum/#!forum/capistrano), [StackOverflow](http://stackoverflow.com/questions/tagged/capistrano) or at [CodersClan](http://codersclan.net/?repo_id=325&source=contributing). The
8
8
  mailing list is moderated to cut down on spam, so please be patient, if you use
9
9
  StackOverflow, make sure to tag your post with "Capistrano". (Not forgetting
10
10
  any other tags which might relate, rvm, rbenv, Ubuntu, etc.)
11
11
 
12
+ If you have an urgent problem you can use [CodersClan](http://codersclan.net/?repo_id=325&source=contributing) to solve your problem quickly. CodersClan has a community of Capistrano experts dedicated to solve code problems for bounties.
13
+
12
14
  Wherever you post please be sure to include the version of Capistrano you are
13
15
  using, which versions of any plugins (*capistrano-rvm*, *capistrano-bundler*,
14
16
  etc.). Proper logs are vital, if you need to redact them, go ahead, but be
data/README.md CHANGED
@@ -1,15 +1,23 @@
1
- # Capistrano [![Build Status](https://travis-ci.org/capistrano/capistrano.png?branch=v3)](https://travis-ci.org/capistrano/capistrano) [![Code Climate](https://codeclimate.com/github/capistrano/capistrano.png)](https://codeclimate.com/github/capistrano/capistrano)
1
+ # Capistrano [![Build Status](https://travis-ci.org/capistrano/capistrano.png?branch=v3)](https://travis-ci.org/capistrano/capistrano) [![Code Climate](https://codeclimate.com/github/capistrano/capistrano.png)](https://codeclimate.com/github/capistrano/capistrano) <a href="http://codersclan.net/?repo_id=325&source=small"><img src="http://www.codersclan.net/gs_button/?repo_id=325&size=small" width="69"></a>
2
2
 
3
3
  ## Requirements
4
4
 
5
5
  * Ruby >= 1.9 (JRuby and C-Ruby/YARV are supported)
6
6
 
7
+ ## Support
8
+
9
+ Need help with getting Capistrano up and running? Got a code problem you want to get solved quickly?
10
+
11
+ Get <a href="http://codersclan.net/?repo_id=325&source=link">Capistrano support on CodersClan.</a>
12
+
13
+ <a href="http://codersclan.net/?repo_id=325&source=big"><img src="http://www.codersclan.net/gs_button/?repo_id=325" width="200"></a>
14
+
7
15
  ## Installation
8
16
 
9
17
  Add this line to your application's Gemfile:
10
18
 
11
19
  ``` ruby
12
- gem 'capistrano', '~> 3.0.1'
20
+ gem 'capistrano', '~> 3.1.0'
13
21
  ```
14
22
 
15
23
  And then execute:
@@ -65,11 +73,19 @@ server 'example.org', roles: [:db, :workers]
65
73
  desc "Report Uptimes"
66
74
  task :uptime do
67
75
  on roles(:all) do |host|
76
+ execute :any_command, "with args", :here, "and here"
68
77
  info "Host #{host} (#{host.roles.to_a.join(', ')}):\t#{capture(:uptime)}"
69
78
  end
70
79
  end
71
80
  ```
72
81
 
82
+ **Note**:
83
+
84
+ **tl;dr**: `execute(:bundle, :install)` and `execute('bundle install')` don't behave identically!
85
+
86
+ `execute()` has a subtle behaviour. When calling `within './directory' { execute(:bundle, :install) }` for example, the first argument to `execute()` is a *Stringish* with ***no whitespace***. This allows the command to pass through the [SSHKit::CommandMap](https://github.com/capistrano/sshkit#the-command-map) which enables a number of powerful features.
87
+
88
+ When the first argument to `execute()` contains whitespace, for example `within './directory' { execute('bundle install') }` (or when using a heredoc), neither Capistrano, nor SSHKit can reliably predict how it should be shell escaped, and thus cannot perform any context, or command mapping, that means that the `within(){}` (as well as `with()`, `as()`, etc) have no effect. There have been a few attempts to resolve this, but we don't consider it a bug although we acknowledge that it might be a little counter intuitive.
73
89
  ## Before / After
74
90
 
75
91
  Where calling on the same task name, executed in order of inclusion
@@ -110,12 +126,14 @@ end
110
126
  The final way to call out to other tasks is to simply `invoke()` them:
111
127
 
112
128
  ``` ruby
113
- task :one do
114
- on roles(:all) { info "One" }
115
- end
116
- task :two do
117
- invoke :one
118
- on roles(:all) { info "Two" }
129
+ namespace :example do
130
+ task :one do
131
+ on roles(:all) { info "One" }
132
+ end
133
+ task :two do
134
+ invoke "example:one"
135
+ on roles(:all) { info "Two" }
136
+ end
119
137
  end
120
138
  ```
121
139
 
@@ -136,12 +154,21 @@ end
136
154
  Perfect, who needs telephones.
137
155
 
138
156
 
157
+ ## Using password authentication
158
+
159
+ Password authentication can be done via `set` and `ask` in your deploy environment file (e.g.: config/environments/production.rb)
160
+
161
+ ```ruby
162
+ set :password, ask('Server password:', nil)
163
+ server 'server.domain.com', user: 'ssh_user_name', port: 22, password: fetch(:password), roles: %w{web app db}
164
+ ```
165
+
139
166
  ## Running local tasks
140
167
 
141
168
  Local tasks can be run by replacing `on` with `run_locally`
142
169
 
143
170
  ``` ruby
144
- desc "Notify service of deployment"
171
+ desc 'Notify service of deployment'
145
172
  task :notify do
146
173
  run_locally do
147
174
  with rails_env: :development do
@@ -151,6 +178,21 @@ task :notify do
151
178
  end
152
179
  ```
153
180
 
181
+ Of course, you can always just use standard ruby syntax to run things locally
182
+ ``` ruby
183
+ desc 'Notify service of deployment'
184
+ task :notify do
185
+ %x('RAILS_ENV=development bundle exec rake "service:notify"')
186
+ end
187
+ ```
188
+
189
+ Alternatively you could use the rake syntax
190
+ ``` ruby
191
+ desc "Notify service of deployment"
192
+ task :notify do
193
+ sh 'RAILS_ENV=development bundle exec rake "service:notify"'
194
+ end
195
+ ```
154
196
  ## Console
155
197
 
156
198
  **Note:** Here be dragons. The console is very immature, but it's much more
@@ -186,7 +228,7 @@ DEBUG [9ce34809] leehambley pts/0 2013-06-13 17:11 (port-11262.pppoe.wtn
186
228
 
187
229
  There is a configuration option which asks the backend driver to ask the remote host
188
230
  to assign the connection a *pty*. A *pty* is a pseudo-terminal, which in effect means
189
- *tell the backend that this is an **interactive** session*. This is normally a bad idea.
231
+ *tell the backend that this is an __interactive__ session*. This is normally a bad idea.
190
232
 
191
233
  Most of the differences are best explained by [this page](https://github.com/sstephenson/rbenv/wiki/Unix-shell-initialization) from the author of *rbenv*.
192
234
 
@@ -209,7 +251,9 @@ The following variables are settable:
209
251
 
210
252
  | Variable Name | Description | Notes |
211
253
  |:---------------------:|----------------------------------------------------------------------|-----------------------------------------------------------------|
212
- | `:repo_url` | The URL of your Git repository | file://, https://, or ssh:// are all supported |
254
+ | `:repo_url` | The URL of your scm repository (git, hg, svn) | file://, https://, ssh://, or svn+ssh:// are all supported |
255
+ | `:branch` | The branch you wish to deploy | This only has meaning for git and hg repos, to specify the branch of an svn repo, set `:repo_url` to the branch location. |
256
+ | `:scm` | The source control system used | `:git`, `:hg`, `:svn` are currently supported |
213
257
  | `: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). |
214
258
 
215
259
  __Support removed__ for following variables:
@@ -225,9 +269,9 @@ connections behind the scenes in Capistrano. Depending on how deep you dig, you
225
269
  might run into interfaces that come directly from SSHKit (the configuration is
226
270
  a good example).
227
271
 
228
- ## Licence
272
+ ## License
229
273
 
230
- The MIT License (MIT)
274
+ MIT License (MIT)
231
275
 
232
276
  Copyright (c) 2012-2013 Tom Clements, Lee Hambley
233
277
 
@@ -13,3 +13,16 @@ Feature: The path to the configuration can be changed, removing the need to
13
13
  But the configuration is in a custom location
14
14
  When I run "cap test"
15
15
  Then the task is successful
16
+
17
+ Scenario: Show install task with configuration in default location
18
+ When I run "cap -T"
19
+ Then the task is successful
20
+ And contains "install" in the output
21
+
22
+ Scenario: Show install task with configuration in a custom location
23
+ And config stage file has line "desc 'Special Task'"
24
+ And config stage file has line "task :special_stage_task"
25
+ But the configuration is in a custom location
26
+ When I run "cap -T"
27
+ Then the task is successful
28
+ And contains "special_stage_task" in the output
@@ -107,3 +107,7 @@ When(/^an error is raised$/) do
107
107
  error = TestApp.shared_path.join('fail')
108
108
  run_vagrant_command(test_file_exists(error))
109
109
  end
110
+
111
+ Then(/contains "(.*?)" in the output/) do |expected|
112
+ expect(@output).to include(expected)
113
+ end
@@ -7,6 +7,6 @@ When(/^I run cap "(.*?)" as part of a release$/) do |task|
7
7
  end
8
8
 
9
9
  When(/^I run "(.*?)"$/) do |command|
10
- @success = TestApp.run(command)
10
+ @success, @output = TestApp.run(command)
11
11
  end
12
12
 
@@ -3,7 +3,7 @@ Given(/^a test app with the default configuration$/) do
3
3
  end
4
4
 
5
5
  Given(/^servers with the roles app and web$/) do
6
- vagrant_cli_command('up')
6
+ vagrant_cli_command('up') rescue nil
7
7
  end
8
8
 
9
9
  Given(/^a required file$/) do
@@ -20,7 +20,11 @@ Given(/^the file does not exist$/) do
20
20
  end
21
21
 
22
22
  Given(/^a custom task to generate a file$/) do
23
- TestApp.copy_task_to_test_app('spec/support/tasks/database.cap')
23
+ TestApp.copy_task_to_test_app('spec/support/tasks/database.rake')
24
+ end
25
+
26
+ Given(/config stage file has line "(.*?)"/) do |line|
27
+ TestApp.append_to_deploy_file(line)
24
28
  end
25
29
 
26
30
  Given(/^the configuration is in a custom location$/) do
@@ -29,10 +33,10 @@ end
29
33
 
30
34
  Given(/^a custom task that will simulate a failure$/) do
31
35
  safely_remove_file(TestApp.shared_path.join('failed'))
32
- TestApp.copy_task_to_test_app('spec/support/tasks/fail.cap')
36
+ TestApp.copy_task_to_test_app('spec/support/tasks/fail.rake')
33
37
  end
34
38
 
35
39
  Given(/^a custom task to run in the event of a failure$/) do
36
40
  safely_remove_file(TestApp.shared_path.join('failed'))
37
- TestApp.copy_task_to_test_app('spec/support/tasks/failed.cap')
41
+ TestApp.copy_task_to_test_app('spec/support/tasks/failed.rake')
38
42
  end
@@ -20,20 +20,16 @@ module Capistrano
20
20
  super
21
21
  end
22
22
 
23
- def load_rakefile
24
- super
25
- end
26
-
27
23
  def top_level_tasks
28
24
  if tasks_without_stage_dependency.include?(@top_level_tasks.first)
29
25
  @top_level_tasks
30
26
  else
31
- @top_level_tasks.unshift(ensure_stage)
27
+ @top_level_tasks.unshift(ensure_stage.to_s)
32
28
  end
33
29
  end
34
30
 
35
31
  def exit_because_of_exception(ex)
36
- if deploying?
32
+ if respond_to?(:deploying?) && deploying?
37
33
  exit_deploy_because_of_exception(ex)
38
34
  else
39
35
  super
@@ -45,6 +41,7 @@ module Capistrano
45
41
  def load_imports
46
42
  if options.show_tasks
47
43
  invoke 'load:defaults'
44
+ set(:stage, '')
48
45
  Dir[deploy_config_path, stage_definitions].each { |f| add_import f }
49
46
  end
50
47
 
@@ -79,7 +76,7 @@ module Capistrano
79
76
  ['--roles ROLES', '-r',
80
77
  "Filter command to only apply to these roles (separate multiple roles with a comma)",
81
78
  lambda { |value|
82
- Configuration.env.set(:filter, :roles => value.split(","))
79
+ Configuration.env.set(:filter, roles: value.split(","))
83
80
  }
84
81
  ]
85
82
  end
@@ -88,7 +85,7 @@ module Capistrano
88
85
  ['--hosts HOSTS', '-z',
89
86
  "Filter command to only apply to these hosts (separate multiple hosts with a comma)",
90
87
  lambda { |value|
91
- Configuration.env.set(:filter, :hosts => value.split(","))
88
+ Configuration.env.set(:filter, hosts: value.split(","))
92
89
  }
93
90
  ]
94
91
  end
@@ -30,11 +30,10 @@ module Capistrano
30
30
 
31
31
  def fetch(key, default=nil, &block)
32
32
  value = fetch_for(key, default, &block)
33
- if value.respond_to?(:call)
34
- set(key, value.call)
35
- else
36
- value
33
+ while callable_without_parameters?(value)
34
+ value = set(key, value.call)
37
35
  end
36
+ return value
38
37
  end
39
38
 
40
39
  def role(name, hosts, options={})
@@ -99,5 +98,8 @@ module Capistrano
99
98
  end
100
99
  end
101
100
 
101
+ def callable_without_parameters?(x)
102
+ x.respond_to?(:call) && ( !x.respond_to?(:arity) || x.arity == 0)
103
+ end
102
104
  end
103
105
  end
@@ -51,7 +51,7 @@ module Capistrano
51
51
  end
52
52
 
53
53
  def matches?(other)
54
- hostname == other.hostname && port == other.port
54
+ user == other.user && hostname == other.hostname && port == other.port
55
55
  end
56
56
 
57
57
  private
@@ -86,6 +86,10 @@ module Capistrano
86
86
  @roles ||= Set.new
87
87
  end
88
88
 
89
+ def keys
90
+ @properties.keys
91
+ end
92
+
89
93
  def method_missing(key, value=nil)
90
94
  if value
91
95
  set(lvalue(key), value)
@@ -1,6 +1,6 @@
1
1
  set :scm, :git
2
2
  set :branch, :master
3
- set :deploy_to, "/var/www/#{fetch(:application)}"
3
+ set :deploy_to, -> { "/var/www/#{fetch(:application)}" }
4
4
  set :tmp_dir, "/tmp"
5
5
 
6
6
  set :default_env, {}
@@ -26,12 +26,6 @@ module Capistrano
26
26
  execute :sudo, *args
27
27
  end
28
28
 
29
- def capturing_revisions(&block)
30
- set :previous_revision, fetch_revision
31
- block.call
32
- set :current_revision, fetch_revision
33
- end
34
-
35
29
  def revision_log_message
36
30
  fetch(:revision_log_message,
37
31
  t(:revision_log_message,
@@ -53,11 +47,6 @@ module Capistrano
53
47
  def lock(locked_version)
54
48
  VersionValidator.new(locked_version).verify
55
49
  end
56
-
57
- private
58
- def fetch_revision
59
- capture("cd #{repo_path} && git rev-parse --short HEAD")
60
- end
61
50
  end
62
51
  end
63
52
  self.extend Capistrano::DSL
@@ -24,6 +24,7 @@ module Capistrano
24
24
  end
25
25
 
26
26
  def set_release_path(timestamp=now)
27
+ set(:release_timestamp, timestamp)
27
28
  set(:release_path, releases_path.join(timestamp))
28
29
  end
29
30
 
@@ -6,9 +6,6 @@ module Capistrano
6
6
  Dir[stage_definitions].map { |f| File.basename(f, '.rb') }
7
7
  end
8
8
 
9
- def infer_stages_from_stage_files
10
- end
11
-
12
9
  def stage_definitions
13
10
  stage_config_path.join('*.rb')
14
11
  end
@@ -2,14 +2,16 @@ module Capistrano
2
2
  module TaskEnhancements
3
3
  def before(task, prerequisite, *args, &block)
4
4
  prerequisite = Rake::Task.define_task(prerequisite, *args, &block) if block_given?
5
- Rake::Task[task].enhance [prerequisite]
5
+ Rake::Task[task].enhance do
6
+ Rake::Task[prerequisite].invoke(*args)
7
+ end
6
8
  end
7
9
 
8
10
  def after(task, post_task, *args, &block)
9
11
  Rake::Task.define_task(post_task, *args, &block) if block_given?
10
12
  post_task = Rake::Task[post_task]
11
13
  Rake::Task[task].enhance do
12
- post_task.invoke
14
+ post_task.invoke(args)
13
15
  end
14
16
  end
15
17
 
@@ -18,7 +18,7 @@ class Capistrano::Git < Capistrano::SCM
18
18
  end
19
19
 
20
20
  def check
21
- test! :git, :'ls-remote', repo_url
21
+ test! :git, :'ls-remote -h', repo_url
22
22
  end
23
23
 
24
24
  def clone
@@ -32,5 +32,9 @@ class Capistrano::Git < Capistrano::SCM
32
32
  def release
33
33
  git :archive, fetch(:branch), '| tar -x -C', release_path
34
34
  end
35
+
36
+ def fetch_revision
37
+ context.capture(:git, "rev-parse #{fetch(:branch)}")
38
+ end
35
39
  end
36
40
  end
@@ -29,5 +29,9 @@ class Capistrano::Hg < Capistrano::SCM
29
29
  def release
30
30
  hg "archive", release_path, "--rev", fetch(:branch)
31
31
  end
32
+
33
+ def fetch_revision
34
+ context.capture(:hg, "log --rev #{fetch(:branch)} --template \"{node}\n\"")
35
+ end
32
36
  end
33
37
  end
@@ -15,6 +15,7 @@ en = {
15
15
  keeping_releases: 'Keeping %{keep_releases} of %{releases} deployed releases on %{host}',
16
16
  no_old_releases: 'No old releases (keeping newest %{keep_releases}) on %{host}',
17
17
  linked_file_does_not_exist: 'linked file %{file} does not exist on %{host}',
18
+ cannot_rollback: 'There are no older releases to rollback to',
18
19
  mirror_exists: "The repository mirror is at %{at}",
19
20
  revision_log_message: 'Branch %{branch} (at %{sha}) deployed as release %{release} by %{user}',
20
21
  rollback_log_message: '%{user} rolled back to release %{release}',
@@ -28,17 +28,17 @@ module Capistrano
28
28
  context.test *args
29
29
  end
30
30
 
31
- # The repository URL accoriding to the context
31
+ # The repository URL according to the context
32
32
  def repo_url
33
33
  context.repo_url
34
34
  end
35
35
 
36
- # The repository path accoriding to the context
36
+ # The repository path according to the context
37
37
  def repo_path
38
38
  context.repo_path
39
39
  end
40
40
 
41
- # The release path accoriding to the context
41
+ # The release path according to the context
42
42
  def release_path
43
43
  context.release_path
44
44
  end
@@ -53,7 +53,7 @@ module Capistrano
53
53
 
54
54
  # @abstract
55
55
  #
56
- # Your implementation should check the existance of a cache repository on
56
+ # Your implementation should check the existence of a cache repository on
57
57
  # the deployment target
58
58
  #
59
59
  # @return [Boolean]
@@ -112,5 +112,17 @@ module Capistrano
112
112
  "Your SCM strategy module should provide a #release method"
113
113
  )
114
114
  end
115
+
116
+ # @abstract
117
+ #
118
+ # Identify the SHA of the commit that will be deployed. This will most likely involve SshKit's capture method.
119
+ #
120
+ # @return void
121
+ #
122
+ def fetch_revision
123
+ raise NotImplementedError.new(
124
+ "Your SCM strategy module should provide a #fetch_revision method"
125
+ )
126
+ end
115
127
  end
116
128
  end
@@ -0,0 +1,38 @@
1
+ load File.expand_path("../tasks/svn.rake", __FILE__)
2
+
3
+ require 'capistrano/scm'
4
+
5
+ class Capistrano::Svn < Capistrano::SCM
6
+
7
+ # execute svn in context with arguments
8
+ def svn(*args)
9
+ args.unshift(:svn)
10
+ context.execute *args
11
+ end
12
+
13
+ module DefaultStrategy
14
+ def test
15
+ test! " [ -d #{repo_path}/.svn ] "
16
+ end
17
+
18
+ def check
19
+ test! :svn, :info, repo_url
20
+ end
21
+
22
+ def clone
23
+ svn :checkout, repo_url, repo_path
24
+ end
25
+
26
+ def update
27
+ svn :update
28
+ end
29
+
30
+ def release
31
+ svn :export, '.', release_path
32
+ end
33
+
34
+ def fetch_revision
35
+ context.capture(:svn, "log -r HEAD -q | tail -n 2 | head -n 1 | sed s/\ \|.*/''/")
36
+ end
37
+ end
38
+ end
@@ -2,10 +2,12 @@ namespace :deploy do
2
2
 
3
3
  task :starting do
4
4
  invoke 'deploy:check'
5
+ invoke 'deploy:set_previous_revision'
5
6
  end
6
7
 
7
8
  task :updating => :new_release_path do
8
9
  invoke "#{scm}:create_release"
10
+ invoke "deploy:set_current_revision"
9
11
  invoke 'deploy:symlink:shared'
10
12
  end
11
13
 
@@ -185,18 +187,35 @@ namespace :deploy do
185
187
  set_release_path
186
188
  end
187
189
 
188
- task :last_release_path do
190
+ task :rollback_release_path do
189
191
  on release_roles(:all) do
190
- last_release = capture(:ls, '-xr', releases_path).split[1]
192
+ releases = capture(:ls, '-xr', releases_path).split
193
+ if releases.count < 2
194
+ error t(:cannot_rollback)
195
+ exit 1
196
+ end
197
+ last_release = releases[1]
191
198
  set_release_path(last_release)
199
+ set(:rollback_timestamp, last_release)
192
200
  end
193
201
  end
194
202
 
195
- task :rollback_release_path do
203
+ desc "Place a REVISION file with the current revision SHA in the current release path"
204
+ task :set_current_revision do
205
+ invoke "#{scm}:set_current_revision"
196
206
  on release_roles(:all) do
197
- last_release = capture(:ls, '-xr', releases_path).split[1]
198
- set_release_path(last_release)
199
- set(:rollback_timestamp, last_release)
207
+ within release_path do
208
+ execute :echo, "\"#{fetch(:current_revision)}\" >> REVISION"
209
+ end
210
+ end
211
+ end
212
+
213
+ task :set_previous_revision do
214
+ on release_roles(:all) do
215
+ target = release_path.join('REVISION')
216
+ if test "[ -f #{target} ]"
217
+ set(:previous_revision, capture(:cat, target, '2>/dev/null'))
218
+ end
200
219
  end
201
220
  end
202
221
 
@@ -49,7 +49,7 @@ namespace :git do
49
49
  task update: :'git:clone' do
50
50
  on release_roles :all do
51
51
  within repo_path do
52
- capturing_revisions do
52
+ with fetch(:git_environmental_variables) do
53
53
  strategy.update
54
54
  end
55
55
  end
@@ -67,5 +67,15 @@ namespace :git do
67
67
  end
68
68
  end
69
69
  end
70
- end
71
70
 
71
+ desc 'Determine the revision that will be deployed'
72
+ task :set_current_revision do
73
+ on release_roles :all do
74
+ within repo_path do
75
+ with fetch(:git_environmental_variables) do
76
+ set :current_revision, strategy.fetch_revision
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -40,4 +40,13 @@ namespace :hg do
40
40
  end
41
41
  end
42
42
  end
43
+
44
+ desc 'Determine the revision that will be deployed'
45
+ task :set_current_revision do
46
+ on release_roles :all do
47
+ within repo_path do
48
+ set :current_revision, strategy.fetch_revision
49
+ end
50
+ end
51
+ end
43
52
  end
@@ -0,0 +1,52 @@
1
+ namespace :svn do
2
+ def strategy
3
+ @strategy ||= Capistrano::Svn.new(self, fetch(:svn_strategy, Capistrano::Svn::DefaultStrategy))
4
+ end
5
+
6
+ desc 'Check that the repo is reachable'
7
+ task :check do
8
+ on release_roles :all do
9
+ strategy.check
10
+ end
11
+ end
12
+
13
+ desc 'Clone the repo to the cache'
14
+ task :clone do
15
+ on release_roles :all do
16
+ if strategy.test
17
+ info t(:mirror_exists, at: repo_path)
18
+ else
19
+ within deploy_path do
20
+ strategy.clone
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ desc 'Pull changes from the remote repo'
27
+ task :update => :'svn:clone' do
28
+ on release_roles :all do
29
+ within repo_path do
30
+ strategy.update
31
+ end
32
+ end
33
+ end
34
+
35
+ desc 'Copy repo to releases'
36
+ task :create_release => :'svn:update' do
37
+ on release_roles :all do
38
+ within repo_path do
39
+ strategy.release
40
+ end
41
+ end
42
+ end
43
+
44
+ desc 'Determine the revision that will be deployed'
45
+ task :set_current_revision do
46
+ on release_roles :all do
47
+ within repo_path do
48
+ set :current_revision, strategy.fetch_revision
49
+ end
50
+ end
51
+ end
52
+ end
@@ -22,4 +22,4 @@ require 'capistrano/deploy'
22
22
  # require 'capistrano/rails/migrations'
23
23
 
24
24
  # Loads custom tasks from `lib/capistrano/tasks' if you have any defined.
25
- Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }
25
+ Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
@@ -5,7 +5,7 @@ set :application, 'my_app_name'
5
5
  set :repo_url, 'git@example.com:me/my_repo.git'
6
6
 
7
7
  # Default branch is :master
8
- # ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }
8
+ # ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }.call
9
9
 
10
10
  # Default deploy_to directory is /var/www/my_app
11
11
  # set :deploy_to, '/var/www/my_app'
@@ -1,31 +1,38 @@
1
1
  # Simple Role Syntax
2
2
  # ==================
3
- # Supports bulk-adding hosts to roles, the primary
4
- # server in each group is considered to be the first
5
- # unless any hosts have the primary property set.
6
- # Don't declare `role :all`, it's a meta role
3
+ # Supports bulk-adding hosts to roles, the primary server in each group
4
+ # is considered to be the first unless any hosts have the primary
5
+ # property set. Don't declare `role :all`, it's a meta role.
6
+
7
7
  role :app, %w{deploy@example.com}
8
8
  role :web, %w{deploy@example.com}
9
9
  role :db, %w{deploy@example.com}
10
10
 
11
+
11
12
  # Extended Server Syntax
12
13
  # ======================
13
- # This can be used to drop a more detailed server
14
- # definition into the server list. The second argument
15
- # something that quacks like a hash can be used to set
16
- # extended properties on the server.
14
+ # This can be used to drop a more detailed server definition into the
15
+ # server list. The second argument is a, or duck-types, Hash and is
16
+ # used to set extended properties on the server.
17
+
17
18
  server 'example.com', user: 'deploy', roles: %w{web app}, my_property: :my_value
18
19
 
19
- # you can set custom ssh options
20
- # it's possible to pass any option but you need to keep in mind that net/ssh understand limited list of options
21
- # you can see them in [net/ssh documentation](http://net-ssh.github.io/net-ssh/classes/Net/SSH.html#method-c-start)
22
- # set it globally
20
+
21
+ # Custom SSH Options
22
+ # ==================
23
+ # You may pass any option but keep in mind that net/ssh understands a
24
+ # limited set of options, consult[net/ssh documentation](http://net-ssh.github.io/net-ssh/classes/Net/SSH.html#method-c-start).
25
+ #
26
+ # Global options
27
+ # --------------
23
28
  # set :ssh_options, {
24
29
  # keys: %w(/home/rlisowski/.ssh/id_rsa),
25
30
  # forward_agent: false,
26
31
  # auth_methods: %w(password)
27
32
  # }
28
- # and/or per server
33
+ #
34
+ # And/or per server (overrides global)
35
+ # ------------------------------------
29
36
  # server 'example.com',
30
37
  # user: 'user_name',
31
38
  # roles: %w{web app},
@@ -36,4 +43,3 @@ server 'example.com', user: 'deploy', roles: %w{web app}, my_property: :my_value
36
43
  # auth_methods: %w(publickey password)
37
44
  # # password: 'please use keys'
38
45
  # }
39
- # setting per server overrides global ssh_options
@@ -1,3 +1,3 @@
1
1
  module Capistrano
2
- VERSION = "3.1.0"
2
+ VERSION = "3.2.0"
3
3
  end
@@ -201,16 +201,18 @@ describe Capistrano::DSL do
201
201
  describe 'when defining a host using a combination of the `server` and `role` syntax' do
202
202
 
203
203
  before do
204
- dsl.server 'example1.com:1234', roles: %w{web}, active: true
204
+ dsl.server 'db@example1.com:1234', roles: %w{db}, active: true
205
+ dsl.server 'root@example1.com:1234', roles: %w{web}, active: true
205
206
  dsl.server 'example1.com:5678', roles: %w{web}, active: true
207
+ dsl.role :app, %w{deployer@example1.com:1234}
206
208
  dsl.role :app, %w{example1.com:5678}
207
209
  end
208
210
 
209
211
  describe 'fetching all servers' do
210
- subject { dsl.roles(:all).map { |server| "#{server.hostname}:#{server.port}" } }
212
+ subject { dsl.roles(:all).map { |server| "#{server.user}@#{server.hostname}:#{server.port}" } }
211
213
 
212
- it 'creates a server instance for each unique host:port combination' do
213
- expect(subject).to eq %w{example1.com:1234 example1.com:5678}
214
+ it 'creates a server instance for each unique user@host:port combination' do
215
+ expect(subject).to eq %w{db@example1.com:1234 root@example1.com:1234 @example1.com:5678 deployer@example1.com:1234}
214
216
  end
215
217
  end
216
218
 
@@ -220,7 +222,7 @@ describe Capistrano::DSL do
220
222
  end
221
223
 
222
224
  it 'roles defined using the `role` syntax are included' do
223
- expect(dsl.roles(:app)).to have(1).items
225
+ expect(dsl.roles(:app)).to have(2).items
224
226
  end
225
227
  end
226
228
 
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  module Capistrano
4
4
  class Configuration
5
5
  describe Server do
6
- let(:server) { Server.new('hostname:1234') }
6
+ let(:server) { Server.new('root@hostname:1234') }
7
7
 
8
8
  describe 'adding a role' do
9
9
  subject { server.add_role(:test) }
@@ -35,23 +35,23 @@ module Capistrano
35
35
  describe 'comparing identity' do
36
36
  subject { server.matches? Server[hostname] }
37
37
 
38
- context 'with the same hostname' do
39
- let(:hostname) { 'hostname:1234' }
38
+ context 'with the same user, hostname and port' do
39
+ let(:hostname) { 'root@hostname:1234' }
40
40
  it { should be_true }
41
41
  end
42
42
 
43
- context 'with the same hostname and a user' do
44
- let(:hostname) { 'user@hostname:1234' }
45
- it { should be_true }
43
+ context 'with a different user' do
44
+ let(:hostname) { 'deployer@hostname:1234' }
45
+ it { should be_false }
46
46
  end
47
47
 
48
- context 'with the same hostname but different port' do
49
- let(:hostname) { 'hostname:5678' }
48
+ context 'with a different port' do
49
+ let(:hostname) { 'root@hostname:5678' }
50
50
  it { should be_false }
51
51
  end
52
52
 
53
53
  context 'with a different hostname' do
54
- let(:hostname) { 'otherserver' }
54
+ let(:hostname) { 'root@otherserver:1234' }
55
55
  it { should be_false }
56
56
  end
57
57
  end
@@ -104,12 +104,18 @@ module Capistrano
104
104
  expect(servers.roles_for([:app]).first.hostname).to eq '1'
105
105
  expect(servers.roles_for([:web]).first.hostname).to eq '1'
106
106
  expect(servers.roles_for([:all]).first.properties.test).to eq :value
107
- end
108
-
109
- it 'can accept multiple servers with the same hostname but different ports' do
110
- servers.add_host('2', roles: [:app, 'web'], test: :value, port: 12)
111
- servers.add_host('2', roles: [:app, 'web'], test: :value, port: 34)
112
- expect(servers.count { |server| server.hostname == '2' }).to eq 2
107
+ expect(servers.roles_for([:all]).first.properties.keys).to eq [:test]
108
+ end
109
+
110
+ it 'can accept multiple servers with the same hostname but different ports or users' do
111
+ servers.add_host('1', roles: [:app, 'web'], test: :value, port: 12)
112
+ servers.add_host('1', roles: [:app, 'web'], test: :value, port: 34)
113
+ servers.add_host('1', roles: [:app, 'web'], test: :value, user: 'root')
114
+ servers.add_host('1', roles: [:app, 'web'], test: :value, user: 'deployer')
115
+ servers.add_host('1', roles: [:app, 'web'], test: :value, user: 'root', port: 34)
116
+ servers.add_host('1', roles: [:app, 'web'], test: :value, user: 'deployer', port: 34)
117
+ servers.add_host('1', roles: [:app, 'web'], test: :value, user: 'deployer', port: 56)
118
+ servers.should have(8).items
113
119
  end
114
120
  end
115
121
 
@@ -61,6 +61,48 @@ module Capistrano
61
61
  end
62
62
  end
63
63
 
64
+ context 'value is a lambda' do
65
+ subject { config.fetch(:key, lambda { :lambda } ) }
66
+ it 'calls the lambda' do
67
+ expect(subject).to eq :lambda
68
+ end
69
+ end
70
+
71
+ context 'value inside proc inside a proc' do
72
+ subject { config.fetch(:key, Proc.new { Proc.new { "some value" } } ) }
73
+ it 'calls all procs and lambdas' do
74
+ expect(subject).to eq "some value"
75
+ end
76
+ end
77
+
78
+ context 'value inside lambda inside a lambda' do
79
+ subject { config.fetch(:key, lambda { lambda { "some value" } } ) }
80
+ it 'calls all procs and lambdas' do
81
+ expect(subject).to eq "some value"
82
+ end
83
+ end
84
+
85
+ context 'value inside lambda inside a proc' do
86
+ subject { config.fetch(:key, Proc.new { lambda { "some value" } } ) }
87
+ it 'calls all procs and lambdas' do
88
+ expect(subject).to eq "some value"
89
+ end
90
+ end
91
+
92
+ context 'value inside proc inside a lambda' do
93
+ subject { config.fetch(:key, lambda { Proc.new { "some value" } } ) }
94
+ it 'calls all procs and lambdas' do
95
+ expect(subject).to eq "some value"
96
+ end
97
+ end
98
+
99
+ context 'lambda with parameters' do
100
+ subject { config.fetch(:key, lambda { |c| c }).call(42) }
101
+ it 'is returned as a lambda' do
102
+ expect(subject).to eq 42
103
+ end
104
+ end
105
+
64
106
  context 'block is passed to fetch' do
65
107
  subject { config.fetch(:key, :default) { fail 'we need this!' } }
66
108
 
@@ -31,7 +31,7 @@ module Capistrano
31
31
  describe "#check" do
32
32
  it "should test the repo url" do
33
33
  context.expects(:repo_url).returns(:url)
34
- context.expects(:test).with(:git, :'ls-remote', :url).returns(true)
34
+ context.expects(:test).with(:git, :'ls-remote -h', :url).returns(true)
35
35
 
36
36
  subject.check
37
37
  end
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+
3
+ require 'capistrano/svn'
4
+
5
+ module Capistrano
6
+ describe Svn do
7
+ let(:context) { Class.new.new }
8
+ subject { Capistrano::Svn.new(context, Capistrano::Svn::DefaultStrategy) }
9
+
10
+ describe "#svn" do
11
+ it "should call execute svn in the context, with arguments" do
12
+ context.expects(:execute).with(:svn, :init)
13
+ subject.svn(:init)
14
+ end
15
+ end
16
+ end
17
+
18
+ describe Svn::DefaultStrategy do
19
+ let(:context) { Class.new.new }
20
+ subject { Capistrano::Svn.new(context, Capistrano::Svn::DefaultStrategy) }
21
+
22
+ describe "#test" do
23
+ it "should call test for repo HEAD" do
24
+ context.expects(:repo_path).returns("/path/to/repo")
25
+ context.expects(:test).with " [ -d /path/to/repo/.svn ] "
26
+
27
+ subject.test
28
+ end
29
+ end
30
+
31
+ describe "#check" do
32
+ it "should test the repo url" do
33
+ context.expects(:repo_url).returns(:url)
34
+ context.expects(:test).with(:svn, :info, :url).returns(true)
35
+
36
+ subject.check
37
+ end
38
+ end
39
+
40
+ describe "#clone" do
41
+ it "should run svn checkout" do
42
+ context.expects(:repo_url).returns(:url)
43
+ context.expects(:repo_path).returns(:path)
44
+
45
+ context.expects(:execute).with(:svn, :checkout, :url, :path)
46
+
47
+ subject.clone
48
+ end
49
+ end
50
+
51
+ describe "#update" do
52
+ it "should run svn update" do
53
+ context.expects(:execute).with(:svn, :update)
54
+
55
+ subject.update
56
+ end
57
+ end
58
+
59
+ describe "#release" do
60
+ it "should run svn export" do
61
+ context.expects(:release_path).returns(:path)
62
+
63
+ context.expects(:execute).with(:svn, :export, '.', :path)
64
+
65
+ subject.release
66
+ end
67
+ end
68
+ end
69
+ end
@@ -57,6 +57,12 @@ module TestApp
57
57
  end
58
58
  end
59
59
 
60
+ def append_to_deploy_file(config)
61
+ File.open(test_stage_path, 'a') do |file|
62
+ file.write config + "\n"
63
+ end
64
+ end
65
+
60
66
  def prepend_to_capfile(config)
61
67
  current_capfile = File.read(capfile)
62
68
  File.open(capfile, 'w') do |file|
@@ -78,10 +84,11 @@ module TestApp
78
84
  end
79
85
 
80
86
  def run(command)
87
+ output = nil
81
88
  Dir.chdir(test_app_path) do
82
- %x[#{command}]
89
+ output = %x[#{command}]
83
90
  end
84
- $?.success?
91
+ [$?.success?, output]
85
92
  end
86
93
 
87
94
  def stage
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: 3.1.0
4
+ version: 3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Clements
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-01-14 00:00:00.000000000 Z
12
+ date: 2014-04-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sshkit
@@ -102,7 +102,6 @@ files:
102
102
  - Rakefile
103
103
  - bin/cap
104
104
  - bin/capify
105
- - capistrano-public_cert.pem
106
105
  - capistrano.gemspec
107
106
  - features/configuration.feature
108
107
  - features/deploy.feature
@@ -140,12 +139,14 @@ files:
140
139
  - lib/capistrano/install.rb
141
140
  - lib/capistrano/scm.rb
142
141
  - lib/capistrano/setup.rb
142
+ - lib/capistrano/svn.rb
143
143
  - lib/capistrano/tasks/console.rake
144
144
  - lib/capistrano/tasks/deploy.rake
145
145
  - lib/capistrano/tasks/framework.rake
146
146
  - lib/capistrano/tasks/git.rake
147
147
  - lib/capistrano/tasks/hg.rake
148
148
  - lib/capistrano/tasks/install.rake
149
+ - lib/capistrano/tasks/svn.rake
149
150
  - lib/capistrano/templates/Capfile
150
151
  - lib/capistrano/templates/deploy.rb.erb
151
152
  - lib/capistrano/templates/stage.rb.erb
@@ -165,15 +166,16 @@ files:
165
166
  - spec/lib/capistrano/git_spec.rb
166
167
  - spec/lib/capistrano/hg_spec.rb
167
168
  - spec/lib/capistrano/scm_spec.rb
169
+ - spec/lib/capistrano/svn_spec.rb
168
170
  - spec/lib/capistrano/version_validator_spec.rb
169
171
  - spec/lib/capistrano_spec.rb
170
172
  - spec/spec_helper.rb
171
173
  - spec/support/.gitignore
172
174
  - spec/support/Vagrantfile
173
175
  - spec/support/matchers.rb
174
- - spec/support/tasks/database.cap
175
- - spec/support/tasks/fail.cap
176
- - spec/support/tasks/failed.cap
176
+ - spec/support/tasks/database.rake
177
+ - spec/support/tasks/fail.rake
178
+ - spec/support/tasks/failed.rake
177
179
  - spec/support/test_app.rb
178
180
  homepage: http://capistranorb.com/
179
181
  licenses:
@@ -227,14 +229,15 @@ test_files:
227
229
  - spec/lib/capistrano/git_spec.rb
228
230
  - spec/lib/capistrano/hg_spec.rb
229
231
  - spec/lib/capistrano/scm_spec.rb
232
+ - spec/lib/capistrano/svn_spec.rb
230
233
  - spec/lib/capistrano/version_validator_spec.rb
231
234
  - spec/lib/capistrano_spec.rb
232
235
  - spec/spec_helper.rb
233
236
  - spec/support/.gitignore
234
237
  - spec/support/Vagrantfile
235
238
  - spec/support/matchers.rb
236
- - spec/support/tasks/database.cap
237
- - spec/support/tasks/fail.cap
238
- - spec/support/tasks/failed.cap
239
+ - spec/support/tasks/database.rake
240
+ - spec/support/tasks/fail.rake
241
+ - spec/support/tasks/failed.rake
239
242
  - spec/support/test_app.rb
240
243
  has_rdoc:
@@ -1,22 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- MIIDkjCCAnqgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMRIwEAYDVQQDDAlnZW1t
3
- YXN0ZXIxHDAaBgoJkiaJk/IsZAEZFgxjYXBpc3RyYW5vcmIxEzARBgoJkiaJk/Is
4
- ZAEZFgNjb20wHhcNMTMwNjI4MTM0MzQ1WhcNMTQwNjI4MTM0MzQ1WjBHMRIwEAYD
5
- VQQDDAlnZW1tYXN0ZXIxHDAaBgoJkiaJk/IsZAEZFgxjYXBpc3RyYW5vcmIxEzAR
6
- BgoJkiaJk/IsZAEZFgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
7
- AQDnuMT+SoCTQoxEOma65Vf9ftibHTzfaZPGSNcheguiFa3/Mc69/xurtUa7bGY8
8
- ZyuJbd2pb4pqhx7PcVlByJnBQCmOHzZPzn6wVa5n4n8/VBccYcFNePdPj8+KK13x
9
- +97E6mjNZJtf4BZm4tZD6Ztyq90+mQ0WeoseYfYdm+ZJ9BNFdB2EHmTnh983MHMj
10
- WNn52ZC2pAHDRuxKAOj5yq8IZWA8B/IWNjMXQCJbM9eaH0+vVvquC2RyprpkfoqQ
11
- Xb7BJA2hftizHUMk4LOldNvy220GHjKL0Ot7tlGcD2DzaZNN0aPUfezz306ytsMp
12
- KDYYLbLcg63TPHFHu1fzyQG9AgMBAAGjgYgwgYUwCQYDVR0TBAIwADALBgNVHQ8E
13
- BAMCBLAwHQYDVR0OBBYEFEzXgfsvOB8Aw2b+Md3t3O9PUGZCMCUGA1UdEQQeMByB
14
- GmdlbW1hc3RlckBjYXBpc3RyYW5vcmIuY29tMCUGA1UdEgQeMByBGmdlbW1hc3Rl
15
- ckBjYXBpc3RyYW5vcmIuY29tMA0GCSqGSIb3DQEBBQUAA4IBAQCnS7Pcy/srhZCb
16
- TrUNkCTHI4QEURAWRNYFLL9TCCl3oyKkwW6aZxarpQbJK3Es99sugsKh/sKijOIE
17
- xhflvSNN59Zc/BETve1y0VktN+94GiQQ1F82SmRwmY2tJJD7C3jQ6Og6pX7eNBWZ
18
- W1su8leIv8sj3o5Vdn/Le1HKVXMakFICq9HdLnIH1jW2Brfthlc2ujAg0cOU58GC
19
- wNkME+L45pR9zggNpbBY23mlbAicPrsmybEdk9SOdaOCgxh+fyGx6Q2n0m5YAXgN
20
- KVoU0DazqHs6BVyJaajxht4kCpPDD1wUqCvwlOQtotdwD7CCGCPdcYgf6fAp4yQZ
21
- jC76QR6/
22
- -----END CERTIFICATE-----