Added support for configuration to Roc.

The installer can now use a roc.cfg file to define the various needed modules.
Format:
{ "name": "demo", "location": ".",
  "modules": {
      "foo": { "location": "path-to-source-of-module-foo"; },
      "bar": { "location": "path-to-source-of-module-bar"; }
  }
}
This commit is contained in:
2016-11-30 15:40:12 +01:00
parent 76cf815477
commit ff58c6aff9
3 changed files with 178 additions and 55 deletions

View File

@@ -26,17 +26,22 @@ feature -- Status report
local
i, n: INTEGER
optional_module: BOOLEAN
optional_config: BOOLEAN
cms_path: BOOLEAN
do
n := args.upper
-- TODO add error reporting.
if n >= 1 and then n <= 4 then
if n >= 1 and then n <= 5 then
from
i := 1
until
i > n
loop
if args [i].same_string ("-m") then
if args [i].same_string ("-f") then
optional_config := True
elseif args [i].same_string ("--config") then
optional_config := True
elseif args [i].same_string ("-m") then
optional_module := True
elseif args [i].same_string ("--module") then
optional_module := True
@@ -47,26 +52,30 @@ feature -- Status report
end
i := i + 1
end
if n = 4 then
if (cms_path and optional_module) then
-- valid command
Result := True
else
print ("Error check the optional argument --module|-m and --dir|-d")
end
elseif n = 2 then
if (cms_path and not optional_module) then
Result := True
else
print ("Error missing value for dir")
Result := False
end
else
if optional_config then
Result := True
else
if n <= 5 then
if (cms_path and (optional_module)) then
-- valid command
Result := True
else
print ("Error check the optional argument --module|-m and --dir|-d")
end
elseif n <= 3 then
if (cms_path and not optional_module) then
Result := True
else
print ("Error missing value for dir")
Result := False
end
else
Result := True
end
end
else
Result := False
if n > 4 then
if n > 5 then
print ("Too many arguments")
end
if n < 1 then
@@ -93,12 +102,14 @@ feature -- Execution
-- Install a module into a cms application.
-- Pattern: module_src/site/* => cms/site/modules/$module_name/*
local
l_site_path, l_cms_path, l_module_source_path: detachable PATH
l_config_path, l_site_path, l_cms_path, p: detachable PATH
l_module_source_locations: ARRAYED_LIST [PATH]
l_site_dir: DIRECTORY
l_modules_dir: DIRECTORY
l_dest_dir: DIRECTORY
i,n: INTEGER
do
create l_module_source_locations.make (1)
from
i := 1
n := args.upper
@@ -107,6 +118,14 @@ feature -- Execution
loop
if attached args[i] as arg then
if
arg.same_string ("-f")
or arg.same_string ("--config")
then
i := i + 1
if i <= n then
create l_config_path.make_from_string (args[i])
end
elseif
arg.same_string ("-d")
or arg.same_string ("--dir")
then
@@ -127,28 +146,75 @@ feature -- Execution
then
i := i + 1
if i <= n then
create l_module_source_path.make_from_string (args[i])
l_module_source_locations.force (create {PATH}.make_from_string (args[i]))
end
elseif
arg.same_string ("-v")
or arg.same_string ("--verbose")
then
is_verbose := True
end
end
i := i + 1
end
if l_module_source_path = Void then
l_module_source_path := Execution_environment.current_working_path
if l_config_path /= Void and then attached {CONFIG_READER} roc_configuration (l_config_path) as cfg then
if attached cfg.resolved_text_item ("location") as cfg_location then
create p.make_from_string (cfg_location)
if not p.is_absolute then
p := l_config_path.parent.extended_path (p)
end
l_cms_path := p.canonical_path
end
if l_cms_path = Void then
l_cms_path := l_config_path.parent
end
if attached cfg.resolved_text_item ("site_directory") as cfg_site_dir then
create p.make_from_string (cfg_site_dir)
if not p.is_absolute then
p := l_cms_path.extended_path (p)
end
l_site_path := p.canonical_path
end
if attached cfg.resolved_text_table_item ("modules") as tb then
across
tb as ic
loop
l_module_source_locations.extend (create {PATH}.make_from_string (ic.item))
end
elseif attached cfg.table_keys ("modules") as tb_keys then
across
tb_keys as ic
loop
if attached cfg.resolved_text_item ({STRING_32} "modules." + ic.item + ".location") as l_loc then
create p.make_from_string (l_loc)
if not p.is_absolute then
p := l_cms_path.extended_path (p)
end
l_module_source_locations.extend (p.canonical_path)
end
end
end
end
if l_cms_path = Void then
l_cms_path := Execution_environment.current_working_path.extended ("modules")
end
if l_cms_path /= Void and l_module_source_path /= Void then
-- If l_site_path is not set; initialize it to $cms_path/site.
if l_site_path = Void then
l_site_path := l_cms_path.extended ("site")
end
-- If l_site_path is not set; initialize it to $cms_path/site.
if l_site_path = Void then
l_site_path := l_cms_path.extended ("site").canonical_path
end
-- Install configuration files.
if attached module_name (l_module_source_path) as l_mod_name then
across
l_module_source_locations as ic
loop
if
attached ic.item as l_module_source_path and then
attached module_name (l_module_source_path) as l_mod_name
then
-- Install configuration files.
create l_site_dir.make_with_path (l_site_path)
if l_site_dir.exists then
create l_modules_dir.make_with_path (l_site_path.extended ("modules"))
if not l_modules_dir.exists then
@@ -159,27 +225,37 @@ feature -- Execution
if not l_dest_dir.exists then
l_dest_dir.create_dir
end
print ("Install module ")
print (l_mod_name)
print (" in %"")
print (l_dest_dir.path.name)
print ("%":%N")
install_module_elements (l_module_source_path, l_dest_dir.path, Void)
-- install_module_elements (l_module_source_path, l_dest_dir.path, Config_dir)
-- install_module_elements (l_module_source_path, l_dest_dir.path, Scripts_dir)
-- install_module_elements (l_module_source_path, l_dest_dir.path, Themes_dir)
print ("Module ")
print (l_mod_name)
print (" was successfuly installed to the CMS Application location ")
print (l_cms_path.name)
print ("%NCheck the module elements at ")
print (l_dest_dir.path.name)
print (" - ")
print (directories_count.out + " director" + if directories_count > 1 then "ies" else "y" end + ", ")
print (files_count.out + " file" + if files_count > 1 then "s" else "" end)
if files_changes_count > 0 then
print (" (+" + files_changes_count.out + ")")
end
print (".%N")
print ("Copied " + directories_count.out + " directories.%N")
print ("Copied " + files_count.out + " files.%N")
else
print ({STRING_32} "The CMS Application located at " + l_cms_path.name + "does not have the site or modules folders.%N")
end
else
print ("Error: not possible to retrieve module name.%N")
print ("Error: could not retrieve module name.%N")
end
else
print ("Error: wrong path to CMS application.%N")
end
end
roc_configuration (a_cfg_location: PATH): detachable CONFIG_READER
do
create {JSON_CONFIG} Result.make_from_file (a_cfg_location)
if Result.has_error then
Result := Void
end
end
@@ -206,15 +282,23 @@ feature -- Execution
end
files_count := 0
directories_count := -1
files_changes_count := 0
copy_directory (l_src_dir, l_dest_dir, True)
end
is_verbose: BOOLEAN
files_count: INTEGER
-- Number of copied files during installation.
files_changes_count: INTEGER
-- Number of files changed during installation.
directories_count: INTEGER
-- Number of copied directories during installation.
feature {NONE} -- System/copy files
copy_directory (a_src: DIRECTORY; a_dest: DIRECTORY; is_recursive: BOOLEAN)
@@ -257,20 +341,30 @@ feature {NONE} -- System/copy files
do
if not retried then
if attached a_file.path.entry as e then
create l_dest.make_with_path (a_dir.extended_path (e))
l_dest.create_read_write
a_file.open_read
-- Copy file source to destination
if
l_dest.exists and then
l_dest.is_writable and then
a_file.exists and then
a_file.is_readable
a_file.is_access_readable
then
a_file.copy_to (l_dest)
a_file.close
l_dest.close
files_count := files_count + 1
create l_dest.make_with_path (a_dir.extended_path (e))
if
not l_dest.exists or else
l_dest.is_writable
then
if not l_dest.exists or else (a_file.date > l_dest.date) then
files_changes_count := files_changes_count + 1
if is_verbose then
print ({STRING_32} " - file %"" + l_dest.path.name + "%"%N")
end
end
l_dest.create_read_write
a_file.copy_to (l_dest)
a_file.close
l_dest.close
files_count := files_count + 1
end
end
end
end
@@ -292,6 +386,6 @@ feature {NONE} -- System/copy files
note
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
copyright: "2011-2016, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
end