class EL_STANDARD_INSTALLER_APP
Standard command-line installer for application with root conforming to EL_MULTI_APPLICATION_ROOT. To use it include the type representation in the list {EL_MULTI_APPLICATION_ROOT}.application_types. Assumes the following directory structure:
package/bin/<application name>
note
	description: "[
		Standard command-line installer for application with root conforming to ${EL_MULTI_APPLICATION_ROOT}.
		To use it include the type representation in the list `{EL_MULTI_APPLICATION_ROOT}.application_types'.
		Assumes the following directory structure:
			package/bin/<application name>
	]"
	author: "Finnian Reilly"
	copyright: "Copyright (c) 2001-2022 Finnian Reilly"
	contact: "finnian at eiffel hyphen loop dot com"
	license: "MIT license (See: en.wikipedia.org/wiki/MIT_License)"
	date: "2024-01-20 19:18:26 GMT (Saturday 20th January 2024)"
	revision: "22"
		
		class
	EL_STANDARD_INSTALLER_APP
inherit
	EL_APPLICATION
		rename
			App_directory_list as Root_owned_app_directory_list
		redefine
			option_name, visible_types, do_application
		end
	EL_MODULE_OS
	EL_APPLICATION_CONSTANTS
	EL_SHARED_APPLICATION_LIST; EL_SHARED_INSTALL_UNINSTALL_TESTER
	EL_SHARED_DIRECTORY
		rename
			Directory as OS_directory
		end
create
	make
feature {NONE} -- Initialization
	initialize
		do
		end
feature -- Basic operations
	run
		do
			if is_package_installable then
				install_package
			else
				if not Package_dir.exists then
					lio.put_labeled_substitution ("ERROR", "Package directory does not exist")
				else
					lio.put_labeled_substitution ("ERROR", "Package directory is empty")
				end
				lio.put_new_line
				lio.put_path_field ("Package", Package_dir)
				lio.put_new_line
			end
		end
feature -- Status query
	is_package_installable: BOOLEAN
		do
			if Package_dir.exists then
				Result := not OS_directory.named (Package_dir).is_empty
			end
		end
feature {NONE} -- Implementation
	do_application
		local
			parent: DIR_PATH
		do
			-- Change name of data and config directories because they are owned by root
			-- Example: "$HOME/.config/Hex 11 Software/My Ching" becomes "$HOME/.config/Hex 11 Software-installer/My Ching"
			across Root_owned_app_directory_list as path loop
				parent := path.item.parent
				parent.set_base (parent.base + "-installer")
				path.item.set_parent (parent)
			end
			Precursor
			-- delete root owned directories, for example:
			-- "$HOME/.config/Hex 11 Software-installer" + "$HOME/.Hex 11 Software-installer"
			across Root_owned_app_directory_list as path loop
				OS.delete_tree (path.item.parent)
			end
		end
	install_package
			--
		require
			package_installable: is_package_installable
		local
			destination_dir: DIR_PATH
		do
			destination_dir := Directory.Application_installation
			Test_aware.adjust_parent (destination_dir)
			lio.put_labeled_string ("Installing program", Executable.name); lio.put_new_line
			lio.put_path_field ("Source", Package_dir); lio.put_new_line
			lio.put_path_field ("Destination", destination_dir); lio.put_new_line
			lio.put_new_line
			File_system.make_directory (destination_dir)
			OS.find_directories_command (Package_dir).copy_sub_directories (destination_dir)
			OS.find_files_command (Package_dir, "*").copy_directory_files (destination_dir)
			Application_list.install_menus
			lio.put_line ("DONE")
		end
	visible_types: TUPLE [EL_FIND_DIRECTORIES_COMMAND_IMP]
		do
			create Result
		end
feature {NONE} -- Constants
	Description: ZSTRING
		once
			Result := "Installs the application"
		end
	Option_name: IMMUTABLE_STRING_8
		once
			Result := Standard_option.install
		end
end