Show More
@@ -21,7 +21,8 b' propertycache = util.propertycache' | |||||
21 |
|
21 | |||
22 | class localrepository(repo.repository): |
|
22 | class localrepository(repo.repository): | |
23 | capabilities = set(('lookup', 'changegroupsubset', 'branchmap', 'pushkey')) |
|
23 | capabilities = set(('lookup', 'changegroupsubset', 'branchmap', 'pushkey')) | |
24 |
supported = set('revlogv1 |
|
24 | supportedformats = set(('revlogv1', 'parentdelta')) | |
|
25 | supported = supportedformats | set(('store', 'fncache', 'shared')) | |||
25 |
|
26 | |||
26 | def __init__(self, baseui, path=None, create=0): |
|
27 | def __init__(self, baseui, path=None, create=0): | |
27 | repo.repository.__init__(self) |
|
28 | repo.repository.__init__(self) | |
@@ -58,10 +59,6 b' class localrepository(repo.repository):' | |||||
58 | ) |
|
59 | ) | |
59 | if self.ui.configbool('format', 'parentdelta', False): |
|
60 | if self.ui.configbool('format', 'parentdelta', False): | |
60 | requirements.append("parentdelta") |
|
61 | requirements.append("parentdelta") | |
61 | reqfile = self.opener("requires", "w") |
|
|||
62 | for r in requirements: |
|
|||
63 | reqfile.write("%s\n" % r) |
|
|||
64 | reqfile.close() |
|
|||
65 | else: |
|
62 | else: | |
66 | raise error.RepoError(_("repository %s not found") % path) |
|
63 | raise error.RepoError(_("repository %s not found") % path) | |
67 | elif create: |
|
64 | elif create: | |
@@ -93,9 +90,9 b' class localrepository(repo.repository):' | |||||
93 | self.sopener = self.store.opener |
|
90 | self.sopener = self.store.opener | |
94 | self.sjoin = self.store.join |
|
91 | self.sjoin = self.store.join | |
95 | self.opener.createmode = self.store.createmode |
|
92 | self.opener.createmode = self.store.createmode | |
96 | self.sopener.options = {} |
|
93 | self._applyrequirements(requirements) | |
97 | if 'parentdelta' in requirements: |
|
94 | if create: | |
98 | self.sopener.options['parentdelta'] = 1 |
|
95 | self._writerequirements() | |
99 |
|
96 | |||
100 | # These two define the set of tags for this repository. _tags |
|
97 | # These two define the set of tags for this repository. _tags | |
101 | # maps tag name to node; _tagtypes maps tag name to 'global' or |
|
98 | # maps tag name to node; _tagtypes maps tag name to 'global' or | |
@@ -112,6 +109,18 b' class localrepository(repo.repository):' | |||||
112 | self._datafilters = {} |
|
109 | self._datafilters = {} | |
113 | self._transref = self._lockref = self._wlockref = None |
|
110 | self._transref = self._lockref = self._wlockref = None | |
114 |
|
111 | |||
|
112 | def _applyrequirements(self, requirements): | |||
|
113 | self.requirements = requirements | |||
|
114 | self.sopener.options = {} | |||
|
115 | if 'parentdelta' in requirements: | |||
|
116 | self.sopener.options['parentdelta'] = 1 | |||
|
117 | ||||
|
118 | def _writerequirements(self): | |||
|
119 | reqfile = self.opener("requires", "w") | |||
|
120 | for r in self.requirements: | |||
|
121 | reqfile.write("%s\n" % r) | |||
|
122 | reqfile.close() | |||
|
123 | ||||
115 | def _checknested(self, path): |
|
124 | def _checknested(self, path): | |
116 | """Determine if path is a legal nested repository.""" |
|
125 | """Determine if path is a legal nested repository.""" | |
117 | if not path.startswith(self.root): |
|
126 | if not path.startswith(self.root): | |
@@ -1775,7 +1784,7 b' class localrepository(repo.repository):' | |||||
1775 | return newheads - oldheads + 1 |
|
1784 | return newheads - oldheads + 1 | |
1776 |
|
1785 | |||
1777 |
|
1786 | |||
1778 | def stream_in(self, remote): |
|
1787 | def stream_in(self, remote, requirements): | |
1779 | fp = remote.stream_out() |
|
1788 | fp = remote.stream_out() | |
1780 | l = fp.readline() |
|
1789 | l = fp.readline() | |
1781 | try: |
|
1790 | try: | |
@@ -1820,6 +1829,13 b' class localrepository(repo.repository):' | |||||
1820 | self.ui.status(_('transferred %s in %.1f seconds (%s/sec)\n') % |
|
1829 | self.ui.status(_('transferred %s in %.1f seconds (%s/sec)\n') % | |
1821 | (util.bytecount(total_bytes), elapsed, |
|
1830 | (util.bytecount(total_bytes), elapsed, | |
1822 | util.bytecount(total_bytes / elapsed))) |
|
1831 | util.bytecount(total_bytes / elapsed))) | |
|
1832 | ||||
|
1833 | # new requirements = old non-format requirements + new format-related | |||
|
1834 | # requirements from the streamed-in repository | |||
|
1835 | requirements.update(set(self.requirements) - self.supportedformats) | |||
|
1836 | self._applyrequirements(requirements) | |||
|
1837 | self._writerequirements() | |||
|
1838 | ||||
1823 | self.invalidate() |
|
1839 | self.invalidate() | |
1824 | return len(self.heads()) + 1 |
|
1840 | return len(self.heads()) + 1 | |
1825 |
|
1841 | |||
@@ -1838,8 +1854,17 b' class localrepository(repo.repository):' | |||||
1838 | # and format flags on "stream" capability, and use |
|
1854 | # and format flags on "stream" capability, and use | |
1839 | # uncompressed only if compatible. |
|
1855 | # uncompressed only if compatible. | |
1840 |
|
1856 | |||
1841 |
if stream and not heads |
|
1857 | if stream and not heads: | |
1842 | return self.stream_in(remote) |
|
1858 | # 'stream' means remote revlog format is revlogv1 only | |
|
1859 | if remote.capable('stream'): | |||
|
1860 | return self.stream_in(remote, set(('revlogv1',))) | |||
|
1861 | # otherwise, 'streamreqs' contains the remote revlog format | |||
|
1862 | streamreqs = remote.capable('streamreqs') | |||
|
1863 | if streamreqs: | |||
|
1864 | streamreqs = set(streamreqs.split(',')) | |||
|
1865 | # if we support it, stream in and adjust our requirements | |||
|
1866 | if not streamreqs - self.supportedformats: | |||
|
1867 | return self.stream_in(remote, streamreqs) | |||
1843 | return self.pull(remote, heads) |
|
1868 | return self.pull(remote, heads) | |
1844 |
|
1869 | |||
1845 | def pushkey(self, namespace, key, old, new): |
|
1870 | def pushkey(self, namespace, key, old, new): |
@@ -172,7 +172,13 b' def branches(repo, proto, nodes):' | |||||
172 | def capabilities(repo, proto): |
|
172 | def capabilities(repo, proto): | |
173 | caps = 'lookup changegroupsubset branchmap pushkey'.split() |
|
173 | caps = 'lookup changegroupsubset branchmap pushkey'.split() | |
174 | if _allowstream(repo.ui): |
|
174 | if _allowstream(repo.ui): | |
175 | caps.append('stream=%d' % repo.changelog.version) |
|
175 | requiredformats = repo.requirements & repo.supportedformats | |
|
176 | # if our local revlogs are just revlogv1, add 'stream' cap | |||
|
177 | if not requiredformats - set(('revlogv1',)): | |||
|
178 | caps.append('stream') | |||
|
179 | # otherwise, add 'streamreqs' detailing our local revlog format | |||
|
180 | else: | |||
|
181 | caps.append('streamreqs=%s' % ','.join(requiredformats)) | |||
176 | caps.append('unbundle=%s' % ','.join(changegroupmod.bundlepriority)) |
|
182 | caps.append('unbundle=%s' % ','.join(changegroupmod.bundlepriority)) | |
177 | return ' '.join(caps) |
|
183 | return ' '.join(caps) | |
178 |
|
184 |
General Comments 0
You need to be logged in to leave comments.
Login now