mirror of
https://github.com/facebook/sapling.git
synced 2024-10-10 16:57:49 +03:00
fastannotate: replace some assertions to formal errors
Summary: fastannotate can rebuild cache automatically if it sees `CorruptedFileError` or `CannotReuseError`, but not for `AssertionError`. With `strip`, some assertion errors really mean file corruption. So let's use correct exceptions so corrupted files get rebuilt automatically. Test Plan: Run existing tests. Reviewers: #mercurial, durham Reviewed By: durham Subscribers: mjpieters Differential Revision: https://phabricator.intern.facebook.com/D5013658 Signature: t1:5013658:1494018897:a04032103b3e0cbc509adeae0d88c0a783a0dbdb
This commit is contained in:
parent
cd7eed4dd0
commit
d2965bcd6a
@ -560,7 +560,8 @@ class _annotatecontext(object):
|
||||
fctx = self._resolvefctx(hsh, revmap.rev2path(rev))
|
||||
annotated = linelog.annotateresult
|
||||
lines = mdiff.splitnewlines(fctx.data())
|
||||
assert len(lines) == len(annotated)
|
||||
if len(lines) != len(annotated):
|
||||
raise faerror.CorruptedFileError('unexpected annotated lines')
|
||||
# resolve lines from the annotate result
|
||||
for i, line in enumerate(lines):
|
||||
k = annotated[i]
|
||||
@ -581,8 +582,12 @@ class _annotatecontext(object):
|
||||
else:
|
||||
hsh = f.node()
|
||||
llrev = self.revmap.hsh2rev(hsh)
|
||||
assert llrev
|
||||
assert (self.revmap.rev2flag(llrev) & revmapmod.sidebranchflag) == 0
|
||||
if not llrev:
|
||||
raise faerror.CorruptedFileError('%s is not in revmap'
|
||||
% node.hex(hsh))
|
||||
if (self.revmap.rev2flag(llrev) & revmapmod.sidebranchflag) != 0:
|
||||
raise faerror.CorruptedFileError('%s is not in revmap mainbranch'
|
||||
% node.hex(hsh))
|
||||
self.linelog.annotate(llrev)
|
||||
result = [(self.revmap.rev2hsh(r), l)
|
||||
for r, l in self.linelog.annotateresult]
|
||||
@ -619,7 +624,8 @@ class _annotatecontext(object):
|
||||
def getllrev(f):
|
||||
"""(fctx) -> int"""
|
||||
# f should not be a linelog revision
|
||||
assert not isinstance(f, int)
|
||||
if isinstance(f, int):
|
||||
raise error.ProgrammingError('f should not be an int')
|
||||
# f is a fctx, allocate linelog rev on demand
|
||||
hsh = f.node()
|
||||
rev = revmap.hsh2rev(hsh)
|
||||
@ -676,7 +682,8 @@ class _annotatecontext(object):
|
||||
llrev = 0
|
||||
else:
|
||||
llrev = self.revmap.hsh2rev(fctx.node())
|
||||
assert llrev
|
||||
if not llrev:
|
||||
raise faerror.CannotReuseError()
|
||||
if self.linelog.maxrev != llrev:
|
||||
raise faerror.CannotReuseError()
|
||||
|
||||
|
@ -5,11 +5,15 @@
|
||||
# This software may be used and distributed according to the terms of the
|
||||
# GNU General Public License version 2 or any later version.
|
||||
|
||||
from __future__ import absolute_import
|
||||
|
||||
import bisect
|
||||
import os
|
||||
import struct
|
||||
|
||||
from fastannotate import error
|
||||
from . import error
|
||||
from mercurial import error as hgerror
|
||||
from mercurial.node import hex
|
||||
|
||||
# the revmap file format is straightforward:
|
||||
#
|
||||
@ -88,8 +92,10 @@ class revmap(object):
|
||||
"""add a binary hg hash and return the mapped linelog revision.
|
||||
if flush is True, incrementally update the file.
|
||||
"""
|
||||
assert hsh not in self._hsh2rev
|
||||
assert len(hsh) == _hshlen
|
||||
if hsh in self._hsh2rev:
|
||||
raise error.CorruptedFileError('%r is in revmap already' % hex(hsh))
|
||||
if len(hsh) != _hshlen:
|
||||
raise hgerror.ProgrammingError('hsh must be %d-char long' % _hshlen)
|
||||
idx = len(self._rev2hsh)
|
||||
flag = 0
|
||||
if sidebranch:
|
||||
@ -195,7 +201,8 @@ class revmap(object):
|
||||
f.write(struct.pack('B', flag))
|
||||
if flag & renameflag:
|
||||
path = self.rev2path(rev)
|
||||
assert path is not None
|
||||
if path is None:
|
||||
raise error.CorruptedFileError('cannot find path for %s' % rev)
|
||||
f.write(path + '\0')
|
||||
f.write(hsh)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user