1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
# Copyright (C) 2007 Canonical Ltd
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
from __future__ import absolute_import
from bzrlib import errors
def _load_data_py(kndx, fp):
"""Read in a knit index."""
cache = kndx._cache
history = kndx._history
kndx.check_header(fp)
# readlines reads the whole file at once:
# bad for transports like http, good for local disk
# we save 60 ms doing this one change (
# from calling readline each time to calling
# readlines once.
# probably what we want for nice behaviour on
# http is a incremental readlines that yields, or
# a check for local vs non local indexes,
history_top = len(history) - 1
for line in fp.readlines():
rec = line.split()
if len(rec) < 5 or rec[-1] != ':':
# corrupt line.
# FIXME: in the future we should determine if its a
# short write - and ignore it
# or a different failure, and raise. RBC 20060407
continue
try:
parents = []
for value in rec[4:-1]:
if value[0] == '.':
# uncompressed reference
parent_id = value[1:]
else:
parent_id = history[int(value)]
parents.append(parent_id)
except (IndexError, ValueError), e:
# The parent could not be decoded to get its parent row. This
# at a minimum will cause this row to have wrong parents, or
# even to apply a delta to the wrong base and decode
# incorrectly. its therefore not usable, and because we have
# encountered a situation where a new knit index had this
# corrupt we can't asssume that no other rows referring to the
# index of this record actually mean the subsequent uncorrupt
# one, so we error.
raise errors.KnitCorrupt(kndx._filename, "line %r: %s" % (rec, e))
version_id, options, pos, size = rec[:4]
version_id = version_id
try:
pos = int(pos)
except ValueError, e:
raise errors.KnitCorrupt(kndx._filename,
"invalid position on line %r: %s"
% (rec, e))
try:
size = int(size)
except ValueError, e:
raise errors.KnitCorrupt(kndx._filename,
"invalid size on line %r: %s"
% (rec, e))
# See kndx._cache_version
# only want the _history index to reference the 1st
# index entry for version_id
if version_id not in cache:
history_top += 1
index = history_top
history.append(version_id)
else:
index = cache[version_id][5]
cache[version_id] = (version_id,
options.split(','),
pos,
size,
tuple(parents),
index)
# end kndx._cache_version
|