23
23
from breezy import osutils
24
24
from breezy.tests import TestCaseWithTransport
25
from breezy.bzr.testament import (
25
from breezy.testament import (
30
from breezy.transform import TreeTransform
30
31
from breezy.tests.features import (
38
39
super(TestamentSetup, self).setUp()
39
40
self.wt = self.make_branch_and_tree('.', format='development-subtree')
40
self.wt.set_root_id(b'TREE_ROT')
41
self.wt.set_root_id('TREE_ROT')
41
42
b = self.b = self.wt.branch
42
43
b.nick = "test branch"
43
44
self.wt.commit(message='initial null commit',
44
committer='test@user',
45
timestamp=1129025423, # 'Tue Oct 11 20:10:23 2005'
47
rev_id=b'test@user-1')
48
self.build_tree_contents([('hello', b'contents of hello file'),
50
('src/foo.c', b'int main()\n{\n}\n')])
45
committer='test@user',
46
timestamp=1129025423, # 'Tue Oct 11 20:10:23 2005'
49
self.build_tree_contents([('hello', 'contents of hello file'),
51
('src/foo.c', 'int main()\n{\n}\n')])
51
52
self.wt.add(['hello', 'src', 'src/foo.c'],
52
[b'hello-id', b'src-id', b'foo.c-id'])
53
tt = self.wt.transform()
53
['hello-id', 'src-id', 'foo.c-id'])
54
tt = TreeTransform(self.wt)
54
55
trans_id = tt.trans_id_tree_path('hello')
55
56
tt.set_executability(True, trans_id)
57
58
self.wt.commit(message='add files and directories',
60
rev_id=b'test@user-2',
61
committer='test@user')
62
committer='test@user')
64
65
class TestamentTests(TestamentSetup):
75
76
def test_null_testament(self):
76
77
"""Testament for a revision with no contents."""
77
t = self.from_revision(self.b.repository, b'test@user-1')
78
t = self.from_revision(self.b.repository, 'test@user-1')
78
79
ass = self.assertTrue
79
80
eq = self.assertEqual
80
81
ass(isinstance(t, Testament))
81
eq(t.revision_id, b'test@user-1')
82
eq(t.revision_id, 'test@user-1')
82
83
eq(t.committer, 'test@user')
83
84
eq(t.timestamp, 1129025423)
86
87
def test_testment_text_form(self):
87
88
"""Conversion of testament to canonical text form."""
88
t = self.from_revision(self.b.repository, b'test@user-1')
89
t = self.from_revision(self.b.repository, 'test@user-1')
89
90
text_form = t.as_text()
90
self.log('testament text form:\n%s' % text_form)
91
self.log('testament text form:\n' + text_form)
91
92
self.assertEqualDiff(text_form, self.expected('rev_1'))
92
93
short_text_form = t.as_short_text()
93
94
self.assertEqualDiff(short_text_form, self.expected('rev_1_short'))
95
96
def test_testament_with_contents(self):
96
97
"""Testament containing a file and a directory."""
97
t = self.from_revision(self.b.repository, b'test@user-2')
98
t = self.from_revision(self.b.repository, 'test@user-2')
98
99
text_form = t.as_text()
99
self.log('testament text form:\n%s' % text_form)
100
self.log('testament text form:\n' + text_form)
100
101
self.assertEqualDiff(text_form, self.expected('rev_2'))
101
102
actual_short = t.as_short_text()
102
103
self.assertEqualDiff(actual_short, self.expected('rev_2_short'))
105
106
"""Testament containing symlink (where possible)"""
106
107
self.requireFeature(SymlinkFeature)
107
108
os.symlink('wibble/linktarget', 'link')
108
self.wt.add(['link'], [b'link-id'])
109
self.wt.add(['link'], ['link-id'])
109
110
self.wt.commit(message='add symlink',
110
timestamp=1129025493,
112
rev_id=b'test@user-3',
113
committer='test@user')
114
t = self.from_revision(self.b.repository, b'test@user-3')
111
timestamp=1129025493,
113
rev_id='test@user-3',
114
committer='test@user')
115
t = self.from_revision(self.b.repository, 'test@user-3')
115
116
self.assertEqualDiff(t.as_text(), self.expected('rev_3'))
117
118
def test_testament_revprops(self):
118
119
"""Testament to revision with extra properties"""
119
props = {u'flavor': 'sour cherry\ncream cheese',
120
props = dict(flavor='sour cherry\ncream cheese',
123
124
self.wt.commit(message='revision with properties',
124
timestamp=1129025493,
126
rev_id=b'test@user-3',
127
committer='test@user',
129
t = self.from_revision(self.b.repository, b'test@user-3')
125
timestamp=1129025493,
127
rev_id='test@user-3',
128
committer='test@user',
130
t = self.from_revision(self.b.repository, 'test@user-3')
130
131
self.assertEqualDiff(t.as_text(), self.expected('rev_props'))
132
133
def test_testament_unicode_commit_message(self):
134
135
message=u'non-ascii commit \N{COPYRIGHT SIGN} me',
135
136
timestamp=1129025493,
137
rev_id=b'test@user-3',
138
rev_id='test@user-3',
138
139
committer=u'Erik B\xe5gfors <test@user>',
139
revprops={u'uni': u'\xb5'}
140
revprops={'uni':u'\xb5'}
141
t = self.from_revision(self.b.repository, b'test@user-3')
142
t = self.from_revision(self.b.repository, 'test@user-3')
142
143
self.assertEqualDiff(
143
144
self.expected('sample_unicode').encode('utf-8'), t.as_text())
145
146
def test_from_tree(self):
146
tree = self.b.repository.revision_tree(b'test@user-2')
147
tree = self.b.repository.revision_tree('test@user-2')
147
148
testament = self.testament_class().from_revision_tree(tree)
148
149
text_1 = testament.as_short_text()
149
150
text_2 = self.from_revision(self.b.repository,
150
b'test@user-2').as_short_text()
151
'test@user-2').as_short_text()
151
152
self.assertEqual(text_1, text_2)
153
154
def test___init__(self):
154
revision = self.b.repository.get_revision(b'test@user-2')
155
tree = self.b.repository.revision_tree(b'test@user-2')
155
revision = self.b.repository.get_revision('test@user-2')
156
tree = self.b.repository.revision_tree('test@user-2')
156
157
testament_1 = self.testament_class()(revision, tree)
157
158
text_1 = testament_1.as_short_text()
158
159
text_2 = self.from_revision(self.b.repository,
159
b'test@user-2').as_short_text()
160
'test@user-2').as_short_text()
160
161
self.assertEqual(text_1, text_2)
225
226
bazaar-ng testament short form 1
226
227
revision-id: test@user-1
228
229
""" % osutils.sha_string(REV_1_TESTAMENT)
231
REV_1_SHORT_STRICT = b"""\
232
REV_1_SHORT_STRICT = """\
232
233
bazaar-ng testament short form 2.1
233
234
revision-id: test@user-1
235
236
""" % osutils.sha_string(REV_1_STRICT_TESTAMENT)
238
REV_1_SHORT_STRICT3 = b"""\
239
REV_1_SHORT_STRICT3 = """\
239
240
bazaar testament short form 3 strict
240
241
revision-id: test@user-1
307
308
bazaar-ng testament short form 1
308
309
revision-id: test@user-2
310
311
""" % osutils.sha_string(REV_2_TESTAMENT)
313
REV_2_SHORT_STRICT = b"""\
314
REV_2_SHORT_STRICT = """\
314
315
bazaar-ng testament short form 2.1
315
316
revision-id: test@user-2
317
318
""" % osutils.sha_string(REV_2_STRICT_TESTAMENT)
320
REV_2_SHORT_STRICT3 = b"""\
321
REV_2_SHORT_STRICT3 = """\
321
322
bazaar testament short form 3 strict
322
323
revision-id: test@user-2
538
Testament: {'rev_1': REV_1_TESTAMENT,
539
'rev_1_short': REV_1_SHORT,
540
'rev_2': REV_2_TESTAMENT,
541
'rev_2_short': REV_2_SHORT,
542
'rev_3': REV_3_TESTAMENT,
543
'rev_props': REV_PROPS_TESTAMENT,
544
'sample_unicode': SAMPLE_UNICODE_TESTAMENT,
539
Testament: { 'rev_1': REV_1_TESTAMENT,
540
'rev_1_short': REV_1_SHORT,
541
'rev_2': REV_2_TESTAMENT,
542
'rev_2_short': REV_2_SHORT,
543
'rev_3': REV_3_TESTAMENT,
544
'rev_props': REV_PROPS_TESTAMENT,
545
'sample_unicode': SAMPLE_UNICODE_TESTAMENT,
546
547
StrictTestament: {'rev_1': REV_1_STRICT_TESTAMENT,
547
548
'rev_1_short': REV_1_SHORT_STRICT,
548
549
'rev_2': REV_2_STRICT_TESTAMENT,
550
551
'rev_3': REV_3_TESTAMENT_STRICT,
551
552
'rev_props': REV_PROPS_TESTAMENT_STRICT,
552
553
'sample_unicode': SAMPLE_UNICODE_TESTAMENT_STRICT,
554
555
StrictTestament3: {'rev_1': REV_1_STRICT_TESTAMENT3,
555
'rev_1_short': REV_1_SHORT_STRICT3,
556
'rev_2': REV_2_STRICT_TESTAMENT3,
557
'rev_2_short': REV_2_SHORT_STRICT3,
558
'rev_3': REV_3_TESTAMENT_STRICT3,
559
'rev_props': REV_PROPS_TESTAMENT_STRICT3,
560
'sample_unicode': SAMPLE_UNICODE_TESTAMENT_STRICT3,
556
'rev_1_short': REV_1_SHORT_STRICT3,
557
'rev_2': REV_2_STRICT_TESTAMENT3,
558
'rev_2_short': REV_2_SHORT_STRICT3,
559
'rev_3': REV_3_TESTAMENT_STRICT3,
560
'rev_props': REV_PROPS_TESTAMENT_STRICT3,
561
'sample_unicode': SAMPLE_UNICODE_TESTAMENT_STRICT3,