1774 raise util.Abort(_('operation forbidden by server')) |
1774 raise util.Abort(_('operation forbidden by server')) |
1775 elif resp == 2: |
1775 elif resp == 2: |
1776 raise util.Abort(_('locking the remote repository failed')) |
1776 raise util.Abort(_('locking the remote repository failed')) |
1777 elif resp != 0: |
1777 elif resp != 0: |
1778 raise util.Abort(_('the server sent an unknown error code')) |
1778 raise util.Abort(_('the server sent an unknown error code')) |
1779 self.ui.status(_('streaming all changes\n')) |
1779 |
1780 l = fp.readline() |
1780 exchange.consumestreamclone(self, fp) |
1781 try: |
|
1782 total_files, total_bytes = map(int, l.split(' ', 1)) |
|
1783 except (ValueError, TypeError): |
|
1784 raise error.ResponseError( |
|
1785 _('unexpected response from remote server:'), l) |
|
1786 self.ui.status(_('%d files to transfer, %s of data\n') % |
|
1787 (total_files, util.bytecount(total_bytes))) |
|
1788 handled_bytes = 0 |
|
1789 self.ui.progress(_('clone'), 0, total=total_bytes) |
|
1790 start = time.time() |
|
1791 |
|
1792 tr = self.transaction(_('clone')) |
|
1793 try: |
|
1794 for i in xrange(total_files): |
|
1795 # XXX doesn't support '\n' or '\r' in filenames |
|
1796 l = fp.readline() |
|
1797 try: |
|
1798 name, size = l.split('\0', 1) |
|
1799 size = int(size) |
|
1800 except (ValueError, TypeError): |
|
1801 raise error.ResponseError( |
|
1802 _('unexpected response from remote server:'), l) |
|
1803 if self.ui.debugflag: |
|
1804 self.ui.debug('adding %s (%s)\n' % |
|
1805 (name, util.bytecount(size))) |
|
1806 # for backwards compat, name was partially encoded |
|
1807 ofp = self.svfs(store.decodedir(name), 'w') |
|
1808 for chunk in util.filechunkiter(fp, limit=size): |
|
1809 handled_bytes += len(chunk) |
|
1810 self.ui.progress(_('clone'), handled_bytes, |
|
1811 total=total_bytes) |
|
1812 ofp.write(chunk) |
|
1813 ofp.close() |
|
1814 tr.close() |
|
1815 finally: |
|
1816 tr.release() |
|
1817 |
|
1818 # Writing straight to files circumvented the inmemory caches |
|
1819 self.invalidate() |
|
1820 |
|
1821 elapsed = time.time() - start |
|
1822 if elapsed <= 0: |
|
1823 elapsed = 0.001 |
|
1824 self.ui.progress(_('clone'), None) |
|
1825 self.ui.status(_('transferred %s in %.1f seconds (%s/sec)\n') % |
|
1826 (util.bytecount(total_bytes), elapsed, |
|
1827 util.bytecount(total_bytes / elapsed))) |
|
1828 |
1781 |
1829 # new requirements = old non-format requirements + |
1782 # new requirements = old non-format requirements + |
1830 # new format-related remote requirements |
1783 # new format-related remote requirements |
1831 # requirements from the streamed-in repository |
1784 # requirements from the streamed-in repository |
1832 self.requirements = remotereqs | ( |
1785 self.requirements = remotereqs | ( |