/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/config.py

  • Committer: Robert Collins
  • Date: 2010-05-06 11:08:10 UTC
  • mto: This revision was merged to the branch mainline in revision 5223.
  • Revision ID: robertc@robertcollins.net-20100506110810-h3j07fh5gmw54s25
Cleaner matcher matching revised unlocking protocol.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2007, 2008 Canonical Ltd
 
1
# Copyright (C) 2005-2010 Canonical Ltd
2
2
#   Authors: Robert Collins <robert.collins@canonical.com>
3
3
#            and others
4
4
#
146
146
class Config(object):
147
147
    """A configuration policy - what username, editor, gpg needs etc."""
148
148
 
 
149
    def __init__(self):
 
150
        super(Config, self).__init__()
 
151
 
149
152
    def get_editor(self):
150
153
        """Get the users pop up editor."""
151
154
        raise NotImplementedError
152
155
 
 
156
    def get_change_editor(self, old_tree, new_tree):
 
157
        from bzrlib import diff
 
158
        cmd = self._get_change_editor()
 
159
        if cmd is None:
 
160
            return None
 
161
        return diff.DiffFromTool.from_string(cmd, old_tree, new_tree,
 
162
                                             sys.stdout)
 
163
 
 
164
 
153
165
    def get_mail_client(self):
154
166
        """Get a mail client to use"""
155
167
        selected_client = self.get_user_option('mail_client')
174
186
        """Get a generic option - no special process, no default."""
175
187
        return self._get_user_option(option_name)
176
188
 
 
189
    def get_user_option_as_bool(self, option_name):
 
190
        """Get a generic option as a boolean - no special process, no default.
 
191
 
 
192
        :return None if the option doesn't exist or its value can't be
 
193
            interpreted as a boolean. Returns True or False otherwise.
 
194
        """
 
195
        s = self._get_user_option(option_name)
 
196
        if s is None:
 
197
            # The option doesn't exist
 
198
            return None
 
199
        val = ui.bool_from_string(s)
 
200
        if val is None:
 
201
            # The value can't be interpreted as a boolean
 
202
            trace.warning('Value "%s" is not a boolean for "%s"',
 
203
                          s, option_name)
 
204
        return val
 
205
 
 
206
    def get_user_option_as_list(self, option_name):
 
207
        """Get a generic option as a list - no special process, no default.
 
208
 
 
209
        :return None if the option doesn't exist. Returns the value as a list
 
210
            otherwise.
 
211
        """
 
212
        l = self._get_user_option(option_name)
 
213
        if isinstance(l, (str, unicode)):
 
214
            # A single value, most probably the user forgot the final ','
 
215
            l = [l]
 
216
        return l
 
217
 
177
218
    def gpg_signing_command(self):
178
219
        """What program should be used to sign signatures?"""
179
220
        result = self._gpg_signing_command()
196
237
        """See log_format()."""
197
238
        return None
198
239
 
199
 
    def __init__(self):
200
 
        super(Config, self).__init__()
201
 
 
202
240
    def post_commit(self):
203
241
        """An ordered list of python functions to call.
204
242
 
295
333
                path = 'bzr'
296
334
            return path
297
335
 
 
336
    def suppress_warning(self, warning):
 
337
        """Should the warning be suppressed or emitted.
 
338
 
 
339
        :param warning: The name of the warning being tested.
 
340
 
 
341
        :returns: True if the warning should be suppressed, False otherwise.
 
342
        """
 
343
        warnings = self.get_user_option_as_list('suppress_warnings')
 
344
        if warnings is None or warning not in warnings:
 
345
            return False
 
346
        else:
 
347
            return True
 
348
 
298
349
 
299
350
class IniBasedConfig(Config):
300
351
    """A configuration policy that draws from ini files."""
301
352
 
 
353
    def __init__(self, get_filename):
 
354
        super(IniBasedConfig, self).__init__()
 
355
        self._get_filename = get_filename
 
356
        self._parser = None
 
357
 
302
358
    def _get_parser(self, file=None):
303
359
        if self._parser is not None:
304
360
            return self._parser
332
388
        """Return the policy for the given (section, option_name) pair."""
333
389
        return POLICY_NONE
334
390
 
 
391
    def _get_change_editor(self):
 
392
        return self.get_user_option('change_editor')
 
393
 
335
394
    def _get_signature_checking(self):
336
395
        """See Config._get_signature_checking."""
337
396
        policy = self._get_user_option('check_signatures')
381
440
        """See Config.log_format."""
382
441
        return self._get_user_option('log_format')
383
442
 
384
 
    def __init__(self, get_filename):
385
 
        super(IniBasedConfig, self).__init__()
386
 
        self._get_filename = get_filename
387
 
        self._parser = None
388
 
 
389
443
    def _post_commit(self):
390
444
        """See Config.post_commit."""
391
445
        return self._get_user_option('post_commit')
464
518
        self._write_config_file()
465
519
 
466
520
    def _write_config_file(self):
467
 
        f = open(self._get_filename(), 'wb')
 
521
        path = self._get_filename()
 
522
        f = open(path, 'wb')
 
523
        osutils.copy_ownership_from_path(path)
468
524
        self._get_parser().write(f)
469
525
        f.close()
470
526
 
670
726
 
671
727
        return self._get_best_value('_get_user_id')
672
728
 
 
729
    def _get_change_editor(self):
 
730
        return self._get_best_value('_get_change_editor')
 
731
 
673
732
    def _get_signature_checking(self):
674
733
        """See Config._get_signature_checking."""
675
734
        return self._get_best_value('_get_signature_checking')
761
820
            os.mkdir(parent_dir)
762
821
        trace.mutter('creating config directory: %r', path)
763
822
        os.mkdir(path)
 
823
        osutils.copy_ownership_from_path(path)
764
824
 
765
825
 
766
826
def config_dir():
812
872
    return osutils.pathjoin(config_dir(), 'ignore')
813
873
 
814
874
 
 
875
def crash_dir():
 
876
    """Return the directory name to store crash files.
 
877
 
 
878
    This doesn't implicitly create it.
 
879
 
 
880
    On Windows it's in the config directory; elsewhere it's /var/crash
 
881
    which may be monitored by apport.  It can be overridden by
 
882
    $APPORT_CRASH_DIR.
 
883
    """
 
884
    if sys.platform == 'win32':
 
885
        return osutils.pathjoin(config_dir(), 'Crash')
 
886
    else:
 
887
        # XXX: hardcoded in apport_python_hook.py; therefore here too -- mbp
 
888
        # 2010-01-31
 
889
        return os.environ.get('APPORT_CRASH_DIR', '/var/crash')
 
890
 
 
891
 
 
892
def xdg_cache_dir():
 
893
    # See http://standards.freedesktop.org/basedir-spec/latest/ar01s03.html
 
894
    # Possibly this should be different on Windows?
 
895
    e = os.environ.get('XDG_CACHE_DIR', None)
 
896
    if e:
 
897
        return e
 
898
    else:
 
899
        return os.path.expanduser('~/.cache')
 
900
 
 
901
 
815
902
def _auto_user_id():
816
903
    """Calculate automatic user identification.
817
904
 
930
1017
            return self._config.get_option(name, section, default)
931
1018
        finally:
932
1019
            self.branch.unlock()
933
 
        return result
934
1020
 
935
1021
    def set_option(self, value, name, section=None):
936
1022
        """Set a per-branch configuration option"""
1132
1218
        config.update({name: values})
1133
1219
        self._save()
1134
1220
 
1135
 
    def get_user(self, scheme, host, port=None, realm=None, path=None, 
 
1221
    def get_user(self, scheme, host, port=None, realm=None, path=None,
1136
1222
                 prompt=None, ask=False, default=None):
1137
1223
        """Get a user from authentication file.
1138
1224
 
1149
1235
        :param ask: Ask the user if there is no explicitly configured username 
1150
1236
                    (optional)
1151
1237
 
 
1238
        :param default: The username returned if none is defined (optional).
 
1239
 
1152
1240
        :return: The found user.
1153
1241
        """
1154
1242
        credentials = self.get_credentials(scheme, host, port, user=None,
1169
1257
                    prompt_host = host
1170
1258
                user = ui.ui_factory.get_username(prompt, host=prompt_host)
1171
1259
            else:
1172
 
                if default is None:
1173
 
                    import getpass
1174
 
                    default = getpass.getuser()
1175
1260
                user = default
1176
1261
        return user
1177
1262
 
1332
1417
 
1333
1418
 
1334
1419
class PlainTextCredentialStore(CredentialStore):
1335
 
    """Plain text credential store for the authentication.conf file."""
 
1420
    __doc__ = """Plain text credential store for the authentication.conf file"""
1336
1421
 
1337
1422
    def decode_password(self, credentials):
1338
1423
        """See CredentialStore.decode_password."""
1346
1431
 
1347
1432
class BzrDirConfig(object):
1348
1433
 
1349
 
    def __init__(self, transport):
1350
 
        self._config = TransportConfig(transport, 'control.conf')
 
1434
    def __init__(self, bzrdir):
 
1435
        self._bzrdir = bzrdir
 
1436
        self._config = bzrdir._get_config()
1351
1437
 
1352
1438
    def set_default_stack_on(self, value):
1353
1439
        """Set the default stacking location.
1357
1443
        This policy affects all branches contained by this bzrdir, except for
1358
1444
        those under repositories.
1359
1445
        """
 
1446
        if self._config is None:
 
1447
            raise errors.BzrError("Cannot set configuration in %s" % self._bzrdir)
1360
1448
        if value is None:
1361
1449
            self._config.set_option('', 'default_stack_on')
1362
1450
        else:
1370
1458
        This policy affects all branches contained by this bzrdir, except for
1371
1459
        those under repositories.
1372
1460
        """
 
1461
        if self._config is None:
 
1462
            return None
1373
1463
        value = self._config.get_option('default_stack_on')
1374
1464
        if value == '':
1375
1465
            value = None
1420
1510
            configobj.setdefault(section, {})[name] = value
1421
1511
        self._set_configobj(configobj)
1422
1512
 
 
1513
    def _get_config_file(self):
 
1514
        try:
 
1515
            return StringIO(self._transport.get_bytes(self._filename))
 
1516
        except errors.NoSuchFile:
 
1517
            return StringIO()
 
1518
 
1423
1519
    def _get_configobj(self):
1424
 
        try:
1425
 
            return ConfigObj(self._transport.get(self._filename),
1426
 
                             encoding='utf-8')
1427
 
        except errors.NoSuchFile:
1428
 
            return ConfigObj(encoding='utf-8')
 
1520
        return ConfigObj(self._get_config_file(), encoding='utf-8')
1429
1521
 
1430
1522
    def _set_configobj(self, configobj):
1431
1523
        out_file = StringIO()