~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/config.py

Show diffs side-by-side

added added

removed removed

Lines of Context:
2264
2264
    value, in which config files it can be stored, etc (TBC).
2265
2265
    """
2266
2266
 
2267
 
    def __init__(self, name, default=None):
 
2267
    def __init__(self, name, default=None, from_unicode=None):
2268
2268
        self.name = name
2269
2269
        self.default = default
 
2270
        self.from_unicode = from_unicode
2270
2271
 
2271
2272
    def get_default(self):
2272
2273
        return self.default
2273
2274
 
2274
2275
 
 
2276
# Predefined converters to get proper values from store
 
2277
 
 
2278
def bool_from_store(unicode_str):
 
2279
    return ui.bool_from_string(unicode_str)
 
2280
 
 
2281
 
2275
2282
# Options registry
2276
2283
 
2277
2284
option_registry = registry.Registry()
2282
2289
    help='The command called to launch an editor to enter a message.')
2283
2290
 
2284
2291
option_registry.register(
2285
 
    'dirstate.fdatasync', Option('dirstate.fdatasync', default=True),
 
2292
    'dirstate.fdatasync', Option('dirstate.fdatasync', default=True,
 
2293
                                 from_unicode=bool_from_store),
2286
2294
    help='Flush dirstate changes onto physical disk?')
2287
2295
 
2288
2296
option_registry.register(
2289
2297
    'repository.fdatasync',
2290
 
    Option('repository.fdatasync', default=True),
 
2298
    Option('repository.fdatasync', default=True, from_unicode=bool_from_store),
2291
2299
    help='Flush repository changes onto physical disk?')
2292
2300
 
2293
2301
 
2746
2754
                    break
2747
2755
            if value is not None:
2748
2756
                break
 
2757
        # If the option is registered, it may provide additional info about
 
2758
        # value handling
 
2759
        try:
 
2760
            opt = option_registry.get(name)
 
2761
        except KeyError:
 
2762
            # Not registered
 
2763
            opt = None
 
2764
        if (opt is not None and opt.from_unicode is not None
 
2765
            and value is not None):
 
2766
            # If a value exists and the option provides a converter, use it
 
2767
            try:
 
2768
                converted = opt.from_unicode(value)
 
2769
            except (ValueError, TypeError):
 
2770
                # Invalid values are ignored
 
2771
                converted = None
 
2772
            value = converted
2749
2773
        if value is None:
2750
2774
            # If the option is registered, it may provide a default value
2751
 
            try:
2752
 
                opt = option_registry.get(name)
2753
 
            except KeyError:
2754
 
                # Not registered
2755
 
                opt = None
2756
2775
            if opt is not None:
2757
2776
                value = opt.get_default()
 
2777
        if opt is not None and value is None:
 
2778
            value = opt.get_default()
2758
2779
        for hook in ConfigHooks['get']:
2759
2780
            hook(self, name, value)
2760
2781
        return value