~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_testament.py

  • Committer: Martin Pool
  • Date: 2006-03-21 12:26:54 UTC
  • mto: This revision was merged to the branch mainline in revision 1621.
  • Revision ID: mbp@sourcefrog.net-20060321122654-514047ed65795a17
New developer commands 'weave-list' and 'weave-join'.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 Canonical Ltd
 
1
# Copyright (C) 2005 by Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
20
20
 
21
21
import os
22
22
from sha import sha
 
23
import sys
23
24
 
24
25
from bzrlib.tests import TestCaseWithTransport
25
 
from bzrlib.testament import Testament, StrictTestament, StrictTestament3
26
 
from bzrlib.transform import TreeTransform
 
26
from bzrlib.branch import Branch
 
27
from bzrlib.testament import Testament
 
28
from bzrlib.trace import mutter
27
29
from bzrlib.osutils import has_symlinks
28
30
 
29
31
 
30
 
class TestamentSetup(TestCaseWithTransport):
 
32
class TestamentTests(TestCaseWithTransport):
31
33
 
32
34
    def setUp(self):
33
 
        super(TestamentSetup, self).setUp()
34
 
        self.wt = self.make_branch_and_tree('.', format='dirstate-with-subtree')
35
 
        self.wt.set_root_id('TREE_ROT')
 
35
        super(TestamentTests, self).setUp()
 
36
        self.wt = self.make_branch_and_tree('.')
36
37
        b = self.b = self.wt.branch
37
38
        b.nick = "test branch"
38
39
        self.wt.commit(message='initial null commit',
45
46
                             ('src/foo.c', 'int main()\n{\n}\n')])
46
47
        self.wt.add(['hello', 'src', 'src/foo.c'],
47
48
                             ['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)
51
 
        tt.apply()
52
49
        self.wt.commit(message='add files and directories',
53
50
                 timestamp=1129025483,
54
51
                 timezone=36000,
55
52
                 rev_id='test@user-2',
56
53
                 committer='test@user')
57
54
 
58
 
 
59
 
class TestamentTests(TestamentSetup):
60
 
 
61
 
    def testament_class(self):
62
 
        return Testament
63
 
 
64
 
    def expected(self, key):
65
 
        return texts[self.testament_class()][key]
66
 
 
67
 
    def from_revision(self, repository, revision_id):
68
 
        return self.testament_class().from_revision(repository, revision_id)
69
 
 
70
55
    def test_null_testament(self):
71
56
        """Testament for a revision with no contents."""
72
 
        t = self.from_revision(self.b.repository, 'test@user-1')
 
57
        t = Testament.from_revision(self.b.repository, 'test@user-1')
73
58
        ass = self.assertTrue
74
59
        eq = self.assertEqual
75
60
        ass(isinstance(t, Testament))
80
65
 
81
66
    def test_testment_text_form(self):
82
67
        """Conversion of testament to canonical text form."""
83
 
        t = self.from_revision(self.b.repository, 'test@user-1')
 
68
        t = Testament.from_revision(self.b.repository, 'test@user-1')
84
69
        text_form = t.as_text()
85
70
        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'))
 
71
        self.assertEqual(text_form, REV_1_TESTAMENT)
89
72
 
90
73
    def test_testament_with_contents(self):
91
74
        """Testament containing a file and a directory."""
92
 
        t = self.from_revision(self.b.repository, 'test@user-2')
 
75
        t = Testament.from_revision(self.b.repository, 'test@user-2')
93
76
        text_form = t.as_text()
94
77
        self.log('testament text form:\n' + text_form)
95
 
        self.assertEqualDiff(text_form, self.expected('rev_2'))
 
78
        self.assertEqualDiff(text_form, REV_2_TESTAMENT)
96
79
        actual_short = t.as_short_text()
97
 
        self.assertEqualDiff(actual_short, self.expected('rev_2_short'))
 
80
        self.assertEqualDiff(actual_short, REV_2_SHORT)
 
81
 
 
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)
 
87
 
 
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)
98
93
 
99
94
    def test_testament_symlinks(self):
100
95
        """Testament containing symlink (where possible)"""
107
102
                 timezone=36000,
108
103
                 rev_id='test@user-3',
109
104
                 committer='test@user')
110
 
        t = self.from_revision(self.b.repository, 'test@user-3')
111
 
        self.assertEqualDiff(t.as_text(), self.expected('rev_3'))
 
105
        t = Testament.from_revision(self.b.repository, 'test@user-3')
 
106
        self.assertEqualDiff(t.as_text(), REV_3_TESTAMENT)
112
107
 
113
108
    def test_testament_revprops(self):
114
109
        """Testament to revision with extra properties"""
115
110
        props = dict(flavor='sour cherry\ncream cheese',
116
 
                     size='medium',
117
 
                     empty='',
118
 
                    )
 
111
                     size='medium')
119
112
        self.wt.commit(message='revision with properties',
120
113
                      timestamp=1129025493,
121
114
                      timezone=36000,
122
115
                      rev_id='test@user-3',
123
116
                      committer='test@user',
124
117
                      revprops=props)
125
 
        t = self.from_revision(self.b.repository, 'test@user-3')
126
 
        self.assertEqualDiff(t.as_text(), self.expected('rev_props'))
 
118
        t = Testament.from_revision(self.b.repository, 'test@user-3')
 
119
        self.assertEqualDiff(t.as_text(), REV_PROPS_TESTAMENT)
127
120
 
128
121
    def test_testament_unicode_commit_message(self):
129
122
        self.wt.commit(
131
124
            timestamp=1129025493,
132
125
            timezone=36000,
133
126
            rev_id='test@user-3',
134
 
            committer='Erik B\xe5gfors <test@user>',
135
 
            revprops={'uni':u'\xb5'}
136
 
            )
137
 
        t = self.from_revision(self.b.repository, 'test@user-3')
 
127
            committer='test@user')
 
128
        t = Testament.from_revision(self.b.repository, 'test@user-3')
138
129
        self.assertEqualDiff(
139
 
            self.expected('sample_unicode').encode('utf-8'), t.as_text())
 
130
            SAMPLE_UNICODE_TESTAMENT.encode('utf-8'), t.as_text())
140
131
 
141
132
    def test___init__(self):
142
133
        revision = self.b.repository.get_revision('test@user-2')
143
134
        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)
 
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)
149
139
                    
150
140
 
151
 
class TestamentTestsStrict(TestamentTests):
152
 
    
153
 
    def testament_class(self):
154
 
        return StrictTestament
155
 
 
156
 
 
157
 
class TestamentTestsStrict2(TestamentTests):
158
 
    
159
 
    def testament_class(self):
160
 
        return StrictTestament3
161
 
 
162
 
 
163
141
REV_1_TESTAMENT = """\
164
142
bazaar-ng testament version 1
165
143
revision-id: test@user-1
175
153
    test branch
176
154
"""
177
155
 
178
 
 
179
 
REV_1_STRICT_TESTAMENT = """\
180
 
bazaar-ng testament version 2.1
181
 
revision-id: test@user-1
182
 
committer: test@user
183
 
timestamp: 1129025423
184
 
timezone: 0
185
 
parents:
186
 
message:
187
 
  initial null commit
188
 
inventory:
189
 
properties:
190
 
  branch-nick:
191
 
    test branch
192
 
"""
193
 
 
194
 
 
195
 
REV_1_STRICT_TESTAMENT3 = """\
196
 
bazaar testament version 3 strict
197
 
revision-id: test@user-1
198
 
committer: test@user
199
 
timestamp: 1129025423
200
 
timezone: 0
201
 
parents:
202
 
message:
203
 
  initial null commit
204
 
inventory:
205
 
  directory . TREE_ROT test@user-1 no
206
 
properties:
207
 
  branch-nick:
208
 
    test branch
209
 
"""
210
 
 
211
 
 
212
156
REV_1_SHORT = """\
213
157
bazaar-ng testament short form 1
214
158
revision-id: test@user-1
216
160
""" % sha(REV_1_TESTAMENT).hexdigest()
217
161
 
218
162
 
219
 
REV_1_SHORT_STRICT = """\
220
 
bazaar-ng testament short form 2.1
221
 
revision-id: test@user-1
222
 
sha1: %s
223
 
""" % sha(REV_1_STRICT_TESTAMENT).hexdigest()
224
 
 
225
 
 
226
 
REV_1_SHORT_STRICT3 = """\
227
 
bazaar testament short form 3 strict
228
 
revision-id: test@user-1
229
 
sha1: %s
230
 
""" % sha(REV_1_STRICT_TESTAMENT3).hexdigest()
231
 
 
232
 
 
233
163
REV_2_TESTAMENT = """\
234
164
bazaar-ng testament version 1
235
165
revision-id: test@user-2
250
180
"""
251
181
 
252
182
 
253
 
REV_2_STRICT_TESTAMENT = """\
254
 
bazaar-ng testament version 2.1
255
 
revision-id: test@user-2
256
 
committer: test@user
257
 
timestamp: 1129025483
258
 
timezone: 36000
259
 
parents:
260
 
  test@user-1
261
 
message:
262
 
  add files and directories
263
 
inventory:
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
267
 
properties:
268
 
  branch-nick:
269
 
    test branch
270
 
"""
271
 
 
272
 
 
273
 
REV_2_STRICT_TESTAMENT3 = """\
274
 
bazaar testament version 3 strict
275
 
revision-id: test@user-2
276
 
committer: test@user
277
 
timestamp: 1129025483
278
 
timezone: 36000
279
 
parents:
280
 
  test@user-1
281
 
message:
282
 
  add files and directories
283
 
inventory:
284
 
  directory . TREE_ROT test@user-1 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
288
 
properties:
289
 
  branch-nick:
290
 
    test branch
291
 
"""
292
 
 
293
 
 
294
183
REV_2_SHORT = """\
295
184
bazaar-ng testament short form 1
296
185
revision-id: test@user-2
298
187
""" % sha(REV_2_TESTAMENT).hexdigest()
299
188
 
300
189
 
301
 
REV_2_SHORT_STRICT = """\
302
 
bazaar-ng testament short form 2.1
303
 
revision-id: test@user-2
304
 
sha1: %s
305
 
""" % sha(REV_2_STRICT_TESTAMENT).hexdigest()
306
 
 
307
 
 
308
 
REV_2_SHORT_STRICT3 = """\
309
 
bazaar testament short form 3 strict
310
 
revision-id: test@user-2
311
 
sha1: %s
312
 
""" % sha(REV_2_STRICT_TESTAMENT3).hexdigest()
313
 
 
314
 
 
315
190
REV_PROPS_TESTAMENT = """\
316
191
bazaar-ng testament version 1
317
192
revision-id: test@user-3
329
204
properties:
330
205
  branch-nick:
331
206
    test branch
332
 
  empty:
333
 
  flavor:
334
 
    sour cherry
335
 
    cream cheese
336
 
  size:
337
 
    medium
338
 
"""
339
 
 
340
 
 
341
 
REV_PROPS_TESTAMENT_STRICT = """\
342
 
bazaar-ng testament version 2.1
343
 
revision-id: test@user-3
344
 
committer: test@user
345
 
timestamp: 1129025493
346
 
timezone: 36000
347
 
parents:
348
 
  test@user-2
349
 
message:
350
 
  revision with properties
351
 
inventory:
352
 
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
353
 
  directory src src-id test@user-2 no
354
 
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
355
 
properties:
356
 
  branch-nick:
357
 
    test branch
358
 
  empty:
359
 
  flavor:
360
 
    sour cherry
361
 
    cream cheese
362
 
  size:
363
 
    medium
364
 
"""
365
 
 
366
 
 
367
 
REV_PROPS_TESTAMENT_STRICT3 = """\
368
 
bazaar testament version 3 strict
369
 
revision-id: test@user-3
370
 
committer: test@user
371
 
timestamp: 1129025493
372
 
timezone: 36000
373
 
parents:
374
 
  test@user-2
375
 
message:
376
 
  revision with properties
377
 
inventory:
378
 
  directory . TREE_ROT test@user-1 no
379
 
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
380
 
  directory src src-id test@user-2 no
381
 
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
382
 
properties:
383
 
  branch-nick:
384
 
    test branch
385
 
  empty:
386
207
  flavor:
387
208
    sour cherry
388
209
    cream cheese
412
233
"""
413
234
 
414
235
 
415
 
REV_3_TESTAMENT_STRICT = """\
416
 
bazaar-ng testament version 2.1
417
 
revision-id: test@user-3
418
 
committer: test@user
419
 
timestamp: 1129025493
420
 
timezone: 36000
421
 
parents:
422
 
  test@user-2
423
 
message:
424
 
  add symlink
425
 
inventory:
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
430
 
properties:
431
 
  branch-nick:
432
 
    test branch
433
 
"""
434
 
 
435
 
 
436
 
REV_3_TESTAMENT_STRICT3 = """\
437
 
bazaar testament version 3 strict
438
 
revision-id: test@user-3
439
 
committer: test@user
440
 
timestamp: 1129025493
441
 
timezone: 36000
442
 
parents:
443
 
  test@user-2
444
 
message:
445
 
  add symlink
446
 
inventory:
447
 
  directory . TREE_ROT test@user-1 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
452
 
properties:
453
 
  branch-nick:
454
 
    test branch
455
 
"""
456
 
 
457
 
 
458
236
SAMPLE_UNICODE_TESTAMENT = u"""\
459
237
bazaar-ng testament version 1
460
238
revision-id: test@user-3
461
 
committer: Erik B\xe5gfors <test@user>
 
239
committer: test@user
462
240
timestamp: 1129025493
463
241
timezone: 36000
464
242
parents:
472
250
properties:
473
251
  branch-nick:
474
252
    test branch
475
 
  uni:
476
 
    \xb5
477
 
"""
478
 
 
479
 
 
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
485
 
timezone: 36000
486
 
parents:
487
 
  test@user-2
488
 
message:
489
 
  non-ascii commit \N{COPYRIGHT SIGN} me
490
 
inventory:
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
494
 
properties:
495
 
  branch-nick:
496
 
    test branch
497
 
  uni:
498
 
    \xb5
499
 
"""
500
 
 
501
 
 
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
507
 
timezone: 36000
508
 
parents:
509
 
  test@user-2
510
 
message:
511
 
  non-ascii commit \N{COPYRIGHT SIGN} me
512
 
inventory:
513
 
  directory . TREE_ROT test@user-1 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
517
 
properties:
518
 
  branch-nick:
519
 
    test branch
520
 
  uni:
521
 
    \xb5
522
 
"""
523
 
 
524
 
 
525
 
texts = {
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,
533
 
    },
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,
541
 
    },
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,
549
 
    },
550
 
}
 
253
"""