~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/testament.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2009-01-13 05:14:24 UTC
  • mfrom: (3936.1.3 integration)
  • Revision ID: pqm@pqm.ubuntu.com-20090113051424-nrk3zkfe09h46i9y
(mbp) merge 1.11 and advance to 1.12

Show diffs side-by-side

added added

removed removed

Lines of Context:
70
70
# revisions can be serialized.
71
71
 
72
72
from copy import copy
73
 
from sha import sha
74
73
 
75
 
from bzrlib.osutils import contains_whitespace, contains_linebreaks
 
74
from bzrlib.osutils import (
 
75
    contains_whitespace,
 
76
    contains_linebreaks,
 
77
    sha,
 
78
    )
76
79
 
77
80
 
78
81
class Testament(object):
98
101
 
99
102
    def __init__(self, rev, inventory):
100
103
        """Create a new testament for rev using inventory."""
101
 
        self.revision_id = str(rev.revision_id)
 
104
        self.revision_id = rev.revision_id
102
105
        self.committer = rev.committer
103
106
        self.timezone = rev.timezone or 0
104
107
        self.timestamp = rev.timestamp
106
109
        self.parent_ids = rev.parent_ids[:]
107
110
        self.inventory = inventory
108
111
        self.revprops = copy(rev.properties)
109
 
        assert not contains_whitespace(self.revision_id)
110
 
        assert not contains_linebreaks(self.committer)
 
112
        if contains_whitespace(self.revision_id):
 
113
            raise ValueError(self.revision_id)
 
114
        if contains_linebreaks(self.committer):
 
115
            raise ValueError(self.committer)
111
116
 
112
117
    def as_text_lines(self):
113
118
        """Yield text form as a sequence of lines.
125
130
        # inventory length contains the root, which is not shown here
126
131
        a('parents:\n')
127
132
        for parent_id in sorted(self.parent_ids):
128
 
            assert not contains_whitespace(parent_id)
 
133
            if contains_whitespace(parent_id):
 
134
                raise ValueError(parent_id)
129
135
            a('  %s\n' % parent_id)
130
136
        a('message:\n')
131
137
        for l in self.message.splitlines():
134
140
        for path, ie in self._get_entries():
135
141
            a(self._entry_to_line(path, ie))
136
142
        r.extend(self._revprops_to_lines())
137
 
        if __debug__:
138
 
            for l in r:
139
 
                assert isinstance(l, basestring), \
140
 
                    '%r of type %s is not a plain string' % (l, type(l))
141
143
        return [line.encode('utf-8') for line in r]
142
144
 
143
145
    def _get_entries(self):
146
148
        return entries
147
149
 
148
150
    def _escape_path(self, path):
149
 
        assert not contains_linebreaks(path)
 
151
        if contains_linebreaks(path):
 
152
            raise ValueError(path)
150
153
        return unicode(path.replace('\\', '/').replace(' ', '\ '))
151
154
 
152
155
    def _entry_to_line(self, path, ie):
153
156
        """Turn an inventory entry into a testament line"""
154
 
        assert not contains_whitespace(ie.file_id)
155
 
 
 
157
        if contains_whitespace(ie.file_id):
 
158
            raise ValueError(ie.file_id)
156
159
        content = ''
157
160
        content_spacer=''
158
161
        if ie.kind == 'file':
159
162
            # TODO: avoid switching on kind
160
 
            assert ie.text_sha1
 
163
            if not ie.text_sha1:
 
164
                raise AssertionError()
161
165
            content = ie.text_sha1
162
166
            content_spacer = ' '
163
167
        elif ie.kind == 'symlink':
164
 
            assert ie.symlink_target
 
168
            if not ie.symlink_target:
 
169
                raise AssertionError()
165
170
            content = self._escape_path(ie.symlink_target)
166
171
            content_spacer = ' '
167
172
 
168
173
        l = u'  %s %s %s%s%s\n' % (ie.kind, self._escape_path(path),
169
 
                                   unicode(ie.file_id),
 
174
                                   ie.file_id.decode('utf8'),
170
175
                                   content_spacer, content)
171
176
        return l
172
177
 
186
191
            return []
187
192
        r = ['properties:\n']
188
193
        for name, value in sorted(self.revprops.items()):
189
 
            assert isinstance(name, str)
190
 
            assert not contains_whitespace(name)
 
194
            if contains_whitespace(name):
 
195
                raise ValueError(name)
191
196
            r.append('  %s:\n' % name)
192
197
            for line in value.splitlines():
193
198
                r.append(u'    %s\n' % line)
223
228
        return self.inventory.iter_entries()
224
229
 
225
230
    def _escape_path(self, path):
226
 
        assert not contains_linebreaks(path)
 
231
        if contains_linebreaks(path):
 
232
            raise ValueError(path)
227
233
        if path == '':
228
234
            path = '.'
229
235
        return unicode(path.replace('\\', '/').replace(' ', '\ '))