Class: Capistrano::Deploy::SCM::Darcs

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

Overview

Implements the Capistrano SCM interface for the darcs revision control system (www.abridgegame.org/darcs/).

Instance Attribute Summary

Attributes inherited from Base

#configuration

Instance Method Summary collapse

Methods inherited from Base

#command, default_command, #handle_data, #initialize, #local, #local?, #next_revision, #scm

Constructor Details

This class inherits a constructor from Capistrano::Deploy::SCM::Base

Instance Method Details

#checkout(revision, destination) ⇒ Object

Returns the command that will check out the given revision to the given destination. The ‘revision’ parameter must be the ‘hash’ value for the revision in question, as given by ‘darcs changes –xml-output’.

[View source]

24
25
26
# File 'lib/capistrano/recipes/deploy/scm/darcs.rb', line 24

def checkout(revision, destination)
  scm :get, verbose, "--repo-name=#{destination}", "--to-match='hash #{revision}'", repository
end

#diff(from, to = nil) ⇒ Object

Returns the command that will do a “darcs diff” for the two revisions. Each revision must be the ‘hash’ identifier of a darcs revision.

[View source]

46
47
48
# File 'lib/capistrano/recipes/deploy/scm/darcs.rb', line 46

def diff(from, to=nil)
  scm :diff, "--from-match 'hash #{from}'", to && "--to-match 'hash #{to}'"
end

#export(revision, destination) ⇒ Object

Darcs does not have a real ‘export’ option; there is ‘darcs dist’, but that presupposes a utility that can untar and ungzip the dist file. We’ll cheat and just do a get, followed by a deletion of the _darcs metadata directory.

[View source]

40
41
42
# File 'lib/capistrano/recipes/deploy/scm/darcs.rb', line 40

def export(revision, destination)
  [checkout(revision, destination), "rm -rf #{destination}/_darcs"].join(" && ")
end

#headObject

Because darcs does not have any support for pseudo-ids, we’ll just return something here that we can use in the helpers below for determining whether we need to look up the latest revision.

[View source]

17
18
19
# File 'lib/capistrano/recipes/deploy/scm/darcs.rb', line 17

def head
  :head
end

#log(from, to = nil) ⇒ Object

Returns the log of changes between the two revisions. Each revision must be the ‘hash’ identifier of a darcs revision.

[View source]

52
53
54
# File 'lib/capistrano/recipes/deploy/scm/darcs.rb', line 52

def log(from, to=nil)
  scm :changes, "--from-match 'hash #{from}'", to && "--to-match 'hash #{to}'", "--repo=#{repository}"
end

#query_revision(revision) ⇒ Object

Attempts to translate the given revision identifier to a “real” revision. If the identifier is a symbol, it is assumed to be a pseudo-id. Otherwise, it will be immediately returned. If it is a pseudo-id, a set of commands to execute will be yielded, and the result of executing those commands must be returned by the block. This method will then extract the actual revision hash from the returned data.

[View source]

63
64
65
66
67
68
69
70
# File 'lib/capistrano/recipes/deploy/scm/darcs.rb', line 63

def query_revision(revision)
  case revision
  when :head
    xml = yield(scm(:changes, "--last 1", "--xml-output", "--repo=#{repository}"))
    return xml[/hash='(.*?)'/, 1]
  else return revision
  end
end

#sync(revision, destination) ⇒ Object

Tries to update the destination repository in-place, to bring it up to the given revision. Note that because darcs’ “pull” operation does not support a “to-match” argument (or similar), this basically nukes the destination directory and re-gets it.

[View source]

32
33
34
# File 'lib/capistrano/recipes/deploy/scm/darcs.rb', line 32

def sync(revision, destination)
  ["rm -rf #{destination}", checkout(revision, destination)].join(" && ")
end