~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/knit.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2006-08-15 14:16:58 UTC
  • mfrom: (1911.2.9 cache-revision-encoding)
  • Revision ID: pqm@pqm.ubuntu.com-20060815141658-4a1356532d7aa155
(jam) cache utf-8 encoding/decoding

Show diffs side-by-side

added added

removed removed

Lines of Context:
74
74
import warnings
75
75
 
76
76
import bzrlib
77
 
import bzrlib.errors as errors
 
77
from bzrlib import (
 
78
    cache_utf8,
 
79
    errors,
 
80
    )
78
81
from bzrlib.errors import FileExists, NoSuchFile, KnitError, \
79
82
        InvalidRevisionId, KnitCorrupt, KnitHeaderError, \
80
83
        RevisionNotPresent, RevisionAlreadyPresent
82
85
from bzrlib.trace import mutter
83
86
from bzrlib.osutils import contains_whitespace, contains_linebreaks, \
84
87
     sha_strings
85
 
from bzrlib.versionedfile import VersionedFile, InterVersionedFile
86
88
from bzrlib.symbol_versioning import DEPRECATED_PARAMETER, deprecated_passed
87
89
from bzrlib.tsort import topo_sort
88
90
import bzrlib.weave
 
91
from bzrlib.versionedfile import VersionedFile, InterVersionedFile
89
92
 
90
93
 
91
94
# TODO: Split out code specific to this format into an associated object.
162
165
        internal representation is of the format:
163
166
        (revid, plaintext)
164
167
        """
 
168
        decode_utf8 = cache_utf8.decode
165
169
        lines = []
166
170
        for line in content:
167
171
            origin, text = line.split(' ', 1)
168
 
            lines.append((origin.decode('utf-8'), text))
 
172
            lines.append((decode_utf8(origin), text))
169
173
        return KnitContent(lines)
170
174
 
171
175
    def parse_line_delta_iter(self, lines):
182
186
        internal representation is
183
187
        (start, end, count, [1..count tuples (revid, newline)])
184
188
        """
 
189
        decode_utf8 = cache_utf8.decode
185
190
        result = []
186
191
        lines = iter(lines)
187
192
        next = lines.next
193
198
            while remaining:
194
199
                origin, text = next().split(' ', 1)
195
200
                remaining -= 1
196
 
                contents.append((origin.decode('utf-8'), text))
 
201
                contents.append((decode_utf8(origin), text))
197
202
            result.append((start, end, count, contents))
198
203
        return result
199
204
 
202
207
 
203
208
        see parse_fulltext which this inverts.
204
209
        """
205
 
        return ['%s %s' % (o.encode('utf-8'), t) for o, t in content._lines]
 
210
        encode_utf8 = cache_utf8.encode
 
211
        return ['%s %s' % (encode_utf8(o), t) for o, t in content._lines]
206
212
 
207
213
    def lower_line_delta(self, delta):
208
214
        """convert a delta into a serializable form.
209
215
 
210
216
        See parse_line_delta which this inverts.
211
217
        """
 
218
        encode_utf8 = cache_utf8.encode
212
219
        out = []
213
220
        for start, end, c, lines in delta:
214
221
            out.append('%d,%d,%d\n' % (start, end, c))
215
 
            for origin, text in lines:
216
 
                out.append('%s %s' % (origin.encode('utf-8'), text))
 
222
            out.extend(encode_utf8(origin) + ' ' + text
 
223
                       for origin, text in lines)
217
224
        return out
218
225
 
219
226
 
1206
1213
        return self._cache[version_id][5]
1207
1214
 
1208
1215
    def _version_list_to_index(self, versions):
 
1216
        encode_utf8 = cache_utf8.encode
1209
1217
        result_list = []
1210
1218
        for version in versions:
1211
1219
            if version in self._cache:
1213
1221
                result_list.append(str(self._cache[version][5]))
1214
1222
                # -- end lookup () --
1215
1223
            else:
1216
 
                result_list.append('.' + version.encode('utf-8'))
 
1224
                result_list.append('.' + encode_utf8(version))
1217
1225
        return ' '.join(result_list)
1218
1226
 
1219
1227
    def add_version(self, version_id, options, pos, size, parents):
1227
1235
                         (version_id, options, pos, size, parents).
1228
1236
        """
1229
1237
        lines = []
 
1238
        encode_utf8 = cache_utf8.encode
1230
1239
        for version_id, options, pos, size, parents in versions:
1231
 
            line = "\n%s %s %s %s %s :" % (version_id.encode('utf-8'),
 
1240
            line = "\n%s %s %s %s %s :" % (encode_utf8(version_id),
1232
1241
                                           ','.join(options),
1233
1242
                                           pos,
1234
1243
                                           size,
1324
1333
        """
1325
1334
        sio = StringIO()
1326
1335
        data_file = GzipFile(None, mode='wb', fileobj=sio)
 
1336
 
 
1337
        version_id_utf8 = cache_utf8.encode(version_id)
1327
1338
        data_file.writelines(chain(
1328
 
            ["version %s %d %s\n" % (version_id.encode('utf-8'), 
 
1339
            ["version %s %d %s\n" % (version_id_utf8,
1329
1340
                                     len(lines),
1330
1341
                                     digest)],
1331
1342
            lines,
1332
 
            ["end %s\n" % version_id.encode('utf-8')]))
 
1343
            ["end %s\n" % version_id_utf8]))
1333
1344
        data_file.close()
1334
1345
        length= sio.tell()
1335
1346
 
1364
1375
        rec = df.readline().split()
1365
1376
        if len(rec) != 4:
1366
1377
            raise KnitCorrupt(self._filename, 'unexpected number of elements in record header')
1367
 
        if rec[1].decode('utf-8')!= version_id:
 
1378
        if cache_utf8.decode(rec[1]) != version_id:
1368
1379
            raise KnitCorrupt(self._filename, 
1369
1380
                              'unexpected version, wanted %r, got %r' % (
1370
1381
                                version_id, rec[1]))
1379
1390
        record_contents = df.readlines()
1380
1391
        l = record_contents.pop()
1381
1392
        assert len(record_contents) == int(rec[2])
1382
 
        if l.decode('utf-8') != 'end %s\n' % version_id:
 
1393
        if l != 'end %s\n' % cache_utf8.encode(version_id):
1383
1394
            raise KnitCorrupt(self._filename, 'unexpected version end line %r, wanted %r' 
1384
1395
                        % (l, version_id))
1385
1396
        df.close()