class Chef::Provider::Subversion
Constants
- SVN_INFO_PATTERN
Public Instance Methods
action_checkout()
click to toggle source
# File lib/chef/provider/subversion.rb, line 61 def action_checkout if target_dir_non_existent_or_empty? converge_by("perform checkout of #{@new_resource.repository} into #{@new_resource.destination}") do run_command(run_options(:command => checkout_command)) end else Chef::Log.debug "#{@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 71 def action_export if target_dir_non_existent_or_empty? action_force_export else Chef::Log.debug "#{@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 79 def action_force_export converge_by("export #{@new_resource.repository} into #{@new_resource.destination}") do run_command(run_options(:command => export_command)) end end
action_sync()
click to toggle source
# File lib/chef/provider/subversion.rb, line 85 def action_sync assert_target_directory_valid! if ::File.exist?(::File.join(@new_resource.destination, ".svn")) current_rev = find_current_revision Chef::Log.debug "#{@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 run_command(run_options(:command => sync_command)) Chef::Log.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 107 def checkout_command c = scm :checkout, @new_resource.svn_arguments, verbose, authentication, "-r#{revision_int}", @new_resource.repository, @new_resource.destination Chef::Log.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 152 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 49 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 114 def export_command args = ["--force"] args << @new_resource.svn_arguments << verbose << authentication << "-r#{revision_int}" << @new_resource.repository << @new_resource.destination c = scm :export, *args Chef::Log.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 141 def find_current_revision return nil unless ::File.exist?(::File.join(@new_resource.destination, ".svn")) command = scm(:info) status, svn_info, error_message = output_of_command(command, run_options(:cwd => cwd)) unless [0,1].include?(status.exitstatus) handle_command_failures(status, "STDOUT: #{svn_info}\nSTDERR: #{error_message}") end extract_revision_info(svn_info) end
load_current_resource()
click to toggle source
# File lib/chef/provider/subversion.rb, line 39 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 126 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}") status, svn_info, error_message = output_of_command(command, run_options) handle_command_failures(status, "STDOUT: #{svn_info}\nSTDERR: #{error_message}") extract_revision_info(svn_info) end end end
Also aliased as: revision_slug
run_options(run_opts={})
click to toggle source
# File lib/chef/provider/subversion.rb, line 156 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 101 def sync_command c = scm :update, @new_resource.svn_arguments, verbose, authentication, "-r#{revision_int}", @new_resource.destination Chef::Log.debug "#{@new_resource} updated working copy #{@new_resource.destination} to revision #{@new_resource.revision}" c end
whyrun_supported?()
click to toggle source
# File lib/chef/provider/subversion.rb, line 35 def whyrun_supported? true end
Private Instance Methods
assert_target_directory_valid!()
click to toggle source
# File lib/chef/provider/subversion.rb, line 206 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 191 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 165 def cwd @new_resource.destination end
extract_revision_info(svn_info)
click to toggle source
# File lib/chef/provider/subversion.rb, line 173 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']) raise "Could not parse `svn info` data: #{svn_info}" if repo_attrs.empty? Chef::Log.debug "#{@new_resource} resolved revision #{@new_resource.revision} to #{rev}" rev end
scm(*args)
click to toggle source
# File lib/chef/provider/subversion.rb, line 198 def scm(*args) ['svn', *args].compact.join(" ") end
target_dir_non_existent_or_empty?()
click to toggle source
# File lib/chef/provider/subversion.rb, line 203 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 169 def verbose "-q" end