capistrano 2.1.0 → 3.0.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 (166) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/.travis.yml +7 -0
  4. data/CHANGELOG.md +89 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +674 -0
  7. data/README.md +226 -0
  8. data/Rakefile +5 -0
  9. data/bin/cap +2 -3
  10. data/bin/capify +7 -77
  11. data/capistrano-public_cert.pem +22 -0
  12. data/capistrano.gemspec +35 -0
  13. data/features/deploy.feature +52 -0
  14. data/features/installation.feature +16 -0
  15. data/features/remote_file_task.feature +14 -0
  16. data/features/step_definitions/assertions.rb +90 -0
  17. data/features/step_definitions/cap_commands.rb +8 -0
  18. data/features/step_definitions/setup.rb +25 -0
  19. data/features/support/env.rb +12 -0
  20. data/features/support/remote_command_helpers.rb +20 -0
  21. data/lib/Capfile +3 -0
  22. data/lib/capistrano/all.rb +16 -0
  23. data/lib/capistrano/application.rb +60 -0
  24. data/lib/capistrano/configuration/question.rb +42 -0
  25. data/lib/capistrano/configuration/server.rb +133 -0
  26. data/lib/capistrano/configuration/servers/role_filter.rb +86 -0
  27. data/lib/capistrano/configuration/servers.rb +53 -58
  28. data/lib/capistrano/configuration.rb +84 -30
  29. data/lib/capistrano/console.rb +1 -0
  30. data/lib/capistrano/defaults.rb +13 -0
  31. data/lib/capistrano/deploy.rb +3 -0
  32. data/lib/capistrano/dotfile.rb +3 -0
  33. data/lib/capistrano/dsl/env.rb +64 -0
  34. data/lib/capistrano/dsl/paths.rb +94 -0
  35. data/lib/capistrano/dsl/stages.rb +15 -0
  36. data/lib/capistrano/dsl/task_enhancements.rb +53 -0
  37. data/lib/capistrano/dsl.rb +48 -0
  38. data/lib/capistrano/git.rb +1 -0
  39. data/lib/capistrano/hg.rb +1 -0
  40. data/lib/capistrano/i18n.rb +34 -0
  41. data/lib/capistrano/install.rb +1 -0
  42. data/lib/capistrano/setup.rb +21 -0
  43. data/lib/capistrano/tasks/console.rake +21 -0
  44. data/lib/capistrano/tasks/deploy.rake +204 -0
  45. data/lib/capistrano/tasks/framework.rake +67 -0
  46. data/lib/capistrano/tasks/git.rake +62 -0
  47. data/lib/capistrano/tasks/hg.rake +39 -0
  48. data/lib/capistrano/tasks/install.rake +39 -0
  49. data/lib/capistrano/templates/Capfile +26 -0
  50. data/lib/capistrano/templates/deploy.rb.erb +40 -0
  51. data/lib/capistrano/templates/stage.rb.erb +42 -0
  52. data/lib/capistrano/version.rb +1 -20
  53. data/lib/capistrano/version_validator.rb +37 -0
  54. data/lib/capistrano.rb +0 -2
  55. data/spec/integration/dsl_spec.rb +344 -0
  56. data/spec/integration_spec_helper.rb +7 -0
  57. data/spec/lib/capistrano/application_spec.rb +61 -0
  58. data/spec/lib/capistrano/configuration/question_spec.rb +54 -0
  59. data/spec/lib/capistrano/configuration/server_spec.rb +249 -0
  60. data/spec/lib/capistrano/configuration/servers/role_filter_spec.rb +140 -0
  61. data/spec/lib/capistrano/configuration/servers_spec.rb +184 -0
  62. data/spec/lib/capistrano/configuration_spec.rb +101 -0
  63. data/spec/lib/capistrano/dsl/env_spec.rb +10 -0
  64. data/spec/lib/capistrano/dsl/paths_spec.rb +69 -0
  65. data/spec/lib/capistrano/dsl_spec.rb +63 -0
  66. data/spec/lib/capistrano/version_validator_spec.rb +103 -0
  67. data/spec/lib/capistrano_spec.rb +8 -0
  68. data/spec/spec_helper.rb +15 -0
  69. data/spec/support/.gitignore +1 -0
  70. data/spec/support/Vagrantfile +13 -0
  71. data/spec/support/matchers.rb +5 -0
  72. data/spec/support/tasks/database.cap +11 -0
  73. data/spec/support/test_app.rb +138 -0
  74. metadata +251 -179
  75. data/CHANGELOG +0 -512
  76. data/MIT-LICENSE +0 -20
  77. data/README +0 -43
  78. data/examples/sample.rb +0 -14
  79. data/lib/capistrano/callback.rb +0 -45
  80. data/lib/capistrano/cli/execute.rb +0 -82
  81. data/lib/capistrano/cli/help.rb +0 -102
  82. data/lib/capistrano/cli/help.txt +0 -53
  83. data/lib/capistrano/cli/options.rb +0 -183
  84. data/lib/capistrano/cli/ui.rb +0 -28
  85. data/lib/capistrano/cli.rb +0 -47
  86. data/lib/capistrano/command.rb +0 -161
  87. data/lib/capistrano/configuration/actions/file_transfer.rb +0 -35
  88. data/lib/capistrano/configuration/actions/inspect.rb +0 -46
  89. data/lib/capistrano/configuration/actions/invocation.rb +0 -134
  90. data/lib/capistrano/configuration/callbacks.rb +0 -148
  91. data/lib/capistrano/configuration/connections.rb +0 -159
  92. data/lib/capistrano/configuration/execution.rb +0 -126
  93. data/lib/capistrano/configuration/loading.rb +0 -198
  94. data/lib/capistrano/configuration/namespaces.rb +0 -196
  95. data/lib/capistrano/configuration/roles.rb +0 -51
  96. data/lib/capistrano/configuration/variables.rb +0 -127
  97. data/lib/capistrano/errors.rb +0 -15
  98. data/lib/capistrano/extensions.rb +0 -57
  99. data/lib/capistrano/gateway.rb +0 -131
  100. data/lib/capistrano/logger.rb +0 -59
  101. data/lib/capistrano/recipes/compat.rb +0 -32
  102. data/lib/capistrano/recipes/deploy/dependencies.rb +0 -44
  103. data/lib/capistrano/recipes/deploy/local_dependency.rb +0 -46
  104. data/lib/capistrano/recipes/deploy/remote_dependency.rb +0 -96
  105. data/lib/capistrano/recipes/deploy/scm/accurev.rb +0 -169
  106. data/lib/capistrano/recipes/deploy/scm/base.rb +0 -192
  107. data/lib/capistrano/recipes/deploy/scm/bzr.rb +0 -86
  108. data/lib/capistrano/recipes/deploy/scm/cvs.rb +0 -151
  109. data/lib/capistrano/recipes/deploy/scm/darcs.rb +0 -85
  110. data/lib/capistrano/recipes/deploy/scm/git.rb +0 -191
  111. data/lib/capistrano/recipes/deploy/scm/mercurial.rb +0 -129
  112. data/lib/capistrano/recipes/deploy/scm/perforce.rb +0 -126
  113. data/lib/capistrano/recipes/deploy/scm/subversion.rb +0 -114
  114. data/lib/capistrano/recipes/deploy/scm.rb +0 -19
  115. data/lib/capistrano/recipes/deploy/strategy/base.rb +0 -64
  116. data/lib/capistrano/recipes/deploy/strategy/checkout.rb +0 -20
  117. data/lib/capistrano/recipes/deploy/strategy/copy.rb +0 -144
  118. data/lib/capistrano/recipes/deploy/strategy/export.rb +0 -20
  119. data/lib/capistrano/recipes/deploy/strategy/remote.rb +0 -52
  120. data/lib/capistrano/recipes/deploy/strategy/remote_cache.rb +0 -47
  121. data/lib/capistrano/recipes/deploy/strategy.rb +0 -19
  122. data/lib/capistrano/recipes/deploy/templates/maintenance.rhtml +0 -53
  123. data/lib/capistrano/recipes/deploy.rb +0 -494
  124. data/lib/capistrano/recipes/standard.rb +0 -37
  125. data/lib/capistrano/recipes/templates/maintenance.rhtml +0 -53
  126. data/lib/capistrano/recipes/upgrade.rb +0 -33
  127. data/lib/capistrano/server_definition.rb +0 -51
  128. data/lib/capistrano/shell.rb +0 -256
  129. data/lib/capistrano/ssh.rb +0 -109
  130. data/lib/capistrano/task_definition.rb +0 -69
  131. data/lib/capistrano/upload.rb +0 -146
  132. data/test/cli/execute_test.rb +0 -132
  133. data/test/cli/help_test.rb +0 -139
  134. data/test/cli/options_test.rb +0 -226
  135. data/test/cli/ui_test.rb +0 -28
  136. data/test/cli_test.rb +0 -17
  137. data/test/command_test.rb +0 -309
  138. data/test/configuration/actions/file_transfer_test.rb +0 -40
  139. data/test/configuration/actions/inspect_test.rb +0 -62
  140. data/test/configuration/actions/invocation_test.rb +0 -202
  141. data/test/configuration/callbacks_test.rb +0 -206
  142. data/test/configuration/connections_test.rb +0 -288
  143. data/test/configuration/execution_test.rb +0 -159
  144. data/test/configuration/loading_test.rb +0 -127
  145. data/test/configuration/namespace_dsl_test.rb +0 -297
  146. data/test/configuration/roles_test.rb +0 -47
  147. data/test/configuration/servers_test.rb +0 -90
  148. data/test/configuration/variables_test.rb +0 -180
  149. data/test/configuration_test.rb +0 -81
  150. data/test/deploy/scm/accurev_test.rb +0 -23
  151. data/test/deploy/scm/base_test.rb +0 -55
  152. data/test/deploy/scm/git_test.rb +0 -112
  153. data/test/deploy/strategy/copy_test.rb +0 -147
  154. data/test/extensions_test.rb +0 -69
  155. data/test/fixtures/cli_integration.rb +0 -5
  156. data/test/fixtures/config.rb +0 -5
  157. data/test/fixtures/custom.rb +0 -3
  158. data/test/gateway_test.rb +0 -167
  159. data/test/logger_test.rb +0 -123
  160. data/test/server_definition_test.rb +0 -108
  161. data/test/shell_test.rb +0 -64
  162. data/test/ssh_test.rb +0 -97
  163. data/test/task_definition_test.rb +0 -101
  164. data/test/upload_test.rb +0 -131
  165. data/test/utils.rb +0 -42
  166. data/test/version_test.rb +0 -24
@@ -1,192 +0,0 @@
1
- module Capistrano
2
- module Deploy
3
- module SCM
4
-
5
- # The ancestor class for all Capistrano SCM implementations. It provides
6
- # minimal infrastructure for subclasses to build upon and override.
7
- #
8
- # Note that subclasses that implement this abstract class only return
9
- # the commands that need to be executed--they do not execute the commands
10
- # themselves. In this way, the deployment method may execute the commands
11
- # either locally or remotely, as necessary.
12
- class Base
13
- class << self
14
- # If no parameters are given, it returns the current configured
15
- # name of the command-line utility of this SCM. If a parameter is
16
- # given, the defeault command is set to that value.
17
- def default_command(value=nil)
18
- if value
19
- @default_command = value
20
- else
21
- @default_command
22
- end
23
- end
24
- end
25
-
26
- # Wraps an SCM instance and forces all messages sent to it to be
27
- # relayed to the underlying SCM instance, in "local" mode. See
28
- # Base#local.
29
- class LocalProxy
30
- def initialize(scm)
31
- @scm = scm
32
- end
33
-
34
- def method_missing(sym, *args, &block)
35
- @scm.local { return @scm.send(sym, *args, &block) }
36
- end
37
- end
38
-
39
- # The options available for this SCM instance to reference. Should be
40
- # treated like a hash.
41
- attr_reader :configuration
42
-
43
- # Creates a new SCM instance with the given configuration options.
44
- def initialize(configuration={})
45
- @configuration = configuration
46
- end
47
-
48
- # Returns a proxy that wraps the SCM instance and forces it to operate
49
- # in "local" mode, which changes how variables are looked up in the
50
- # configuration. Normally, if the value of a variable "foo" is needed,
51
- # it is queried for in the configuration as "foo". However, in "local"
52
- # mode, first "local_foo" would be looked for, and only if it is not
53
- # found would "foo" be used. This allows for both (e.g.) "scm_command"
54
- # and "local_scm_command" to be set, if the two differ.
55
- #
56
- # Alternatively, it may be called with a block, and for the duration of
57
- # the block, all requests on this configuration object will be
58
- # considered local.
59
- def local
60
- if block_given?
61
- begin
62
- saved, @local_mode = @local_mode, true
63
- yield
64
- ensure
65
- @local_mode = saved
66
- end
67
- else
68
- LocalProxy.new(self)
69
- end
70
- end
71
-
72
- # Returns true if running in "local" mode. See #local.
73
- def local?
74
- @local_mode
75
- end
76
-
77
- # Returns the string used to identify the latest revision in the
78
- # repository. This will be passed as the "revision" parameter of
79
- # the methods below.
80
- def head
81
- raise NotImplementedError, "`head' is not implemented by #{self.class.name}"
82
- end
83
-
84
- # Checkout a copy of the repository, at the given +revision+, to the
85
- # given +destination+. The checkout is suitable for doing development
86
- # work in, e.g. allowing subsequent commits and updates.
87
- def checkout(revision, destination)
88
- raise NotImplementedError, "`checkout' is not implemented by #{self.class.name}"
89
- end
90
-
91
- # Resynchronize the working copy in +destination+ to the specified
92
- # +revision+.
93
- def sync(revision, destination)
94
- raise NotImplementedError, "`sync' is not implemented by #{self.class.name}"
95
- end
96
-
97
- # Compute the difference between the two revisions, +from+ and +to+.
98
- def diff(from, to=nil)
99
- raise NotImplementedError, "`diff' is not implemented by #{self.class.name}"
100
- end
101
-
102
- # Return a log of all changes between the two specified revisions,
103
- # +from+ and +to+, inclusive.
104
- def log(from, to=nil)
105
- raise NotImplementedError, "`log' is not implemented by #{self.class.name}"
106
- end
107
-
108
- # If the given revision represents a "real" revision, this should
109
- # simply return the revision value. If it represends a pseudo-revision
110
- # (like Subversions "HEAD" identifier), it should yield a string
111
- # containing the commands that, when executed will return a string
112
- # that this method can then extract the real revision from.
113
- def query_revision(revision)
114
- raise NotImplementedError, "`query_revision' is not implemented by #{self.class.name}"
115
- end
116
-
117
- # Returns the revision number immediately following revision, if at
118
- # all possible. A block should always be passed to this method, which
119
- # accepts a command to invoke and returns the result, although a
120
- # particular SCM's implementation is not required to invoke the block.
121
- #
122
- # By default, this method simply returns the revision itself. If a
123
- # particular SCM is able to determine a subsequent revision given a
124
- # revision identifier, it should override this method.
125
- def next_revision(revision)
126
- revision
127
- end
128
-
129
- # Should analyze the given text and determine whether or not a
130
- # response is expected, and if so, return the appropriate response.
131
- # If no response is expected, return nil. The +state+ parameter is a
132
- # hash that may be used to preserve state between calls. This method
133
- # is used to define how Capistrano should respond to common prompts
134
- # and messages from the SCM, like password prompts and such. By
135
- # default, the output is simply displayed.
136
- def handle_data(state, stream, text)
137
- logger.info "[#{stream}] #{text}"
138
- nil
139
- end
140
-
141
- # Returns the name of the command-line utility for this SCM. It first
142
- # looks at the :scm_command variable, and if it does not exist, it
143
- # then falls back to whatever was defined by +default_command+.
144
- #
145
- # If scm_command is set to :default, the default_command will be
146
- # returned.
147
- def command
148
- command = variable(:scm_command)
149
- command = nil if command == :default
150
- command || default_command
151
- end
152
-
153
- private
154
-
155
- # A helper for accessing variable values, which takes into
156
- # consideration the current mode ("normal" vs. "local").
157
- def variable(name)
158
- if local? && configuration.exists?("local_#{name}".to_sym)
159
- return configuration["local_#{name}".to_sym]
160
- else
161
- configuration[name]
162
- end
163
- end
164
-
165
- # A reference to a Logger instance that the SCM can use to log
166
- # activity.
167
- def logger
168
- @logger ||= variable(:logger) || Capistrano::Logger.new(:output => STDOUT)
169
- end
170
-
171
- # A helper for accessing the default command name for this SCM. It
172
- # simply delegates to the class' +default_command+ method.
173
- def default_command
174
- self.class.default_command
175
- end
176
-
177
- # A helper method that can be used to define SCM commands naturally.
178
- # It returns a single string with all arguments joined by spaces,
179
- # with the scm command prefixed onto it.
180
- def scm(*args)
181
- [command, *args].compact.join(" ")
182
- end
183
-
184
- # A convenience method for accessing the declared repository value.
185
- def repository
186
- variable(:repository)
187
- end
188
- end
189
-
190
- end
191
- end
192
- end
@@ -1,86 +0,0 @@
1
- require 'capistrano/recipes/deploy/scm/base'
2
-
3
- module Capistrano
4
- module Deploy
5
- module SCM
6
-
7
- # Implements the Capistrano SCM interface for the Bazaar-NG revision
8
- # control system (http://bazaar-vcs.org/).
9
- class Bzr < Base
10
- # Sets the default command name for this SCM. Users may override this
11
- # by setting the :scm_command variable.
12
- default_command "bzr"
13
-
14
- # Bazaar-NG doesn't support any pseudo-id's, so we'll use the convention
15
- # in this adapter that the :head symbol means the most recently
16
- # committed revision.
17
- def head
18
- :head
19
- end
20
-
21
- # Returns the command that will check out the given revision to the
22
- # given destination.
23
- def checkout(revision, destination)
24
- scm :branch, revswitch(revision), repository, destination
25
- end
26
-
27
- # The bzr 'update' command does not support updating to a specific
28
- # revision, so this just does update, followed by revert (unless
29
- # updating to head).
30
- def sync(revision, destination)
31
- commands = [scm(:update, destination)]
32
- commands << [scm(:revert, revswitch(revision), destination)] if revision != head
33
- commands.join(" && ")
34
- end
35
-
36
- # The bzr 'export' command would work fine, except it doesn't let you
37
- # specify the repository itself, so it only works if there is a working
38
- # tree handy, locally. Since this needs to work even on a remote host
39
- # where there is no working tree, we'll just do a checkout, followed
40
- # by a deletion of the ".bzr" metadata directory.
41
- def export(revision, destination)
42
- [checkout(revision, destination) && "rm -rf #{destination}/.bzr"].join(" && ")
43
- end
44
-
45
- # The bzr "diff" command doesn't accept a repository argument, so it
46
- # must be run from within a working tree.
47
- def diff(from, to=nil)
48
- switch = "-r#{from}"
49
- switch << "..#{to}" if to
50
-
51
- scm :diff, switch
52
- end
53
-
54
- # Returns a log of changes between the two revisions (inclusive).
55
- def log(from, to=nil)
56
- scm :log, "--short", "-r#{from}..#{to}", repository
57
- end
58
-
59
- # Attempts to translate the given revision identifier to a "real"
60
- # revision. If the identifier is :head, the "bzr revno" command will
61
- # be yielded, and the block must execute the command and return the
62
- # output. The revision will be extracted from the output and returned.
63
- # If the 'revision' argument, on the other hand, is not :head, it is
64
- # simply returned.
65
- def query_revision(revision)
66
- if revision == head
67
- yield(scm(:revno, repository)).chomp
68
- else
69
- revision
70
- end
71
- end
72
-
73
- private
74
-
75
- def revswitch(revision)
76
- if revision == :head
77
- nil
78
- else
79
- "-r #{revision}"
80
- end
81
- end
82
- end
83
-
84
- end
85
- end
86
- end
@@ -1,151 +0,0 @@
1
- require 'capistrano/recipes/deploy/scm/base'
2
-
3
- module Capistrano
4
- module Deploy
5
- module SCM
6
-
7
- # Implements the Capistrano SCM interface for the CVS revision
8
- # control system.
9
- class Cvs < Base
10
- # Sets the default command name for this SCM. Users may override this
11
- # by setting the :scm_command variable.
12
- default_command "cvs"
13
-
14
- # CVS understands 'HEAD' to refer to the latest revision in the
15
- # repository.
16
- def head
17
- "HEAD"
18
- end
19
-
20
- # Returns the command that will check out the given revision to the
21
- # given destination.
22
- def checkout(revision, destination)
23
- [ prep_destination(destination),
24
- scm(verbose, cvs_root, :checkout, cvs_revision(revision), cvs_destination(destination), variable(:scm_module))
25
- ].join(' && ')
26
- end
27
-
28
- # Returns the command that will do an "cvs update" to the given
29
- # revision, for the working copy at the given destination.
30
- def sync(revision, destination)
31
- [ prep_destination(destination),
32
- scm(verbose, cvs_root, :update, cvs_revision(revision), cvs_destination(destination))
33
- ].join(' && ')
34
- end
35
-
36
- # Returns the command that will do an "cvs export" of the given revision
37
- # to the given destination.
38
- def export(revision, destination)
39
- [ prep_destination(destination),
40
- scm(verbose, cvs_root, :export, cvs_revision(revision), cvs_destination(destination), variable(:scm_module))
41
- ].join(' && ')
42
- end
43
-
44
- # Returns the command that will do an "cvs diff" for the two revisions.
45
- def diff(from, to=nil)
46
- rev_type = revision_type(from)
47
- if rev_type == :date
48
- range_args = "-D '#{from}' -D '#{to || 'now'}'"
49
- else
50
- range_args = "-r '#{from}' -r '#{to || head}'"
51
- end
52
- scm cvs_root, :diff, range_args
53
- end
54
-
55
- # Returns an "cvs log" command for the two revisions.
56
- def log(from, to=nil)
57
- rev_type = revision_type(from)
58
- if rev_type == :date
59
- range_arg = "-d '#{from}<#{to || 'now'}'"
60
- else
61
- range_arg = "-r '#{from}:#{to || head}'"
62
- end
63
- scm cvs_root, :log, range_arg
64
- end
65
-
66
- # Unfortunately, cvs doesn't support the concept of a revision number like
67
- # subversion and other SCM's do. For now, we'll rely on getting the timestamp
68
- # of the latest checkin under the revision that's passed to us.
69
- def query_revision(revision)
70
- return revision if revision_type(revision) == :date
71
- revision = yield(scm(cvs_root, :log, "-r#{revision}")).
72
- grep(/^date:/).
73
- map { |line| line[/^date: (.*?);/, 1] }.
74
- sort.last
75
- return revision
76
- end
77
-
78
- # Determines what the response should be for a particular bit of text
79
- # from the SCM. Password prompts, connection requests, passphrases,
80
- # etc. are handled here.
81
- def handle_data(state, stream, text)
82
- logger.info "[#{stream}] #{text}"
83
- case text
84
- when /\bpassword.*:/i
85
- # prompting for a password
86
- "#{variable(:scm_password) || variable(:password)}\n"
87
- when %r{\(yes/no\)}
88
- # let's be agreeable...
89
- "yes\n"
90
- end
91
- end
92
-
93
- private
94
-
95
- # Constructs the CVSROOT command-line option
96
- def cvs_root
97
- root = ""
98
- root << "-d #{repository} " if repository
99
- root
100
- end
101
-
102
- # Constructs the destination dir command-line option
103
- def cvs_destination(destination)
104
- dest = ""
105
- if destination
106
- dest_parts = destination.split(/\//);
107
- dest << "-d #{dest_parts.pop}"
108
- end
109
- dest
110
- end
111
-
112
- # attempts to guess what type of revision we're working with
113
- def revision_type(rev)
114
- return :date if rev =~ /^\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2}$/ # i.e 2007-05-15 08:13:25
115
- return :revision if rev =~ /^\d/ # i.e. 1.2.1
116
- return :tag # i.e. RELEASE_1_2
117
- end
118
-
119
- # constructs the appropriate command-line switch for specifying a
120
- # "revision" in CVS. This could be a tag, branch, revision (i.e. 1.3)
121
- # or a date (to be used with -d)
122
- def cvs_revision(rev)
123
- revision = ""
124
- revision << case revision_type(rev)
125
- when :date:
126
- "-D \"#{rev}\"" if revision_type(rev) == :date
127
- when :revision:
128
- "-r #{rev}"
129
- else
130
- "-r #{head}"
131
- end
132
- return revision
133
- end
134
-
135
- # If verbose output is requested, return nil, otherwise return the
136
- # command-line switch for "quiet" ("-Q").
137
- def verbose
138
- variable(:scm_verbose) ? nil : "-Q"
139
- end
140
-
141
- def prep_destination(destination)
142
- dest_parts = destination.split(/\//);
143
- checkout_dir = dest_parts.pop
144
- dest = dest_parts.join('/')
145
- "mkdir -p #{ dest } && cd #{ dest }"
146
- end
147
- end
148
-
149
- end
150
- end
151
- end
@@ -1,85 +0,0 @@
1
- require 'capistrano/recipes/deploy/scm/base'
2
-
3
- module Capistrano
4
- module Deploy
5
- module SCM
6
-
7
- # Implements the Capistrano SCM interface for the darcs revision
8
- # control system (http://www.abridgegame.org/darcs/).
9
- class Darcs < Base
10
- # Sets the default command name for this SCM. Users may override this
11
- # by setting the :scm_command variable.
12
- default_command "darcs"
13
-
14
- # Because darcs does not have any support for pseudo-ids, we'll just
15
- # return something here that we can use in the helpers below for
16
- # determining whether we need to look up the latest revision.
17
- def head
18
- :head
19
- end
20
-
21
- # Returns the command that will check out the given revision to the
22
- # given destination. The 'revision' parameter must be the 'hash' value
23
- # for the revision in question, as given by 'darcs changes --xml-output'.
24
- def checkout(revision, destination)
25
- scm :get, verbose, "--repo-name=#{destination}", "--to-match='hash #{revision}'", repository
26
- end
27
-
28
- # Tries to update the destination repository in-place, to bring it up
29
- # to the given revision. Note that because darcs' "pull" operation
30
- # does not support a "to-match" argument (or similar), this basically
31
- # nukes the destination directory and re-gets it.
32
- def sync(revision, destination)
33
- ["rm -rf #{destination}", checkout(revision, destination)].join(" && ")
34
- end
35
-
36
- # Darcs does not have a real 'export' option; there is 'darcs dist',
37
- # but that presupposes a utility that can untar and ungzip the dist
38
- # file. We'll cheat and just do a get, followed by a deletion of the
39
- # _darcs metadata directory.
40
- def export(revision, destination)
41
- [checkout(revision, destination), "rm -rf #{destination}/_darcs"].join(" && ")
42
- end
43
-
44
- # Returns the command that will do a "darcs diff" for the two revisions.
45
- # Each revision must be the 'hash' identifier of a darcs revision.
46
- def diff(from, to=nil)
47
- scm :diff, "--from-match 'hash #{from}'", to && "--to-match 'hash #{to}'"
48
- end
49
-
50
- # Returns the log of changes between the two revisions. Each revision
51
- # must be the 'hash' identifier of a darcs revision.
52
- def log(from, to=nil)
53
- scm :changes, "--from-match 'hash #{from}'", to && "--to-match 'hash #{to}'", "--repo=#{repository}"
54
- end
55
-
56
- # Attempts to translate the given revision identifier to a "real"
57
- # revision. If the identifier is a symbol, it is assumed to be a
58
- # pseudo-id. Otherwise, it will be immediately returned. If it is a
59
- # pseudo-id, a set of commands to execute will be yielded, and the
60
- # result of executing those commands must be returned by the block.
61
- # This method will then extract the actual revision hash from the
62
- # returned data.
63
- def query_revision(revision)
64
- case revision
65
- when :head
66
- xml = yield(scm(:changes, "--last 1", "--xml-output", "--repo=#{repository}"))
67
- return xml[/hash='(.*?)'/, 1]
68
- else return revision
69
- end
70
- end
71
-
72
- private
73
-
74
- def verbose
75
- case variable(:scm_verbose)
76
- when nil then "-q"
77
- when false then nil
78
- else "-v"
79
- end
80
- end
81
- end
82
-
83
- end
84
- end
85
- end