##// END OF EJS Templates
narrow: only send the narrowspecs back if ACL in play...
narrow: only send the narrowspecs back if ACL in play I am unable to think why we need to send narrowspecs back from the server. The current state adds a 'narrow:spec' part to each changegroup which is generated when narrow extension is enabled. So we are sending narrowspecs on pull also. There is a problem with sending the narrowspecs the way we are doing it right now. We add include and exclude as parameter of the 'narrow:spec' bundle2 part. The the len of include or exclude string increase 255 which is obvious while working on large repos, bundle2 generation code breaks. For more on that refer issue5952 on bugzilla. I was thinking why we need to send the narrowspecs back, and deleted the 'narrow:spec' bundle2 part generation code and found that only narrow-acl test has some failure. With this patch, we will only send the 'narrow:spec' bundle2 part if ACL is enabled because the original narrowspecs in those cases can be a subset of narrowspecs user requested. There are phase related output change in couple of tests. The output change shows that we are now dealing in public phases completely. So maybe sending the narrow:spec bundle2 part was preventing phases being exchanged or phase bundle2 data being applied. Differential Revision: https://phab.mercurial-scm.org/D4931

File last commit:

r40353:6958eb9b default
r40373:cb516a85 default
Show More
hgclient.py
134 lines | 3.6 KiB | text/x-python | PythonLexer
Yuya Nishihara
test-commandserver: split helper functions to new hgclient module...
r22566 # A minimal client for Mercurial's command server
Pulkit Goyal
hgclient: use absolute_import and print_function
r28355 from __future__ import absolute_import, print_function
Yuya Nishihara
py3: rewrite StringIO fallback for Python 3
r40353
import io
Pulkit Goyal
hgclient: use absolute_import and print_function
r28355 import os
Yuya Nishihara
py3: reinvent print() function for contrib/hgclient.py
r40352 import re
Pulkit Goyal
hgclient: use absolute_import and print_function
r28355 import signal
import socket
import struct
import subprocess
import sys
import time
Yuya Nishihara
test-commandserver: split helper functions to new hgclient module...
r22566
Yuya Nishihara
py3: work around unicode stdio streams in contrib/hgclient.py
r40351 if sys.version_info[0] >= 3:
stdout = sys.stdout.buffer
stderr = sys.stderr.buffer
Yuya Nishihara
py3: rewrite StringIO fallback for Python 3
r40353 stringio = io.BytesIO
Yuya Nishihara
py3: reinvent print() function for contrib/hgclient.py
r40352 def bprint(*args):
# remove b'' as well for ease of test migration
pargs = [re.sub(br'''\bb(['"])''', br'\1', b'%s' % a) for a in args]
stdout.write(b' '.join(pargs) + b'\n')
Yuya Nishihara
py3: work around unicode stdio streams in contrib/hgclient.py
r40351 else:
Yuya Nishihara
py3: rewrite StringIO fallback for Python 3
r40353 import cStringIO
Yuya Nishihara
py3: work around unicode stdio streams in contrib/hgclient.py
r40351 stdout = sys.stdout
stderr = sys.stderr
Yuya Nishihara
py3: rewrite StringIO fallback for Python 3
r40353 stringio = cStringIO.StringIO
Yuya Nishihara
py3: reinvent print() function for contrib/hgclient.py
r40352 bprint = print
Yuya Nishihara
py3: work around unicode stdio streams in contrib/hgclient.py
r40351
Yuya Nishihara
test-commandserver: allow check() to make connection in different way...
r22992 def connectpipe(path=None):
Yuya Nishihara
py3: convert string literals to bytes in contrib/hgclient.py...
r40350 cmdline = [b'hg', b'serve', b'--cmdserver', b'pipe']
Yuya Nishihara
test-commandserver: split helper functions to new hgclient module...
r22566 if path:
Yuya Nishihara
py3: convert string literals to bytes in contrib/hgclient.py...
r40350 cmdline += [b'-R', path]
Yuya Nishihara
test-commandserver: split helper functions to new hgclient module...
r22566
server = subprocess.Popen(cmdline, stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
return server
Yuya Nishihara
test-commandserver: add connector for unix domain socket server...
r22993 class unixconnection(object):
def __init__(self, sockpath):
self.sock = sock = socket.socket(socket.AF_UNIX)
sock.connect(sockpath)
self.stdin = sock.makefile('wb')
self.stdout = sock.makefile('rb')
def wait(self):
self.stdin.close()
self.stdout.close()
self.sock.close()
class unixserver(object):
def __init__(self, sockpath, logpath=None, repopath=None):
self.sockpath = sockpath
Yuya Nishihara
py3: convert string literals to bytes in contrib/hgclient.py...
r40350 cmdline = [b'hg', b'serve', b'--cmdserver', b'unix', b'-a', sockpath]
Yuya Nishihara
test-commandserver: add connector for unix domain socket server...
r22993 if repopath:
Yuya Nishihara
py3: convert string literals to bytes in contrib/hgclient.py...
r40350 cmdline += [b'-R', repopath]
Yuya Nishihara
test-commandserver: add connector for unix domain socket server...
r22993 if logpath:
stdout = open(logpath, 'a')
stderr = subprocess.STDOUT
else:
stdout = stderr = None
self.server = subprocess.Popen(cmdline, stdout=stdout, stderr=stderr)
# wait for listen()
while self.server.poll() is None:
if os.path.exists(sockpath):
break
time.sleep(0.1)
def connect(self):
return unixconnection(self.sockpath)
def shutdown(self):
os.kill(self.server.pid, signal.SIGTERM)
self.server.wait()
Yuya Nishihara
test-commandserver: split helper functions to new hgclient module...
r22566 def writeblock(server, data):
Yuya Nishihara
py3: convert string literals to bytes in contrib/hgclient.py...
r40350 server.stdin.write(struct.pack(b'>I', len(data)))
Yuya Nishihara
test-commandserver: split helper functions to new hgclient module...
r22566 server.stdin.write(data)
server.stdin.flush()
def readchannel(server):
data = server.stdout.read(5)
if not data:
raise EOFError
channel, length = struct.unpack('>cI', data)
Yuya Nishihara
py3: convert string literals to bytes in contrib/hgclient.py...
r40350 if channel in b'IL':
Yuya Nishihara
test-commandserver: split helper functions to new hgclient module...
r22566 return channel, length
else:
return channel, server.stdout.read(length)
def sep(text):
Yuya Nishihara
py3: convert string literals to bytes in contrib/hgclient.py...
r40350 return text.replace(b'\\', b'/')
Yuya Nishihara
test-commandserver: split helper functions to new hgclient module...
r22566
Yuya Nishihara
py3: work around unicode stdio streams in contrib/hgclient.py
r40351 def runcommand(server, args, output=stdout, error=stderr, input=None,
Yuya Nishihara
test-commandserver: split helper functions to new hgclient module...
r22566 outfilter=lambda x: x):
Yuya Nishihara
py3: reinvent print() function for contrib/hgclient.py
r40352 bprint(b'*** runcommand', b' '.join(args))
Yuya Nishihara
py3: work around unicode stdio streams in contrib/hgclient.py
r40351 stdout.flush()
Yuya Nishihara
py3: convert string literals to bytes in contrib/hgclient.py...
r40350 server.stdin.write(b'runcommand\n')
writeblock(server, b'\0'.join(args))
Yuya Nishihara
test-commandserver: split helper functions to new hgclient module...
r22566
if not input:
timeless
test-commandserver: handle cStringIO.StringIO/io.StringIO divergence
r28836 input = stringio()
Yuya Nishihara
test-commandserver: split helper functions to new hgclient module...
r22566
while True:
ch, data = readchannel(server)
Yuya Nishihara
py3: convert string literals to bytes in contrib/hgclient.py...
r40350 if ch == b'o':
Yuya Nishihara
test-commandserver: split helper functions to new hgclient module...
r22566 output.write(outfilter(data))
output.flush()
Yuya Nishihara
py3: convert string literals to bytes in contrib/hgclient.py...
r40350 elif ch == b'e':
Yuya Nishihara
test-commandserver: split helper functions to new hgclient module...
r22566 error.write(data)
error.flush()
Yuya Nishihara
py3: convert string literals to bytes in contrib/hgclient.py...
r40350 elif ch == b'I':
Yuya Nishihara
test-commandserver: split helper functions to new hgclient module...
r22566 writeblock(server, input.read(data))
Yuya Nishihara
py3: convert string literals to bytes in contrib/hgclient.py...
r40350 elif ch == b'L':
Yuya Nishihara
test-commandserver: split helper functions to new hgclient module...
r22566 writeblock(server, input.readline(data))
Yuya Nishihara
py3: convert string literals to bytes in contrib/hgclient.py...
r40350 elif ch == b'r':
Yuya Nishihara
test-commandserver: split helper functions to new hgclient module...
r22566 ret, = struct.unpack('>i', data)
if ret != 0:
Yuya Nishihara
py3: reinvent print() function for contrib/hgclient.py
r40352 bprint(b' [%d]' % ret)
Yuya Nishihara
test-commandserver: split helper functions to new hgclient module...
r22566 return ret
else:
Yuya Nishihara
py3: reinvent print() function for contrib/hgclient.py
r40352 bprint(b"unexpected channel %c: %r" % (ch, data))
Yuya Nishihara
test-commandserver: split helper functions to new hgclient module...
r22566 if ch.isupper():
return
Yuya Nishihara
test-commandserver: allow check() to make connection in different way...
r22992 def check(func, connect=connectpipe):
Yuya Nishihara
py3: work around unicode stdio streams in contrib/hgclient.py
r40351 stdout.flush()
Yuya Nishihara
test-commandserver: remove unused repopath argument from check()...
r22991 server = connect()
Yuya Nishihara
test-commandserver: split helper functions to new hgclient module...
r22566 try:
return func(server)
finally:
server.stdin.close()
server.wait()