lib/kpm/uninstaller.rb



module KPM
  class Uninstaller
    def initialize(destination, logger = nil)
      @logger = logger
      if @logger.nil?
        @logger = Logger.new(STDOUT)
        @logger.level = Logger::INFO
      end

      destination ||= KPM::BaseInstaller::DEFAULT_BUNDLES_DIR
      @installed_plugins = Inspector.new.inspect(destination)

      plugins_installation_path = File.join(destination, 'plugins')
      @plugins_manager = PluginsManager.new(plugins_installation_path, @logger)

      sha1_file_path = File.join(destination, KPM::BaseInstaller::SHA1_FILENAME)
      @sha1checker = KPM::Sha1Checker.from_file(sha1_file_path, @logger)
    end

    def uninstall_plugin(plugin, force = false)
      plugin_info = find_plugin(plugin)
      raise "No plugin with key/name '#{plugin}' found installed. Try running 'kpm inspect' for more info" unless plugin_info

      remove_all_plugin_versions(plugin_info, force)
    end

    private

    def find_plugin(plugin)
      plugin_info = @installed_plugins[plugin]
      if plugin_info.nil?
        @installed_plugins.each do |_, info|
          if info[:plugin_key] == plugin
            plugin_info = info
            break
          end
        end
      end

      plugin_info
    end

    def remove_all_plugin_versions(plugin_info, force = false)
      versions = plugin_info[:versions].map { |artifact| artifact[:version] }
      KPM.ui.say "Removing the following versions of the #{plugin_info[:plugin_name]} plugin: #{versions.join(', ')}"
      if !force && versions.length > 1
        return false unless 'y' == KPM.ui.ask('Are you sure you want to continue?', limited_to: %w(y n))
      end

      FileUtils.rmtree(plugin_info[:plugin_path])

      @plugins_manager.remove_plugin_identifier_key(plugin_info[:plugin_key])
      versions.each do |version|
        remove_sha1_entry(plugin_info, version)
      end

      true
    end

    def remove_sha1_entry(plugin_info, version)
      coordinates = KPM::Coordinates.build_coordinates(group_id: plugin_info[:group_id],
                                                       artifact_id: plugin_info[:artifact_id],
                                                       packaging: plugin_info[:packaging],
                                                       classifier: plugin_info[:classifier],
                                                       version: version)
      @sha1checker.remove_entry!(coordinates)
    end
  end
end