##// END OF EJS Templates
debugcommands: perform handshake when obtaining httpv2 peer...
debugcommands: perform handshake when obtaining httpv2 peer If we obtain an httpv2peer directly, the instance doesn't have an API descriptor and therefore doesn't know about the remote's commands, feature support, etc. This doesn't matter now. But when we implement the peer so it consults the API descriptor as part of sending commands, it will. So we change the logic for obtaining an http version 2 peer to go through makepeer() so the peer will perform the handshake and pass the API descriptor to the httpv2peer instance. Tests changed because we now perform a ?cmd=capabilities when obtaining version 2 peers. The Content-Length header is globbed because compression info will lack zstandard for pure builds. Differential Revision: https://phab.mercurial-scm.org/D3296

File last commit:

r37593:230eb959 default
r37663:72b0982c default
Show More
diffhelpers.py
77 lines | 2.2 KiB | text/x-python | PythonLexer
Yuya Nishihara
diffhelpers: move out of pure package
r37589 # diffhelpers.py - helper routines for patch
#
# 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.
from __future__ import absolute_import
Yuya Nishihara
patch: error out if reached to EOF while reading hunk...
r37591 from .i18n import _
from . import (
error,
)
Yuya Nishihara
diffhelpers: move out of pure package
r37589 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
for i in xrange(num):
s = fp.readline()
Yuya Nishihara
patch: error out if reached to EOF while reading hunk...
r37591 if not s:
raise error.ParseError(_('incomplete hunk'))
Yuya Nishihara
diffhelpers: move out of pure package
r37589 if s == "\\ No newline at end of file\n":
fixnewline(hunk, a, b)
continue
Yuya Nishihara
diffhelpers: be more tolerant for stripped empty lines of CRLF ending...
r37593 if s == '\n' or s == '\r\n':
Yuya Nishihara
diffhelpers: move out of pure package
r37589 # Some patches may be missing the control char
# on empty lines. Supply a leading space.
Yuya Nishihara
diffhelpers: be more tolerant for stripped empty lines of CRLF ending...
r37593 s = ' ' + s
Yuya Nishihara
diffhelpers: move out of pure package
r37589 hunk.append(s)
if s.startswith('+'):
b.append(s[1:])
elif s.startswith('-'):
a.append(s)
else:
b.append(s[1:])
a.append(s)
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
if l.endswith('\r\n'):
hline = l[:-2]
else:
hline = l[:-1]
if hline.startswith((' ', '+')):
b[-1] = hline[1:]
if hline.startswith((' ', '-')):
a[-1] = hline
hunk[-1] = hline
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:
Yuya Nishihara
diffhelpers: make return value of testhunk() more Pythonic...
r37592 return False
Yuya Nishihara
diffhelpers: move out of pure package
r37589 for i in xrange(alen):
if a[i][1:] != b[i + bstart]:
Yuya Nishihara
diffhelpers: make return value of testhunk() more Pythonic...
r37592 return False
return True