Class: Chef::Provider::Subversion

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

Constant Summary collapse

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

Instance Attribute Summary

Attributes inherited from Chef::Provider

#action, #after_resource, #current_resource, #logger, #new_resource, #recipe_name, #run_context

Instance Method Summary collapse

Methods inherited from Chef::Provider

action, #action_nothing, #check_resource_semantics!, #cleanup_after_converge, #compile_and_converge_action, #converge_by, #converge_if_changed, #cookbook_name, #description, #events, include_resource_dsl?, include_resource_dsl_module, #initialize, #introduced, #load_after_resource, #node, #process_resource_requirements, provides, provides?, #requirements, #resource_collection, #resource_updated?, #run_action, #set_updated_status, supports?, use, use_inline_resources, #validate_required_properties!, #whyrun_mode?, #whyrun_supported?

Methods included from Mixin::LazyModuleInclude

#descendants, #include, #included

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::PowershellExec

#powershell_exec, #powershell_exec!

Methods included from DSL::Powershell

#ps_credential

Methods included from DSL::RegistryHelper

#registry_data_exists?, #registry_get_subkeys, #registry_get_values, #registry_has_subkeys?, #registry_key_exists?, #registry_value_exists?

Methods included from DSL::ChefVault

#chef_vault, #chef_vault_item, #chef_vault_item_for_environment

Methods included from DSL::DataQuery

#data_bag, #data_bag_item, #search, #tagged?

Methods included from EncryptedDataBagItem::CheckEncrypted

#encrypted?

Methods included from DSL::PlatformIntrospection

#older_than_win_2012_or_8?, #platform?, #platform_family?, #value_for_platform, #value_for_platform_family

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 DSL::Recipe

#exec, #have_resource_class_for?, #resource_class_for

Methods included from DSL::Definitions

add_definition, #evaluate_resource_definition, #has_resource_definition?

Methods included from DSL::Resources

add_resource_dsl, remove_resource_dsl

Methods included from DSL::Cheffish

load_cheffish

Methods included from DSL::RebootPending

#reboot_pending?

Methods included from DSL::IncludeRecipe

#include_recipe, #load_recipe

Methods included from Mixin::NotifyingBlock

#notifying_block, #subcontext_block

Methods included from DSL::DeclareResource

#build_resource, #declare_resource, #delete_resource, #delete_resource!, #edit_resource, #edit_resource!, #find_resource, #find_resource!, #resources, #with_run_context

Constructor Details

This class inherits a constructor from Chef::Provider

Instance Method Details

#checkout_commandObject


104
105
106
107
108
109
# 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?Boolean

Returns:

  • (Boolean)

145
146
147
# File 'lib/chef/provider/subversion.rb', line 145

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


46
47
48
49
50
51
52
53
54
55
56
# 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_commandObject


111
112
113
114
115
116
117
118
# 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_revisionObject


136
137
138
139
140
141
142
143
# File 'lib/chef/provider/subversion.rb', line 136

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


36
37
38
39
40
41
42
43
44
# File 'lib/chef/provider/subversion.rb', line 36

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

  unless %i{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.


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

def revision_int
  @revision_int ||= if /^\d+$/.match?(new_resource.revision)
                      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

#run_options(run_opts = {}) ⇒ Object


149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/chef/provider/subversion.rb', line 149

def run_options(run_opts = {})
  env = {}
  if new_resource.user
    run_opts[:user] = new_resource.user
    env["HOME"] = get_homedir(new_resource.user)
  end
  run_opts[:group] = new_resource.group if new_resource.group
  run_opts[:timeout] = new_resource.timeout if new_resource.timeout
  env.merge!(new_resource.environment) if new_resource.environment
  run_opts[:environment] = env unless env.empty?
  run_opts
end

#sync_commandObject


98
99
100
101
102
# 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