Explorar o código

Refactor paths so they can be set in config

Billy Barrow hai 1 mes
pai
achega
31b554c276
Modificáronse 5 ficheiros con 86 adicións e 33 borrados
  1. 1 1
      src/cli/Cli.vala
  2. 3 3
      src/cli/Manifest.vala
  3. 4 0
      src/lib/Configuration.vala
  4. 76 27
      src/lib/Paths.vala
  5. 2 2
      src/lib/Tag/Tag.vala

+ 1 - 1
src/cli/Cli.vala

@@ -2,7 +2,7 @@ Usm.Paths paths;
 
 
 public static int main(string[] args) {
-    paths = new Usm.Paths.usm_environ();
+    paths = new Usm.Paths();
 
     if(args.length < 2) {
         usage();

+ 3 - 3
src/cli/Manifest.vala

@@ -5,7 +5,7 @@ bool debug_mode = false;
 
 
 public static int manifest_main(string[] args) {
-    paths = new Usm.Paths.usm_environ();
+    paths = new Usm.Paths();
 
     if(args.length < 2) {
         manifest_usage();
@@ -596,7 +596,7 @@ private static Usm.ResourceType guess_resource_type(string path) {
     string clean_path = path.has_prefix("/") ? path.substring(1) : path;
     
     // Create a temporary Paths object to get the default paths
-    var default_paths = new Usm.Paths.usm_environ();
+    var default_paths = new Usm.Paths();
     
     // Find all matching resource types and calculate directory traversals
     var matching_types = new Invercargill.DataStructures.Vector<Usm.ResourceType>();
@@ -688,7 +688,7 @@ private static string get_relative_path_for_type(string path, string type) {
     string clean_path = path.has_prefix("/") ? path.substring(1) : path;
     
     // Create a temporary Paths object to get the default paths
-    var default_paths = new Usm.Paths.usm_environ();
+    var default_paths = new Usm.Paths();
     
     try {
         // Convert string type to ResourceType enum

+ 4 - 0
src/lib/Configuration.vala

@@ -7,6 +7,7 @@ namespace Usm {
 
         public bool is_managed { get; set; }
         public ManagedConfiguration? managed_config { get; set; }
+        public Paths? paths { get; set; }
 
         public static PropertyMapper<Configuration> get_mapper() {
             return PropertyMapper.build_for<Configuration>(cfg => {
@@ -14,6 +15,9 @@ namespace Usm {
                 cfg.map_properties_with<ManagedConfiguration>("managed", o => o.managed_config, (o, v) => o.managed_config = v, ManagedConfiguration.get_mapper())
                     .undefined_when(o => o.managed_config == null)
                     .when_undefined(o => o.managed_config = null);
+                cfg.map_properties_with<Paths>("paths", o => o.paths, (o, v) => o.paths = v, Paths.get_mapper())
+                    .undefined_when(o => o.paths == null)
+                    .when_undefined(o => new Paths.usm_environ());
                 cfg.set_constructor(() => new Configuration());
             });
         }

+ 76 - 27
src/lib/Paths.vala

@@ -1,3 +1,5 @@
+using Invercargill.Mapping;
+
 namespace Usm {
 
     public class Paths {
@@ -10,7 +12,6 @@ namespace Usm {
         public string data { get; set; }
         public string info { get; set; }
         public string lib { get; set; }
-        public string altlib { get; set; }
         public string canonlib { get; set; }
         public string man { get; set; }
         public string libexec { get; set; }
@@ -31,7 +32,6 @@ namespace Usm {
             Environment.set_variable("DATADIR", Paths.ensure_trailing_slash(data), true);
             Environment.set_variable("INFODIR", Paths.ensure_trailing_slash(info), true);
             Environment.set_variable("LIBDIR", Paths.ensure_trailing_slash(lib), true);
-            Environment.set_variable("ALTLIBDIR", Paths.ensure_trailing_slash(altlib), true);
             Environment.set_variable("CANONLIBDIR", Paths.ensure_trailing_slash(canonlib), true);
             Environment.set_variable("MANDIR", Paths.ensure_trailing_slash(man), true);
             Environment.set_variable("LIBEXECDIR", Paths.ensure_trailing_slash(libexec), true);
@@ -126,9 +126,8 @@ namespace Usm {
             include = "include";
             data = "share";
             info = "share/info";
-            lib = sizeof(void*) == 8 ? "lib64" : "lib";
+            lib = "lib";
             canonlib = "lib";
-            altlib = "lib";
             man = "share/man";
             libexec = "libexec";
             locale = "share/locale";
@@ -141,28 +140,22 @@ namespace Usm {
             usm_config_dir = "/etc/usm";
         }
 
-        public Paths.usm_environ() {
-            var defaults = new Paths.defaults();
-            
-            destination = Environment.get_variable("USM_DESTDIR") ?? defaults.destination;
-            prefix = Environment.get_variable("USM_PREFIX") ?? defaults.prefix;
-            bin = Environment.get_variable("USM_BINDIR") ?? defaults.bin;
-            include = Environment.get_variable("USM_INCLUDEDIR") ?? defaults.include;
-            data = Environment.get_variable("USM_DATADIR") ?? defaults.data;
-            info = Environment.get_variable("USM_INFODIR") ?? defaults.info;
-            lib = Environment.get_variable("USM_LIBDIR") ?? defaults.lib;
-            altlib = Environment.get_variable("USM_ALTLIBDIR") ?? defaults.altlib;
-            canonlib = Environment.get_variable("USM_CANONLIBDIR") ?? defaults.canonlib;
-            man = Environment.get_variable("USM_MANDIR") ?? defaults.man;
-            libexec = Environment.get_variable("USM_LIBEXECDIR") ?? defaults.libexec;
-            locale = Environment.get_variable("USM_LOCALEDIR") ?? defaults.locale;
-            local_state = Environment.get_variable("USM_LOCALSTATEDIR") ?? defaults.local_state;
-            sbin = Environment.get_variable("USM_SBINDIR") ?? defaults.sbin;
-            shared_state = Environment.get_variable("USM_SHAREDSTATEDIR") ?? defaults.shared_state;
-            sys_config = Environment.get_variable("USM_SYSCONFIGDIR") ?? defaults.sys_config;
-            tags = Environment.get_variable("USM_TAGSDIR") ?? defaults.tags;
-
-            usm_config_dir = Environment.get_variable("USM_CONFIGDIR") ?? defaults.usm_config_dir;
+        public Paths.usm_environ(Paths? defaults = null) {
+            var fallback = defaults ?? new Paths.defaults();
+            override_from_environment(fallback);
+        }
+
+        private Paths.empty() {}
+
+        public Paths() {
+            var provisional_paths = new Paths.usm_environ();
+            try {
+                var config = new Configuration.from_paths(provisional_paths);
+                override_from_environment(config.paths);
+            }
+            catch {
+                override_from_environment(provisional_paths);
+            }
         }
 
         public Paths clone() {
@@ -174,7 +167,6 @@ namespace Usm {
                 data = data,
                 info = info,
                 lib = lib,
-                altlib = altlib,
                 canonlib = canonlib,
                 man = man,
                 libexec = libexec,
@@ -187,6 +179,63 @@ namespace Usm {
                 usm_config_dir = usm_config_dir,
             };
         }
+
+        private void override_from_environment(Paths fallback) {
+            destination = Environment.get_variable("USM_DESTDIR") ?? fallback.destination;
+            prefix = Environment.get_variable("USM_PREFIX") ?? fallback.prefix;
+            bin = Environment.get_variable("USM_BINDIR") ?? fallback.bin;
+            include = Environment.get_variable("USM_INCLUDEDIR") ?? fallback.include;
+            data = Environment.get_variable("USM_DATADIR") ?? fallback.data;
+            info = Environment.get_variable("USM_INFODIR") ?? fallback.info;
+            lib = Environment.get_variable("USM_LIBDIR") ?? fallback.lib;
+            canonlib = Environment.get_variable("USM_CANONLIBDIR") ?? fallback.canonlib;
+            man = Environment.get_variable("USM_MANDIR") ?? fallback.man;
+            libexec = Environment.get_variable("USM_LIBEXECDIR") ?? fallback.libexec;
+            locale = Environment.get_variable("USM_LOCALEDIR") ?? fallback.locale;
+            local_state = Environment.get_variable("USM_LOCALSTATEDIR") ?? fallback.local_state;
+            sbin = Environment.get_variable("USM_SBINDIR") ?? fallback.sbin;
+            shared_state = Environment.get_variable("USM_SHAREDSTATEDIR") ?? fallback.shared_state;
+            sys_config = Environment.get_variable("USM_SYSCONFIGDIR") ?? fallback.sys_config;
+            tags = Environment.get_variable("USM_TAGSDIR") ?? fallback.tags;
+            usm_config_dir = Environment.get_variable("USM_CONFIGDIR") ?? fallback.usm_config_dir;
+        }
+
+        public static PropertyMapper<Paths> get_mapper() {
+            var defaults = new Paths.defaults();
+            return new PropertyMapperBuilder<Paths>()
+                .map<string?>("prefix", o => o.prefix, (o, v) => o.prefix = v)
+                    .when_undefined(o => o.prefix = defaults.prefix)
+                .map<string?>("bin", o => o.bin, (o, v) => o.bin = v)
+                    .when_undefined(o => o.bin = defaults.bin)
+                .map<string?>("include", o => o.include, (o, v) => o.include = v)
+                    .when_undefined(o => o.include = defaults.include)
+                .map<string?>("data", o => o.data, (o, v) => o.data = v)
+                    .when_undefined(o => o.data = defaults.data)
+                .map<string?>("info", o => o.info, (o, v) => o.info = v)
+                    .when_undefined(o => o.info = defaults.info)
+                .map<string?>("lib", o => o.lib, (o, v) => o.lib = v)
+                    .when_undefined(o => o.lib = defaults.lib)
+                .map<string?>("canonlib", o => o.canonlib, (o, v) => o.canonlib = v)
+                    .when_undefined(o => o.canonlib = defaults.canonlib)
+                .map<string?>("man", o => o.man, (o, v) => o.man = v)
+                    .when_undefined(o => o.man = defaults.man)
+                .map<string?>("libexec", o => o.libexec, (o, v) => o.libexec = v)
+                    .when_undefined(o => o.libexec = defaults.libexec)
+                .map<string?>("locale", o => o.locale, (o, v) => o.locale = v)
+                    .when_undefined(o => o.locale = defaults.locale)
+                .map<string?>("localState", o => o.local_state, (o, v) => o.local_state = v)
+                    .when_undefined(o => o.local_state = defaults.local_state)
+                .map<string?>("sbin", o => o.sbin, (o, v) => o.sbin = v)
+                    .when_undefined(o => o.sbin = defaults.sbin)
+                .map<string?>("sharedState", o => o.shared_state, (o, v) => o.shared_state = v)
+                    .when_undefined(o => o.shared_state = defaults.shared_state)
+                .map<string?>("sysConfig", o => o.sys_config, (o, v) => o.sys_config = v)
+                    .when_undefined(o => o.sys_config = defaults.sys_config)
+                .map<string?>("tags", o => o.tags, (o, v) => o.tags = v)
+                    .when_undefined(o => o.tags = defaults.tags)
+                .set_constructor(() => new Paths.empty())
+                .build();
+        }
     }
 
 }

+ 2 - 2
src/lib/Tag/Tag.vala

@@ -27,7 +27,7 @@ namespace Usm {
         }
 
         public static Tag? read(string name) {
-            var paths = new Paths.usm_environ();
+            var paths = new Paths();
             var path = paths.get_tag_file_path(name);
             if(!File.new_for_path(path).query_exists()) {
                 return null;
@@ -54,7 +54,7 @@ namespace Usm {
         }
 
         public Enumerable<Tag> get_children() {
-            var paths = new Paths.usm_environ();
+            var paths = new Paths();
             var path = paths.get_tag_dir_path(name);
             if(!File.new_for_path(path).query_exists()) {
                 return Iterate.nothing<Tag>();