mirror of
https://github.com/facebook/sapling.git
synced 2024-10-08 07:49:11 +03:00
When pulling from a non hg repository URL (e.g. http://www.kernel.org/hg)
you geta pretty obscure error (zlib: uknown compression type). The attached patch modifies hgweb.py and hg.py to supply and check a 'Content-type: application/hg-0.1' HTTP header for the branches, between and changegroup commands, so that we know it's a proper hg repo before snarfing the input. Comments appreciated!
This commit is contained in:
parent
d1b02c9855
commit
0bf14d0d7e
@ -1753,10 +1753,20 @@ class httprepository:
|
||||
self.ui.warn("unexpected response:\n" + d[:400] + "\n...\n")
|
||||
raise
|
||||
|
||||
def verify_hg_repo(self, resp):
|
||||
if (resp.headers['content-type'] == 'application/hg-0.1'):
|
||||
pass
|
||||
else:
|
||||
msg = """'%s' does not appear to be a valid hg repository -
|
||||
missing a 'Content-type: application/hg-0.1' HTTP header""" % (self.url,)
|
||||
raise RepoError(msg)
|
||||
|
||||
def branches(self, nodes):
|
||||
n = " ".join(map(hex, nodes))
|
||||
d = self.do_cmd("branches", nodes=n).read()
|
||||
resp = self.do_cmd("branches", nodes=n);
|
||||
self.verify_hg_repo(resp);
|
||||
try:
|
||||
d = resp.read()
|
||||
br = [ tuple(map(bin, b.split(" "))) for b in d.splitlines() ]
|
||||
return br
|
||||
except:
|
||||
@ -1765,8 +1775,10 @@ class httprepository:
|
||||
|
||||
def between(self, pairs):
|
||||
n = "\n".join(["-".join(map(hex, p)) for p in pairs])
|
||||
d = self.do_cmd("between", pairs=n).read()
|
||||
resp = self.do_cmd("between", pairs=n)
|
||||
self.verify_hg_repo(resp)
|
||||
try:
|
||||
d = resp.read()
|
||||
p = [ l and map(bin, l.split(" ")) or [] for l in d.splitlines() ]
|
||||
return p
|
||||
except:
|
||||
@ -1775,7 +1787,8 @@ class httprepository:
|
||||
|
||||
def changegroup(self, nodes):
|
||||
n = " ".join(map(hex, nodes))
|
||||
f = self.do_cmd("changegroup", roots=n)
|
||||
resp = self.do_cmd("changegroup", roots=n)
|
||||
self.verify_hg_repo(resp)
|
||||
bytes = 0
|
||||
|
||||
class zread:
|
||||
@ -1785,7 +1798,7 @@ class httprepository:
|
||||
self.buf = ""
|
||||
def read(self, l):
|
||||
while l > len(self.buf):
|
||||
r = f.read(4096)
|
||||
r = self.f.read(4096)
|
||||
if r:
|
||||
self.buf += self.zd.decompress(r)
|
||||
else:
|
||||
@ -1794,7 +1807,7 @@ class httprepository:
|
||||
d, self.buf = self.buf[:l], self.buf[l:]
|
||||
return d
|
||||
|
||||
return zread(f)
|
||||
return zread(resp)
|
||||
|
||||
class remotelock:
|
||||
def __init__(self, repo):
|
||||
|
@ -657,12 +657,12 @@ class hgweb:
|
||||
write(self.filelog(args['file'][0], args['filenode'][0]))
|
||||
|
||||
elif args['cmd'][0] == 'heads':
|
||||
httphdr("text/plain")
|
||||
httphdr("application/mercurial-0.1")
|
||||
h = self.repo.heads()
|
||||
sys.stdout.write(" ".join(map(hex, h)) + "\n")
|
||||
|
||||
elif args['cmd'][0] == 'branches':
|
||||
httphdr("text/plain")
|
||||
httphdr("application/mercurial-0.1")
|
||||
nodes = []
|
||||
if args.has_key('nodes'):
|
||||
nodes = map(bin, args['nodes'][0].split(" "))
|
||||
@ -670,7 +670,7 @@ class hgweb:
|
||||
sys.stdout.write(" ".join(map(hex, b)) + "\n")
|
||||
|
||||
elif args['cmd'][0] == 'between':
|
||||
httphdr("text/plain")
|
||||
httphdr("application/hg-0.1")
|
||||
nodes = []
|
||||
if args.has_key('pairs'):
|
||||
pairs = [ map(bin, p.split("-"))
|
||||
@ -679,7 +679,7 @@ class hgweb:
|
||||
sys.stdout.write(" ".join(map(hex, b)) + "\n")
|
||||
|
||||
elif args['cmd'][0] == 'changegroup':
|
||||
httphdr("application/hg-changegroup")
|
||||
httphdr("application/mercurial-0.1")
|
||||
nodes = []
|
||||
if self.viewonly:
|
||||
return
|
||||
|
Loading…
Reference in New Issue
Block a user