~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: 2007-07-13 04:12:12 UTC
  • mfrom: (2484.1.25 knit_index_pyrex)
  • Revision ID: pqm@pqm.ubuntu.com-20070713041212-ar46c24wgu0jhtm5
(John Arbash Meinel) Implement _KnitIndex._load_data in pyrex.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2007 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
1150
1150
            try:
1151
1151
                # _load_data may raise NoSuchFile if the target knit is
1152
1152
                # completely empty.
1153
 
                self._load_data(fp)
 
1153
                _load_data(self, fp)
1154
1154
            finally:
1155
1155
                fp.close()
1156
1156
        except NoSuchFile:
1162
1162
                self._transport.put_bytes_non_atomic(
1163
1163
                    self._filename, self.HEADER, mode=self._file_mode)
1164
1164
 
1165
 
    def _load_data(self, fp):
1166
 
        cache = self._cache
1167
 
        history = self._history
1168
 
 
1169
 
        self.check_header(fp)
1170
 
        # readlines reads the whole file at once:
1171
 
        # bad for transports like http, good for local disk
1172
 
        # we save 60 ms doing this one change (
1173
 
        # from calling readline each time to calling
1174
 
        # readlines once.
1175
 
        # probably what we want for nice behaviour on
1176
 
        # http is a incremental readlines that yields, or
1177
 
        # a check for local vs non local indexes,
1178
 
        history_top = len(history) - 1
1179
 
        for line in fp.readlines():
1180
 
            rec = line.split()
1181
 
            if len(rec) < 5 or rec[-1] != ':':
1182
 
                # corrupt line.
1183
 
                # FIXME: in the future we should determine if its a
1184
 
                # short write - and ignore it 
1185
 
                # or a different failure, and raise. RBC 20060407
1186
 
                continue
1187
 
 
1188
 
            try:
1189
 
                parents = []
1190
 
                for value in rec[4:-1]:
1191
 
                    if value[0] == '.':
1192
 
                        # uncompressed reference
1193
 
                        parent_id = value[1:]
1194
 
                    else:
1195
 
                        parent_id = history[int(value)]
1196
 
                    parents.append(parent_id)
1197
 
            except (IndexError, ValueError), e:
1198
 
                # The parent could not be decoded to get its parent row. This
1199
 
                # at a minimum will cause this row to have wrong parents, or
1200
 
                # even to apply a delta to the wrong base and decode
1201
 
                # incorrectly. its therefore not usable, and because we have
1202
 
                # encountered a situation where a new knit index had this
1203
 
                # corrupt we can't asssume that no other rows referring to the
1204
 
                # index of this record actually mean the subsequent uncorrupt
1205
 
                # one, so we error.
1206
 
                raise errors.KnitCorrupt(self._filename,
1207
 
                    "line %r: %s" % (rec, e))
1208
 
 
1209
 
            version_id, options, pos, size = rec[:4]
1210
 
            version_id = version_id
1211
 
 
1212
 
            # See self._cache_version
1213
 
            # only want the _history index to reference the 1st 
1214
 
            # index entry for version_id
1215
 
            if version_id not in cache:
1216
 
                history_top += 1
1217
 
                index = history_top
1218
 
                history.append(version_id)
1219
 
            else:
1220
 
                index = cache[version_id][5]
1221
 
            cache[version_id] = (version_id,
1222
 
                                 options.split(','),
1223
 
                                 int(pos),
1224
 
                                 int(size),
1225
 
                                 parents,
1226
 
                                 index)
1227
 
            # end self._cache_version 
1228
 
 
1229
1165
    def get_graph(self):
1230
1166
        return [(vid, idx[4]) for vid, idx in self._cache.iteritems()]
1231
1167
 
1961
1897
            bestsize = bestsize + 1
1962
1898
 
1963
1899
        return besti, bestj, bestsize
 
1900
 
 
1901
 
 
1902
try:
 
1903
    from bzrlib._knit_load_data_c import _load_data_c as _load_data
 
1904
except ImportError:
 
1905
    from bzrlib._knit_load_data_py import _load_data_py as _load_data