1
# Copyright (C) 2005, 2006 by Canonical Ltd
2
# Authors: Robert Collins <robert.collins@canonical.com>
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
# GNU General Public License for more details.
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
"""Tests for finding and reading the bzr config file[s]."""
19
# import system imports here
20
from bzrlib.util.configobj.configobj import ConfigObj, ConfigObjError
21
from cStringIO import StringIO
25
#import bzrlib specific imports here
32
from bzrlib.branch import Branch
33
from bzrlib.bzrdir import BzrDir
34
from bzrlib.tests import TestCase, TestCaseInTempDir, TestCaseWithTransport
37
sample_long_alias="log -r-15..-1 --line"
38
sample_config_text = ("[DEFAULT]\n"
39
u"email=Erik B\u00e5gfors <erik@bagfors.nu>\n"
41
"gpg_signing_command=gnome-gpg\n"
43
"user_global_option=something\n"
46
"ll=" + sample_long_alias + "\n")
49
sample_always_signatures = ("[DEFAULT]\n"
50
"check_signatures=ignore\n"
51
"create_signatures=always")
54
sample_ignore_signatures = ("[DEFAULT]\n"
55
"check_signatures=require\n"
56
"create_signatures=never")
59
sample_maybe_signatures = ("[DEFAULT]\n"
60
"check_signatures=ignore\n"
61
"create_signatures=when-required")
64
sample_branches_text = ("[http://www.example.com]\n"
65
"# Top level policy\n"
66
"email=Robert Collins <robertc@example.org>\n"
67
"[http://www.example.com/useglobal]\n"
68
"# different project, forces global lookup\n"
71
"check_signatures=require\n"
72
"# test trailing / matching with no children\n"
74
"check_signatures=check-available\n"
75
"gpg_signing_command=false\n"
76
"user_local_option=local\n"
77
"# test trailing / matching\n"
79
"#subdirs will match but not the parent\n"
82
"check_signatures=ignore\n"
83
"post_commit=bzrlib.tests.test_config.post_commit\n"
84
"#testing explicit beats globs\n")
88
class InstrumentedConfigObj(object):
89
"""A config obj look-enough-alike to record calls made to it."""
91
def __contains__(self, thing):
92
self._calls.append(('__contains__', thing))
95
def __getitem__(self, key):
96
self._calls.append(('__getitem__', key))
99
def __init__(self, input, encoding=None):
100
self._calls = [('__init__', input, encoding)]
102
def __setitem__(self, key, value):
103
self._calls.append(('__setitem__', key, value))
105
def write(self, arg):
106
self._calls.append(('write',))
109
class FakeBranch(object):
111
def __init__(self, base=None, user_id=None):
113
self.base = "http://example.com/branches/demo"
116
self.control_files = FakeControlFiles(user_id=user_id)
118
def lock_write(self):
125
class FakeControlFiles(object):
127
def __init__(self, user_id=None):
131
def get_utf8(self, filename):
132
if filename != 'email':
133
raise NotImplementedError
134
if self.email is not None:
135
return StringIO(self.email)
136
raise errors.NoSuchFile(filename)
138
def get(self, filename):
140
return StringIO(self.files[filename])
142
raise errors.NoSuchFile(filename)
144
def put(self, filename, fileobj):
145
self.files[filename] = fileobj.read()
148
class InstrumentedConfig(config.Config):
149
"""An instrumented config that supplies stubs for template methods."""
152
super(InstrumentedConfig, self).__init__()
154
self._signatures = config.CHECK_NEVER
156
def _get_user_id(self):
157
self._calls.append('_get_user_id')
158
return "Robert Collins <robert.collins@example.org>"
160
def _get_signature_checking(self):
161
self._calls.append('_get_signature_checking')
162
return self._signatures
165
bool_config = """[DEFAULT]
172
class TestConfigObj(TestCase):
173
def test_get_bool(self):
174
from bzrlib.config import ConfigObj
175
co = ConfigObj(StringIO(bool_config))
176
self.assertIs(co.get_bool('DEFAULT', 'active'), True)
177
self.assertIs(co.get_bool('DEFAULT', 'inactive'), False)
178
self.assertIs(co.get_bool('UPPERCASE', 'active'), True)
179
self.assertIs(co.get_bool('UPPERCASE', 'nonactive'), False)
182
class TestConfig(TestCase):
184
def test_constructs(self):
187
def test_no_default_editor(self):
188
self.assertRaises(NotImplementedError, config.Config().get_editor)
190
def test_user_email(self):
191
my_config = InstrumentedConfig()
192
self.assertEqual('robert.collins@example.org', my_config.user_email())
193
self.assertEqual(['_get_user_id'], my_config._calls)
195
def test_username(self):
196
my_config = InstrumentedConfig()
197
self.assertEqual('Robert Collins <robert.collins@example.org>',
198
my_config.username())
199
self.assertEqual(['_get_user_id'], my_config._calls)
201
def test_signatures_default(self):
202
my_config = config.Config()
203
self.assertFalse(my_config.signature_needed())
204
self.assertEqual(config.CHECK_IF_POSSIBLE,
205
my_config.signature_checking())
206
self.assertEqual(config.SIGN_WHEN_REQUIRED,
207
my_config.signing_policy())
209
def test_signatures_template_method(self):
210
my_config = InstrumentedConfig()
211
self.assertEqual(config.CHECK_NEVER, my_config.signature_checking())
212
self.assertEqual(['_get_signature_checking'], my_config._calls)
214
def test_signatures_template_method_none(self):
215
my_config = InstrumentedConfig()
216
my_config._signatures = None
217
self.assertEqual(config.CHECK_IF_POSSIBLE,
218
my_config.signature_checking())
219
self.assertEqual(['_get_signature_checking'], my_config._calls)
221
def test_gpg_signing_command_default(self):
222
my_config = config.Config()
223
self.assertEqual('gpg', my_config.gpg_signing_command())
225
def test_get_user_option_default(self):
226
my_config = config.Config()
227
self.assertEqual(None, my_config.get_user_option('no_option'))
229
def test_post_commit_default(self):
230
my_config = config.Config()
231
self.assertEqual(None, my_config.post_commit())
233
def test_log_format_default(self):
234
my_config = config.Config()
235
self.assertEqual('long', my_config.log_format())
238
class TestConfigPath(TestCase):
241
super(TestConfigPath, self).setUp()
242
self.old_home = os.environ.get('HOME', None)
243
self.old_appdata = os.environ.get('APPDATA', None)
244
os.environ['HOME'] = '/home/bogus'
245
os.environ['APPDATA'] = \
246
r'C:\Documents and Settings\bogus\Application Data'
249
if self.old_home is None:
250
del os.environ['HOME']
252
os.environ['HOME'] = self.old_home
253
if self.old_appdata is None:
254
del os.environ['APPDATA']
256
os.environ['APPDATA'] = self.old_appdata
257
super(TestConfigPath, self).tearDown()
259
def test_config_dir(self):
260
if sys.platform == 'win32':
261
self.assertEqual(config.config_dir(),
262
'C:/Documents and Settings/bogus/Application Data/bazaar/2.0')
264
self.assertEqual(config.config_dir(), '/home/bogus/.bazaar')
266
def test_config_filename(self):
267
if sys.platform == 'win32':
268
self.assertEqual(config.config_filename(),
269
'C:/Documents and Settings/bogus/Application Data/bazaar/2.0/bazaar.conf')
271
self.assertEqual(config.config_filename(),
272
'/home/bogus/.bazaar/bazaar.conf')
274
def test_branches_config_filename(self):
275
if sys.platform == 'win32':
276
self.assertEqual(config.branches_config_filename(),
277
'C:/Documents and Settings/bogus/Application Data/bazaar/2.0/branches.conf')
279
self.assertEqual(config.branches_config_filename(),
280
'/home/bogus/.bazaar/branches.conf')
282
def test_locations_config_filename(self):
283
if sys.platform == 'win32':
284
self.assertEqual(config.locations_config_filename(),
285
'C:/Documents and Settings/bogus/Application Data/bazaar/2.0/locations.conf')
287
self.assertEqual(config.locations_config_filename(),
288
'/home/bogus/.bazaar/locations.conf')
290
class TestIniConfig(TestCase):
292
def test_contructs(self):
293
my_config = config.IniBasedConfig("nothing")
295
def test_from_fp(self):
296
config_file = StringIO(sample_config_text.encode('utf-8'))
297
my_config = config.IniBasedConfig(None)
299
isinstance(my_config._get_parser(file=config_file),
302
def test_cached(self):
303
config_file = StringIO(sample_config_text.encode('utf-8'))
304
my_config = config.IniBasedConfig(None)
305
parser = my_config._get_parser(file=config_file)
306
self.failUnless(my_config._get_parser() is parser)
309
class TestGetConfig(TestCase):
311
def test_constructs(self):
312
my_config = config.GlobalConfig()
314
def test_calls_read_filenames(self):
315
# replace the class that is constructured, to check its parameters
316
oldparserclass = config.ConfigObj
317
config.ConfigObj = InstrumentedConfigObj
318
my_config = config.GlobalConfig()
320
parser = my_config._get_parser()
322
config.ConfigObj = oldparserclass
323
self.failUnless(isinstance(parser, InstrumentedConfigObj))
324
self.assertEqual(parser._calls, [('__init__', config.config_filename(),
328
class TestBranchConfig(TestCaseWithTransport):
330
def test_constructs(self):
331
branch = FakeBranch()
332
my_config = config.BranchConfig(branch)
333
self.assertRaises(TypeError, config.BranchConfig)
335
def test_get_location_config(self):
336
branch = FakeBranch()
337
my_config = config.BranchConfig(branch)
338
location_config = my_config._get_location_config()
339
self.assertEqual(branch.base, location_config.location)
340
self.failUnless(location_config is my_config._get_location_config())
342
def test_get_config(self):
343
"""The Branch.get_config method works properly"""
344
b = BzrDir.create_standalone_workingtree('.').branch
345
my_config = b.get_config()
346
self.assertIs(my_config.get_user_option('wacky'), None)
347
my_config.set_user_option('wacky', 'unlikely')
348
self.assertEqual(my_config.get_user_option('wacky'), 'unlikely')
350
# Ensure we get the same thing if we start again
351
b2 = Branch.open('.')
352
my_config2 = b2.get_config()
353
self.assertEqual(my_config2.get_user_option('wacky'), 'unlikely')
355
def test_has_explicit_nickname(self):
356
b = self.make_branch('.')
357
self.assertFalse(b.get_config().has_explicit_nickname())
359
self.assertTrue(b.get_config().has_explicit_nickname())
361
def test_config_url(self):
362
"""The Branch.get_config will use section that uses a local url"""
363
branch = self.make_branch('branch')
364
self.assertEqual('branch', branch.nick)
366
locations = config.locations_config_filename()
367
config.ensure_config_dir_exists()
368
local_url = urlutils.local_path_to_url('branch')
369
open(locations, 'wb').write('[%s]\nnickname = foobar'
371
self.assertEqual('foobar', branch.nick)
373
def test_config_local_path(self):
374
"""The Branch.get_config will use a local system path"""
375
branch = self.make_branch('branch')
376
self.assertEqual('branch', branch.nick)
378
locations = config.locations_config_filename()
379
config.ensure_config_dir_exists()
380
open(locations, 'wb').write('[%s/branch]\nnickname = barry'
381
% (osutils.getcwd().encode('utf8'),))
382
self.assertEqual('barry', branch.nick)
384
def test_config_creates_local(self):
385
"""Creating a new entry in config uses a local path."""
386
branch = self.make_branch('branch')
387
branch.set_push_location('http://foobar')
388
locations = config.locations_config_filename()
389
local_path = osutils.getcwd().encode('utf8')
390
# Surprisingly ConfigObj doesn't create a trailing newline
391
self.check_file_contents(locations,
392
'[%s/branch]\npush_location = http://foobar' % (local_path,))
395
class TestGlobalConfigItems(TestCase):
397
def test_user_id(self):
398
config_file = StringIO(sample_config_text.encode('utf-8'))
399
my_config = config.GlobalConfig()
400
my_config._parser = my_config._get_parser(file=config_file)
401
self.assertEqual(u"Erik B\u00e5gfors <erik@bagfors.nu>",
402
my_config._get_user_id())
404
def test_absent_user_id(self):
405
config_file = StringIO("")
406
my_config = config.GlobalConfig()
407
my_config._parser = my_config._get_parser(file=config_file)
408
self.assertEqual(None, my_config._get_user_id())
410
def test_configured_editor(self):
411
config_file = StringIO(sample_config_text.encode('utf-8'))
412
my_config = config.GlobalConfig()
413
my_config._parser = my_config._get_parser(file=config_file)
414
self.assertEqual("vim", my_config.get_editor())
416
def test_signatures_always(self):
417
config_file = StringIO(sample_always_signatures)
418
my_config = config.GlobalConfig()
419
my_config._parser = my_config._get_parser(file=config_file)
420
self.assertEqual(config.CHECK_NEVER,
421
my_config.signature_checking())
422
self.assertEqual(config.SIGN_ALWAYS,
423
my_config.signing_policy())
424
self.assertEqual(True, my_config.signature_needed())
426
def test_signatures_if_possible(self):
427
config_file = StringIO(sample_maybe_signatures)
428
my_config = config.GlobalConfig()
429
my_config._parser = my_config._get_parser(file=config_file)
430
self.assertEqual(config.CHECK_NEVER,
431
my_config.signature_checking())
432
self.assertEqual(config.SIGN_WHEN_REQUIRED,
433
my_config.signing_policy())
434
self.assertEqual(False, my_config.signature_needed())
436
def test_signatures_ignore(self):
437
config_file = StringIO(sample_ignore_signatures)
438
my_config = config.GlobalConfig()
439
my_config._parser = my_config._get_parser(file=config_file)
440
self.assertEqual(config.CHECK_ALWAYS,
441
my_config.signature_checking())
442
self.assertEqual(config.SIGN_NEVER,
443
my_config.signing_policy())
444
self.assertEqual(False, my_config.signature_needed())
446
def _get_sample_config(self):
447
config_file = StringIO(sample_config_text.encode('utf-8'))
448
my_config = config.GlobalConfig()
449
my_config._parser = my_config._get_parser(file=config_file)
452
def test_gpg_signing_command(self):
453
my_config = self._get_sample_config()
454
self.assertEqual("gnome-gpg", my_config.gpg_signing_command())
455
self.assertEqual(False, my_config.signature_needed())
457
def _get_empty_config(self):
458
config_file = StringIO("")
459
my_config = config.GlobalConfig()
460
my_config._parser = my_config._get_parser(file=config_file)
463
def test_gpg_signing_command_unset(self):
464
my_config = self._get_empty_config()
465
self.assertEqual("gpg", my_config.gpg_signing_command())
467
def test_get_user_option_default(self):
468
my_config = self._get_empty_config()
469
self.assertEqual(None, my_config.get_user_option('no_option'))
471
def test_get_user_option_global(self):
472
my_config = self._get_sample_config()
473
self.assertEqual("something",
474
my_config.get_user_option('user_global_option'))
476
def test_post_commit_default(self):
477
my_config = self._get_sample_config()
478
self.assertEqual(None, my_config.post_commit())
480
def test_configured_logformat(self):
481
my_config = self._get_sample_config()
482
self.assertEqual("short", my_config.log_format())
484
def test_get_alias(self):
485
my_config = self._get_sample_config()
486
self.assertEqual('help', my_config.get_alias('h'))
488
def test_get_no_alias(self):
489
my_config = self._get_sample_config()
490
self.assertEqual(None, my_config.get_alias('foo'))
492
def test_get_long_alias(self):
493
my_config = self._get_sample_config()
494
self.assertEqual(sample_long_alias, my_config.get_alias('ll'))
497
class TestLocationConfig(TestCaseInTempDir):
499
def test_constructs(self):
500
my_config = config.LocationConfig('http://example.com')
501
self.assertRaises(TypeError, config.LocationConfig)
503
def test_branch_calls_read_filenames(self):
504
# This is testing the correct file names are provided.
505
# TODO: consolidate with the test for GlobalConfigs filename checks.
507
# replace the class that is constructured, to check its parameters
508
oldparserclass = config.ConfigObj
509
config.ConfigObj = InstrumentedConfigObj
511
my_config = config.LocationConfig('http://www.example.com')
512
parser = my_config._get_parser()
514
config.ConfigObj = oldparserclass
515
self.failUnless(isinstance(parser, InstrumentedConfigObj))
516
self.assertEqual(parser._calls,
517
[('__init__', config.locations_config_filename(),
519
config.ensure_config_dir_exists()
520
#os.mkdir(config.config_dir())
521
f = file(config.branches_config_filename(), 'wb')
524
oldparserclass = config.ConfigObj
525
config.ConfigObj = InstrumentedConfigObj
527
my_config = config.LocationConfig('http://www.example.com')
528
parser = my_config._get_parser()
530
config.ConfigObj = oldparserclass
532
def test_get_global_config(self):
533
my_config = config.BranchConfig(FakeBranch('http://example.com'))
534
global_config = my_config._get_global_config()
535
self.failUnless(isinstance(global_config, config.GlobalConfig))
536
self.failUnless(global_config is my_config._get_global_config())
538
def test__get_section_no_match(self):
539
self.get_branch_config('/')
540
self.assertEqual(None, self.my_location_config._get_section())
542
def test__get_section_exact(self):
543
self.get_branch_config('http://www.example.com')
544
self.assertEqual('http://www.example.com',
545
self.my_location_config._get_section())
547
def test__get_section_suffix_does_not(self):
548
self.get_branch_config('http://www.example.com-com')
549
self.assertEqual(None, self.my_location_config._get_section())
551
def test__get_section_subdir_recursive(self):
552
self.get_branch_config('http://www.example.com/com')
553
self.assertEqual('http://www.example.com',
554
self.my_location_config._get_section())
556
def test__get_section_subdir_matches(self):
557
self.get_branch_config('http://www.example.com/useglobal')
558
self.assertEqual('http://www.example.com/useglobal',
559
self.my_location_config._get_section())
561
def test__get_section_subdir_nonrecursive(self):
562
self.get_branch_config(
563
'http://www.example.com/useglobal/childbranch')
564
self.assertEqual('http://www.example.com',
565
self.my_location_config._get_section())
567
def test__get_section_subdir_trailing_slash(self):
568
self.get_branch_config('/b')
569
self.assertEqual('/b/', self.my_location_config._get_section())
571
def test__get_section_subdir_child(self):
572
self.get_branch_config('/a/foo')
573
self.assertEqual('/a/*', self.my_location_config._get_section())
575
def test__get_section_subdir_child_child(self):
576
self.get_branch_config('/a/foo/bar')
577
self.assertEqual('/a/', self.my_location_config._get_section())
579
def test__get_section_trailing_slash_with_children(self):
580
self.get_branch_config('/a/')
581
self.assertEqual('/a/', self.my_location_config._get_section())
583
def test__get_section_explicit_over_glob(self):
584
self.get_branch_config('/a/c')
585
self.assertEqual('/a/c', self.my_location_config._get_section())
588
def test_location_without_username(self):
589
self.get_branch_config('http://www.example.com/useglobal')
590
self.assertEqual(u'Erik B\u00e5gfors <erik@bagfors.nu>',
591
self.my_config.username())
593
def test_location_not_listed(self):
594
"""Test that the global username is used when no location matches"""
595
self.get_branch_config('/home/robertc/sources')
596
self.assertEqual(u'Erik B\u00e5gfors <erik@bagfors.nu>',
597
self.my_config.username())
599
def test_overriding_location(self):
600
self.get_branch_config('http://www.example.com/foo')
601
self.assertEqual('Robert Collins <robertc@example.org>',
602
self.my_config.username())
604
def test_signatures_not_set(self):
605
self.get_branch_config('http://www.example.com',
606
global_config=sample_ignore_signatures)
607
self.assertEqual(config.CHECK_ALWAYS,
608
self.my_config.signature_checking())
609
self.assertEqual(config.SIGN_NEVER,
610
self.my_config.signing_policy())
612
def test_signatures_never(self):
613
self.get_branch_config('/a/c')
614
self.assertEqual(config.CHECK_NEVER,
615
self.my_config.signature_checking())
617
def test_signatures_when_available(self):
618
self.get_branch_config('/a/', global_config=sample_ignore_signatures)
619
self.assertEqual(config.CHECK_IF_POSSIBLE,
620
self.my_config.signature_checking())
622
def test_signatures_always(self):
623
self.get_branch_config('/b')
624
self.assertEqual(config.CHECK_ALWAYS,
625
self.my_config.signature_checking())
627
def test_gpg_signing_command(self):
628
self.get_branch_config('/b')
629
self.assertEqual("gnome-gpg", self.my_config.gpg_signing_command())
631
def test_gpg_signing_command_missing(self):
632
self.get_branch_config('/a')
633
self.assertEqual("false", self.my_config.gpg_signing_command())
635
def test_get_user_option_global(self):
636
self.get_branch_config('/a')
637
self.assertEqual('something',
638
self.my_config.get_user_option('user_global_option'))
640
def test_get_user_option_local(self):
641
self.get_branch_config('/a')
642
self.assertEqual('local',
643
self.my_config.get_user_option('user_local_option'))
645
def test_post_commit_default(self):
646
self.get_branch_config('/a/c')
647
self.assertEqual('bzrlib.tests.test_config.post_commit',
648
self.my_config.post_commit())
650
def get_branch_config(self, location, global_config=None):
651
if global_config is None:
652
global_file = StringIO(sample_config_text.encode('utf-8'))
654
global_file = StringIO(global_config.encode('utf-8'))
655
branches_file = StringIO(sample_branches_text.encode('utf-8'))
656
self.my_config = config.BranchConfig(FakeBranch(location))
657
# Force location config to use specified file
658
self.my_location_config = self.my_config._get_location_config()
659
self.my_location_config._get_parser(branches_file)
660
# Force global config to use specified file
661
self.my_config._get_global_config()._get_parser(global_file)
663
def test_set_user_setting_sets_and_saves(self):
664
self.get_branch_config('/a/c')
665
record = InstrumentedConfigObj("foo")
666
self.my_location_config._parser = record
668
real_mkdir = os.mkdir
670
def checked_mkdir(path, mode=0777):
671
self.log('making directory: %s', path)
672
real_mkdir(path, mode)
675
os.mkdir = checked_mkdir
677
self.my_config.set_user_option('foo', 'bar', local=True)
679
os.mkdir = real_mkdir
681
self.failUnless(self.created, 'Failed to create ~/.bazaar')
682
self.assertEqual([('__contains__', '/a/c'),
683
('__contains__', '/a/c/'),
684
('__setitem__', '/a/c', {}),
685
('__getitem__', '/a/c'),
686
('__setitem__', 'foo', 'bar'),
690
def test_set_user_setting_sets_and_saves2(self):
691
self.get_branch_config('/a/c')
692
self.assertIs(self.my_config.get_user_option('foo'), None)
693
self.my_config.set_user_option('foo', 'bar')
695
self.my_config.branch.control_files.files['branch.conf'],
697
self.assertEqual(self.my_config.get_user_option('foo'), 'bar')
698
self.my_config.set_user_option('foo', 'baz', local=True)
699
self.assertEqual(self.my_config.get_user_option('foo'), 'baz')
700
self.my_config.set_user_option('foo', 'qux')
701
self.assertEqual(self.my_config.get_user_option('foo'), 'baz')
704
precedence_global = 'option = global'
705
precedence_branch = 'option = branch'
706
precedence_location = """
710
[http://example.com/specific]
715
class TestBranchConfigItems(TestCaseInTempDir):
717
def get_branch_config(self, global_config=None, location=None,
718
location_config=None, branch_data_config=None):
719
my_config = config.BranchConfig(FakeBranch(location))
720
if global_config is not None:
721
global_file = StringIO(global_config.encode('utf-8'))
722
my_config._get_global_config()._get_parser(global_file)
723
self.my_location_config = my_config._get_location_config()
724
if location_config is not None:
725
location_file = StringIO(location_config.encode('utf-8'))
726
self.my_location_config._get_parser(location_file)
727
if branch_data_config is not None:
728
my_config.branch.control_files.files['branch.conf'] = \
732
def test_user_id(self):
733
branch = FakeBranch(user_id='Robert Collins <robertc@example.net>')
734
my_config = config.BranchConfig(branch)
735
self.assertEqual("Robert Collins <robertc@example.net>",
736
my_config.username())
737
branch.control_files.email = "John"
738
my_config.set_user_option('email',
739
"Robert Collins <robertc@example.org>")
740
self.assertEqual("John", my_config.username())
741
branch.control_files.email = None
742
self.assertEqual("Robert Collins <robertc@example.org>",
743
my_config.username())
745
def test_not_set_in_branch(self):
746
my_config = self.get_branch_config(sample_config_text)
747
my_config.branch.control_files.email = None
748
self.assertEqual(u"Erik B\u00e5gfors <erik@bagfors.nu>",
749
my_config._get_user_id())
750
my_config.branch.control_files.email = "John"
751
self.assertEqual("John", my_config._get_user_id())
753
def test_BZR_EMAIL_OVERRIDES(self):
754
os.environ['BZR_EMAIL'] = "Robert Collins <robertc@example.org>"
755
branch = FakeBranch()
756
my_config = config.BranchConfig(branch)
757
self.assertEqual("Robert Collins <robertc@example.org>",
758
my_config.username())
760
def test_signatures_forced(self):
761
my_config = self.get_branch_config(
762
global_config=sample_always_signatures)
763
self.assertEqual(config.CHECK_NEVER, my_config.signature_checking())
764
self.assertEqual(config.SIGN_ALWAYS, my_config.signing_policy())
765
self.assertTrue(my_config.signature_needed())
767
def test_signatures_forced_branch(self):
768
my_config = self.get_branch_config(
769
global_config=sample_ignore_signatures,
770
branch_data_config=sample_always_signatures)
771
self.assertEqual(config.CHECK_NEVER, my_config.signature_checking())
772
self.assertEqual(config.SIGN_ALWAYS, my_config.signing_policy())
773
self.assertTrue(my_config.signature_needed())
775
def test_gpg_signing_command(self):
776
my_config = self.get_branch_config(
777
# branch data cannot set gpg_signing_command
778
branch_data_config="gpg_signing_command=pgp")
779
config_file = StringIO(sample_config_text.encode('utf-8'))
780
my_config._get_global_config()._get_parser(config_file)
781
self.assertEqual('gnome-gpg', my_config.gpg_signing_command())
783
def test_get_user_option_global(self):
784
branch = FakeBranch()
785
my_config = config.BranchConfig(branch)
786
config_file = StringIO(sample_config_text.encode('utf-8'))
787
(my_config._get_global_config()._get_parser(config_file))
788
self.assertEqual('something',
789
my_config.get_user_option('user_global_option'))
791
def test_post_commit_default(self):
792
branch = FakeBranch()
793
my_config = self.get_branch_config(sample_config_text, '/a/c',
794
sample_branches_text)
795
self.assertEqual(my_config.branch.base, '/a/c')
796
self.assertEqual('bzrlib.tests.test_config.post_commit',
797
my_config.post_commit())
798
my_config.set_user_option('post_commit', 'rmtree_root')
799
# post-commit is ignored when bresent in branch data
800
self.assertEqual('bzrlib.tests.test_config.post_commit',
801
my_config.post_commit())
802
my_config.set_user_option('post_commit', 'rmtree_root', local=True)
803
self.assertEqual('rmtree_root', my_config.post_commit())
805
def test_config_precedence(self):
806
my_config = self.get_branch_config(global_config=precedence_global)
807
self.assertEqual(my_config.get_user_option('option'), 'global')
808
my_config = self.get_branch_config(global_config=precedence_global,
809
branch_data_config=precedence_branch)
810
self.assertEqual(my_config.get_user_option('option'), 'branch')
811
my_config = self.get_branch_config(global_config=precedence_global,
812
branch_data_config=precedence_branch,
813
location_config=precedence_location)
814
self.assertEqual(my_config.get_user_option('option'), 'recurse')
815
my_config = self.get_branch_config(global_config=precedence_global,
816
branch_data_config=precedence_branch,
817
location_config=precedence_location,
818
location='http://example.com/specific')
819
self.assertEqual(my_config.get_user_option('option'), 'exact')
822
class TestMailAddressExtraction(TestCase):
824
def test_extract_email_address(self):
825
self.assertEqual('jane@test.com',
826
config.extract_email_address('Jane <jane@test.com>'))
827
self.assertRaises(errors.BzrError,
828
config.extract_email_address, 'Jane Tester')