~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/selftest/testtestament.py

  • Committer: Robert Collins
  • Date: 2005-10-17 21:57:32 UTC
  • mto: This revision was merged to the branch mainline in revision 1462.
  • Revision ID: robertc@robertcollins.net-20051017215732-08f487800e726748
Allow creation of testaments from uncommitted data, and use that to get signatures before committing revisions.

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
 
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
28
31
 
29
32
 
30
 
class TestamentSetup(TestCaseWithTransport):
 
33
class TestamentTests(TestCaseInTempDir):
31
34
 
32
35
    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')
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'
41
41
                 timezone=0,
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'),
44
44
                             ('src/', ),
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)
51
 
        tt.apply()
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,
54
50
                 timezone=36000,
55
51
                 rev_id='test@user-2',
56
52
                 committer='test@user')
57
53
 
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
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))
80
64
 
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)
89
71
 
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)
 
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)
98
92
 
99
93
    def test_testament_symlinks(self):
100
94
        """Testament containing symlink (where possible)"""
101
95
        if not has_symlinks():
102
96
            return
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,
107
101
                 timezone=36000,
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)
112
106
 
113
107
    def test_testament_revprops(self):
114
108
        """Testament to revision with extra properties"""
115
109
        props = dict(flavor='sour cherry\ncream cheese',
116
 
                     size='medium',
117
 
                     empty='',
118
 
                    )
119
 
        self.wt.commit(message='revision with properties',
 
110
                     size='medium')
 
111
        self.b.commit(message='revision with properties',
120
112
                      timestamp=1129025493,
121
113
                      timezone=36000,
122
114
                      rev_id='test@user-3',
123
115
                      committer='test@user',
124
116
                      revprops=props)
125
 
        t = self.from_revision(self.b.repository, 'test@user-3')
126
 
        self.assertEqualDiff(t.as_text(), self.expected('rev_props'))
127
 
 
128
 
    def test_testament_unicode_commit_message(self):
129
 
        self.wt.commit(
130
 
            message=u'non-ascii commit \N{COPYRIGHT SIGN} me',
131
 
            timestamp=1129025493,
132
 
            timezone=36000,
133
 
            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')
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)
140
119
 
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)
149
127
                    
150
128
 
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
129
REV_1_TESTAMENT = """\
164
130
bazaar-ng testament version 1
165
131
revision-id: test@user-1
170
136
message:
171
137
  initial null commit
172
138
inventory:
173
 
properties:
174
 
  branch-nick:
175
 
    test branch
176
 
"""
177
 
 
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
 
 
 
139
"""
211
140
 
212
141
REV_1_SHORT = """\
213
142
bazaar-ng testament short form 1
216
145
""" % sha(REV_1_TESTAMENT).hexdigest()
217
146
 
218
147
 
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
148
REV_2_TESTAMENT = """\
234
149
bazaar-ng testament version 1
235
150
revision-id: test@user-2
244
159
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
245
160
  directory src src-id
246
161
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
247
 
properties:
248
 
  branch-nick:
249
 
    test branch
250
 
"""
251
 
 
252
 
 
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
162
"""
292
163
 
293
164
 
298
169
""" % sha(REV_2_TESTAMENT).hexdigest()
299
170
 
300
171
 
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
172
REV_PROPS_TESTAMENT = """\
316
173
bazaar-ng testament version 1
317
174
revision-id: test@user-3
327
184
  directory src src-id
328
185
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
329
186
properties:
330
 
  branch-nick:
331
 
    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
187
  flavor:
387
188
    sour cherry
388
189
    cream cheese
406
207
  symlink link link-id wibble/linktarget
407
208
  directory src src-id
408
209
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
409
 
properties:
410
 
  branch-nick:
411
 
    test branch
412
 
"""
413
 
 
414
 
 
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
 
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
463
 
timezone: 36000
464
 
parents:
465
 
  test@user-2
466
 
message:
467
 
  non-ascii commit \N{COPYRIGHT SIGN} me
468
 
inventory:
469
 
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
470
 
  directory src src-id
471
 
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
472
 
properties:
473
 
  branch-nick:
474
 
    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
 
}
 
210
"""