class Chef::Provider::Subversion

Constants

SVN_INFO_PATTERN

Public Instance Methods

action_checkout() click to toggle source
# File lib/chef/provider/subversion.rb, line 58
def action_checkout
  if target_dir_non_existent_or_empty?
    converge_by("perform checkout of #{new_resource.repository} into #{new_resource.destination}") do
      shell_out!(checkout_command, run_options)
    end
  else
    logger.trace "#{new_resource} checkout destination #{new_resource.destination} already exists or is a non-empty directory - nothing to do"
  end
end
action_export() click to toggle source
# File lib/chef/provider/subversion.rb, line 68
def action_export
  if target_dir_non_existent_or_empty?
    action_force_export
  else
    logger.trace "#{new_resource} export destination #{new_resource.destination} already exists or is a non-empty directory - nothing to do"
  end
end
action_force_export() click to toggle source
# File lib/chef/provider/subversion.rb, line 76
def action_force_export
  converge_by("export #{new_resource.repository} into #{new_resource.destination}") do
    shell_out!(export_command, run_options)
  end
end
action_sync() click to toggle source
# File lib/chef/provider/subversion.rb, line 82
def action_sync
  assert_target_directory_valid!
  if ::File.exist?(::File.join(new_resource.destination, ".svn"))
    current_rev = find_current_revision
    logger.trace "#{new_resource} current revision: #{current_rev} target revision: #{revision_int}"
    unless current_revision_matches_target_revision?
      converge_by("sync #{new_resource.destination} from #{new_resource.repository}") do
        shell_out!(sync_command, run_options)
        logger.info "#{new_resource} updated to revision: #{revision_int}"
      end
    end
  else
    action_checkout
  end
end
checkout_command() click to toggle source
# File lib/chef/provider/subversion.rb, line 104
def checkout_command
  c = scm :checkout, new_resource.svn_arguments, verbose, authentication, proxy,
    "-r#{revision_int}", new_resource.repository, new_resource.destination
  logger.info "#{new_resource} checked out #{new_resource.repository} at revision #{new_resource.revision} to #{new_resource.destination}"
  c
end
current_revision_matches_target_revision?() click to toggle source
# File lib/chef/provider/subversion.rb, line 146
def current_revision_matches_target_revision?
  (!current_resource.revision.nil?) && (revision_int.strip.to_i == current_resource.revision.strip.to_i)
end
define_resource_requirements() click to toggle source
# File lib/chef/provider/subversion.rb, line 46
def define_resource_requirements
  requirements.assert(:all_actions) do |a|
    # Make sure the parent dir exists, or else fail.
    # for why run, print a message explaining the potential error.
    parent_directory = ::File.dirname(new_resource.destination)
    a.assertion { ::File.directory?(parent_directory) }
    a.failure_message(Chef::Exceptions::MissingParentDirectory,
      "Cannot clone #{new_resource} to #{new_resource.destination}, the enclosing directory #{parent_directory} does not exist")
    a.whyrun("Directory #{parent_directory} does not exist, assuming it would have been created")
  end
end
export_command() click to toggle source
# File lib/chef/provider/subversion.rb, line 111
def export_command
  args = ["--force"]
  args << new_resource.svn_arguments << verbose << authentication << proxy <<
    "-r#{revision_int}" << new_resource.repository << new_resource.destination
  c = scm :export, *args
  logger.info "#{new_resource} exported #{new_resource.repository} at revision #{new_resource.revision} to #{new_resource.destination}"
  c
end
find_current_revision() click to toggle source
# File lib/chef/provider/subversion.rb, line 138
def find_current_revision
  return nil unless ::File.exist?(::File.join(new_resource.destination, ".svn"))
  command = scm(:info)
  svn_info = shell_out!(command, run_options(:cwd => cwd, :returns => [0, 1])).stdout

  extract_revision_info(svn_info)
end
load_current_resource() click to toggle source
# File lib/chef/provider/subversion.rb, line 36
def load_current_resource
  @current_resource = Chef::Resource::Subversion.new(new_resource.name)

  unless [:export, :force_export].include?(Array(new_resource.action).first)
    if current_revision = find_current_revision
      current_resource.revision current_revision
    end
  end
end
revision_int() click to toggle source

If the specified revision isn't an integer (“HEAD” for example), look up the revision id by asking the server If the specified revision is an integer, trust it.

# File lib/chef/provider/subversion.rb, line 123
def revision_int
  @revision_int ||= begin
    if new_resource.revision =~ /^\d+$/
      new_resource.revision
    else
      command = scm(:info, new_resource.repository, new_resource.svn_info_args, authentication, "-r#{new_resource.revision}")
      svn_info = shell_out!(command, run_options(:cwd => cwd, :returns => [0, 1])).stdout

      extract_revision_info(svn_info)
    end
  end
end
Also aliased as: revision_slug
revision_slug()
Alias for: revision_int
run_options(run_opts = {}) click to toggle source
# File lib/chef/provider/subversion.rb, line 150
def run_options(run_opts = {})
  run_opts[:user] = new_resource.user if new_resource.user
  run_opts[:group] = new_resource.group if new_resource.group
  run_opts[:timeout] = new_resource.timeout if new_resource.timeout
  run_opts
end
sync_command() click to toggle source
# File lib/chef/provider/subversion.rb, line 98
def sync_command
  c = scm :update, new_resource.svn_arguments, verbose, authentication, proxy, "-r#{revision_int}", new_resource.destination
  logger.trace "#{new_resource} updated working copy #{new_resource.destination} to revision #{new_resource.revision}"
  c
end

Private Instance Methods

assert_target_directory_valid!() click to toggle source
# File lib/chef/provider/subversion.rb, line 218
def assert_target_directory_valid!
  target_parent_directory = ::File.dirname(new_resource.destination)
  unless ::File.directory?(target_parent_directory)
    msg = "Cannot clone #{new_resource} to #{new_resource.destination}, the enclosing directory #{target_parent_directory} does not exist"
    raise Chef::Exceptions::MissingParentDirectory, msg
  end
end
authentication() click to toggle source

If a username is configured for the SCM, return the command-line switches for that. Note that we don't need to return the password switch, since Capistrano will check for that prompt in the output and will respond appropriately.

# File lib/chef/provider/subversion.rb, line 186
def authentication
  return "" unless new_resource.svn_username
  result = "--username #{new_resource.svn_username} "
  result << "--password #{new_resource.svn_password} "
  result
end
cwd() click to toggle source
# File lib/chef/provider/subversion.rb, line 159
def cwd
  new_resource.destination
end
extract_revision_info(svn_info) click to toggle source
# File lib/chef/provider/subversion.rb, line 167
def extract_revision_info(svn_info)
  repo_attrs = svn_info.lines.inject({}) do |attrs, line|
    if line =~ SVN_INFO_PATTERN
      property, value = $1, $2
      attrs[property] = value
    end
    attrs
  end
  rev = (repo_attrs["Last Changed Rev"] || repo_attrs["Revision"])
  rev.strip! if rev
  raise "Could not parse `svn info` data: #{svn_info}" if repo_attrs.empty?
  logger.trace "#{new_resource} resolved revision #{new_resource.revision} to #{rev}"
  rev
end
proxy() click to toggle source
# File lib/chef/provider/subversion.rb, line 193
def proxy
  repo_uri = URI.parse(new_resource.repository)
  proxy_uri = Chef::Config.proxy_uri(repo_uri.scheme, repo_uri.host, repo_uri.port)
  return "" if proxy_uri.nil?

  result = "--config-option servers:global:http-proxy-host=#{proxy_uri.host} "
  result << "--config-option servers:global:http-proxy-port=#{proxy_uri.port} "
  result
end
scm(*args) click to toggle source
# File lib/chef/provider/subversion.rb, line 203
def scm(*args)
  binary = svn_binary
  binary = "\"#{binary}\"" if binary =~ /\s/
  [binary, *args].compact.join(" ")
end
svn_binary() click to toggle source
# File lib/chef/provider/subversion.rb, line 213
def svn_binary
  new_resource.svn_binary ||
    (Chef::Platform.windows? ? "svn.exe" : "svn")
end
target_dir_non_existent_or_empty?() click to toggle source
# File lib/chef/provider/subversion.rb, line 209
def target_dir_non_existent_or_empty?
  !::File.exist?(new_resource.destination) || Dir.entries(new_resource.destination).sort == [".", ".."]
end
verbose() click to toggle source
# File lib/chef/provider/subversion.rb, line 163
def verbose
  "-q"
end