~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/config.py

  • Committer: Vincent Ladeuil
  • Date: 2012-07-31 09:22:02 UTC
  • mto: This revision was merged to the branch mainline in revision 6554.
  • Revision ID: v.ladeuil+lp@free.fr-20120731092202-qh9fs6q4p7y4qqmy
Stop using _CompatibleStack now that local config files can be
shared. Save changes when library state goes out of scope or, as a
fallback, when the process ends.

Show diffs side-by-side

added added

removed removed

Lines of Context:
3278
3278
        # anyway.
3279
3279
        return 'In-Process Store, no URL'
3280
3280
 
 
3281
 
3281
3282
class TransportIniFileStore(IniFileStore):
3282
3283
    """IniFileStore that loads files from a transport.
3283
3284
 
3408
3409
        self.id = 'control'
3409
3410
 
3410
3411
 
 
3412
# FIXME: _shared_stores should be an attribute of a library state once a
 
3413
# library_state object is always available.
 
3414
_shared_stores = {}
 
3415
_once = True
 
3416
def get_shared_store(store, state=None):
 
3417
    """Get a known shared store.
 
3418
 
 
3419
    Store urls uniquely identify them and are used to ensure a single copy is
 
3420
    shared across all users.
 
3421
 
 
3422
    :param store: The store known to the caller.
 
3423
 
 
3424
    :param state: The library state where the known stores are kept.
 
3425
 
 
3426
    :returns: The store received if it's not a known one, an already known
 
3427
        otherwise.
 
3428
    """
 
3429
    if state is None:
 
3430
        global _once
 
3431
        stores = _shared_stores
 
3432
        def save_config_changes():
 
3433
            for k, store in stores.iteritems():
 
3434
                store.save_changes()
 
3435
        if _once:
 
3436
            # FIXME: Ugly hack waiting for library_state to always be available.
 
3437
            import atexit
 
3438
            atexit.register(save_config_changes)
 
3439
            _once = False
 
3440
    else:
 
3441
        stores = states.config_stores
 
3442
    url = store.external_url()
 
3443
    try:
 
3444
        return stores[url]
 
3445
    except KeyError:
 
3446
        stores[url] = store
 
3447
        return store
 
3448
 
 
3449
 
3411
3450
class SectionMatcher(object):
3412
3451
    """Select sections into a given Store.
3413
3452
 
3797
3836
        return "<config.%s(%s)>" % (self.__class__.__name__, id(self))
3798
3837
 
3799
3838
    def _get_overrides(self):
3800
 
        # Hack around library_state.initialize never called
 
3839
        # FIXME: Hack around library_state.initialize never called
3801
3840
        if bzrlib.global_state is not None:
3802
3841
            return bzrlib.global_state.cmdline_overrides.get_sections()
3803
3842
        return []
3857
3896
        self.store.save()
3858
3897
 
3859
3898
 
3860
 
class GlobalStack(_CompatibleStack):
 
3899
class GlobalStack(Stack):
3861
3900
    """Global options only stack.
3862
3901
 
3863
3902
    The following sections are queried:
3871
3910
    """
3872
3911
 
3873
3912
    def __init__(self):
3874
 
        gstore = GlobalStore()
 
3913
        gstore = get_shared_store(GlobalStore())
3875
3914
        super(GlobalStack, self).__init__(
3876
3915
            [self._get_overrides,
3877
3916
             NameMatcher(gstore, 'DEFAULT').get_sections],
3878
3917
            gstore, mutable_section_id='DEFAULT')
3879
3918
 
3880
3919
 
3881
 
class LocationStack(_CompatibleStack):
 
3920
class LocationStack(Stack):
3882
3921
    """Per-location options falling back to global options stack.
3883
3922
 
3884
3923
 
3900
3939
        """Make a new stack for a location and global configuration.
3901
3940
 
3902
3941
        :param location: A URL prefix to """
3903
 
        lstore = LocationStore()
 
3942
        # FIXME: self._get_shared_store ?
 
3943
        lstore = get_shared_store(LocationStore())
3904
3944
        if location.startswith('file://'):
3905
3945
            location = urlutils.local_path_from_url(location)
3906
 
        gstore = GlobalStore()
 
3946
        gstore = get_shared_store(GlobalStore())
3907
3947
        super(LocationStack, self).__init__(
3908
3948
            [self._get_overrides,
3909
3949
             LocationMatcher(lstore, location).get_sections,
3931
3971
    """
3932
3972
 
3933
3973
    def __init__(self, branch):
3934
 
        lstore = LocationStore()
 
3974
        lstore = get_shared_store(LocationStore())
3935
3975
        bstore = branch._get_config_store()
3936
 
        gstore = GlobalStore()
 
3976
        gstore = get_shared_store(GlobalStore())
3937
3977
        super(BranchStack, self).__init__(
3938
3978
            [self._get_overrides,
3939
3979
             LocationMatcher(lstore, branch.base).get_sections,
3961
4001
        # unlock saves all the changes.
3962
4002
 
3963
4003
 
3964
 
class RemoteControlStack(_CompatibleStack):
 
4004
class RemoteControlStack(Stack):
3965
4005
    """Remote control-only options stack."""
3966
4006
 
3967
4007
    # FIXME 2011-11-22 JRV This should probably be renamed to avoid confusion