1
module Puppet::Module::Tool
1
module Puppet::ModuleTool
3
3
class Uninstaller < Application
4
include Puppet::ModuleTool::Errors
5
def initialize(name, options = {})
7
@target_directories = options[:target_directories]
6
def initialize(name, options)
9
@errors = Hash.new {|h, k| h[k] = {}}
13
@environment = Puppet::Node::Environment.new(options[:environment])
13
Puppet.notice "#{@name} is not installed" if @removed_dirs.empty?
18
:module_name => @name,
19
:requested_version => @version,
25
FileUtils.rm_rf(@installed.first.path, :secure => true)
27
results[:affected_modules] = @installed
28
results[:result] = :success
29
rescue ModuleToolError => err
31
:oneline => err.message,
32
:multiline => err.multiline,
36
:oneline => e.message,
37
:multiline => e.respond_to?(:multiline) ? e.multiline : [e.to_s, e.backtrace].join("\n")
40
results[:result] ||= :failure
20
# TODO: #11803 Check for broken dependencies before uninstalling modules.
22
# Search each path in the target directories for the specified module
23
# and delete the directory.
24
@target_directories.each do |target|
25
if File.directory? target
26
module_path = File.join(target, @name)
27
@removed_dirs << FileUtils.rm_rf(module_path).first if File.directory?(module_path)
48
def find_installed_module
49
@environment.modules_by_path.values.flatten.each do |mod|
50
mod_name = (mod.forge_name || mod.name).gsub('/', '-')
54
:version => mod.version,
55
:path => mod.modulepath,
57
if @options[:version] && mod.version
58
next unless SemVer[@options[:version]].include?(SemVer.new(mod.version))
61
elsif mod_name =~ /#{@name}/
62
@suggestions << mod_name
66
if @installed.length > 1
67
raise MultipleInstalledError,
68
:action => :uninstall,
69
:module_name => @name,
70
:installed_modules => @installed.sort_by { |mod| @environment.modulepath.index(mod.modulepath) }
71
elsif @installed.empty?
73
raise NotInstalledError,
74
:action => :uninstall,
75
:suggestions => @suggestions,
78
raise NoVersionMatchesError,
79
:installed_modules => @unfiltered.sort_by { |mod| @environment.modulepath.index(mod[:path]) },
80
:version_range => @options[:version],
87
mod = @installed.first
89
if !@options[:force] && mod.has_metadata? && mod.has_local_changes?
90
raise LocalChangesError,
91
:action => :uninstall,
92
:module_name => (mod.forge_name || mod.name).gsub('/', '-'),
93
:requested_version => @options[:version],
94
:installed_version => mod.version
97
if !@options[:force] && !mod.required_by.empty?
98
raise ModuleIsRequiredError,
99
:module_name => (mod.forge_name || mod.name).gsub('/', '-'),
100
:required_by => mod.required_by,
101
:requested_version => @options[:version],
102
:installed_version => mod.version