Mercurial > hg
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): |