151 # 32 bytes: nodeid |
151 # 32 bytes: nodeid |
152 indexformatng = ">Qiiiiii20s12x" |
152 indexformatng = ">Qiiiiii20s12x" |
153 ngshaoffset = 32 |
153 ngshaoffset = 32 |
154 versionformat = ">I" |
154 versionformat = ">I" |
155 |
155 |
|
156 # corresponds to uncompressed length of indexformatng (2 gigs, 4-byte |
|
157 # signed integer) |
|
158 _maxentrysize = 0x7fffffff |
|
159 |
156 class revlogio(object): |
160 class revlogio(object): |
157 def __init__(self): |
161 def __init__(self): |
158 self.size = struct.calcsize(indexformatng) |
162 self.size = struct.calcsize(indexformatng) |
159 |
163 |
160 def parseindex(self, data, inline): |
164 def parseindex(self, data, inline): |
161 # call the C implementation to parse the index data |
165 # call the C implementation to parse the index data |
162 index, cache = parsers.parse_index2(data, inline) |
166 index, cache = parsers.parse_index2(data, inline) |
163 return index, getattr(index, 'nodemap', None), cache |
167 return index, getattr(index, 'nodemap', None), cache |
164 |
168 |
165 def packentry(self, entry, node, version, rev): |
169 def packentry(self, entry, node, version, rev): |
|
170 uncompressedlength = entry[2] |
|
171 if uncompressedlength > _maxentrysize: |
|
172 raise RevlogError( |
|
173 _("size of %d bytes exceeds maximum revlog storage of 2GiB") |
|
174 % uncompressedlength) |
|
175 |
166 p = _pack(indexformatng, *entry) |
176 p = _pack(indexformatng, *entry) |
167 if rev == 0: |
177 if rev == 0: |
168 p = _pack(versionformat, version) + p[4:] |
178 p = _pack(versionformat, version) + p[4:] |
169 return p |
179 return p |
170 |
180 |