~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/testament.py

- constraints on revprops
- tests for this

Show diffs side-by-side

added added

removed removed

Lines of Context:
69
69
# TODO: Perhaps these should just be different formats in which inventories/
70
70
# revisions can be serialized.
71
71
 
72
 
from copy import copy
73
72
from cStringIO import StringIO
74
73
import string
75
74
from sha import sha
90
89
    @classmethod
91
90
    def from_revision(cls, branch, revision_id):
92
91
        """Produce a new testament from a historical revision"""
 
92
        t = cls()
93
93
        rev = branch.get_revision(revision_id)
94
 
        inventory = branch.get_inventory(revision_id)
95
 
        return cls(rev, inventory)
96
 
 
97
 
    def __init__(self, rev, inventory):
98
 
        """Create a new testament for rev using inventory."""
99
 
        self.revision_id = str(rev.revision_id)
100
 
        self.committer = rev.committer
101
 
        self.timezone = rev.timezone or 0
102
 
        self.timestamp = rev.timestamp
103
 
        self.message = rev.message
104
 
        self.parent_ids = rev.parent_ids[:]
105
 
        self.inventory = inventory
106
 
        self.revprops = copy(rev.properties)
107
 
        assert not contains_whitespace(self.revision_id)
108
 
        assert not contains_linebreaks(self.committer)
 
94
        t.revision_id = str(revision_id)
 
95
        t.committer = rev.committer
 
96
        t.timezone = rev.timezone or 0
 
97
        t.timestamp = rev.timestamp
 
98
        t.message = rev.message
 
99
        t.parent_ids = rev.parent_ids[:]
 
100
        t.inventory = branch.get_inventory(revision_id)
 
101
        assert not contains_whitespace(t.revision_id)
 
102
        assert not contains_linebreaks(t.committer)
 
103
        return t
109
104
 
110
105
    def as_text_lines(self):
111
106
        """Yield text form as a sequence of lines.
132
127
        a('inventory:\n')
133
128
        for path, ie in self.inventory.iter_entries():
134
129
            a(self._entry_to_line(path, ie))
135
 
        r.extend(self._revprops_to_lines())
136
130
        if __debug__:
137
131
            for l in r:
138
 
                assert isinstance(l, basestring), \
 
132
                assert isinstance(l, str), \
139
133
                    '%r of type %s is not a plain string' % (l, type(l))
140
134
        return r
141
135
 
171
165
                'sha1: %s\n'
172
166
                % (self.revision_id, s.hexdigest()))
173
167
 
174
 
    def _revprops_to_lines(self):
175
 
        """Pack up revision properties."""
176
 
        if not self.revprops:
177
 
            return []
178
 
        r = ['properties:\n']
179
 
        for name, value in sorted(self.revprops.items()):
180
 
            assert isinstance(name, str)
181
 
            assert not contains_whitespace(name)
182
 
            r.append('  %s:\n' % name)
183
 
            for line in value.splitlines():
184
 
                if not isinstance(line, str):
185
 
                    line = line.encode('utf-8')
186
 
                r.append('    %s\n' % line)
187
 
        return r