25
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
26
import bzrlib.config as config
27
import bzrlib.errors as errors
28
from bzrlib.tests import TestCase, TestCaseInTempDir
37
31
sample_long_alias="log -r-15..-1 --line"
38
sample_config_text = u"""
40
email=Erik B\u00e5gfors <erik@bagfors.nu>
42
gpg_signing_command=gnome-gpg
44
user_global_option=something
47
ll=""" + sample_long_alias + "\n"
50
sample_always_signatures = """
52
check_signatures=ignore
53
create_signatures=always
56
sample_ignore_signatures = """
58
check_signatures=require
59
create_signatures=never
62
sample_maybe_signatures = """
64
check_signatures=ignore
65
create_signatures=when-required
68
sample_branches_text = """
69
[http://www.example.com]
71
email=Robert Collins <robertc@example.org>
72
normal_option = normal
73
appendpath_option = append
74
appendpath_option:policy = appendpath
75
norecurse_option = norecurse
76
norecurse_option:policy = norecurse
77
[http://www.example.com/ignoreparent]
78
# different project: ignore parent dir config
80
[http://www.example.com/norecurse]
81
# configuration items that only apply to this dir
83
normal_option = norecurse
84
[http://www.example.com/dir]
85
appendpath_option = normal
87
check_signatures=require
88
# test trailing / matching with no children
90
check_signatures=check-available
91
gpg_signing_command=false
92
user_local_option=local
93
# test trailing / matching
95
#subdirs will match but not the parent
97
check_signatures=ignore
98
post_commit=bzrlib.tests.test_config.post_commit
99
#testing explicit beats globs
32
sample_config_text = ("[DEFAULT]\n"
33
u"email=Erik B\u00e5gfors <erik@bagfors.nu>\n"
35
"gpg_signing_command=gnome-gpg\n"
37
"user_global_option=something\n"
40
"ll=" + sample_long_alias + "\n")
43
sample_always_signatures = ("[DEFAULT]\n"
44
"check_signatures=require\n")
47
sample_ignore_signatures = ("[DEFAULT]\n"
48
"check_signatures=ignore\n")
51
sample_maybe_signatures = ("[DEFAULT]\n"
52
"check_signatures=check-available\n")
55
sample_branches_text = ("[http://www.example.com]\n"
56
"# Top level policy\n"
57
"email=Robert Collins <robertc@example.org>\n"
58
"[http://www.example.com/useglobal]\n"
59
"# different project, forces global lookup\n"
62
"check_signatures=require\n"
63
"# test trailing / matching with no children\n"
65
"check_signatures=check-available\n"
66
"gpg_signing_command=false\n"
67
"user_local_option=local\n"
68
"# test trailing / matching\n"
70
"#subdirs will match but not the parent\n"
73
"check_signatures=ignore\n"
74
"post_commit=bzrlib.tests.test_config.post_commit\n"
75
"#testing explicit beats globs\n")
103
79
class InstrumentedConfigObj(object):
529
410
# replace the class that is constructured, to check its parameters
530
411
oldparserclass = config.ConfigObj
531
412
config.ConfigObj = InstrumentedConfigObj
413
my_config = config.LocationConfig('http://www.example.com')
533
my_config = config.LocationConfig('http://www.example.com')
534
415
parser = my_config._get_parser()
536
417
config.ConfigObj = oldparserclass
537
418
self.failUnless(isinstance(parser, InstrumentedConfigObj))
538
419
self.assertEqual(parser._calls,
539
[('__init__', config.locations_config_filename(),
420
[('__init__', config.branches_config_filename(),
541
config.ensure_config_dir_exists()
542
#os.mkdir(config.config_dir())
543
f = file(config.branches_config_filename(), 'wb')
546
oldparserclass = config.ConfigObj
547
config.ConfigObj = InstrumentedConfigObj
549
my_config = config.LocationConfig('http://www.example.com')
550
parser = my_config._get_parser()
552
config.ConfigObj = oldparserclass
554
423
def test_get_global_config(self):
555
my_config = config.BranchConfig(FakeBranch('http://example.com'))
424
my_config = config.LocationConfig('http://example.com')
556
425
global_config = my_config._get_global_config()
557
426
self.failUnless(isinstance(global_config, config.GlobalConfig))
558
427
self.failUnless(global_config is my_config._get_global_config())
560
def test__get_matching_sections_no_match(self):
561
self.get_branch_config('/')
562
self.assertEqual([], self.my_location_config._get_matching_sections())
429
def test__get_section_no_match(self):
430
self.get_location_config('/')
431
self.assertEqual(None, self.my_config._get_section())
564
def test__get_matching_sections_exact(self):
565
self.get_branch_config('http://www.example.com')
566
self.assertEqual([('http://www.example.com', '')],
567
self.my_location_config._get_matching_sections())
433
def test__get_section_exact(self):
434
self.get_location_config('http://www.example.com')
435
self.assertEqual('http://www.example.com',
436
self.my_config._get_section())
569
def test__get_matching_sections_suffix_does_not(self):
570
self.get_branch_config('http://www.example.com-com')
571
self.assertEqual([], self.my_location_config._get_matching_sections())
573
def test__get_matching_sections_subdir_recursive(self):
574
self.get_branch_config('http://www.example.com/com')
575
self.assertEqual([('http://www.example.com', 'com')],
576
self.my_location_config._get_matching_sections())
578
def test__get_matching_sections_ignoreparent(self):
579
self.get_branch_config('http://www.example.com/ignoreparent')
580
self.assertEqual([('http://www.example.com/ignoreparent', '')],
581
self.my_location_config._get_matching_sections())
583
def test__get_matching_sections_ignoreparent_subdir(self):
584
self.get_branch_config(
585
'http://www.example.com/ignoreparent/childbranch')
586
self.assertEqual([('http://www.example.com/ignoreparent', 'childbranch')],
587
self.my_location_config._get_matching_sections())
589
def test__get_matching_sections_subdir_trailing_slash(self):
590
self.get_branch_config('/b')
591
self.assertEqual([('/b/', '')],
592
self.my_location_config._get_matching_sections())
594
def test__get_matching_sections_subdir_child(self):
595
self.get_branch_config('/a/foo')
596
self.assertEqual([('/a/*', ''), ('/a/', 'foo')],
597
self.my_location_config._get_matching_sections())
599
def test__get_matching_sections_subdir_child_child(self):
600
self.get_branch_config('/a/foo/bar')
601
self.assertEqual([('/a/*', 'bar'), ('/a/', 'foo/bar')],
602
self.my_location_config._get_matching_sections())
604
def test__get_matching_sections_trailing_slash_with_children(self):
605
self.get_branch_config('/a/')
606
self.assertEqual([('/a/', '')],
607
self.my_location_config._get_matching_sections())
609
def test__get_matching_sections_explicit_over_glob(self):
610
# XXX: 2006-09-08 jamesh
611
# This test only passes because ord('c') > ord('*'). If there
612
# was a config section for '/a/?', it would get precedence
614
self.get_branch_config('/a/c')
615
self.assertEqual([('/a/c', ''), ('/a/*', ''), ('/a/', 'c')],
616
self.my_location_config._get_matching_sections())
618
def test__get_option_policy_normal(self):
619
self.get_branch_config('http://www.example.com')
621
self.my_location_config._get_config_policy(
622
'http://www.example.com', 'normal_option'),
625
def test__get_option_policy_norecurse(self):
626
self.get_branch_config('http://www.example.com')
628
self.my_location_config._get_option_policy(
629
'http://www.example.com', 'norecurse_option'),
630
config.POLICY_NORECURSE)
631
# Test old recurse=False setting:
633
self.my_location_config._get_option_policy(
634
'http://www.example.com/norecurse', 'normal_option'),
635
config.POLICY_NORECURSE)
637
def test__get_option_policy_normal(self):
638
self.get_branch_config('http://www.example.com')
640
self.my_location_config._get_option_policy(
641
'http://www.example.com', 'appendpath_option'),
642
config.POLICY_APPENDPATH)
438
def test__get_section_suffix_does_not(self):
439
self.get_location_config('http://www.example.com-com')
440
self.assertEqual(None, self.my_config._get_section())
442
def test__get_section_subdir_recursive(self):
443
self.get_location_config('http://www.example.com/com')
444
self.assertEqual('http://www.example.com',
445
self.my_config._get_section())
447
def test__get_section_subdir_matches(self):
448
self.get_location_config('http://www.example.com/useglobal')
449
self.assertEqual('http://www.example.com/useglobal',
450
self.my_config._get_section())
452
def test__get_section_subdir_nonrecursive(self):
453
self.get_location_config(
454
'http://www.example.com/useglobal/childbranch')
455
self.assertEqual('http://www.example.com',
456
self.my_config._get_section())
458
def test__get_section_subdir_trailing_slash(self):
459
self.get_location_config('/b')
460
self.assertEqual('/b/', self.my_config._get_section())
462
def test__get_section_subdir_child(self):
463
self.get_location_config('/a/foo')
464
self.assertEqual('/a/*', self.my_config._get_section())
466
def test__get_section_subdir_child_child(self):
467
self.get_location_config('/a/foo/bar')
468
self.assertEqual('/a/', self.my_config._get_section())
470
def test__get_section_trailing_slash_with_children(self):
471
self.get_location_config('/a/')
472
self.assertEqual('/a/', self.my_config._get_section())
474
def test__get_section_explicit_over_glob(self):
475
self.get_location_config('/a/c')
476
self.assertEqual('/a/c', self.my_config._get_section())
644
479
def test_location_without_username(self):
645
self.get_branch_config('http://www.example.com/ignoreparent')
480
self.get_location_config('http://www.example.com/useglobal')
646
481
self.assertEqual(u'Erik B\u00e5gfors <erik@bagfors.nu>',
647
482
self.my_config.username())
649
484
def test_location_not_listed(self):
650
485
"""Test that the global username is used when no location matches"""
651
self.get_branch_config('/home/robertc/sources')
486
self.get_location_config('/home/robertc/sources')
652
487
self.assertEqual(u'Erik B\u00e5gfors <erik@bagfors.nu>',
653
488
self.my_config.username())
655
490
def test_overriding_location(self):
656
self.get_branch_config('http://www.example.com/foo')
491
self.get_location_config('http://www.example.com/foo')
657
492
self.assertEqual('Robert Collins <robertc@example.org>',
658
493
self.my_config.username())
660
495
def test_signatures_not_set(self):
661
self.get_branch_config('http://www.example.com',
496
self.get_location_config('http://www.example.com',
662
497
global_config=sample_ignore_signatures)
663
self.assertEqual(config.CHECK_ALWAYS,
498
self.assertEqual(config.CHECK_NEVER,
664
499
self.my_config.signature_checking())
665
self.assertEqual(config.SIGN_NEVER,
666
self.my_config.signing_policy())
668
501
def test_signatures_never(self):
669
self.get_branch_config('/a/c')
502
self.get_location_config('/a/c')
670
503
self.assertEqual(config.CHECK_NEVER,
671
504
self.my_config.signature_checking())
673
506
def test_signatures_when_available(self):
674
self.get_branch_config('/a/', global_config=sample_ignore_signatures)
507
self.get_location_config('/a/', global_config=sample_ignore_signatures)
675
508
self.assertEqual(config.CHECK_IF_POSSIBLE,
676
509
self.my_config.signature_checking())
678
511
def test_signatures_always(self):
679
self.get_branch_config('/b')
512
self.get_location_config('/b')
680
513
self.assertEqual(config.CHECK_ALWAYS,
681
514
self.my_config.signature_checking())
683
516
def test_gpg_signing_command(self):
684
self.get_branch_config('/b')
517
self.get_location_config('/b')
685
518
self.assertEqual("gnome-gpg", self.my_config.gpg_signing_command())
687
520
def test_gpg_signing_command_missing(self):
688
self.get_branch_config('/a')
521
self.get_location_config('/a')
689
522
self.assertEqual("false", self.my_config.gpg_signing_command())
691
524
def test_get_user_option_global(self):
692
self.get_branch_config('/a')
525
self.get_location_config('/a')
693
526
self.assertEqual('something',
694
527
self.my_config.get_user_option('user_global_option'))
696
529
def test_get_user_option_local(self):
697
self.get_branch_config('/a')
530
self.get_location_config('/a')
698
531
self.assertEqual('local',
699
532
self.my_config.get_user_option('user_local_option'))
701
def test_get_user_option_appendpath(self):
702
# returned as is for the base path:
703
self.get_branch_config('http://www.example.com')
704
self.assertEqual('append',
705
self.my_config.get_user_option('appendpath_option'))
706
# Extra path components get appended:
707
self.get_branch_config('http://www.example.com/a/b/c')
708
self.assertEqual('append/a/b/c',
709
self.my_config.get_user_option('appendpath_option'))
710
# Overriden for http://www.example.com/dir, where it is a
712
self.get_branch_config('http://www.example.com/dir/a/b/c')
713
self.assertEqual('normal',
714
self.my_config.get_user_option('appendpath_option'))
716
def test_get_user_option_norecurse(self):
717
self.get_branch_config('http://www.example.com')
718
self.assertEqual('norecurse',
719
self.my_config.get_user_option('norecurse_option'))
720
self.get_branch_config('http://www.example.com/dir')
721
self.assertEqual(None,
722
self.my_config.get_user_option('norecurse_option'))
723
# http://www.example.com/norecurse is a recurse=False section
724
# that redefines normal_option. Subdirectories do not pick up
726
self.get_branch_config('http://www.example.com/norecurse')
727
self.assertEqual('norecurse',
728
self.my_config.get_user_option('normal_option'))
729
self.get_branch_config('http://www.example.com/norecurse/subdir')
730
self.assertEqual('normal',
731
self.my_config.get_user_option('normal_option'))
733
def test_set_user_option_norecurse(self):
734
self.get_branch_config('http://www.example.com')
735
self.my_config.set_user_option('foo', 'bar',
736
store=config.STORE_LOCATION_NORECURSE)
738
self.my_location_config._get_option_policy(
739
'http://www.example.com', 'foo'),
740
config.POLICY_NORECURSE)
742
def test_set_user_option_appendpath(self):
743
self.get_branch_config('http://www.example.com')
744
self.my_config.set_user_option('foo', 'bar',
745
store=config.STORE_LOCATION_APPENDPATH)
747
self.my_location_config._get_option_policy(
748
'http://www.example.com', 'foo'),
749
config.POLICY_APPENDPATH)
751
def test_set_user_option_change_policy(self):
752
self.get_branch_config('http://www.example.com')
753
self.my_config.set_user_option('norecurse_option', 'normal',
754
store=config.STORE_LOCATION)
756
self.my_location_config._get_option_policy(
757
'http://www.example.com', 'norecurse_option'),
760
def test_set_user_option_recurse_false_section(self):
761
# The following section has recurse=False set. The test is to
762
# make sure that a normal option can be added to the section,
763
# converting recurse=False to the norecurse policy.
764
self.get_branch_config('http://www.example.com/norecurse')
765
self.callDeprecated(['The recurse option is deprecated as of 0.14. '
766
'The section "http://www.example.com/norecurse" '
767
'has been converted to use policies.'],
768
self.my_config.set_user_option,
769
'foo', 'bar', store=config.STORE_LOCATION)
771
self.my_location_config._get_option_policy(
772
'http://www.example.com/norecurse', 'foo'),
774
# The previously existing option is still norecurse:
776
self.my_location_config._get_option_policy(
777
'http://www.example.com/norecurse', 'normal_option'),
778
config.POLICY_NORECURSE)
781
534
def test_post_commit_default(self):
782
self.get_branch_config('/a/c')
535
self.get_location_config('/a/c')
783
536
self.assertEqual('bzrlib.tests.test_config.post_commit',
784
537
self.my_config.post_commit())
786
def get_branch_config(self, location, global_config=None):
539
def get_location_config(self, location, global_config=None):
787
540
if global_config is None:
788
541
global_file = StringIO(sample_config_text.encode('utf-8'))
790
543
global_file = StringIO(global_config.encode('utf-8'))
791
544
branches_file = StringIO(sample_branches_text.encode('utf-8'))
792
self.my_config = config.BranchConfig(FakeBranch(location))
793
# Force location config to use specified file
794
self.my_location_config = self.my_config._get_location_config()
795
self.my_location_config._get_parser(branches_file)
796
# Force global config to use specified file
545
self.my_config = config.LocationConfig(location)
546
self.my_config._get_parser(branches_file)
797
547
self.my_config._get_global_config()._get_parser(global_file)
799
549
def test_set_user_setting_sets_and_saves(self):
800
self.get_branch_config('/a/c')
550
self.get_location_config('/a/c')
801
551
record = InstrumentedConfigObj("foo")
802
self.my_location_config._parser = record
552
self.my_config._parser = record
804
554
real_mkdir = os.mkdir
805
555
self.created = False
824
570
('__setitem__', '/a/c', {}),
825
571
('__getitem__', '/a/c'),
826
572
('__setitem__', 'foo', 'bar'),
827
('__getitem__', '/a/c'),
828
('as_bool', 'recurse'),
829
('__getitem__', '/a/c'),
830
('__delitem__', 'recurse'),
831
('__getitem__', '/a/c'),
833
('__getitem__', '/a/c'),
834
('__contains__', 'foo:policy'),
836
574
record._calls[1:])
838
def test_set_user_setting_sets_and_saves2(self):
839
self.get_branch_config('/a/c')
840
self.assertIs(self.my_config.get_user_option('foo'), None)
841
self.my_config.set_user_option('foo', 'bar')
843
self.my_config.branch.control_files.files['branch.conf'],
845
self.assertEqual(self.my_config.get_user_option('foo'), 'bar')
846
self.my_config.set_user_option('foo', 'baz',
847
store=config.STORE_LOCATION)
848
self.assertEqual(self.my_config.get_user_option('foo'), 'baz')
849
self.my_config.set_user_option('foo', 'qux')
850
self.assertEqual(self.my_config.get_user_option('foo'), 'baz')
853
precedence_global = 'option = global'
854
precedence_branch = 'option = branch'
855
precedence_location = """
859
[http://example.com/specific]
864
class TestBranchConfigItems(TestCaseInTempDir):
866
def get_branch_config(self, global_config=None, location=None,
867
location_config=None, branch_data_config=None):
868
my_config = config.BranchConfig(FakeBranch(location))
869
if global_config is not None:
870
global_file = StringIO(global_config.encode('utf-8'))
871
my_config._get_global_config()._get_parser(global_file)
872
self.my_location_config = my_config._get_location_config()
873
if location_config is not None:
874
location_file = StringIO(location_config.encode('utf-8'))
875
self.my_location_config._get_parser(location_file)
876
if branch_data_config is not None:
877
my_config.branch.control_files.files['branch.conf'] = \
577
class TestBranchConfigItems(TestCase):
881
579
def test_user_id(self):
882
branch = FakeBranch(user_id='Robert Collins <robertc@example.net>')
580
branch = FakeBranch()
883
581
my_config = config.BranchConfig(branch)
884
582
self.assertEqual("Robert Collins <robertc@example.net>",
885
my_config.username())
583
my_config._get_user_id())
886
584
branch.control_files.email = "John"
887
my_config.set_user_option('email',
888
"Robert Collins <robertc@example.org>")
889
self.assertEqual("John", my_config.username())
585
self.assertEqual("John", my_config._get_user_id())
587
def test_not_set_in_branch(self):
588
branch = FakeBranch()
589
my_config = config.BranchConfig(branch)
890
590
branch.control_files.email = None
891
self.assertEqual("Robert Collins <robertc@example.org>",
892
my_config.username())
894
def test_not_set_in_branch(self):
895
my_config = self.get_branch_config(sample_config_text)
896
my_config.branch.control_files.email = None
591
config_file = StringIO(sample_config_text.encode('utf-8'))
592
(my_config._get_location_config().
593
_get_global_config()._get_parser(config_file))
897
594
self.assertEqual(u"Erik B\u00e5gfors <erik@bagfors.nu>",
898
595
my_config._get_user_id())
899
my_config.branch.control_files.email = "John"
596
branch.control_files.email = "John"
900
597
self.assertEqual("John", my_config._get_user_id())
902
def test_BZR_EMAIL_OVERRIDES(self):
903
os.environ['BZR_EMAIL'] = "Robert Collins <robertc@example.org>"
599
def test_BZREMAIL_OVERRIDES(self):
600
os.environ['BZREMAIL'] = "Robert Collins <robertc@example.org>"
904
601
branch = FakeBranch()
905
602
my_config = config.BranchConfig(branch)
906
603
self.assertEqual("Robert Collins <robertc@example.org>",
907
604
my_config.username())
909
606
def test_signatures_forced(self):
910
my_config = self.get_branch_config(
911
global_config=sample_always_signatures)
912
self.assertEqual(config.CHECK_NEVER, my_config.signature_checking())
913
self.assertEqual(config.SIGN_ALWAYS, my_config.signing_policy())
914
self.assertTrue(my_config.signature_needed())
916
def test_signatures_forced_branch(self):
917
my_config = self.get_branch_config(
918
global_config=sample_ignore_signatures,
919
branch_data_config=sample_always_signatures)
920
self.assertEqual(config.CHECK_NEVER, my_config.signature_checking())
921
self.assertEqual(config.SIGN_ALWAYS, my_config.signing_policy())
922
self.assertTrue(my_config.signature_needed())
607
branch = FakeBranch()
608
my_config = config.BranchConfig(branch)
609
config_file = StringIO(sample_always_signatures)
610
(my_config._get_location_config().
611
_get_global_config()._get_parser(config_file))
612
self.assertEqual(config.CHECK_ALWAYS, my_config.signature_checking())
924
614
def test_gpg_signing_command(self):
925
my_config = self.get_branch_config(
926
# branch data cannot set gpg_signing_command
927
branch_data_config="gpg_signing_command=pgp")
615
branch = FakeBranch()
616
my_config = config.BranchConfig(branch)
928
617
config_file = StringIO(sample_config_text.encode('utf-8'))
929
my_config._get_global_config()._get_parser(config_file)
618
(my_config._get_location_config().
619
_get_global_config()._get_parser(config_file))
930
620
self.assertEqual('gnome-gpg', my_config.gpg_signing_command())
932
622
def test_get_user_option_global(self):
933
623
branch = FakeBranch()
934
624
my_config = config.BranchConfig(branch)
935
625
config_file = StringIO(sample_config_text.encode('utf-8'))
936
(my_config._get_global_config()._get_parser(config_file))
626
(my_config._get_location_config().
627
_get_global_config()._get_parser(config_file))
937
628
self.assertEqual('something',
938
629
my_config.get_user_option('user_global_option'))
940
631
def test_post_commit_default(self):
941
632
branch = FakeBranch()
942
my_config = self.get_branch_config(sample_config_text, '/a/c',
943
sample_branches_text)
944
self.assertEqual(my_config.branch.base, '/a/c')
945
self.assertEqual('bzrlib.tests.test_config.post_commit',
946
my_config.post_commit())
947
my_config.set_user_option('post_commit', 'rmtree_root')
948
# post-commit is ignored when bresent in branch data
949
self.assertEqual('bzrlib.tests.test_config.post_commit',
950
my_config.post_commit())
951
my_config.set_user_option('post_commit', 'rmtree_root',
952
store=config.STORE_LOCATION)
953
self.assertEqual('rmtree_root', my_config.post_commit())
955
def test_config_precedence(self):
956
my_config = self.get_branch_config(global_config=precedence_global)
957
self.assertEqual(my_config.get_user_option('option'), 'global')
958
my_config = self.get_branch_config(global_config=precedence_global,
959
branch_data_config=precedence_branch)
960
self.assertEqual(my_config.get_user_option('option'), 'branch')
961
my_config = self.get_branch_config(global_config=precedence_global,
962
branch_data_config=precedence_branch,
963
location_config=precedence_location)
964
self.assertEqual(my_config.get_user_option('option'), 'recurse')
965
my_config = self.get_branch_config(global_config=precedence_global,
966
branch_data_config=precedence_branch,
967
location_config=precedence_location,
968
location='http://example.com/specific')
969
self.assertEqual(my_config.get_user_option('option'), 'exact')
634
my_config = config.BranchConfig(branch)
635
config_file = StringIO(sample_config_text.encode('utf-8'))
636
(my_config._get_location_config().
637
_get_global_config()._get_parser(config_file))
638
branch_file = StringIO(sample_branches_text)
639
my_config._get_location_config()._get_parser(branch_file)
640
self.assertEqual('bzrlib.tests.test_config.post_commit',
641
my_config.post_commit())
972
644
class TestMailAddressExtraction(TestCase):