75 lines
2.2 KiB
Ruby
75 lines
2.2 KiB
Ruby
require "vagrant/plugin/manager"
|
|
|
|
module VagrantPlugins
|
|
module CommandPlugin
|
|
module Action
|
|
# This middleware removes user installed plugins by
|
|
# removing:
|
|
# * ~/.vagrant.d/plugins.json
|
|
# * ~/.vagrant.d/gems
|
|
# Usage should be restricted to when a repair is
|
|
# unsuccessful and the only reasonable option remaining
|
|
# is to re-install all plugins
|
|
class ExpungePlugins
|
|
def initialize(app, env)
|
|
@app = app
|
|
end
|
|
|
|
def call(env)
|
|
if !env[:force]
|
|
|
|
result = nil
|
|
attempts = 0
|
|
while attempts < 5 && result.nil?
|
|
attempts += 1
|
|
result = env[:ui].ask(
|
|
I18n.t("vagrant.commands.plugin.expunge_confirm") +
|
|
" [N]: "
|
|
)
|
|
result = result.to_s.downcase.strip
|
|
result = "n" if result.empty?
|
|
if !["y", "yes", "n", "no"].include?(result)
|
|
result = nil
|
|
env[:ui].error("Please answer Y or N")
|
|
else
|
|
result = result[0,1]
|
|
end
|
|
end
|
|
|
|
if result != 'y'
|
|
abort_action = true
|
|
end
|
|
end
|
|
|
|
if !abort_action
|
|
files = []
|
|
dirs = []
|
|
|
|
# Do not include global paths if local only
|
|
if !env[:env_local]
|
|
files << Vagrant::Plugin::Manager.instance.user_file.path
|
|
dirs << Vagrant::Bundler.instance.plugin_gem_path
|
|
end
|
|
|
|
# Add local paths if they exist
|
|
if Vagrant::Plugin::Manager.instance.local_file
|
|
files << Vagrant::Plugin::Manager.instance.local_file.path
|
|
dirs << Vagrant::Bundler.instance.env_plugin_gem_path
|
|
end
|
|
|
|
# Expunge files and directories
|
|
files.find_all(&:exist?).map(&:delete)
|
|
dirs.find_all(&:exist?).map(&:rmtree)
|
|
|
|
env[:ui].info(I18n.t("vagrant.commands.plugin.expunge_complete"))
|
|
|
|
@app.call(env)
|
|
else
|
|
env[:ui].info(I18n.t("vagrant.commands.plugin.expunge_aborted"))
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|