Class: Chef::Provider::Subversion

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

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, #not_if, #only_if, #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::RecipeDefinitionDSLCore

#method_missing

Methods included from Mixin::Language

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

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



41
42
43
44
# File 'lib/chef/provider/subversion.rb', line 41

def action_checkout
  run_command(run_options(:command => checkout_command))
  @new_resource.updated_by_last_action(true)
end

#action_exportObject



46
47
48
49
# File 'lib/chef/provider/subversion.rb', line 46

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

#action_force_exportObject



51
52
53
54
# File 'lib/chef/provider/subversion.rb', line 51

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

#action_syncObject



56
57
58
59
60
61
62
63
# File 'lib/chef/provider/subversion.rb', line 56

def action_sync
  if !::File.exist?(@new_resource.destination + "/.svn") || ::Dir.entries(@new_resource.destination) == ['.','..']
    action_checkout
  else
    run_command(run_options(:command => sync_command))
  end
  @new_resource.updated_by_last_action(true)
end

#checkout_commandObject



70
71
72
73
74
# File 'lib/chef/provider/subversion.rb', line 70

def checkout_command
  Chef::Log.info "checking out #{@new_resource.repository} at revision #{@new_resource.revision} to #{@new_resource.destination}"
  scm :checkout, @new_resource.svn_arguments, verbose, authentication, 
      "-r#{revision_int}", @new_resource.repository, @new_resource.destination
end

#export_commandObject



76
77
78
79
80
81
82
# File 'lib/chef/provider/subversion.rb', line 76

def export_command
  Chef::Log.info "exporting #{@new_resource.repository} at revision #{@new_resource.revision} to #{@new_resource.destination}"
  args = ["--force"]
  args << @new_resource.svn_arguments << verbose << authentication <<
      "-r#{revision_int}" << @new_resource.repository << @new_resource.destination
  scm :export, *args
end

#find_current_revisionObject



102
103
104
105
106
107
108
109
110
111
# File 'lib/chef/provider/subversion.rb', line 102

def find_current_revision
  return nil unless ::File.exist?(@new_resource.destination)
  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



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

def load_current_resource
  @current_resource = Chef::Resource::Subversion.new(@new_resource.name)

  unless [:export, :force_export].include?(@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.



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

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



113
114
115
116
117
# File 'lib/chef/provider/subversion.rb', line 113

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



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

def sync_command
  Chef::Log.info "Updating working copy #{@new_resource.destination} to revision #{@new_resource.revision}"
  scm :update, @new_resource.svn_arguments, verbose, authentication, "-r#{revision_int}", @new_resource.destination
end