##// END OF EJS Templates
repoview: do not crash when localtags refers to non existing revisions...
repoview: do not crash when localtags refers to non existing revisions This fixes a crash that may happen when using mercurial 3.0.x. The _gethiddenblockers function assumed that the output of tags.readlocaltags() was a dict mapping tags to of valid nodes. However this was not necessarily the case. When a repository had obsolete revisions and had local tag pointing to a non existing revision was found, many mercurial commands would crash. This revision fixes the problem by removing any tags from the output of tags.readlocaltags() which point to invalid nodes. We may want to add a warning when this happens (although it might be annoying to get that warning for every command, possibly even more than once per command). A test for this problem has been added to test-obsolete.t. Without this fix the test would output: $ hg tags abort: 00changelog.i@3816541e5485: no node! [255] Instead of: $ hg tags tiptag 2:3816541e5485 tip 2:3816541e5485 visible 0:193e9254ce7e

File last commit:

r12387:4f8067c9 default
r21823:925d1bb9 stable
Show More
diffhelpers.py
60 lines | 1.5 KiB | text/x-python | PythonLexer
# diffhelpers.py - pure Python implementation of diffhelpers.c
#
# Copyright 2009 Matt Mackall <mpm@selenic.com> and others
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
def addlines(fp, hunk, lena, lenb, a, b):
while True:
todoa = lena - len(a)
todob = lenb - len(b)
num = max(todoa, todob)
if num == 0:
break
for i in xrange(num):
s = fp.readline()
c = s[0]
if s == "\\ No newline at end of file\n":
fix_newline(hunk, a, b)
continue
if c == "\n":
# Some patches may be missing the control char
# on empty lines. Supply a leading space.
s = " \n"
hunk.append(s)
if c == "+":
b.append(s[1:])
elif c == "-":
a.append(s)
else:
b.append(s[1:])
a.append(s)
return 0
def fix_newline(hunk, a, b):
l = hunk[-1]
# tolerate CRLF in last line
if l.endswith('\r\n'):
hline = l[:-2]
else:
hline = l[:-1]
c = hline[0]
if c in " +":
b[-1] = hline[1:]
if c in " -":
a[-1] = hline
hunk[-1] = hline
return 0
def testhunk(a, b, bstart):
alen = len(a)
blen = len(b)
if alen > blen - bstart:
return -1
for i in xrange(alen):
if a[i][1:] != b[i + bstart]:
return -1
return 0