Class: Capistrano::Deploy::SCM::Subversion

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

Overview

Implements the Capistrano SCM interface for the Subversion revision control system (subversion.tigris.org).

Instance Attribute Summary

Attributes inherited from Base

#configuration

Instance Method Summary (collapse)

Methods inherited from Base

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

Constructor Details

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

Instance Method Details

- (Object) checkout(revision, destination)

Returns the command that will check out the given revision to the given destination.



23
24
25
# File 'lib/capistrano/recipes/deploy/scm/subversion.rb', line 23

def checkout(revision, destination)
  scm :checkout, arguments, arguments(:checkout), verbose, authentication, "-r#{revision}", repository, destination
end

- (Object) diff(from, to = nil)

Returns the command that will do an "svn diff" for the two revisions.



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

def diff(from, to=nil)
  scm :diff, repository, arguments(:diff), authentication, "-r#{from}:#{to || head}"
end

- (Object) export(revision, destination)

Returns the command that will do an "svn export" of the given revision to the given destination.



35
36
37
# File 'lib/capistrano/recipes/deploy/scm/subversion.rb', line 35

def export(revision, destination)
  scm :export, arguments, arguments(:export), verbose, authentication, "-r#{revision}", repository, destination
end

- (Object) handle_data(state, stream, text)

Determines what the response should be for a particular bit of text from the SCM. Password prompts, connection requests, passphrases, etc. are handled here.



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/capistrano/recipes/deploy/scm/subversion.rb', line 70

def handle_data(state, stream, text)
  host = state[:channel][:host]
 logger.info "[#{host} :: #{stream}] #{text}"
  case text
  when /\bpassword.*:/i
    # subversion is prompting for a password
    "#{scm_password_prompt}\n"
  when %r{\(yes/no\)}
    # subversion is asking whether or not to connect
    "yes\n"
  when /passphrase/i
    # subversion is asking for the passphrase for the user's key
    "#{variable(:scm_passphrase)}\n"
  when /The entry \'(.+?)\' is no longer a directory/
    raise Capistrano::Error, "subversion can't update because directory '#{$1}' was replaced. Please add it to svn:ignore."
  when /accept \(t\)emporarily/
    # subversion is asking whether to accept the certificate
    "t\n"
  end
end

- (Object) head

Subversion understands 'HEAD' to refer to the latest revision in the repository.



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

def head
  "HEAD"
end

- (Object) log(from, to = nil)

Returns an "svn log" command for the two revisions.



45
46
47
# File 'lib/capistrano/recipes/deploy/scm/subversion.rb', line 45

def log(from, to=nil)
  scm :log, repository, arguments(:log), authentication, "-r#{from}:#{to || head}"
end

- (Object) next_revision(revision)

Increments the given revision number and returns it.



63
64
65
# File 'lib/capistrano/recipes/deploy/scm/subversion.rb', line 63

def next_revision(revision)
  revision.to_i + 1
end

- (Object) query_revision(revision)

Attempts to translate the given revision identifier to a "real" revision. If the identifier is an integer, it will simply be returned. Otherwise, this will yield a string of the commands it needs to be executed (svn info), and will extract the revision from the response.



53
54
55
56
57
58
59
60
# File 'lib/capistrano/recipes/deploy/scm/subversion.rb', line 53

def query_revision(revision)
  return revision if revision =~ /^\d+$/
  command = scm(:info, arguments, arguments(:info), repository, authentication, "-r#{revision}")
  result = yield(command)
  yaml = YAML.load(result)
  raise "tried to run `#{command}' and got unexpected result #{result.inspect}" unless Hash === yaml
  [ (yaml['Last Changed Rev'] || 0).to_i, (yaml['Revision'] || 0).to_i ].max
end

- (Object) sync(revision, destination)

Returns the command that will do an "svn update" to the given revision, for the working copy at the given destination.



29
30
31
# File 'lib/capistrano/recipes/deploy/scm/subversion.rb', line 29

def sync(revision, destination)
  scm :switch, arguments, verbose, authentication, "-r#{revision}", repository, destination
end