capistrano 2.8.0 → 2.9.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.
@@ -0,0 +1,4 @@
1
+ rvm:
2
+ - 1.8.7
3
+ - 1.9.2
4
+ - ree
data/CHANGELOG CHANGED
@@ -1,3 +1,56 @@
1
+ ## 2.9.0 / September 24 2011
2
+
3
+ A vairly heavy release, including some new features which most of you won't
4
+ need, but power users have contributed, this also marks the beginning of the
5
+ end of the 2.x series, more information will follow in due course, but with
6
+ the proliferation of Bundler, and better ways to do deployment, we will be
7
+ introducing heavier changes to Capistrano to keep the tool current.
8
+
9
+ **Please note, following some reported problems with the asset pipeline code
10
+ being not found, remember Capistrano needs to be in your Gemfile, and as such
11
+ needs to be run with Bundler, otherwise you risk loading a system-wide version
12
+ of Capistrano who's behaviour might be different from that specified in your
13
+ Gemfile. This is also good practice because much of the deploy logic resides
14
+ in the Gem, and you wouldn't want that to change without your knowledge. Rails
15
+ applications include Cap in the Gemfile anyway, you should follow this
16
+ convention.**
17
+
18
+ * find_servers() will no longer raise if there are no servers, this behaviour
19
+ can be modified by way of the `:on_no_matching_servers` option. Thanks to
20
+ `@ppgengler`.
21
+
22
+ * Short Git SHA1 fragments are now supported in commands such as `cap deploy
23
+ -s revision=d7e99f` thanks to `@ndbroadbent`.
24
+
25
+ * One can now specify individual SCM commands by setting
26
+ `:scm_arguments_<command_name>`. Thanks to `@alextk`.
27
+
28
+ * Travis CI build now passes thanks to @andrew, build tested against MRI
29
+ `1.8.7`. `1.9.2` and `REE`.
30
+
31
+ * Support for Perforce labels, I don't know much about this, but I believe
32
+ it's much like deploying a Git tag, thanks to `@ak47`.
33
+
34
+ * Git SCM now correctly adheres to the `:scm_verbose` setting. Thanks
35
+ `@dubek`.
36
+
37
+ * `set()` can now be used to set a `false` value, previously this was a no-op.
38
+ Thanks to `@nilbus`.
39
+
40
+ * Support for Git 1.6x submodules, The Git SCM strategy now queries Git on the
41
+ server-side to ensure it supports the `--recursive` flag, if it doesn't then
42
+ it will fall back to using the long-hand. Many thanks to all those involved in
43
+ the discussion surrounding this topic, and to `@nilbus` for a beautifully
44
+ clean solution which doesn't hold us back.
45
+
46
+ * When using `:cached_copy` with Subversion, use `svn switch` to for more
47
+ reliable switching of branches/etc. Thanks to `@iGEL` for the patch that we
48
+ accepted finally, and to `@richmeyers` who also submitted a patch and
49
+ contributed to the discssion.
50
+
51
+ Other cleanups and minor improvements to the code and tests were committed by yours truly
52
+ (@leehambley), @maxim, @ak47 and @andrew).
53
+
1
54
  ## 2.8.0 / August 3 2011
2
55
 
3
56
  A short release, after the last. Announcing Rails 3.1 asset pipeline support.
data/Gemfile CHANGED
@@ -8,7 +8,7 @@ gemspec
8
8
  # are merged here.
9
9
  #
10
10
  group :development do
11
- gem 'rake'
11
+ gem 'rake', '0.8.7'
12
12
  gem 'ruby-debug', :platform => :mri_18
13
13
  gem 'ruby-debug19', :platform => :mri_19
14
14
  end
@@ -1,5 +1,9 @@
1
1
  ## Capistrano
2
2
 
3
+ [![Build
4
+ Status](https://secure.travis-ci.org/capistrano/capistrano.png)](http://travis-ci.org/capistrano/capistrano)
5
+
6
+
3
7
  Capistrano is a utility and framework for executing commands in parallel on
4
8
  multiple remote machines, via SSH. It uses a simple DSL (borrowed in part from
5
9
  [Rake](http://rake.rubyforge.org/)) that allows you to define _tasks_, which may
@@ -54,6 +58,19 @@ By default, the script will look for a file called one of `capfile` or
54
58
  "cap -h" to see all the available options and "cap -T" to see all the available
55
59
  tasks.
56
60
 
61
+ ## CONTRIBUTING:
62
+
63
+ * Fork Capistrano
64
+ * Create a topic branch - `git checkout -b my_branch`
65
+ * Rebase your branch so that all your changes are reflected in one
66
+ commit
67
+ * Push to your branch - `git push origin my_branch`
68
+ * Create a Pull Request from your branch, include as much documentation
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)
71
+ * That's it!
72
+
73
+
57
74
  ## LICENSE:
58
75
 
59
76
  Permission is hereby granted, free of charge, to any person obtaining
@@ -11,7 +11,6 @@ Gem::Specification.new do |s|
11
11
  s.homepage = "http://github.com/capistrano/capistrano"
12
12
  s.summary = %q{Capistrano - Welcome to easy deployment with Ruby over SSH}
13
13
  s.description = %q{Capistrano is a utility and framework for executing commands in parallel on multiple remote machines, via SSH.}
14
- s.date = %q{2011-03-22}
15
14
  s.files = `git ls-files`.split("\n")
16
15
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
16
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
@@ -54,13 +54,14 @@ module Capistrano
54
54
  filter_server_list(hosts.uniq)
55
55
  end
56
56
  else
57
- roles = role_list_from(ENV['ROLES'] || options[:roles] || self.roles.keys)
58
- roles = roles & Array(options[:roles]) if preserve_roles && !options[:roles].nil?
57
+ roles = role_list_from(ENV['ROLES'] || options[:roles] || self.roles.keys)
58
+ roles = roles & Array(options[:roles]) if preserve_roles && !options[:roles].nil?
59
59
 
60
60
  only = options[:only] || {}
61
61
  except = options[:except] || {}
62
62
 
63
- servers = roles.inject([]) { |list, role| list.concat(self.roles[role]) }
63
+ # If we don't have a def for a role it means its bogus, skip it so higher level can handle
64
+ servers = roles.inject([]) { |list, role| list.concat(self.roles[role] || []) }
64
65
  servers = servers.select { |server| only.all? { |key,value| server.options[key] == value } }
65
66
  servers = servers.reject { |server| except.any? { |key,value| server.options[key] == value } }
66
67
 
@@ -103,7 +104,6 @@ module Capistrano
103
104
  roles = build_list(roles)
104
105
  roles.map do |role|
105
106
  role = String === role ? role.strip.to_sym : role
106
- raise ArgumentError, "unknown role `#{role}'" unless self.roles.key?(role)
107
107
  role
108
108
  end
109
109
  end
@@ -163,9 +163,9 @@ module Capistrano
163
163
  # consideration the current mode ("normal" vs. "local").
164
164
  def variable(name, default = nil)
165
165
  if local? && configuration.exists?("local_#{name}".to_sym)
166
- return configuration["local_#{name}".to_sym] || default
166
+ return configuration["local_#{name}".to_sym].nil? ? default : configuration["local_#{name}".to_sym]
167
167
  else
168
- configuration[name] || default
168
+ configuration[name].nil? ? default : configuration[name]
169
169
  end
170
170
  end
171
171
 
@@ -186,8 +186,12 @@ module Capistrano
186
186
  variable(:repository)
187
187
  end
188
188
 
189
- def arguments
190
- variable(:scm_arguments)
189
+ def arguments(command = :all)
190
+ value = variable(:scm_arguments)
191
+ if value.is_a?(Hash)
192
+ value = value[command]
193
+ end
194
+ value
191
195
  end
192
196
  end
193
197
 
@@ -151,11 +151,12 @@ module Capistrano
151
151
  if false == variable(:git_submodules_recursive)
152
152
  execute << "#{git} submodule #{verbose} update --init"
153
153
  else
154
- execute << "#{git} submodule #{verbose} update --init --recursive"
154
+ execute << %Q(export GIT_RECURSIVE=$([ ! "`#{git} --version`" \\< "git version 1.6.5" ] && echo --recursive))
155
+ execute << "#{git} submodule #{verbose} update --init $GIT_RECURSIVE"
155
156
  end
156
157
  end
157
158
 
158
- execute.join(" && ").compact
159
+ execute.compact.join(" && ").gsub(/\s+/, ' ')
159
160
  end
160
161
 
161
162
  # An expensive export. Performs a checkout as above, then
@@ -194,7 +195,8 @@ module Capistrano
194
195
  if false == variable(:git_submodules_recursive)
195
196
  execute << "#{git} submodule #{verbose} update --init"
196
197
  else
197
- execute << "#{git} submodule #{verbose} update --init --recursive"
198
+ execute << %Q(export GIT_RECURSIVE=$([ ! "`#{git} --version`" \\< "git version 1.6.5" ] && echo --recursive))
199
+ execute << "#{git} submodule #{verbose} update --init $GIT_RECURSIVE"
198
200
  end
199
201
  end
200
202
 
@@ -232,6 +234,12 @@ module Capistrano
232
234
  break
233
235
  end
234
236
  end
237
+ return newrev if newrev =~ /^[0-9a-f]{40}$/
238
+
239
+ # If sha is not found on remote, try expanding from local repository
240
+ command = scm('rev-parse --revs-only', revision)
241
+ newrev = yield(command).to_s.strip
242
+
235
243
  raise "Unable to resolve revision for '#{revision}' on repository '#{repository}'." unless newrev =~ /^[0-9a-f]{40}$/
236
244
  return newrev
237
245
  end
@@ -274,9 +282,10 @@ module Capistrano
274
282
  # If verbose output is requested, return nil, otherwise return the
275
283
  # command-line switch for "quiet" ("-q").
276
284
  def verbose
277
- variable(:scm_verbose, true) ? "-q" : nil
285
+ variable(:scm_verbose) ? nil : "-q"
278
286
  end
279
287
  end
280
288
  end
281
289
  end
282
290
  end
291
+
@@ -1,9 +1,9 @@
1
1
  require 'capistrano/recipes/deploy/scm/base'
2
2
 
3
- # Notes:
3
+ # Notes:
4
4
  # no global verbose flag for scm_verbose
5
5
  # sync, checkout and export are just sync in p4
6
- #
6
+ #
7
7
  module Capistrano
8
8
  module Deploy
9
9
  module SCM
@@ -27,7 +27,7 @@ module Capistrano
27
27
  def checkout(revision, destination)
28
28
  p4_sync(revision, destination, p4sync_flags)
29
29
  end
30
-
30
+
31
31
  # Returns the command that will sync the given revision to the given
32
32
  # destination directory. The perforce client has a fixed destination so
33
33
  # the files must be copied from there to their intended resting place.
@@ -41,7 +41,7 @@ module Capistrano
41
41
  def export(revision, destination)
42
42
  p4_sync(revision, destination, p4sync_flags)
43
43
  end
44
-
44
+
45
45
  # Returns the command that will do an "p4 diff2" for the two revisions.
46
46
  def diff(from, to=head)
47
47
  scm authentication, :diff2, "-u -db", "//#{p4client}/...#{rev_no(from)}", "//#{p4client}/...#{rev_no(to)}"
@@ -72,11 +72,11 @@ module Capistrano
72
72
  raise Capistrano::Error, "scm_password (or p4passwd) is incorrect or unset"
73
73
  when /Can.t create a new user.*/i
74
74
  raise Capistrano::Error, "scm_username (or p4user) is incorrect or unset"
75
- when /Perforce client error\:/i
75
+ when /Perforce client error\:/i
76
76
  raise Capistrano::Error, "p4port is incorrect or unset"
77
77
  when /Client \'[\w\-\_\.]+\' unknown.*/i
78
78
  raise Capistrano::Error, "p4client is incorrect or unset"
79
- end
79
+ end
80
80
  end
81
81
 
82
82
  private
@@ -90,11 +90,11 @@ module Capistrano
90
90
  end
91
91
 
92
92
  # Returns the command that will sync the given revision to the given
93
- # destination directory with specific options. The perforce client has
94
- # a fixed destination so the files must be copied from there to their
95
- # intended resting place.
93
+ # destination directory with specific options. The perforce client has
94
+ # a fixed destination so the files must be copied from there to their
95
+ # intended resting place.
96
96
  def p4_sync(revision, destination, options="")
97
- scm authentication, :sync, options, "#{rev_no(revision)}", "&& cp -rf #{p4client_root} #{destination}"
97
+ scm authentication, :sync, options, "#{rev_no(revision)}", "&& cp -rf #{p4client_root} #{destination}"
98
98
  end
99
99
 
100
100
  def p4client
@@ -108,7 +108,7 @@ module Capistrano
108
108
  def p4user
109
109
  variable(:p4user) || variable(:scm_username)
110
110
  end
111
-
111
+
112
112
  def p4passwd
113
113
  variable(:p4passwd) || variable(:scm_password)
114
114
  end
@@ -120,16 +120,25 @@ module Capistrano
120
120
  def p4client_root
121
121
  variable(:p4client_root) || "`#{command} #{authentication} client -o | grep ^Root | cut -f2`"
122
122
  end
123
-
124
- def rev_no(revision)
123
+
124
+ def rev_no(revision)
125
+ if variable(:p4_label)
126
+ p4_label = if variable(:p4_label) =~ /\A@/
127
+ variable(:p4_label)
128
+ else
129
+ "@#{variable(:p4_label)}"
130
+ end
131
+ return p4_label
132
+ end
133
+
125
134
  case revision.to_s
126
135
  when "head"
127
136
  "#head"
128
- when /^\d+/
137
+ when /^\d+/
129
138
  "@#{revision}"
130
139
  else
131
140
  revision
132
- end
141
+ end
133
142
  end
134
143
  end
135
144
 
@@ -21,29 +21,29 @@ module Capistrano
21
21
  # Returns the command that will check out the given revision to the
22
22
  # given destination.
23
23
  def checkout(revision, destination)
24
- scm :checkout, arguments, verbose, authentication, "-r#{revision}", repository, destination
24
+ scm :checkout, arguments, arguments(:checkout), verbose, authentication, "-r#{revision}", repository, destination
25
25
  end
26
26
 
27
27
  # Returns the command that will do an "svn update" to the given
28
28
  # revision, for the working copy at the given destination.
29
29
  def sync(revision, destination)
30
- scm :update, arguments, verbose, authentication, "-r#{revision}", destination
30
+ scm :switch, arguments, verbose, authentication, "-r#{revision}", repository, destination
31
31
  end
32
32
 
33
33
  # Returns the command that will do an "svn export" of the given revision
34
34
  # to the given destination.
35
35
  def export(revision, destination)
36
- scm :export, arguments, verbose, authentication, "-r#{revision}", repository, destination
36
+ scm :export, arguments, arguments(:export), verbose, authentication, "-r#{revision}", repository, destination
37
37
  end
38
38
 
39
39
  # Returns the command that will do an "svn diff" for the two revisions.
40
40
  def diff(from, to=nil)
41
- scm :diff, repository, authentication, "-r#{from}:#{to || head}"
41
+ scm :diff, repository, arguments(:diff), authentication, "-r#{from}:#{to || head}"
42
42
  end
43
43
 
44
44
  # Returns an "svn log" command for the two revisions.
45
45
  def log(from, to=nil)
46
- scm :log, repository, authentication, "-r#{from}:#{to || head}"
46
+ scm :log, repository, arguments(:log), authentication, "-r#{from}:#{to || head}"
47
47
  end
48
48
 
49
49
  # Attempts to translate the given revision identifier to a "real"
@@ -52,7 +52,7 @@ module Capistrano
52
52
  # executed (svn info), and will extract the revision from the response.
53
53
  def query_revision(revision)
54
54
  return revision if revision =~ /^\d+$/
55
- command = scm(:info, arguments, repository, authentication, "-r#{revision}")
55
+ command = scm(:info, arguments, arguments(:info), repository, authentication, "-r#{revision}")
56
56
  result = yield(command)
57
57
  yaml = YAML.load(result)
58
58
  raise "tried to run `#{command}' and got unexpected result #{result.inspect}" unless Hash === yaml
@@ -86,13 +86,12 @@ module Capistrano
86
86
 
87
87
  if copy_exclude.any?
88
88
  logger.debug "processing exclusions..."
89
- if copy_exclude.any?
90
- copy_exclude.each do |pattern|
91
- delete_list = Dir.glob(File.join(destination, pattern), File::FNM_DOTMATCH)
92
- # avoid the /.. trap that deletes the parent directories
93
- delete_list.delete_if { |dir| dir =~ /\/\.\.$/ }
94
- FileUtils.rm_rf(delete_list.compact)
95
- end
89
+
90
+ copy_exclude.each do |pattern|
91
+ delete_list = Dir.glob(File.join(destination, pattern), File::FNM_DOTMATCH)
92
+ # avoid the /.. trap that deletes the parent directories
93
+ delete_list.delete_if { |dir| dir =~ /\/\.\.$/ }
94
+ FileUtils.rm_rf(delete_list.compact)
96
95
  end
97
96
  end
98
97
  end
@@ -4,7 +4,7 @@ module Capistrano
4
4
  class Version
5
5
 
6
6
  MAJOR = 2
7
- MINOR = 8
7
+ MINOR = 9
8
8
  PATCH = 0
9
9
 
10
10
  def self.to_s
@@ -205,6 +205,7 @@ class CommandTest < Test::Unit::TestCase
205
205
  new_channel = Proc.new do |times|
206
206
  ch = mock("channel")
207
207
  returns = [false] * (times-1)
208
+ ch.stubs(:to_ary)
208
209
  ch.stubs(:[]).with(:closed).returns(*(returns + [true]))
209
210
  ch.expects(:[]).with(:status).returns(0)
210
211
  ch
@@ -39,11 +39,11 @@ class ConfigurationServersTest < Test::Unit::TestCase
39
39
  assert_equal %w(web1 web2).sort, @config.find_servers_for_task(task).map { |s| s.host }.sort
40
40
  end
41
41
 
42
- def test_task_with_unknown_role_should_raise_exception
42
+ # NOTE Rather than throw an error, as it used to, we return an
43
+ # empty array so that if a task is okay with a missing role it can continue on
44
+ def test_task_with_unknown_role_should_return_empty_array
43
45
  task = new_task(:testing, @config, :roles => :bogus)
44
- assert_raises(ArgumentError) do
45
- @config.find_servers_for_task(task)
46
- end
46
+ assert_equal [], @config.find_servers_for_task(task)
47
47
  end
48
48
 
49
49
  def test_task_with_hosts_option_should_apply_only_to_those_hosts
@@ -15,7 +15,7 @@ class DeploySCMGitTest < Test::Unit::TestCase
15
15
 
16
16
  def test_head
17
17
  assert_equal "HEAD", @source.head
18
-
18
+
19
19
  # With :branch
20
20
  @config[:branch] = "master"
21
21
  assert_equal "master", @source.head
@@ -40,14 +40,31 @@ class DeploySCMGitTest < Test::Unit::TestCase
40
40
 
41
41
  # with submodules
42
42
  @config[:git_enable_submodules] = true
43
- assert_equal "#{git} clone -q git@somehost.com:project.git /var/www && cd /var/www && #{git} checkout -q -b deploy #{rev} && #{git} submodule -q init && #{git} submodule -q sync && #{git} submodule -q update --init --recursive", @source.checkout(rev, dest).gsub(/\s+/, ' ')
43
+ assert_equal "#{git} clone -q git@somehost.com:project.git /var/www && cd /var/www && #{git} checkout -q -b deploy #{rev} && #{git} submodule -q init && #{git} submodule -q sync && export GIT_RECURSIVE=$([ ! \"`#{git} --version`\" \\< \"git version 1.6.5\" ] && echo --recursive) && #{git} submodule -q update --init $GIT_RECURSIVE", @source.checkout(rev, dest).gsub(/\s+/, ' ')
44
44
  end
45
45
 
46
- def test_checkout_with_verbose_should_use_q_switch
46
+ def test_checkout_submodules_without_recursive
47
+ @config[:repository] = "git@somehost.com:project.git"
48
+ dest = "/var/www"
49
+ rev = 'c2d9e79'
50
+ @config[:git_enable_submodules] = true
51
+ @config[:git_submodules_recursive] = false
52
+ assert_equal "git clone -q git@somehost.com:project.git /var/www && cd /var/www && git checkout -q -b deploy #{rev} && git submodule -q init && git submodule -q sync && git submodule -q update --init", @source.checkout(rev, dest).gsub(/\s+/, ' ')
53
+ end
54
+
55
+ def test_checkout_with_verbose_should_not_use_q_switch
47
56
  @config[:repository] = "git@somehost.com:project.git"
48
57
  @config[:scm_verbose] = true
49
58
  dest = "/var/www"
50
59
  rev = 'c2d9e79'
60
+ assert_equal "git clone git@somehost.com:project.git /var/www && cd /var/www && git checkout -b deploy #{rev}", @source.checkout(rev, dest)
61
+ end
62
+
63
+ def test_checkout_with_verbose_off_should_use_q_switch
64
+ @config[:repository] = "git@somehost.com:project.git"
65
+ @config[:scm_verbose] = false
66
+ dest = "/var/www"
67
+ rev = 'c2d9e79'
51
68
  assert_equal "git clone -q git@somehost.com:project.git /var/www && cd /var/www && git checkout -q -b deploy #{rev}", @source.checkout(rev, dest)
52
69
  end
53
70
 
@@ -61,7 +78,7 @@ class DeploySCMGitTest < Test::Unit::TestCase
61
78
  assert_equal "git log master..branch", @source.log('master', 'branch')
62
79
  end
63
80
 
64
- def test_query_revision
81
+ def test_query_revision_from_remote
65
82
  revision = @source.query_revision('HEAD') do |o|
66
83
  assert_equal "git ls-remote . HEAD", o
67
84
  "d11006102c07c94e5d54dd0ee63dca825c93ed61\tHEAD"
@@ -69,6 +86,15 @@ class DeploySCMGitTest < Test::Unit::TestCase
69
86
  assert_equal "d11006102c07c94e5d54dd0ee63dca825c93ed61", revision
70
87
  end
71
88
 
89
+ def test_query_revision_falls_back_to_local
90
+ revision = @source.query_revision('d11006') do |o|
91
+ return nil if o == "git ls-remote . d11006"
92
+ assert_equal "git rev-parse --revs-only d11006", o
93
+ "d11006102c07c94e5d54dd0ee63dca825c93ed61"
94
+ end
95
+ assert_equal "d11006102c07c94e5d54dd0ee63dca825c93ed61", revision
96
+ end
97
+
72
98
  def test_query_revision_has_whitespace
73
99
  revision = @source.query_revision('HEAD') do |o|
74
100
  assert_equal "git ls-remote . HEAD", o
@@ -101,7 +127,7 @@ class DeploySCMGitTest < Test::Unit::TestCase
101
127
 
102
128
  # with submodules
103
129
  @config[:git_enable_submodules] = true
104
- assert_equal "cd #{dest} && #{git} fetch -q origin && #{git} fetch --tags -q origin && #{git} reset -q --hard #{rev} && #{git} submodule -q init && for mod in `#{git} submodule status | awk '{ print $2 }'`; do #{git} config -f .git/config submodule.${mod}.url `#{git} config -f .gitmodules --get submodule.${mod}.url` && echo Synced $mod; done && #{git} submodule -q sync && #{git} submodule -q update --init --recursive && #{git} clean -q -d -x -f", @source.sync(rev, dest)
130
+ assert_equal "cd #{dest} && #{git} fetch -q origin && #{git} fetch --tags -q origin && #{git} reset -q --hard #{rev} && #{git} submodule -q init && for mod in `#{git} submodule status | awk '{ print $2 }'`; do #{git} config -f .git/config submodule.${mod}.url `#{git} config -f .gitmodules --get submodule.${mod}.url` && echo Synced $mod; done && #{git} submodule -q sync && export GIT_RECURSIVE=$([ ! \"`#{git} --version`\" \\< \"git version 1.6.5\" ] && echo --recursive) && #{git} submodule -q update --init $GIT_RECURSIVE && #{git} clean -q -d -x -f", @source.sync(rev, dest)
105
131
  end
106
132
 
107
133
  def test_sync_with_remote
@@ -138,7 +164,7 @@ class DeploySCMGitTest < Test::Unit::TestCase
138
164
  @config[:git_enable_submodules] = true
139
165
  dest = "/var/www"
140
166
  rev = 'c2d9e79'
141
- assert_equal "git clone -q -o username git@somehost.com:project.git /var/www && cd /var/www && git checkout -q -b deploy #{rev} && git submodule -q init && git submodule -q sync && git submodule -q update --init --recursive", @source.checkout(rev, dest)
167
+ assert_equal "git clone -q -o username git@somehost.com:project.git /var/www && cd /var/www && git checkout -q -b deploy #{rev} && git submodule -q init && git submodule -q sync && export GIT_RECURSIVE=$([ ! \"`git --version`\" \\< \"git version 1.6.5\" ] && echo --recursive) && git submodule -q update --init $GIT_RECURSIVE", @source.checkout(rev, dest)
142
168
  end
143
169
 
144
170
  # Tests from base_test.rb, makin' sure we didn't break anything up there!
@@ -182,3 +208,4 @@ class DeploySCMGitTest < Test::Unit::TestCase
182
208
  assert_equal "/foo/bar/git", @source.command
183
209
  end
184
210
  end
211
+
@@ -0,0 +1,23 @@
1
+ require "utils"
2
+ require 'capistrano/recipes/deploy/scm/perforce'
3
+
4
+ class DeploySCMPerforceTest < Test::Unit::TestCase
5
+ class TestSCM < Capistrano::Deploy::SCM::Perforce
6
+ default_command "perforce"
7
+ end
8
+ def setup
9
+ @config = { :repository => "." }
10
+ @source = TestSCM.new(@config)
11
+ end
12
+
13
+ def test_p4_label
14
+ @config[:p4_label] = "some_p4_label"
15
+ assert_equal "@some_p4_label", @source.send(:rev_no, 'foo')
16
+ end
17
+
18
+ def test_p4_label_with_symbol
19
+ @config[:p4_label] = "@some_p4_label"
20
+ assert_equal "@some_p4_label", @source.send(:rev_no, 'foo')
21
+ end
22
+
23
+ end
@@ -29,4 +29,12 @@ Last Changed Date: 2009-03-11 11:04:25 -0700 (Wed, 11 Mar 2009)
29
29
  end
30
30
  assert_equal 2095, revision
31
31
  end
32
+
33
+ def test_sync
34
+ @config[:repository] = "http://svn.github.com/capistrano/capistrano.git"
35
+ rev = '602'
36
+ dest = "/var/www"
37
+ assert_equal "svn switch -q -r602 http://svn.github.com/capistrano/capistrano.git /var/www", @source.sync(rev, dest)
38
+ end
39
+
32
40
  end
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.8.0
4
+ version: 2.9.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,12 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-03-22 00:00:00.000000000 +01:00
14
- default_executable:
13
+ date: 2011-09-24 00:00:00.000000000Z
15
14
  dependencies:
16
15
  - !ruby/object:Gem::Dependency
17
16
  name: highline
18
- requirement: &2165629280 !ruby/object:Gem::Requirement
17
+ requirement: &70363620892360 !ruby/object:Gem::Requirement
19
18
  none: false
20
19
  requirements:
21
20
  - - ! '>='
@@ -23,10 +22,10 @@ dependencies:
23
22
  version: '0'
24
23
  type: :runtime
25
24
  prerelease: false
26
- version_requirements: *2165629280
25
+ version_requirements: *70363620892360
27
26
  - !ruby/object:Gem::Dependency
28
27
  name: net-ssh
29
- requirement: &2165744820 !ruby/object:Gem::Requirement
28
+ requirement: &70363620908220 !ruby/object:Gem::Requirement
30
29
  none: false
31
30
  requirements:
32
31
  - - ! '>='
@@ -34,10 +33,10 @@ dependencies:
34
33
  version: 2.0.14
35
34
  type: :runtime
36
35
  prerelease: false
37
- version_requirements: *2165744820
36
+ version_requirements: *70363620908220
38
37
  - !ruby/object:Gem::Dependency
39
38
  name: net-sftp
40
- requirement: &2165744300 !ruby/object:Gem::Requirement
39
+ requirement: &70363620907740 !ruby/object:Gem::Requirement
41
40
  none: false
42
41
  requirements:
43
42
  - - ! '>='
@@ -45,10 +44,10 @@ dependencies:
45
44
  version: 2.0.0
46
45
  type: :runtime
47
46
  prerelease: false
48
- version_requirements: *2165744300
47
+ version_requirements: *70363620907740
49
48
  - !ruby/object:Gem::Dependency
50
49
  name: net-scp
51
- requirement: &2165743700 !ruby/object:Gem::Requirement
50
+ requirement: &70363620907260 !ruby/object:Gem::Requirement
52
51
  none: false
53
52
  requirements:
54
53
  - - ! '>='
@@ -56,10 +55,10 @@ dependencies:
56
55
  version: 1.0.0
57
56
  type: :runtime
58
57
  prerelease: false
59
- version_requirements: *2165743700
58
+ version_requirements: *70363620907260
60
59
  - !ruby/object:Gem::Dependency
61
60
  name: net-ssh-gateway
62
- requirement: &2165743120 !ruby/object:Gem::Requirement
61
+ requirement: &70363620906780 !ruby/object:Gem::Requirement
63
62
  none: false
64
63
  requirements:
65
64
  - - ! '>='
@@ -67,10 +66,10 @@ dependencies:
67
66
  version: 1.1.0
68
67
  type: :runtime
69
68
  prerelease: false
70
- version_requirements: *2165743120
69
+ version_requirements: *70363620906780
71
70
  - !ruby/object:Gem::Dependency
72
71
  name: mocha
73
- requirement: &2165742540 !ruby/object:Gem::Requirement
72
+ requirement: &70363620906300 !ruby/object:Gem::Requirement
74
73
  none: false
75
74
  requirements:
76
75
  - - ! '>='
@@ -78,7 +77,7 @@ dependencies:
78
77
  version: '0'
79
78
  type: :development
80
79
  prerelease: false
81
- version_requirements: *2165742540
80
+ version_requirements: *70363620906300
82
81
  description: Capistrano is a utility and framework for executing commands in parallel
83
82
  on multiple remote machines, via SSH.
84
83
  email:
@@ -93,6 +92,7 @@ extra_rdoc_files:
93
92
  files:
94
93
  - .gitignore
95
94
  - .rvmrc
95
+ - .travis.yml
96
96
  - CHANGELOG
97
97
  - Gemfile
98
98
  - README.mdown
@@ -188,6 +188,7 @@ files:
188
188
  - test/deploy/scm/git_test.rb
189
189
  - test/deploy/scm/mercurial_test.rb
190
190
  - test/deploy/scm/none_test.rb
191
+ - test/deploy/scm/perforce_test.rb
191
192
  - test/deploy/scm/subversion_test.rb
192
193
  - test/deploy/strategy/copy_test.rb
193
194
  - test/extensions_test.rb
@@ -203,7 +204,6 @@ files:
203
204
  - test/task_definition_test.rb
204
205
  - test/transfer_test.rb
205
206
  - test/utils.rb
206
- has_rdoc: true
207
207
  homepage: http://github.com/capistrano/capistrano
208
208
  licenses: []
209
209
  post_install_message:
@@ -224,7 +224,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
224
224
  version: '0'
225
225
  requirements: []
226
226
  rubyforge_project:
227
- rubygems_version: 1.6.2
227
+ rubygems_version: 1.8.7
228
228
  signing_key:
229
229
  specification_version: 3
230
230
  summary: Capistrano - Welcome to easy deployment with Ruby over SSH
@@ -256,6 +256,7 @@ test_files:
256
256
  - test/deploy/scm/git_test.rb
257
257
  - test/deploy/scm/mercurial_test.rb
258
258
  - test/deploy/scm/none_test.rb
259
+ - test/deploy/scm/perforce_test.rb
259
260
  - test/deploy/scm/subversion_test.rb
260
261
  - test/deploy/strategy/copy_test.rb
261
262
  - test/extensions_test.rb