/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
 
1330
1417
 
1331
1418
 
1332
1419
class PlainTextCredentialStore(CredentialStore):
1333
 
    """Plain text credential store for the authentication.conf file."""
 
1420
    __doc__ = """Plain text credential store for the authentication.conf file"""
1334
1421
 
1335
1422
    def decode_password(self, credentials):
1336
1423
        """See CredentialStore.decode_password."""
1425
1512
 
1426
1513
    def _get_config_file(self):
1427
1514
        try:
1428
 
            return self._transport.get(self._filename)
 
1515
            return StringIO(self._transport.get_bytes(self._filename))
1429
1516
        except errors.NoSuchFile:
1430
1517
            return StringIO()
1431
1518