~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-11-02 23:40:14 UTC
  • mfrom: (2102.2.1 add_versions_compresses)
  • Revision ID: pqm@pqm.ubuntu.com-20061102234014-be7b4e5b6dac2996
(John Arbash Meinel) bug #64789, dict compress new revisions as they are added to knits

Show diffs side-by-side

added added

removed removed

Lines of Context:
1256
1256
        """
1257
1257
        lines = []
1258
1258
        encode_utf8 = cache_utf8.encode
1259
 
        for version_id, options, pos, size, parents in versions:
1260
 
            line = "\n%s %s %s %s %s :" % (encode_utf8(version_id),
1261
 
                                           ','.join(options),
1262
 
                                           pos,
1263
 
                                           size,
1264
 
                                           self._version_list_to_index(parents))
1265
 
            assert isinstance(line, str), \
1266
 
                'content must be utf-8 encoded: %r' % (line,)
1267
 
            lines.append(line)
1268
 
        if not self._need_to_create:
1269
 
            self._transport.append_bytes(self._filename, ''.join(lines))
1270
 
        else:
1271
 
            sio = StringIO()
1272
 
            sio.write(self.HEADER)
1273
 
            sio.writelines(lines)
1274
 
            sio.seek(0)
1275
 
            self._transport.put_file_non_atomic(self._filename, sio,
1276
 
                                create_parent_dir=self._create_parent_dir,
1277
 
                                mode=self._file_mode,
1278
 
                                dir_mode=self._dir_mode)
1279
 
            self._need_to_create = False
1280
 
 
1281
 
        # cache after writing, so that a failed write leads to missing cache
1282
 
        # entries not extra ones. XXX TODO: RBC 20060502 in the event of a 
1283
 
        # failure, reload the index or flush it or some such, to prevent
1284
 
        # writing records that did complete twice.
1285
 
        for version_id, options, pos, size, parents in versions:
1286
 
            self._cache_version(version_id, options, pos, size, parents)
1287
 
        
 
1259
        orig_history = self._history[:]
 
1260
        orig_cache = self._cache.copy()
 
1261
 
 
1262
        try:
 
1263
            for version_id, options, pos, size, parents in versions:
 
1264
                line = "\n%s %s %s %s %s :" % (encode_utf8(version_id),
 
1265
                                               ','.join(options),
 
1266
                                               pos,
 
1267
                                               size,
 
1268
                                               self._version_list_to_index(parents))
 
1269
                assert isinstance(line, str), \
 
1270
                    'content must be utf-8 encoded: %r' % (line,)
 
1271
                lines.append(line)
 
1272
                self._cache_version(version_id, options, pos, size, parents)
 
1273
            if not self._need_to_create:
 
1274
                self._transport.append_bytes(self._filename, ''.join(lines))
 
1275
            else:
 
1276
                sio = StringIO()
 
1277
                sio.write(self.HEADER)
 
1278
                sio.writelines(lines)
 
1279
                sio.seek(0)
 
1280
                self._transport.put_file_non_atomic(self._filename, sio,
 
1281
                                    create_parent_dir=self._create_parent_dir,
 
1282
                                    mode=self._file_mode,
 
1283
                                    dir_mode=self._dir_mode)
 
1284
                self._need_to_create = False
 
1285
        except:
 
1286
            # If any problems happen, restore the original values and re-raise
 
1287
            self._history = orig_history
 
1288
            self._cache = orig_cache
 
1289
            raise
 
1290
 
1288
1291
    def has_version(self, version_id):
1289
1292
        """True if the version is in the index."""
1290
1293
        return (version_id in self._cache)