comparison mercurial/hg.py @ 751:0b245edec124

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!
author Muli Ben-Yehuda <mulix@mulix.org>
date Thu, 21 Jul 2005 18:18:43 -0500
parents 156dc2f3be7f
children c693eafd5967
comparison
equal deleted inserted replaced
750:25986be9a1aa 751:0b245edec124
1751 return map(bin, d[:-1].split(" ")) 1751 return map(bin, d[:-1].split(" "))
1752 except: 1752 except:
1753 self.ui.warn("unexpected response:\n" + d[:400] + "\n...\n") 1753 self.ui.warn("unexpected response:\n" + d[:400] + "\n...\n")
1754 raise 1754 raise
1755 1755
1756 def verify_hg_repo(self, resp):
1757 if (resp.headers['content-type'] == 'application/hg-0.1'):
1758 pass
1759 else:
1760 msg = """'%s' does not appear to be a valid hg repository -
1761 missing a 'Content-type: application/hg-0.1' HTTP header""" % (self.url,)
1762 raise RepoError(msg)
1763
1756 def branches(self, nodes): 1764 def branches(self, nodes):
1757 n = " ".join(map(hex, nodes)) 1765 n = " ".join(map(hex, nodes))
1758 d = self.do_cmd("branches", nodes=n).read() 1766 resp = self.do_cmd("branches", nodes=n);
1767 self.verify_hg_repo(resp);
1759 try: 1768 try:
1769 d = resp.read()
1760 br = [ tuple(map(bin, b.split(" "))) for b in d.splitlines() ] 1770 br = [ tuple(map(bin, b.split(" "))) for b in d.splitlines() ]
1761 return br 1771 return br
1762 except: 1772 except:
1763 self.ui.warn("unexpected response:\n" + d[:400] + "\n...\n") 1773 self.ui.warn("unexpected response:\n" + d[:400] + "\n...\n")
1764 raise 1774 raise
1765 1775
1766 def between(self, pairs): 1776 def between(self, pairs):
1767 n = "\n".join(["-".join(map(hex, p)) for p in pairs]) 1777 n = "\n".join(["-".join(map(hex, p)) for p in pairs])
1768 d = self.do_cmd("between", pairs=n).read() 1778 resp = self.do_cmd("between", pairs=n)
1779 self.verify_hg_repo(resp)
1769 try: 1780 try:
1781 d = resp.read()
1770 p = [ l and map(bin, l.split(" ")) or [] for l in d.splitlines() ] 1782 p = [ l and map(bin, l.split(" ")) or [] for l in d.splitlines() ]
1771 return p 1783 return p
1772 except: 1784 except:
1773 self.ui.warn("unexpected response:\n" + d[:400] + "\n...\n") 1785 self.ui.warn("unexpected response:\n" + d[:400] + "\n...\n")
1774 raise 1786 raise
1775 1787
1776 def changegroup(self, nodes): 1788 def changegroup(self, nodes):
1777 n = " ".join(map(hex, nodes)) 1789 n = " ".join(map(hex, nodes))
1778 f = self.do_cmd("changegroup", roots=n) 1790 resp = self.do_cmd("changegroup", roots=n)
1791 self.verify_hg_repo(resp)
1779 bytes = 0 1792 bytes = 0
1780 1793
1781 class zread: 1794 class zread:
1782 def __init__(self, f): 1795 def __init__(self, f):
1783 self.zd = zlib.decompressobj() 1796 self.zd = zlib.decompressobj()
1784 self.f = f 1797 self.f = f
1785 self.buf = "" 1798 self.buf = ""
1786 def read(self, l): 1799 def read(self, l):
1787 while l > len(self.buf): 1800 while l > len(self.buf):
1788 r = f.read(4096) 1801 r = self.f.read(4096)
1789 if r: 1802 if r:
1790 self.buf += self.zd.decompress(r) 1803 self.buf += self.zd.decompress(r)
1791 else: 1804 else:
1792 self.buf += self.zd.flush() 1805 self.buf += self.zd.flush()
1793 break 1806 break
1794 d, self.buf = self.buf[:l], self.buf[l:] 1807 d, self.buf = self.buf[:l], self.buf[l:]
1795 return d 1808 return d
1796 1809
1797 return zread(f) 1810 return zread(resp)
1798 1811
1799 class remotelock: 1812 class remotelock:
1800 def __init__(self, repo): 1813 def __init__(self, repo):
1801 self.repo = repo 1814 self.repo = repo
1802 def release(self): 1815 def release(self):