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]+): (.+)$/

Instance Attribute Summary

Attributes inherited from Chef::Provider

#current_resource, #new_resource, #run_context

Instance Method Summary collapse

Methods included from Mixin::Command

#chdir_or_tmpdir, #handle_command_failures, #output_of_command, #run_command, #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, build_from_file, #cookbook_name, #initialize, #node, #resource_collection

Methods included from Mixin::ConvertToClassName

#convert_to_class_name, #convert_to_snake_case, #filename_to_qualified_string, #snake_case_basename

Methods included from Mixin::EnforceOwnershipAndPermissions

#enforce_ownership_and_permissions

Methods included from Mixin::RecipeDefinitionDSLCore

#method_missing

Methods included from Mixin::Language

#data_bag, #data_bag_item, #platform?, #platform_family?, #search, #value_for_platform, #value_for_platform_family

Constructor Details

This class inherits a constructor from Chef::Provider

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Chef::Mixin::RecipeDefinitionDSLCore

Instance Method Details

#action_checkoutObject



43
44
45
46
47
48
49
50
51
# File 'lib/chef/provider/subversion.rb', line 43

def action_checkout
  assert_target_directory_valid!
  if target_dir_non_existant_or_empty?
    run_command(run_options(:command => checkout_command))
    @new_resource.updated_by_last_action(true)
  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



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

def action_export
  assert_target_directory_valid!
  if target_dir_non_existant_or_empty?
    run_command(run_options(:command => export_command))
    @new_resource.updated_by_last_action(true)
  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



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

def action_force_export
  assert_target_directory_valid!
  run_command(run_options(:command => export_command))
  @new_resource.updated_by_last_action(true)
end

#action_syncObject



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/chef/provider/subversion.rb', line 69

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?
      run_command(run_options(:command => sync_command))
      Chef::Log.info "#{@new_resource} updated to revision: #{revision_int}"
      @new_resource.updated_by_last_action(true)
    end
  else
    action_checkout
    @new_resource.updated_by_last_action(true)
  end
end

#checkout_commandObject



91
92
93
94
95
96
# File 'lib/chef/provider/subversion.rb', line 91

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



136
137
138
# File 'lib/chef/provider/subversion.rb', line 136

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

#export_commandObject



98
99
100
101
102
103
104
105
# File 'lib/chef/provider/subversion.rb', line 98

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



125
126
127
128
129
130
131
132
133
134
# File 'lib/chef/provider/subversion.rb', line 125

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_resourceObject



33
34
35
36
37
38
39
40
41
# File 'lib/chef/provider/subversion.rb', line 33

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.



110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/chef/provider/subversion.rb', line 110

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

#run_options(run_opts = {}) ⇒ Object



140
141
142
143
144
# File 'lib/chef/provider/subversion.rb', line 140

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
end

#sync_commandObject



85
86
87
88
89
# File 'lib/chef/provider/subversion.rb', line 85

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