~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_testament.py

  • Committer: Michael Ellerman
  • Date: 2005-12-10 22:11:13 UTC
  • mto: This revision was merged to the branch mainline in revision 1528.
  • Revision ID: michael@ellerman.id.au-20051210221113-99ca561aaab4661e
Simplify handling of DivergedBranches in cmd_pull()

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2006 by 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
 
from bzrlib.tests import TestCaseWithTransport
25
 
from bzrlib.testament import Testament, StrictTestament, StrictTestament3
26
 
from bzrlib.transform import TreeTransform
 
25
from bzrlib.tests import TestCaseInTempDir
 
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(TestCaseInTempDir):
31
33
 
32
34
    def setUp(self):
33
 
        super(TestamentSetup, self).setUp()
34
 
        self.wt = self.make_branch_and_tree('.')
35
 
        b = self.b = self.wt.branch
 
35
        super(TestamentTests, self).setUp()
 
36
        b = self.b = Branch.initialize(u'.')
36
37
        b.nick = "test branch"
37
 
        self.wt.commit(message='initial null commit',
 
38
        b.working_tree().commit(message='initial null commit',
38
39
                 committer='test@user',
39
40
                 timestamp=1129025423, # 'Tue Oct 11 20:10:23 2005'
40
41
                 timezone=0,
42
43
        self.build_tree_contents([('hello', 'contents of hello file'),
43
44
                             ('src/', ),
44
45
                             ('src/foo.c', 'int main()\n{\n}\n')])
45
 
        self.wt.add(['hello', 'src', 'src/foo.c'],
 
46
        b.working_tree().add(['hello', 'src', 'src/foo.c'],
46
47
                             ['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)
50
 
        tt.apply()
51
 
        self.wt.commit(message='add files and directories',
 
48
        b.working_tree().commit(message='add files and directories',
52
49
                 timestamp=1129025483,
53
50
                 timezone=36000,
54
51
                 rev_id='test@user-2',
55
52
                 committer='test@user')
56
53
 
57
 
 
58
 
class TestamentTests(TestamentSetup):
59
 
 
60
 
    def testament_class(self):
61
 
        return Testament
62
 
 
63
 
    def expected(self, key):
64
 
        return texts[self.testament_class()][key]
65
 
 
66
 
    def from_revision(self, repository, revision_id):
67
 
        return self.testament_class().from_revision(repository, revision_id)
68
 
 
69
54
    def test_null_testament(self):
70
55
        """Testament for a revision with no contents."""
71
 
        t = self.from_revision(self.b.repository, 'test@user-1')
 
56
        t = Testament.from_revision(self.b, 'test@user-1')
72
57
        ass = self.assertTrue
73
58
        eq = self.assertEqual
74
59
        ass(isinstance(t, Testament))
79
64
 
80
65
    def test_testment_text_form(self):
81
66
        """Conversion of testament to canonical text form."""
82
 
        t = self.from_revision(self.b.repository, 'test@user-1')
 
67
        t = Testament.from_revision(self.b, 'test@user-1')
83
68
        text_form = t.as_text()
84
69
        self.log('testament text form:\n' + text_form)
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'))
 
70
        self.assertEqual(text_form, REV_1_TESTAMENT)
88
71
 
89
72
    def test_testament_with_contents(self):
90
73
        """Testament containing a file and a directory."""
91
 
        t = self.from_revision(self.b.repository, 'test@user-2')
 
74
        t = Testament.from_revision(self.b, 'test@user-2')
92
75
        text_form = t.as_text()
93
76
        self.log('testament text form:\n' + text_form)
94
 
        self.assertEqualDiff(text_form, self.expected('rev_2'))
 
77
        self.assertEqualDiff(text_form, REV_2_TESTAMENT)
95
78
        actual_short = t.as_short_text()
96
 
        self.assertEqualDiff(actual_short, self.expected('rev_2_short'))
 
79
        self.assertEqualDiff(actual_short, REV_2_SHORT)
 
80
 
 
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)
 
86
 
 
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)
97
92
 
98
93
    def test_testament_symlinks(self):
99
94
        """Testament containing symlink (where possible)"""
100
95
        if not has_symlinks():
101
96
            return
102
97
        os.symlink('wibble/linktarget', 'link')
103
 
        self.wt.add(['link'], ['link-id'])
104
 
        self.wt.commit(message='add symlink',
 
98
        self.b.working_tree().add(['link'], ['link-id'])
 
99
        self.b.working_tree().commit(message='add symlink',
105
100
                 timestamp=1129025493,
106
101
                 timezone=36000,
107
102
                 rev_id='test@user-3',
108
103
                 committer='test@user')
109
 
        t = self.from_revision(self.b.repository, 'test@user-3')
110
 
        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)
111
106
 
112
107
    def test_testament_revprops(self):
113
108
        """Testament to revision with extra properties"""
114
109
        props = dict(flavor='sour cherry\ncream cheese',
115
 
                     size='medium',
116
 
                     empty='',
117
 
                    )
118
 
        self.wt.commit(message='revision with properties',
 
110
                     size='medium')
 
111
        self.b.working_tree().commit(message='revision with properties',
119
112
                      timestamp=1129025493,
120
113
                      timezone=36000,
121
114
                      rev_id='test@user-3',
122
115
                      committer='test@user',
123
116
                      revprops=props)
124
 
        t = self.from_revision(self.b.repository, 'test@user-3')
125
 
        self.assertEqualDiff(t.as_text(), self.expected('rev_props'))
126
 
 
127
 
    def test_testament_unicode_commit_message(self):
128
 
        self.wt.commit(
129
 
            message=u'non-ascii commit \N{COPYRIGHT SIGN} me',
130
 
            timestamp=1129025493,
131
 
            timezone=36000,
132
 
            rev_id='test@user-3',
133
 
            committer='Erik B\xe5gfors <test@user>',
134
 
            revprops={'uni':u'\xb5'}
135
 
            )
136
 
        t = self.from_revision(self.b.repository, 'test@user-3')
137
 
        self.assertEqualDiff(
138
 
            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)
139
119
 
140
120
    def test___init__(self):
141
 
        revision = self.b.repository.get_revision('test@user-2')
142
 
        inventory = self.b.repository.get_inventory('test@user-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)
 
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)
148
127
                    
149
128
 
150
 
class TestamentTestsStrict(TestamentTests):
151
 
    
152
 
    def testament_class(self):
153
 
        return StrictTestament
154
 
 
155
 
 
156
 
class TestamentTestsStrict2(TestamentTests):
157
 
    
158
 
    def testament_class(self):
159
 
        return StrictTestament3
160
 
 
161
 
 
162
129
REV_1_TESTAMENT = """\
163
130
bazaar-ng testament version 1
164
131
revision-id: test@user-1
174
141
    test branch
175
142
"""
176
143
 
177
 
 
178
 
REV_1_STRICT_TESTAMENT = """\
179
 
bazaar-ng testament version 2.1
180
 
revision-id: test@user-1
181
 
committer: test@user
182
 
timestamp: 1129025423
183
 
timezone: 0
184
 
parents:
185
 
message:
186
 
  initial null commit
187
 
inventory:
188
 
properties:
189
 
  branch-nick:
190
 
    test branch
191
 
"""
192
 
 
193
 
 
194
 
REV_1_STRICT_TESTAMENT3 = """\
195
 
bazaar testament version 3 strict
196
 
revision-id: test@user-1
197
 
committer: test@user
198
 
timestamp: 1129025423
199
 
timezone: 0
200
 
parents:
201
 
message:
202
 
  initial null commit
203
 
inventory:
204
 
  directory . TREE_ROOT test@user-1 no
205
 
properties:
206
 
  branch-nick:
207
 
    test branch
208
 
"""
209
 
 
210
 
 
211
144
REV_1_SHORT = """\
212
145
bazaar-ng testament short form 1
213
146
revision-id: test@user-1
215
148
""" % sha(REV_1_TESTAMENT).hexdigest()
216
149
 
217
150
 
218
 
REV_1_SHORT_STRICT = """\
219
 
bazaar-ng testament short form 2.1
220
 
revision-id: test@user-1
221
 
sha1: %s
222
 
""" % sha(REV_1_STRICT_TESTAMENT).hexdigest()
223
 
 
224
 
 
225
 
REV_1_SHORT_STRICT3 = """\
226
 
bazaar testament short form 3 strict
227
 
revision-id: test@user-1
228
 
sha1: %s
229
 
""" % sha(REV_1_STRICT_TESTAMENT3).hexdigest()
230
 
 
231
 
 
232
151
REV_2_TESTAMENT = """\
233
152
bazaar-ng testament version 1
234
153
revision-id: test@user-2
249
168
"""
250
169
 
251
170
 
252
 
REV_2_STRICT_TESTAMENT = """\
253
 
bazaar-ng testament version 2.1
254
 
revision-id: test@user-2
255
 
committer: test@user
256
 
timestamp: 1129025483
257
 
timezone: 36000
258
 
parents:
259
 
  test@user-1
260
 
message:
261
 
  add files and directories
262
 
inventory:
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
266
 
properties:
267
 
  branch-nick:
268
 
    test branch
269
 
"""
270
 
 
271
 
 
272
 
REV_2_STRICT_TESTAMENT3 = """\
273
 
bazaar testament version 3 strict
274
 
revision-id: test@user-2
275
 
committer: test@user
276
 
timestamp: 1129025483
277
 
timezone: 36000
278
 
parents:
279
 
  test@user-1
280
 
message:
281
 
  add files and directories
282
 
inventory:
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
287
 
properties:
288
 
  branch-nick:
289
 
    test branch
290
 
"""
291
 
 
292
 
 
293
171
REV_2_SHORT = """\
294
172
bazaar-ng testament short form 1
295
173
revision-id: test@user-2
297
175
""" % sha(REV_2_TESTAMENT).hexdigest()
298
176
 
299
177
 
300
 
REV_2_SHORT_STRICT = """\
301
 
bazaar-ng testament short form 2.1
302
 
revision-id: test@user-2
303
 
sha1: %s
304
 
""" % sha(REV_2_STRICT_TESTAMENT).hexdigest()
305
 
 
306
 
 
307
 
REV_2_SHORT_STRICT3 = """\
308
 
bazaar testament short form 3 strict
309
 
revision-id: test@user-2
310
 
sha1: %s
311
 
""" % sha(REV_2_STRICT_TESTAMENT3).hexdigest()
312
 
 
313
 
 
314
178
REV_PROPS_TESTAMENT = """\
315
179
bazaar-ng testament version 1
316
180
revision-id: test@user-3
328
192
properties:
329
193
  branch-nick:
330
194
    test branch
331
 
  empty:
332
 
  flavor:
333
 
    sour cherry
334
 
    cream cheese
335
 
  size:
336
 
    medium
337
 
"""
338
 
 
339
 
 
340
 
REV_PROPS_TESTAMENT_STRICT = """\
341
 
bazaar-ng testament version 2.1
342
 
revision-id: test@user-3
343
 
committer: test@user
344
 
timestamp: 1129025493
345
 
timezone: 36000
346
 
parents:
347
 
  test@user-2
348
 
message:
349
 
  revision with properties
350
 
inventory:
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
354
 
properties:
355
 
  branch-nick:
356
 
    test branch
357
 
  empty:
358
 
  flavor:
359
 
    sour cherry
360
 
    cream cheese
361
 
  size:
362
 
    medium
363
 
"""
364
 
 
365
 
 
366
 
REV_PROPS_TESTAMENT_STRICT3 = """\
367
 
bazaar testament version 3 strict
368
 
revision-id: test@user-3
369
 
committer: test@user
370
 
timestamp: 1129025493
371
 
timezone: 36000
372
 
parents:
373
 
  test@user-2
374
 
message:
375
 
  revision with properties
376
 
inventory:
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
381
 
properties:
382
 
  branch-nick:
383
 
    test branch
384
 
  empty:
385
195
  flavor:
386
196
    sour cherry
387
197
    cream cheese
409
219
  branch-nick:
410
220
    test branch
411
221
"""
412
 
 
413
 
 
414
 
REV_3_TESTAMENT_STRICT = """\
415
 
bazaar-ng testament version 2.1
416
 
revision-id: test@user-3
417
 
committer: test@user
418
 
timestamp: 1129025493
419
 
timezone: 36000
420
 
parents:
421
 
  test@user-2
422
 
message:
423
 
  add symlink
424
 
inventory:
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
429
 
properties:
430
 
  branch-nick:
431
 
    test branch
432
 
"""
433
 
 
434
 
 
435
 
REV_3_TESTAMENT_STRICT3 = """\
436
 
bazaar testament version 3 strict
437
 
revision-id: test@user-3
438
 
committer: test@user
439
 
timestamp: 1129025493
440
 
timezone: 36000
441
 
parents:
442
 
  test@user-2
443
 
message:
444
 
  add symlink
445
 
inventory:
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
451
 
properties:
452
 
  branch-nick:
453
 
    test branch
454
 
"""
455
 
 
456
 
 
457
 
SAMPLE_UNICODE_TESTAMENT = u"""\
458
 
bazaar-ng testament version 1
459
 
revision-id: test@user-3
460
 
committer: Erik B\xe5gfors <test@user>
461
 
timestamp: 1129025493
462
 
timezone: 36000
463
 
parents:
464
 
  test@user-2
465
 
message:
466
 
  non-ascii commit \N{COPYRIGHT SIGN} me
467
 
inventory:
468
 
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
469
 
  directory src src-id
470
 
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
471
 
properties:
472
 
  branch-nick:
473
 
    test branch
474
 
  uni:
475
 
    \xb5
476
 
"""
477
 
 
478
 
 
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
484
 
timezone: 36000
485
 
parents:
486
 
  test@user-2
487
 
message:
488
 
  non-ascii commit \N{COPYRIGHT SIGN} me
489
 
inventory:
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
493
 
properties:
494
 
  branch-nick:
495
 
    test branch
496
 
  uni:
497
 
    \xb5
498
 
"""
499
 
 
500
 
 
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
506
 
timezone: 36000
507
 
parents:
508
 
  test@user-2
509
 
message:
510
 
  non-ascii commit \N{COPYRIGHT SIGN} me
511
 
inventory:
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
516
 
properties:
517
 
  branch-nick:
518
 
    test branch
519
 
  uni:
520
 
    \xb5
521
 
"""
522
 
 
523
 
 
524
 
texts = {
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,
532
 
    },
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,
540
 
    },
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,
548
 
    },
549
 
}