Add new global config singleton object and Spec class and convert snapshot and generi...
authorAndrew Gaffney <agaffney@gentoo.org>
Tue, 13 Jan 2009 00:45:30 +0000 (18:45 -0600)
committerAndrew Gaffney <agaffney@gentoo.org>
Tue, 13 Jan 2009 00:45:30 +0000 (18:45 -0600)
ChangeLog
catalyst
modules/catalyst/__init__.py
modules/catalyst/config.py
modules/catalyst/target/generic.py
modules/catalyst/target/generic_stage.py
modules/catalyst/target/snapshot.py

index 376df55773cfbc4138e210b02df93b0e176476bc..05198336a640f6ebc06f8ae44cabebf5c08ed0a5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,14 @@
 # Copyright 2002-2009 Gentoo Foundation; 2008-2009 Various authors (see AUTHORS)
 # Distributed under the GPL v2
 
+  13 Jan 2009; Andrew Gaffney <agaffney@gentoo.org> catalyst,
+  modules/catalyst/__init__.py, modules/catalyst/config.py,
+  modules/catalyst/target/generic.py,
+  modules/catalyst/target/generic_stage.py,
+  modules/catalyst/target/snapshot.py:
+  Add new global config singleton object and Spec class and convert snapshot
+  and generic targets to use it
+
   12 Jan 2009; Andrew Gaffney <agaffney@gentoo.org>
   modules/catalyst/__init__.py:
   Add base singleton class definition
index af5559958a5e4d9fa12f94c4ff83ffdcecdd0a42..50a7af7fd03416023d92ac1e7c0b70f6f89cb0bd 100755 (executable)
--- a/catalyst
+++ b/catalyst
@@ -20,6 +20,7 @@ __maintainer__="Chris Gianelloni <wolf31o2@gentoo.org>"
 __version__="2.99"
 
 conf_values={}
+config = catalyst.config.config()
 
 def usage():
        print "Usage catalyst [options] [-C variable=value...] [ -s identifier]"
@@ -145,6 +146,7 @@ def build_target(addlargs, targetmap):
                if not addlargs["target"] in targetmap:
                        raise CatalystError,"Target \""+addlargs["target"]+"\" not available."
 
+               config.get_spec().set_target(addlargs["target"])
                mytarget=targetmap[addlargs["target"]](conf_values, addlargs)
 
                mytarget.run()
@@ -290,19 +292,27 @@ if __name__ == "__main__":
        targetmap = catalyst.target.build_target_map()
 
        addlargs={}
+       spec = catalyst.config.Spec()
 
        if myspecfile:
-               spec = catalyst.config.SpecParser(myspecfile)
-               addlargs.update(spec.get_values())
+               specparser = catalyst.config.SpecParser(myspecfile)
+               spec_values = specparser.get_values()
+               addlargs.update(spec_values)
+               spec.parse_values(spec_values)
 
        if mycmdline:
                try:
                        cmdline = catalyst.config.ConfigParser()
                        cmdline.parse_lines(mycmdline)
+                       cmdline_values = cmdline.get_values()
                        addlargs.update(cmdline.get_values())
+                       spec.parse_values(cmdline_values)
                except CatalystError:
                        die("Could not parse commandline, exiting.")
 
+       config.set_spec(spec)
+       config.set_conf(conf_values)
+
        if not "target" in addlargs:
                raise CatalystError, "Required value \"target\" not specified."
 
index 3b1ea8d18467601baf3bd85e841fbf1ba7c0ac59..a7d2aaff40926dba8da6535d819649d7f8575b11 100644 (file)
@@ -15,16 +15,3 @@ error = catalyst.error
 spawn = catalyst.spawn
 target = catalyst.target
 config = catalyst.config
-
-"""
-This class implements a proper singleton. This is useful for having a "global"
-var with config and spec values instead of passing them around between objects
-and functions
-"""
-class Singleton(object):
-
-       def __new__(type):
-               if not '_the_instance' in type.__dict__:
-                       type._the_instance = object.__new__(type)
-               return type._the_instance
-
index 4fc62911bf7585d2b639f0878b5ecb80623661cf..4e372e50d4242e0d3361b9cb618893e34ec8d9b9 100644 (file)
@@ -145,3 +145,70 @@ class ConfigParser(ParserBase):
                if filename:
                        self.parse_file(filename)
 
+class Spec:
+
+       special_prefixes = ('boot', )
+
+       def __init__(self, values=None):
+               self.values = { 'global': {} }
+               self.target = None
+               if values:
+                       self.parse_values(values)
+
+       def parse_values(self, values):
+               for x in values:
+                       parts = x.split('/')
+                       if len(parts) == 1 or parts[0] in self.special_prefixes:
+                               self.values['global'][x] = values[x]
+                       else:
+                               if not parts[0] in self.values:
+                                       self.values[parts[0]] = {}
+                               # We need to stick the key including the prefix in here until the targets are updated
+                               self.values[parts[0]][x] = values[x]
+                               self.values[parts[0]]['/'.join(parts[1:])] = values[x]
+
+       def set_target(self, target):
+               self.target = target
+
+       def get_values(self, target=None):
+               if target is None:
+                       target = self.target
+               tmp = self.values['global']
+               if target in self.values:
+                       tmp.update(self.values[target])
+               return tmp
+
+class Singleton(type):
+
+       def __init__(self, *args):
+               type.__init__(self, *args)
+               self._instances = {}
+
+       def __call__(self, *args):
+               if not args in self._instances:
+                       self._instances[args] = type.__call__(self, *args)
+               return self._instances[args]
+
+class config:
+
+       __metaclass__ = Singleton
+
+       def __init__(self):
+               if not hasattr(self, 'spec'):
+                       self.spec = None
+                       self.conf = {}
+
+       def set_spec(self, spec):
+               self.spec = spec
+
+       def get_spec(self):
+               return self.spec
+
+       def set_conf(self, conf):
+               self.conf = conf
+
+       def update_conf(self, conf):
+               self.conf.update(conf)
+
+       def get_conf(self):
+               return self.conf
index 6bcec8be45434aa0ad4b64f66fa0553e6c7140d4..3e09da48131bbde5a225c8c4466e3fdeb497e878 100644 (file)
@@ -7,9 +7,15 @@ from catalyst.output import *
 
 class generic_target:
 
-       def __init__(self,myspec,addlargs):
-               catalyst.util.addl_arg_parse(myspec,addlargs,self.required_values,self.valid_values)
-               self.settings=myspec
+       def __init__(self, myspec=None, addlargs=None):
+               if myspec and addlargs:
+                       catalyst.util.addl_arg_parse(myspec,addlargs,self.required_values,self.valid_values)
+                       self.settings=myspec
+               else:
+                       self.config = catalyst.config.config()
+                       self.settings = self.config.get_spec().get_values()
+                       self.settings.update(self.config.get_conf())
+
                self.env={}
                self.env["PATH"]="/bin:/sbin:/usr/bin:/usr/sbin"
 
index 931539d140286cd90c5d649b119deb86fae58860..12bf1de1d9c635a19a7341dabb7730cc2f7e5ac9 100644 (file)
@@ -14,7 +14,7 @@ from catalyst.target.generic import *
 
 class generic_stage_target(generic_target):
 
-       def __init__(self,myspec,addlargs):
+       def __init__(self, myspec=None, addlargs=None):
                self.required_values.extend(["version_stamp","target","subarch",\
                        "rel_type","profile","snapshot","source_subpath"])
 
index e88ad8cab3c23f2826cb61fba05ea99a1957c585..50bf65008bdcaa69678b9e709aee7e6af2ff63fe 100644 (file)
@@ -14,8 +14,8 @@ class snapshot_target(generic_target):
                self.required_values=["version_stamp","target"]
                self.valid_values=["version_stamp","target"]
 
-               generic_target.__init__(self,myspec,addlargs)
-               self.settings=myspec
+               generic_target.__init__(self)
+#              self.settings=myspec
                self.settings["target_subpath"]="portage"
                st=self.settings["storedir"]
                self.settings["snapshot_path"]=catalyst.util.normpath(st+"/snapshots/portage-"+self.settings["version_stamp"]\