Class: Capistrano::Deploy::SCM::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/capistrano/recipes/deploy/scm/base.rb

Overview

The ancestor class for all Capistrano SCM implementations. It provides minimal infrastructure for subclasses to build upon and override.

Note that subclasses that implement this abstract class only return the commands that need to be executed–they do not execute the commands themselves. In this way, the deployment method may execute the commands either locally or remotely, as necessary.

Direct Known Subclasses

Accurev, Bzr, Cvs, Darcs, Git, Mercurial, None, Perforce, Subversion

Defined Under Namespace

Classes: LocalProxy

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(configuration = {}) ⇒ Base

Creates a new SCM instance with the given configuration options.


44
45
46
# File 'lib/capistrano/recipes/deploy/scm/base.rb', line 44

def initialize(configuration={})
  @configuration = configuration
end

Instance Attribute Details

#configurationObject (readonly)

The options available for this SCM instance to reference. Should be treated like a hash.


41
42
43
# File 'lib/capistrano/recipes/deploy/scm/base.rb', line 41

def configuration
  @configuration
end

Class Method Details

.default_command(value = nil) ⇒ Object

If no parameters are given, it returns the current configured name of the command-line utility of this SCM. If a parameter is given, the defeault command is set to that value.


17
18
19
20
21
22
23
# File 'lib/capistrano/recipes/deploy/scm/base.rb', line 17

def default_command(value=nil)
  if value
    @default_command = value
  else
    @default_command
  end
end

Instance Method Details

#checkout(revision, destination) ⇒ Object

Checkout a copy of the repository, at the given revision, to the given destination. The checkout is suitable for doing development work in, e.g. allowing subsequent commits and updates.

Raises:

  • (NotImplementedError)

87
88
89
# File 'lib/capistrano/recipes/deploy/scm/base.rb', line 87

def checkout(revision, destination)
  raise NotImplementedError, "`checkout' is not implemented by #{self.class.name}"
end

#commandObject

Returns the name of the command-line utility for this SCM. It first looks at the :scm_command variable, and if it does not exist, it then falls back to whatever was defined by default_command.

If scm_command is set to :default, the default_command will be returned.


147
148
149
150
151
# File 'lib/capistrano/recipes/deploy/scm/base.rb', line 147

def command
  command = variable(:scm_command)
  command = nil if command == :default
  command || default_command
end

#diff(from, to = nil) ⇒ Object

Compute the difference between the two revisions, from and to.

Raises:

  • (NotImplementedError)

98
99
100
# File 'lib/capistrano/recipes/deploy/scm/base.rb', line 98

def diff(from, to=nil)
  raise NotImplementedError, "`diff' is not implemented by #{self.class.name}"
end

#handle_data(state, stream, text) ⇒ Object

Should analyze the given text and determine whether or not a response is expected, and if so, return the appropriate response. If no response is expected, return nil. The state parameter is a hash that may be used to preserve state between calls. This method is used to define how Capistrano should respond to common prompts and messages from the SCM, like password prompts and such. By default, the output is simply displayed.


136
137
138
139
# File 'lib/capistrano/recipes/deploy/scm/base.rb', line 136

def handle_data(state, stream, text)
  logger.info "[#{stream}] #{text}"
  nil
end

#headObject

Returns the string used to identify the latest revision in the repository. This will be passed as the “revision” parameter of the methods below.

Raises:

  • (NotImplementedError)

80
81
82
# File 'lib/capistrano/recipes/deploy/scm/base.rb', line 80

def head
  raise NotImplementedError, "`head' is not implemented by #{self.class.name}"
end

#localObject

Returns a proxy that wraps the SCM instance and forces it to operate in “local” mode, which changes how variables are looked up in the configuration. Normally, if the value of a variable “foo” is needed, it is queried for in the configuration as “foo”. However, in “local” mode, first “local_foo” would be looked for, and only if it is not found would “foo” be used. This allows for both (e.g.) “scm_command” and “local_scm_command” to be set, if the two differ.

Alternatively, it may be called with a block, and for the duration of the block, all requests on this configuration object will be considered local.


59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/capistrano/recipes/deploy/scm/base.rb', line 59

def local
  if block_given?
    begin
      saved, @local_mode = @local_mode, true
      yield
    ensure
      @local_mode = saved
    end
  else
    LocalProxy.new(self)
  end
end

#local?Boolean

Returns true if running in “local” mode. See #local.

Returns:

  • (Boolean)

73
74
75
# File 'lib/capistrano/recipes/deploy/scm/base.rb', line 73

def local?
  @local_mode
end

#log(from, to = nil) ⇒ Object

Return a log of all changes between the two specified revisions, from and to, inclusive.

Raises:

  • (NotImplementedError)

104
105
106
# File 'lib/capistrano/recipes/deploy/scm/base.rb', line 104

def log(from, to=nil)
  raise NotImplementedError, "`log' is not implemented by #{self.class.name}"
end

#next_revision(revision) ⇒ Object

Returns the revision number immediately following revision, if at all possible. A block should always be passed to this method, which accepts a command to invoke and returns the result, although a particular SCM's implementation is not required to invoke the block.

By default, this method simply returns the revision itself. If a particular SCM is able to determine a subsequent revision given a revision identifier, it should override this method.


125
126
127
# File 'lib/capistrano/recipes/deploy/scm/base.rb', line 125

def next_revision(revision)
  revision
end

#query_revision(revision) ⇒ Object

If the given revision represents a “real” revision, this should simply return the revision value. If it represends a pseudo-revision (like Subversions “HEAD” identifier), it should yield a string containing the commands that, when executed will return a string that this method can then extract the real revision from.

Raises:

  • (NotImplementedError)

113
114
115
# File 'lib/capistrano/recipes/deploy/scm/base.rb', line 113

def query_revision(revision)
  raise NotImplementedError, "`query_revision' is not implemented by #{self.class.name}"
end

#scm(*args) ⇒ Object

A helper method that can be used to define SCM commands naturally. It returns a single string with all arguments joined by spaces, with the scm command prefixed onto it.


156
157
158
# File 'lib/capistrano/recipes/deploy/scm/base.rb', line 156

def scm(*args)
  [command, *args].compact.join(" ")
end

#sync(revision, destination) ⇒ Object

Resynchronize the working copy in destination to the specified revision.

Raises:

  • (NotImplementedError)

93
94
95
# File 'lib/capistrano/recipes/deploy/scm/base.rb', line 93

def sync(revision, destination)
  raise NotImplementedError, "`sync' is not implemented by #{self.class.name}"
end