~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/testament.py

- testament now contains summary of parents and inventory

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
proof or evidence."  In bzr we use them to allow people to certify
21
21
particular revisions as authentic.  
22
22
 
 
23
The goal is that if two revisions are semantically equal, then they will
 
24
have a byte-for-byte equal testament.  We can define different versions of
 
25
"semantically equal" by using different testament classes; e.g. one that
 
26
includes or ignores file-ids.
 
27
 
23
28
We sign a testament rather than the revision XML itself for several reasons.
24
29
The most important is that the form in which the revision is stored
25
30
internally is designed for that purpose, and contains information which need
39
44
Different signing keys might indicate different levels of trust; we can in
40
45
the future extend this to allow signatures indicating not just that a
41
46
particular version is authentic but that it has other properties.
 
47
 
 
48
The signature can be applied to either the full testament or to just a
 
49
hash of it.
 
50
 
 
51
Testament format 1
 
52
~~~~~~~~~~~~~~~~~~
 
53
 
 
54
* timestamps are given as integers to avoid rounding errors
 
55
* parents given in lexicographical order
 
56
* indented-text form similar to log; intended to be human readable
 
57
* paths are given with forward slashes
 
58
* files are named using paths for ease of comparison/debugging
 
59
* the testament uses unix line-endings (\n)
42
60
"""
43
61
 
 
62
# XXX: At the moment, clients trust that the graph described in a weave
 
63
# is accurate, but that's not covered by the testament.  Perhaps the best
 
64
# fix is when verifying a revision to make sure that every file mentioned 
 
65
# in the revision has compatible ancestry links.
 
66
 
44
67
from cStringIO import StringIO
45
68
import string
46
69
 
84
107
        t.timezone = rev.timezone or 0
85
108
        t.timestamp = rev.timestamp
86
109
        t.message = rev.message
 
110
        t.parent_ids = rev.parent_ids[:]
87
111
        t.inventory = branch.get_inventory(revision_id)
88
112
        return t
89
113
 
104
128
        print >>f, 'timezone:', self.timezone
105
129
        # inventory length contains the root, which is not shown here
106
130
        print >>f, 'entries:', len(self.inventory) - 1
 
131
        print >>f, 'parents:'
 
132
        for parent_id in sorted(self.parent_ids):
 
133
            assert not contains_whitespace(parent_id)
 
134
            print >>f, '  ' + parent_id
107
135
        print >>f, 'message:'
108
136
        for l in self.message.splitlines():
109
137
            print >>f, '  ' + l
 
138
        print >>f, 'inventory:'
 
139
        for path, ie in self.inventory.iter_entries():
 
140
            print >>f, ' ', ie.kind, path
110
141
 
111
142
    def to_text_form_1(self):
112
143
        s = StringIO()