capistrano 2.1.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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