From ff58c6aff9680dc59cb801a878db979f3d7696a9 Mon Sep 17 00:00:00 2001 From: Jocelyn Fiat Date: Wed, 30 Nov 2016 15:40:12 +0100 Subject: [PATCH] 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"; } } } --- tools/roc/roc.cfg-example | 24 ++++ tools/roc/roc.ecf | 13 ++- tools/roc/roc_install_command.e | 196 +++++++++++++++++++++++--------- 3 files changed, 178 insertions(+), 55 deletions(-) create mode 100644 tools/roc/roc.cfg-example diff --git a/tools/roc/roc.cfg-example b/tools/roc/roc.cfg-example new file mode 100644 index 0000000..ff6aa9c --- /dev/null +++ b/tools/roc/roc.cfg-example @@ -0,0 +1,24 @@ +{ + "name": "demo", + "project": "demo-safe.ecf", + "location": ".", + "site_directory": "site", + "modules": { + "admin": { "location": "../../modules/admin" }, + "auth": { "location": "../../modules/auth" }, + "basic_auth": { "location": "../../modules/basic_auth" }, + "blog": { "location": "../../modules/blog" }, + "contact": { "location": "../../modules/contact" }, + "feed_aggregator": { "location": "../../modules/feed_aggregator" }, + "google_search": { "location": "../../modules/google_search" }, + "node": { "location": "../../modules/node" }, + "oauth20": { "location": "../../modules/oauth20" }, + "openid": { "location": "../../modules/openid" }, + "recent_changes": { "location": "../../modules/recent_changes" }, + "seo": { "location": "../../modules/seo" }, + "session_auth": { "location": "../../modules/session_auth" }, + "taxonomy": { "location": "../../modules/taxonomy" }, + "files": { "location": "../../modules/files" }, + "custom_block": { "location": "../../modules/custom_block" } + } +} diff --git a/tools/roc/roc.ecf b/tools/roc/roc.ecf index e38b269..9c277ee 100644 --- a/tools/roc/roc.ecf +++ b/tools/roc/roc.ecf @@ -1,18 +1,23 @@ - + - + + + + + - /EIFGENs$ - /CVS$ /.svn$ + /CVS$ + /EIFGENs$ diff --git a/tools/roc/roc_install_command.e b/tools/roc/roc_install_command.e index f73d274..76dce24 100644 --- a/tools/roc/roc_install_command.e +++ b/tools/roc/roc_install_command.e @@ -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