22
22
from sha import sha
24
from bzrlib.tests import TestCaseWithTransport
25
from bzrlib.testament import Testament, StrictTestament, StrictTestament3
26
from bzrlib.transform import TreeTransform
25
from bzrlib.selftest import TestCaseInTempDir
26
from bzrlib.selftest.treeshape import build_tree_contents
27
from bzrlib.branch import Branch
28
from bzrlib.testament import Testament
29
from bzrlib.trace import mutter
27
30
from bzrlib.osutils import has_symlinks
30
class TestamentSetup(TestCaseWithTransport):
33
class TestamentTests(TestCaseInTempDir):
33
super(TestamentSetup, self).setUp()
34
self.wt = self.make_branch_and_tree('.')
35
self.wt.set_root_id('TREE_ROT')
36
b = self.b = self.wt.branch
37
b.nick = "test branch"
38
self.wt.commit(message='initial null commit',
36
super(TestamentTests, self).setUp()
37
b = self.b = Branch.initialize('.')
38
b.commit(message='initial null commit',
39
39
committer='test@user',
40
40
timestamp=1129025423, # 'Tue Oct 11 20:10:23 2005'
42
42
rev_id='test@user-1')
43
self.build_tree_contents([('hello', 'contents of hello file'),
43
build_tree_contents([('hello', 'contents of hello file'),
45
45
('src/foo.c', 'int main()\n{\n}\n')])
46
self.wt.add(['hello', 'src', 'src/foo.c'],
47
['hello-id', 'src-id', 'foo.c-id'])
48
tt = TreeTransform(self.wt)
49
trans_id = tt.trans_id_tree_path('hello')
50
tt.set_executability(True, trans_id)
52
self.wt.commit(message='add files and directories',
46
b.add(['hello', 'src', 'src/foo.c'],
47
['hello-id', 'src-id', 'foo.c-id'])
48
b.commit(message='add files and directories',
53
49
timestamp=1129025483,
55
51
rev_id='test@user-2',
56
52
committer='test@user')
59
class TestamentTests(TestamentSetup):
61
def testament_class(self):
64
def expected(self, key):
65
return texts[self.testament_class()][key]
67
def from_revision(self, repository, revision_id):
68
return self.testament_class().from_revision(repository, revision_id)
70
54
def test_null_testament(self):
71
55
"""Testament for a revision with no contents."""
72
t = self.from_revision(self.b.repository, 'test@user-1')
56
t = Testament.from_revision(self.b, 'test@user-1')
73
57
ass = self.assertTrue
74
58
eq = self.assertEqual
75
59
ass(isinstance(t, Testament))
81
65
def test_testment_text_form(self):
82
66
"""Conversion of testament to canonical text form."""
83
t = self.from_revision(self.b.repository, 'test@user-1')
67
t = Testament.from_revision(self.b, 'test@user-1')
84
68
text_form = t.as_text()
85
69
self.log('testament text form:\n' + text_form)
86
self.assertEqualDiff(text_form, self.expected('rev_1'))
87
short_text_form = t.as_short_text()
88
self.assertEqualDiff(short_text_form, self.expected('rev_1_short'))
70
self.assertEqual(text_form, REV_1_TESTAMENT)
90
72
def test_testament_with_contents(self):
91
73
"""Testament containing a file and a directory."""
92
t = self.from_revision(self.b.repository, 'test@user-2')
74
t = Testament.from_revision(self.b, 'test@user-2')
93
75
text_form = t.as_text()
94
76
self.log('testament text form:\n' + text_form)
95
self.assertEqualDiff(text_form, self.expected('rev_2'))
77
self.assertEqualDiff(text_form, REV_2_TESTAMENT)
96
78
actual_short = t.as_short_text()
97
self.assertEqualDiff(actual_short, self.expected('rev_2_short'))
79
self.assertEqualDiff(actual_short, REV_2_SHORT)
81
def test_testament_command(self):
82
"""Testament containing a file and a directory."""
83
out, err = self.run_bzr_captured(['testament', '--long'])
84
self.assertEqualDiff(err, '')
85
self.assertEqualDiff(out, REV_2_TESTAMENT)
87
def test_testament_command_2(self):
88
"""Command getting short testament of previous version."""
89
out, err = self.run_bzr_captured(['testament', '-r1'])
90
self.assertEqualDiff(err, '')
91
self.assertEqualDiff(out, REV_1_SHORT)
99
93
def test_testament_symlinks(self):
100
94
"""Testament containing symlink (where possible)"""
101
95
if not has_symlinks():
103
97
os.symlink('wibble/linktarget', 'link')
104
self.wt.add(['link'], ['link-id'])
105
self.wt.commit(message='add symlink',
98
self.b.add(['link'], ['link-id'])
99
self.b.commit(message='add symlink',
106
100
timestamp=1129025493,
108
102
rev_id='test@user-3',
109
103
committer='test@user')
110
t = self.from_revision(self.b.repository, 'test@user-3')
111
self.assertEqualDiff(t.as_text(), self.expected('rev_3'))
104
t = Testament.from_revision(self.b, 'test@user-3')
105
self.assertEqualDiff(t.as_text(), REV_3_TESTAMENT)
113
107
def test_testament_revprops(self):
114
108
"""Testament to revision with extra properties"""
115
109
props = dict(flavor='sour cherry\ncream cheese',
119
self.wt.commit(message='revision with properties',
111
self.b.commit(message='revision with properties',
120
112
timestamp=1129025493,
122
114
rev_id='test@user-3',
123
115
committer='test@user',
125
t = self.from_revision(self.b.repository, 'test@user-3')
126
self.assertEqualDiff(t.as_text(), self.expected('rev_props'))
128
def test_testament_unicode_commit_message(self):
130
message=u'non-ascii commit \N{COPYRIGHT SIGN} me',
131
timestamp=1129025493,
133
rev_id='test@user-3',
134
committer='Erik B\xe5gfors <test@user>',
135
revprops={'uni':u'\xb5'}
137
t = self.from_revision(self.b.repository, 'test@user-3')
138
self.assertEqualDiff(
139
self.expected('sample_unicode').encode('utf-8'), t.as_text())
117
t = Testament.from_revision(self.b, 'test@user-3')
118
self.assertEqualDiff(t.as_text(), REV_PROPS_TESTAMENT)
141
120
def test___init__(self):
142
revision = self.b.repository.get_revision('test@user-2')
143
inventory = self.b.repository.get_inventory('test@user-2')
144
testament_1 = self.testament_class()(revision, inventory)
145
text_1 = testament_1.as_short_text()
146
text_2 = self.from_revision(self.b.repository,
147
'test@user-2').as_short_text()
148
self.assertEqual(text_1, text_2)
121
revision = self.b.get_revision('test@user-2')
122
inventory = self.b.get_inventory('test@user-2')
123
testament_1 = Testament(revision, inventory).as_short_text()
124
testament_2 = Testament.from_revision(self.b,
125
'test@user-2').as_short_text()
126
self.assertEqual(testament_1, testament_2)
151
class TestamentTestsStrict(TestamentTests):
153
def testament_class(self):
154
return StrictTestament
157
class TestamentTestsStrict2(TestamentTests):
159
def testament_class(self):
160
return StrictTestament3
163
129
REV_1_TESTAMENT = """\
164
130
bazaar-ng testament version 1
165
131
revision-id: test@user-1
244
159
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
245
160
directory src src-id
246
161
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
253
REV_2_STRICT_TESTAMENT = """\
254
bazaar-ng testament version 2.1
255
revision-id: test@user-2
257
timestamp: 1129025483
262
add files and directories
264
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
265
directory src src-id test@user-2 no
266
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
273
REV_2_STRICT_TESTAMENT3 = """\
274
bazaar testament version 3 strict
275
revision-id: test@user-2
277
timestamp: 1129025483
282
add files and directories
284
directory . TREE_ROT test@user-2 no
285
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
286
directory src src-id test@user-2 no
287
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
406
207
symlink link link-id wibble/linktarget
407
208
directory src src-id
408
209
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
415
REV_3_TESTAMENT_STRICT = """\
416
bazaar-ng testament version 2.1
417
revision-id: test@user-3
419
timestamp: 1129025493
426
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
427
symlink link link-id wibble/linktarget test@user-3 no
428
directory src src-id test@user-2 no
429
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
436
REV_3_TESTAMENT_STRICT3 = """\
437
bazaar testament version 3 strict
438
revision-id: test@user-3
440
timestamp: 1129025493
447
directory . TREE_ROT test@user-3 no
448
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
449
symlink link link-id wibble/linktarget test@user-3 no
450
directory src src-id test@user-2 no
451
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
458
SAMPLE_UNICODE_TESTAMENT = u"""\
459
bazaar-ng testament version 1
460
revision-id: test@user-3
461
committer: Erik B\xe5gfors <test@user>
462
timestamp: 1129025493
467
non-ascii commit \N{COPYRIGHT SIGN} me
469
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
471
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
480
SAMPLE_UNICODE_TESTAMENT_STRICT = u"""\
481
bazaar-ng testament version 2.1
482
revision-id: test@user-3
483
committer: Erik B\xe5gfors <test@user>
484
timestamp: 1129025493
489
non-ascii commit \N{COPYRIGHT SIGN} me
491
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
492
directory src src-id test@user-2 no
493
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
502
SAMPLE_UNICODE_TESTAMENT_STRICT3 = u"""\
503
bazaar testament version 3 strict
504
revision-id: test@user-3
505
committer: Erik B\xe5gfors <test@user>
506
timestamp: 1129025493
511
non-ascii commit \N{COPYRIGHT SIGN} me
513
directory . TREE_ROT test@user-3 no
514
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
515
directory src src-id test@user-2 no
516
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
526
Testament: { 'rev_1': REV_1_TESTAMENT,
527
'rev_1_short': REV_1_SHORT,
528
'rev_2': REV_2_TESTAMENT,
529
'rev_2_short': REV_2_SHORT,
530
'rev_3': REV_3_TESTAMENT,
531
'rev_props': REV_PROPS_TESTAMENT,
532
'sample_unicode': SAMPLE_UNICODE_TESTAMENT,
534
StrictTestament: {'rev_1': REV_1_STRICT_TESTAMENT,
535
'rev_1_short': REV_1_SHORT_STRICT,
536
'rev_2': REV_2_STRICT_TESTAMENT,
537
'rev_2_short': REV_2_SHORT_STRICT,
538
'rev_3': REV_3_TESTAMENT_STRICT,
539
'rev_props': REV_PROPS_TESTAMENT_STRICT,
540
'sample_unicode': SAMPLE_UNICODE_TESTAMENT_STRICT,
542
StrictTestament3: {'rev_1': REV_1_STRICT_TESTAMENT3,
543
'rev_1_short': REV_1_SHORT_STRICT3,
544
'rev_2': REV_2_STRICT_TESTAMENT3,
545
'rev_2_short': REV_2_SHORT_STRICT3,
546
'rev_3': REV_3_TESTAMENT_STRICT3,
547
'rev_props': REV_PROPS_TESTAMENT_STRICT3,
548
'sample_unicode': SAMPLE_UNICODE_TESTAMENT_STRICT3,