##// END OF EJS Templates
tracked-key: remove the dual write and rename to tracked-hint...
tracked-key: remove the dual write and rename to tracked-hint The dual-write approach was mostly useless. As explained in the previous version of the help, the key had to be read twice before we could cache a value. However this "read twice" limitation actually also apply to any usage of the key. If some operation wants to rely of the "same value == same tracked set" property it would need to read the value before, and after running that operation (or at least, after, in all cases). So it cannot be sure the operation it did is "valid" until checking the key after the operation. As a resultat such operation can only be read-only or rollbackable. This reduce the utility of the "same value == same tracked set" a lot. So it seems simpler to drop the double write and to update the documentation to highlight that this file does not garantee race-free operation. As a result the "key" is demoted to a "hint". Documentation is updated accordingly. Differential Revision: https://phab.mercurial-scm.org/D12201

File last commit:

r47575:d4ba4d51 default
r49644:6e559391 default
Show More
diffhelper.py
83 lines | 2.3 KiB | text/x-python | PythonLexer
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 # diffhelper.py - helper routines for patch
#
Raphaël Gomès
contributor: change mentions of mpm to olivia...
r47575 # Copyright 2009 Olivia Mackall <olivia@selenic.com> and others
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 #
# 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
from .i18n import _
from . import (
error,
Gregory Szorc
global: use pycompat.xrange()...
r38806 pycompat,
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 )
Rodrigo Damazio Bovendorp
diff: move no-eol text constant to a common location...
r45714 MISSING_NEWLINE_MARKER = b'\\ No newline at end of file\n'
Augie Fackler
style: run a patched black on a subset of mercurial...
r43345
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 def addlines(fp, hunk, lena, lenb, a, b):
"""Read lines from fp into the hunk
The hunk is parsed into two arrays, a and b. a gets the old state of
the text, b gets the new state. The control char from the hunk is saved
when inserting into a, but not b (for performance while deleting files.)
"""
while True:
todoa = lena - len(a)
todob = lenb - len(b)
num = max(todoa, todob)
if num == 0:
break
Gregory Szorc
global: use pycompat.xrange()...
r38806 for i in pycompat.xrange(num):
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 s = fp.readline()
if not s:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.ParseError(_(b'incomplete hunk'))
Rodrigo Damazio Bovendorp
diff: move no-eol text constant to a common location...
r45714 if s == MISSING_NEWLINE_MARKER:
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 fixnewline(hunk, a, b)
continue
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if s == b'\n' or s == b'\r\n':
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 # Some patches may be missing the control char
# on empty lines. Supply a leading space.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 s = b' ' + s
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 hunk.append(s)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if s.startswith(b'+'):
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 b.append(s[1:])
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif s.startswith(b'-'):
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 a.append(s)
else:
b.append(s[1:])
a.append(s)
Augie Fackler
style: run a patched black on a subset of mercurial...
r43345
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 def fixnewline(hunk, a, b):
"""Fix up the last lines of a and b when the patch has no newline at EOF"""
l = hunk[-1]
# tolerate CRLF in last line
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if l.endswith(b'\r\n'):
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 hline = l[:-2]
else:
hline = l[:-1]
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if hline.startswith((b' ', b'+')):
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 b[-1] = hline[1:]
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if hline.startswith((b' ', b'-')):
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 a[-1] = hline
hunk[-1] = hline
Augie Fackler
style: run a patched black on a subset of mercurial...
r43345
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 def testhunk(a, b, bstart):
"""Compare the lines in a with the lines in b
a is assumed to have a control char at the start of each line, this char
is ignored in the compare.
"""
alen = len(a)
blen = len(b)
if alen > blen - bstart or bstart < 0:
return False
Gregory Szorc
global: use pycompat.xrange()...
r38806 for i in pycompat.xrange(alen):
Yuya Nishihara
diffhelper: rename module to avoid conflicts with ancient C module (issue5846)...
r37821 if a[i][1:] != b[i + bstart]:
return False
return True