Class: Chef::Provider::Subversion

Inherits:
Chef::Provider show all
Includes:
Mixin::Command
Defined in:
lib/chef/provider/subversion.rb

Constant Summary collapse

SVN_INFO_PATTERN =
/^([\w\s]+): (.+)$/

Constants included from Mixin::ShellOut

Mixin::ShellOut::DEPRECATED_OPTIONS

Instance Attribute Summary

Attributes inherited from Chef::Provider

#action, #cookbook_name, #current_resource, #new_resource, #recipe_name, #run_context

Instance Method Summary collapse

Methods included from Mixin::Command

#chdir_or_tmpdir, #handle_command_failures, #output_of_command, #run_command, #run_command_and_return_stdout_stderr, #run_command_with_systems_locale

Methods included from Mixin::Command::Windows

#popen4

Methods included from Mixin::Command::Unix

#popen4

Methods inherited from Chef::Provider

#action_nothing, #check_resource_semantics!, #cleanup_after_converge, #converge_by, #converge_if_changed, #events, include_resource_dsl, include_resource_dsl_module, #initialize, #node, #process_resource_requirements, provides, provides?, #requirements, #resource_collection, #resource_updated?, #run_action, #set_updated_status, supports?, use_inline_resources, #whyrun_mode?

Methods included from Mixin::Provides

#provided_as, #provides, #provides?

Methods included from Mixin::DescendantsTracker

#descendants, descendants, direct_descendants, #direct_descendants, find_descendants_by_name, #find_descendants_by_name, #inherited, store_inherited

Methods included from DeprecatedLWRPClass

#const_missing, #register_deprecated_lwrp_class

Methods included from Mixin::PowershellOut

#powershell_out, #powershell_out!

Methods included from Mixin::WindowsArchitectureHelper

#assert_valid_windows_architecture!, #disable_wow64_file_redirection, #forced_32bit_override_required?, #is_i386_process_on_x86_64_windows?, #node_supports_windows_architecture?, #node_windows_architecture, #restore_wow64_file_redirection, #valid_windows_architecture?, #with_os_architecture, #wow64_architecture_override_required?, #wow64_directory

Methods included from Mixin::ShellOut

#run_command_compatible_options, #shell_out, #shell_out!, #shell_out_with_systems_locale, #shell_out_with_systems_locale!

Constructor Details

This class inherits a constructor from Chef::Provider

Instance Method Details

#action_checkoutObject



62
63
64
65
66
67
68
69
70
# File 'lib/chef/provider/subversion.rb', line 62

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
    Chef::Log.debug "#{@new_resource} checkout destination #{@new_resource.destination} already exists or is a non-empty directory - nothing to do"
  end
end

#action_exportObject



72
73
74
75
76
77
78
# File 'lib/chef/provider/subversion.rb', line 72

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_exportObject



80
81
82
83
84
# File 'lib/chef/provider/subversion.rb', line 80

def action_force_export
  converge_by("export #{@new_resource.repository} into #{@new_resource.destination}") do
    shell_out!(export_command, run_options)
  end
end

#action_syncObject



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/chef/provider/subversion.rb', line 86

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
        shell_out!(sync_command, run_options)
        Chef::Log.info "#{@new_resource} updated to revision: #{revision_int}"
      end
    end
  else
    action_checkout
  end
end

#checkout_commandObject



108
109
110
111
112
113
# File 'lib/chef/provider/subversion.rb', line 108

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?Boolean

Returns:

  • (Boolean)


150
151
152
# File 'lib/chef/provider/subversion.rb', line 150

def current_revision_matches_target_revision?
  (!@current_resource.revision.nil?) && (revision_int.strip.to_i == @current_resource.revision.strip.to_i)
end

#define_resource_requirementsObject



50
51
52
53
54
55
56
57
58
59
60
# File 'lib/chef/provider/subversion.rb', line 50

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_commandObject



115
116
117
118
119
120
121
122
# File 'lib/chef/provider/subversion.rb', line 115

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_revisionObject



142
143
144
145
146
147
148
# File 'lib/chef/provider/subversion.rb', line 142

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_resourceObject



40
41
42
43
44
45
46
47
48
# File 'lib/chef/provider/subversion.rb', line 40

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_intObject Also known as: revision_slug

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.



127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/chef/provider/subversion.rb', line 127

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

#run_options(run_opts = {}) ⇒ Object



154
155
156
157
158
159
# File 'lib/chef/provider/subversion.rb', line 154

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_commandObject



102
103
104
105
106
# File 'lib/chef/provider/subversion.rb', line 102

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?Boolean

Returns:

  • (Boolean)


36
37
38
# File 'lib/chef/provider/subversion.rb', line 36

def whyrun_supported?
  true
end