[jhbuild] keep track of configuration options set from the command line



commit 244069425f821010bfa141dad31361126f3f84c9
Author: Frédéric Péters <fpeters 0d be>
Date:   Sat May 23 00:51:28 2009 +0200

    keep track of configuration options set from the command line
    
    The configuration values were reset to default values when the user
    choosed to reload the configuration (from the terminal frontend), and
    options set from the command line (such as --no-poison) were therefore
    lost.  (GNOME bug 583518)
---
 jhbuild/commands/base.py      |   88 +++--------------------------------------
 jhbuild/commands/tinderbox.py |   22 +---------
 jhbuild/commands/uninstall.py |    3 +-
 jhbuild/config.py             |   55 +++++++++++++++++++++++++
 4 files changed, 65 insertions(+), 103 deletions(-)

diff --git a/jhbuild/commands/base.py b/jhbuild/commands/base.py
index 13a5860..ffc02ab 100644
--- a/jhbuild/commands/base.py
+++ b/jhbuild/commands/base.py
@@ -30,14 +30,7 @@ import jhbuild.frontends
 from jhbuild.errors import UsageError, FatalError, CommandError
 from jhbuild.commands import Command, register_command
 
-
-def parse_relative_time(s):
-    m = re.match(r'(\d+) *([smhdw])', s.lower())
-    if m:
-        coeffs = {'s': 1, 'm': 60, 'h': 3600, 'd': 86400, 'w':7*86400}
-        return float(m.group(1)) * coeffs[m.group(2)]
-    else:
-        raise ValueError(_('unable to parse \'%s\' as relative time.') % s)
+from jhbuild.config import parse_relative_time
 
 
 class cmd_update(Command):
@@ -66,15 +59,7 @@ class cmd_update(Command):
             ])
 
     def run(self, config, options, args):
-        for item in options.skip:
-            config.skip += item.split(',')
-        for item in options.tags:
-            config.tags += item.split(',')
-        if options.sticky_date is not None:
-            config.sticky_date = options.sticky_date
-        if options.ignore_suggests:
-            config.ignore_suggests = True
-
+        config.set_from_cmdline_options(options)
         module_set = jhbuild.moduleset.load(config)
         module_list = module_set.get_module_list(args or config.modules,
                 config.skip, tags=config.tags,
@@ -110,9 +95,7 @@ class cmd_updateone(Command):
             ])
 
     def run(self, config, options, args):
-        if options.sticky_date is not None:
-            config.sticky_date = options.sticky_date
-        
+        config.set_from_cmdline_options(options)
         module_set = jhbuild.moduleset.load(config)
         try:
             module_list = [module_set.get_module(modname, ignore_case = True) for modname in args]
@@ -280,39 +263,7 @@ class cmd_build(Command):
             ])
 
     def run(self, config, options, args):
-        if options.autogen:
-            config.alwaysautogen = True
-        if options.clean and not 'clean' in config.build_targets:
-            config.build_targets.insert(0, 'clean')
-        if options.dist and not 'dist' in config.build_targets:
-            config.build_targets.append('dist')
-        if options.distcheck and not 'distcheck' in config.build_targets:
-            config.build_targets.append('distcheck')
-        if options.ignore_suggests:
-            config.ignore_suggests = True
-        if options.nonetwork:
-            config.nonetwork = True
-        for item in options.skip:
-            config.skip += item.split(',')
-        for item in options.tags:
-            config.tags += item.split(',')
-        if options.sticky_date is not None:
-            config.sticky_date = options.sticky_date
-        if options.noxvfb is not None:
-            config.noxvfb = options.noxvfb
-        if options.trycheckout:
-            config.trycheckout = True
-        if options.nopoison:
-            config.nopoison = True
-        if options.quiet:
-            config.quiet_mode = True
-        if options.force_policy:
-            config.build_policy = 'all'
-        if options.min_age:
-            try:
-                config.min_time = time.time() - parse_relative_time(options.min_age)
-            except ValueError:
-                raise FatalError(_('Failed to parse relative time'))
+        config.set_from_cmdline_options(options)
 
         if not config.quiet_mode:
             check_bootstrap_updateness(config)
@@ -382,29 +333,7 @@ class cmd_buildone(Command):
             ])
 
     def run(self, config, options, args):
-        if options.autogen:
-            config.alwaysautogen = True
-        if options.clean and not 'clean' in config.build_targets:
-            config.build_targets.insert(0, 'clean')
-        if options.dist and not 'dist' in config.build_targets:
-            config.build_targets.append('dist')
-        if options.distcheck and not 'distcheck' in config.build_targets:
-            config.build_targets.append('distcheck')
-        if options.nonetwork:
-            config.nonetwork = True
-        if options.sticky_date is not None:
-            config.sticky_date = options.sticky_date
-        if options.noxvfb is not None:
-            config.noxvfb = options.noxvfb
-        if options.quiet:
-            config.quiet_mode = True
-        if options.force_policy:
-            config.build_policy = 'all'
-        if options.min_age:
-            try:
-                config.min_time = time.time() - parse_relative_time(options.min_age)
-            except ValueError:
-                raise FatalError(_('Failed to parse relative time'))
+        config.set_from_cmdline_options(options)
 
         if not config.quiet_mode:
             check_bootstrap_updateness(config)
@@ -524,12 +453,7 @@ class cmd_list(Command):
             ])
 
     def run(self, config, options, args):
-        for item in options.skip:
-            config.skip += item.split(',')
-        for item in options.tags:
-            config.tags += item.split(',')
-        if options.ignore_suggests:
-            config.ignore_suggests = True
+        config.set_from_cmdline_options(options)
         module_set = jhbuild.moduleset.load(config)
         if options.list_all_modules:
             module_list = module_set.modules.values()
diff --git a/jhbuild/commands/tinderbox.py b/jhbuild/commands/tinderbox.py
index 4a0743e..8a94d73 100644
--- a/jhbuild/commands/tinderbox.py
+++ b/jhbuild/commands/tinderbox.py
@@ -65,26 +65,10 @@ class cmd_tinderbox(Command):
             ])
 
     def run(self, config, options, args):
-        config.buildscript = 'tinderbox'
-
-        if options.autogen:
-            config.alwaysautogen = True
-        if options.clean:
-            config.makeclean = True
-        if options.nonetwork:
-            config.nonetwork = True
-        if options.outputdir is not None:
-            config.tinderbox_outputdir = options.outputdir
-        for item in options.skip:
-            config.skip += item.split(',')
-        if options.sticky_date is not None:
-            config.sticky_date = options.sticky_date
-        if options.trycheckout:
-            config.trycheckout = True
-        if options.nopoison:
-            config.nopoison = True
+        extra_config = {'buildscript': 'tinderbox'}
         if options.force_policy:
-            config.build_policy = 'all'
+            extra_config = {'build_policy': 'all'}
+        config.set_from_cmdline_options(options)
 
         if not config.tinderbox_outputdir:
             raise UsageError(_('output directory for tinderbox build not specified'))
diff --git a/jhbuild/commands/uninstall.py b/jhbuild/commands/uninstall.py
index d863a8c..d9d704c 100644
--- a/jhbuild/commands/uninstall.py
+++ b/jhbuild/commands/uninstall.py
@@ -42,8 +42,7 @@ class cmd_uninstall(Command):
             ])
 
     def run(self, config, options, args):
-        for item in options.skip:
-            config.skip += item.split(',')
+        config.set_from_cmdline_options(options)
 
         module_set = jhbuild.moduleset.load(config)
         module_list = module_set.get_module_list(args or config.modules, config.skip)
diff --git a/jhbuild/config.py b/jhbuild/config.py
index 8363346..ab2e956 100644
--- a/jhbuild/config.py
+++ b/jhbuild/config.py
@@ -98,6 +98,15 @@ def addpath(envvar, path):
 
     os.environ[envvar] = envval
 
+def parse_relative_time(s):
+    m = re.match(r'(\d+) *([smhdw])', s.lower())
+    if m:
+        coeffs = {'s': 1, 'm': 60, 'h': 3600, 'd': 86400, 'w':7*86400}
+        return float(m.group(1)) * coeffs[m.group(2)]
+    else:
+        raise ValueError(_('unable to parse \'%s\' as relative time.') % s)
+
+
 class Config:
     _orig_environ = None
 
@@ -134,6 +143,7 @@ class Config:
     def reload(self):
         os.environ = self._orig_environ.copy()
         self.__init__(filename=self._config.get('__file__'))
+        self.set_from_cmdline_options(options=None)
 
     def include(self, filename):
         '''Read configuration variables from a file.'''
@@ -376,6 +386,51 @@ class Config:
         if self.makedistcheck and not 'distcheck' in self.build_targets:
             self.build_targets.append('distcheck')
 
+    def set_from_cmdline_options(self, options=None):
+        if options is None:
+            options = self.cmdline_options
+        else:
+            self.cmdline_options = options
+        if hasattr(options, 'autogen') and options.autogen:
+            self.alwaysautogen = True
+        if hasattr(options, 'clean') and (
+                options.clean and not 'clean' in self.build_targets):
+            self.build_targets.insert(0, 'clean')
+        if hasattr(options, 'dist') and (
+                options.dist and not 'dist' in self.build_targets):
+            self.build_targets.append('dist')
+        if hasattr(options, 'distcheck') and (
+                options.distcheck and not 'distcheck' in self.build_targets):
+            self.build_targets.append('distcheck')
+        if hasattr(options, 'ignore_suggests') and options.ignore_suggests:
+            self.ignore_suggests = True
+        if hasattr(options, 'nonetwork') and options.nonetwork:
+            self.nonetwork = True
+        if hasattr(options, 'skip'):
+            for item in options.skip:
+                self.skip += item.split(',')
+        if hasattr(options, 'tags'):
+            for item in options.tags:
+                self.tags += item.split(',')
+        if hasattr(options, 'sticky_date') and options.sticky_date is not None:
+                self.sticky_date = options.sticky_date
+        if hasattr(options, 'xvfb') and options.noxvfb is not None:
+                self.noxvfb = options.noxvfb
+        if hasattr(options, 'trycheckout') and  options.trycheckout:
+            self.trycheckout = True
+        if hasattr(options, 'nopoison') and options.nopoison:
+            self.nopoison = True
+        if hasattr(options, 'quiet') and options.quiet:
+            self.quiet_mode = True
+        if hasattr(options, 'force_policy') and options.force_policy:
+            self.build_policy = 'all'
+        if hasattr(options, 'min_age') and options.min_age:
+            try:
+                self.min_time = time.time() - parse_relative_time(options.min_age)
+            except ValueError:
+                raise FatalError(_('Failed to parse relative time'))
+
+
     def __setattr__(self, k, v):
         '''Override __setattr__ for additional checks on some options.'''
         if k == 'quiet_mode' and v:



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]