22
22
from sha import sha
25
24
from bzrlib.tests import TestCaseWithTransport
26
from bzrlib.branch import Branch
27
from bzrlib.testament import Testament
28
from bzrlib.trace import mutter
25
from bzrlib.testament import Testament, StrictTestament, StrictTestament3
26
from bzrlib.transform import TreeTransform
29
27
from bzrlib.osutils import has_symlinks
32
class TestamentTests(TestCaseWithTransport):
30
class TestamentSetup(TestCaseWithTransport):
35
super(TestamentTests, self).setUp()
33
super(TestamentSetup, self).setUp()
36
34
self.wt = self.make_branch_and_tree('.')
37
35
b = self.b = self.wt.branch
38
36
b.nick = "test branch"
46
44
('src/foo.c', 'int main()\n{\n}\n')])
47
45
self.wt.add(['hello', 'src', 'src/foo.c'],
48
46
['hello-id', 'src-id', 'foo.c-id'])
47
tt = TreeTransform(self.wt)
48
trans_id = tt.trans_id_tree_path('hello')
49
tt.set_executability(True, trans_id)
49
51
self.wt.commit(message='add files and directories',
50
52
timestamp=1129025483,
52
54
rev_id='test@user-2',
53
55
committer='test@user')
58
class TestamentTests(TestamentSetup):
60
def testament_class(self):
63
def expected(self, key):
64
return texts[self.testament_class()][key]
66
def from_revision(self, repository, revision_id):
67
return self.testament_class().from_revision(repository, revision_id)
55
69
def test_null_testament(self):
56
70
"""Testament for a revision with no contents."""
57
t = Testament.from_revision(self.b.repository, 'test@user-1')
71
t = self.from_revision(self.b.repository, 'test@user-1')
58
72
ass = self.assertTrue
59
73
eq = self.assertEqual
60
74
ass(isinstance(t, Testament))
66
80
def test_testment_text_form(self):
67
81
"""Conversion of testament to canonical text form."""
68
t = Testament.from_revision(self.b.repository, 'test@user-1')
82
t = self.from_revision(self.b.repository, 'test@user-1')
69
83
text_form = t.as_text()
70
84
self.log('testament text form:\n' + text_form)
71
self.assertEqual(text_form, REV_1_TESTAMENT)
85
self.assertEqualDiff(text_form, self.expected('rev_1'))
86
short_text_form = t.as_short_text()
87
self.assertEqualDiff(short_text_form, self.expected('rev_1_short'))
73
89
def test_testament_with_contents(self):
74
90
"""Testament containing a file and a directory."""
75
t = Testament.from_revision(self.b.repository, 'test@user-2')
91
t = self.from_revision(self.b.repository, 'test@user-2')
76
92
text_form = t.as_text()
77
93
self.log('testament text form:\n' + text_form)
78
self.assertEqualDiff(text_form, REV_2_TESTAMENT)
94
self.assertEqualDiff(text_form, self.expected('rev_2'))
79
95
actual_short = t.as_short_text()
80
self.assertEqualDiff(actual_short, REV_2_SHORT)
82
def test_testament_command(self):
83
"""Testament containing a file and a directory."""
84
out, err = self.run_bzr_captured(['testament', '--long'])
85
self.assertEqualDiff(err, '')
86
self.assertEqualDiff(out, REV_2_TESTAMENT)
88
def test_testament_command_2(self):
89
"""Command getting short testament of previous version."""
90
out, err = self.run_bzr_captured(['testament', '-r1'])
91
self.assertEqualDiff(err, '')
92
self.assertEqualDiff(out, REV_1_SHORT)
96
self.assertEqualDiff(actual_short, self.expected('rev_2_short'))
94
98
def test_testament_symlinks(self):
95
99
"""Testament containing symlink (where possible)"""
103
107
rev_id='test@user-3',
104
108
committer='test@user')
105
t = Testament.from_revision(self.b.repository, 'test@user-3')
106
self.assertEqualDiff(t.as_text(), REV_3_TESTAMENT)
109
t = self.from_revision(self.b.repository, 'test@user-3')
110
self.assertEqualDiff(t.as_text(), self.expected('rev_3'))
108
112
def test_testament_revprops(self):
109
113
"""Testament to revision with extra properties"""
110
114
props = dict(flavor='sour cherry\ncream cheese',
112
118
self.wt.commit(message='revision with properties',
113
119
timestamp=1129025493,
115
121
rev_id='test@user-3',
116
122
committer='test@user',
118
t = Testament.from_revision(self.b.repository, 'test@user-3')
119
self.assertEqualDiff(t.as_text(), REV_PROPS_TESTAMENT)
124
t = self.from_revision(self.b.repository, 'test@user-3')
125
self.assertEqualDiff(t.as_text(), self.expected('rev_props'))
121
127
def test_testament_unicode_commit_message(self):
124
130
timestamp=1129025493,
126
132
rev_id='test@user-3',
127
committer='test@user')
128
t = Testament.from_revision(self.b.repository, 'test@user-3')
133
committer='Erik B\xe5gfors <test@user>',
134
revprops={'uni':u'\xb5'}
136
t = self.from_revision(self.b.repository, 'test@user-3')
129
137
self.assertEqualDiff(
130
SAMPLE_UNICODE_TESTAMENT.encode('utf-8'), t.as_text())
138
self.expected('sample_unicode').encode('utf-8'), t.as_text())
132
140
def test___init__(self):
133
141
revision = self.b.repository.get_revision('test@user-2')
134
142
inventory = self.b.repository.get_inventory('test@user-2')
135
testament_1 = Testament(revision, inventory).as_short_text()
136
testament_2 = Testament.from_revision(self.b.repository,
137
'test@user-2').as_short_text()
138
self.assertEqual(testament_1, testament_2)
143
testament_1 = self.testament_class()(revision, inventory)
144
text_1 = testament_1.as_short_text()
145
text_2 = self.from_revision(self.b.repository,
146
'test@user-2').as_short_text()
147
self.assertEqual(text_1, text_2)
150
class TestamentTestsStrict(TestamentTests):
152
def testament_class(self):
153
return StrictTestament
156
class TestamentTestsStrict2(TestamentTests):
158
def testament_class(self):
159
return StrictTestament3
141
162
REV_1_TESTAMENT = """\
142
163
bazaar-ng testament version 1
143
164
revision-id: test@user-1
178
REV_1_STRICT_TESTAMENT = """\
179
bazaar-ng testament version 2.1
180
revision-id: test@user-1
182
timestamp: 1129025423
194
REV_1_STRICT_TESTAMENT3 = """\
195
bazaar testament version 3 strict
196
revision-id: test@user-1
198
timestamp: 1129025423
204
directory . TREE_ROOT test@user-1 no
156
211
REV_1_SHORT = """\
157
212
bazaar-ng testament short form 1
158
213
revision-id: test@user-1
160
215
""" % sha(REV_1_TESTAMENT).hexdigest()
218
REV_1_SHORT_STRICT = """\
219
bazaar-ng testament short form 2.1
220
revision-id: test@user-1
222
""" % sha(REV_1_STRICT_TESTAMENT).hexdigest()
225
REV_1_SHORT_STRICT3 = """\
226
bazaar testament short form 3 strict
227
revision-id: test@user-1
229
""" % sha(REV_1_STRICT_TESTAMENT3).hexdigest()
163
232
REV_2_TESTAMENT = """\
164
233
bazaar-ng testament version 1
165
234
revision-id: test@user-2
252
REV_2_STRICT_TESTAMENT = """\
253
bazaar-ng testament version 2.1
254
revision-id: test@user-2
256
timestamp: 1129025483
261
add files and directories
263
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
264
directory src src-id test@user-2 no
265
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
272
REV_2_STRICT_TESTAMENT3 = """\
273
bazaar testament version 3 strict
274
revision-id: test@user-2
276
timestamp: 1129025483
281
add files and directories
283
directory . TREE_ROOT test@user-2 no
284
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
285
directory src src-id test@user-2 no
286
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
183
293
REV_2_SHORT = """\
184
294
bazaar-ng testament short form 1
185
295
revision-id: test@user-2
187
297
""" % sha(REV_2_TESTAMENT).hexdigest()
300
REV_2_SHORT_STRICT = """\
301
bazaar-ng testament short form 2.1
302
revision-id: test@user-2
304
""" % sha(REV_2_STRICT_TESTAMENT).hexdigest()
307
REV_2_SHORT_STRICT3 = """\
308
bazaar testament short form 3 strict
309
revision-id: test@user-2
311
""" % sha(REV_2_STRICT_TESTAMENT3).hexdigest()
190
314
REV_PROPS_TESTAMENT = """\
191
315
bazaar-ng testament version 1
192
316
revision-id: test@user-3
340
REV_PROPS_TESTAMENT_STRICT = """\
341
bazaar-ng testament version 2.1
342
revision-id: test@user-3
344
timestamp: 1129025493
349
revision with properties
351
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
352
directory src src-id test@user-2 no
353
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
366
REV_PROPS_TESTAMENT_STRICT3 = """\
367
bazaar testament version 3 strict
368
revision-id: test@user-3
370
timestamp: 1129025493
375
revision with properties
377
directory . TREE_ROOT test@user-3 no
378
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
379
directory src src-id test@user-2 no
380
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
414
REV_3_TESTAMENT_STRICT = """\
415
bazaar-ng testament version 2.1
416
revision-id: test@user-3
418
timestamp: 1129025493
425
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
426
symlink link link-id wibble/linktarget test@user-3 no
427
directory src src-id test@user-2 no
428
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
435
REV_3_TESTAMENT_STRICT3 = """\
436
bazaar testament version 3 strict
437
revision-id: test@user-3
439
timestamp: 1129025493
446
directory . TREE_ROOT test@user-3 no
447
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
448
symlink link link-id wibble/linktarget test@user-3 no
449
directory src src-id test@user-2 no
450
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
236
457
SAMPLE_UNICODE_TESTAMENT = u"""\
237
458
bazaar-ng testament version 1
238
459
revision-id: test@user-3
460
committer: Erik B\xe5gfors <test@user>
240
461
timestamp: 1129025493
479
SAMPLE_UNICODE_TESTAMENT_STRICT = u"""\
480
bazaar-ng testament version 2.1
481
revision-id: test@user-3
482
committer: Erik B\xe5gfors <test@user>
483
timestamp: 1129025493
488
non-ascii commit \N{COPYRIGHT SIGN} me
490
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
491
directory src src-id test@user-2 no
492
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
501
SAMPLE_UNICODE_TESTAMENT_STRICT3 = u"""\
502
bazaar testament version 3 strict
503
revision-id: test@user-3
504
committer: Erik B\xe5gfors <test@user>
505
timestamp: 1129025493
510
non-ascii commit \N{COPYRIGHT SIGN} me
512
directory . TREE_ROOT test@user-3 no
513
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
514
directory src src-id test@user-2 no
515
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
525
Testament: { 'rev_1': REV_1_TESTAMENT,
526
'rev_1_short': REV_1_SHORT,
527
'rev_2': REV_2_TESTAMENT,
528
'rev_2_short': REV_2_SHORT,
529
'rev_3': REV_3_TESTAMENT,
530
'rev_props': REV_PROPS_TESTAMENT,
531
'sample_unicode': SAMPLE_UNICODE_TESTAMENT,
533
StrictTestament: {'rev_1': REV_1_STRICT_TESTAMENT,
534
'rev_1_short': REV_1_SHORT_STRICT,
535
'rev_2': REV_2_STRICT_TESTAMENT,
536
'rev_2_short': REV_2_SHORT_STRICT,
537
'rev_3': REV_3_TESTAMENT_STRICT,
538
'rev_props': REV_PROPS_TESTAMENT_STRICT,
539
'sample_unicode': SAMPLE_UNICODE_TESTAMENT_STRICT,
541
StrictTestament3: {'rev_1': REV_1_STRICT_TESTAMENT3,
542
'rev_1_short': REV_1_SHORT_STRICT3,
543
'rev_2': REV_2_STRICT_TESTAMENT3,
544
'rev_2_short': REV_2_SHORT_STRICT3,
545
'rev_3': REV_3_TESTAMENT_STRICT3,
546
'rev_props': REV_PROPS_TESTAMENT_STRICT3,
547
'sample_unicode': SAMPLE_UNICODE_TESTAMENT_STRICT3,