Show More
@@ -1578,6 +1578,20 b' class localrepository(repo.repository):' | |||||
1578 | the linkrev. |
|
1578 | the linkrev. | |
1579 | """ |
|
1579 | """ | |
1580 |
|
1580 | |||
|
1581 | if extranodes is None: | |||
|
1582 | # can we go through the fast path ? | |||
|
1583 | heads.sort() | |||
|
1584 | allheads = self.heads() | |||
|
1585 | allheads.sort() | |||
|
1586 | if heads == allheads: | |||
|
1587 | common = [] | |||
|
1588 | # parents of bases are known from both sides | |||
|
1589 | for n in bases: | |||
|
1590 | for p in self.changelog.parents(n): | |||
|
1591 | if p != nullid: | |||
|
1592 | common.append(p) | |||
|
1593 | return self._changegroup(common, source) | |||
|
1594 | ||||
1581 | self.hook('preoutgoing', throw=True, source=source) |
|
1595 | self.hook('preoutgoing', throw=True, source=source) | |
1582 |
|
1596 | |||
1583 | # Set up some initial variables |
|
1597 | # Set up some initial variables | |
@@ -1854,16 +1868,22 b' class localrepository(repo.repository):' | |||||
1854 | return util.chunkbuffer(gengroup()) |
|
1868 | return util.chunkbuffer(gengroup()) | |
1855 |
|
1869 | |||
1856 | def changegroup(self, basenodes, source): |
|
1870 | def changegroup(self, basenodes, source): | |
|
1871 | # to avoid a race we use changegroupsubset() (issue1320) | |||
|
1872 | return self.changegroupsubset(basenodes, self.heads(), source) | |||
|
1873 | ||||
|
1874 | def _changegroup(self, common, source): | |||
1857 | """Generate a changegroup of all nodes that we have that a recipient |
|
1875 | """Generate a changegroup of all nodes that we have that a recipient | |
1858 | doesn't. |
|
1876 | doesn't. | |
1859 |
|
1877 | |||
1860 | This is much easier than the previous function as we can assume that |
|
1878 | This is much easier than the previous function as we can assume that | |
1861 |
the recipient has any changenode we aren't sending them. |
|
1879 | the recipient has any changenode we aren't sending them. | |
|
1880 | ||||
|
1881 | common is the set of common nodes between remote and self""" | |||
1862 |
|
1882 | |||
1863 | self.hook('preoutgoing', throw=True, source=source) |
|
1883 | self.hook('preoutgoing', throw=True, source=source) | |
1864 |
|
1884 | |||
1865 | cl = self.changelog |
|
1885 | cl = self.changelog | |
1866 | nodes = cl.nodesbetween(basenodes, None)[0] |
|
1886 | nodes = cl.findmissing(common) | |
1867 | revset = dict.fromkeys([cl.rev(n) for n in nodes]) |
|
1887 | revset = dict.fromkeys([cl.rev(n) for n in nodes]) | |
1868 | self.changegroupinfo(nodes, source) |
|
1888 | self.changegroupinfo(nodes, source) | |
1869 |
|
1889 |
@@ -590,6 +590,46 b' class revlog(object):' | |||||
590 | yield i |
|
590 | yield i | |
591 | break |
|
591 | break | |
592 |
|
592 | |||
|
593 | def findmissing(self, common=None, heads=None): | |||
|
594 | ''' | |||
|
595 | returns the topologically sorted list of nodes from the set: | |||
|
596 | missing = (ancestors(heads) \ ancestors(common)) | |||
|
597 | ||||
|
598 | where ancestors() is the set of ancestors from heads, heads included | |||
|
599 | ||||
|
600 | if heads is None, the heads of the revlog are used | |||
|
601 | if common is None, nullid is assumed to be a common node | |||
|
602 | ''' | |||
|
603 | if common is None: | |||
|
604 | common = [nullid] | |||
|
605 | if heads is None: | |||
|
606 | heads = self.heads() | |||
|
607 | ||||
|
608 | common = [self.rev(n) for n in common] | |||
|
609 | heads = [self.rev(n) for n in heads] | |||
|
610 | ||||
|
611 | # we want the ancestors, but inclusive | |||
|
612 | has = dict.fromkeys(self.ancestors(*common)) | |||
|
613 | has[nullrev] = None | |||
|
614 | for r in common: | |||
|
615 | has[r] = None | |||
|
616 | ||||
|
617 | # take all ancestors from heads that aren't in has | |||
|
618 | missing = {} | |||
|
619 | visit = [r for r in heads if r not in has] | |||
|
620 | while visit: | |||
|
621 | r = visit.pop(0) | |||
|
622 | if r in missing: | |||
|
623 | continue | |||
|
624 | else: | |||
|
625 | missing[r] = None | |||
|
626 | for p in self.parentrevs(r): | |||
|
627 | if p not in has: | |||
|
628 | visit.append(p) | |||
|
629 | missing = missing.keys() | |||
|
630 | missing.sort() | |||
|
631 | return [self.node(r) for r in missing] | |||
|
632 | ||||
593 | def nodesbetween(self, roots=None, heads=None): |
|
633 | def nodesbetween(self, roots=None, heads=None): | |
594 | """Return a tuple containing three elements. Elements 1 and 2 contain |
|
634 | """Return a tuple containing three elements. Elements 1 and 2 contain | |
595 | a final list bases and heads after all the unreachable ones have been |
|
635 | a final list bases and heads after all the unreachable ones have been |
@@ -2,4 +2,4 b'' | |||||
2 | adding a |
|
2 | adding a | |
3 | % try hgweb request |
|
3 | % try hgweb request | |
4 | 0 |
|
4 | 0 | |
5 | 54086fe9a47b47d83204f38bda0b90c2 page1 |
|
5 | 1f424bb22ec05c3c6bc866b6e67efe43 page1 |
@@ -100,7 +100,7 b' searching for changes' | |||||
100 | adding changesets |
|
100 | adding changesets | |
101 | adding manifests |
|
101 | adding manifests | |
102 | adding file changes |
|
102 | adding file changes | |
103 |
added 1 changesets with 1 changes to |
|
103 | added 1 changesets with 1 changes to 2 files | |
104 | % parent should be 2 (no automatic update) |
|
104 | % parent should be 2 (no automatic update) | |
105 | 2 |
|
105 | 2 | |
106 |
|
106 |
1 | NO CONTENT: modified file, binary diff hidden |
|
NO CONTENT: modified file, binary diff hidden |
@@ -22,7 +22,7 b' searching for changes' | |||||
22 | adding changesets |
|
22 | adding changesets | |
23 | adding manifests |
|
23 | adding manifests | |
24 | adding file changes |
|
24 | adding file changes | |
25 |
added 2 changesets with 1 changes to |
|
25 | added 2 changesets with 1 changes to 2 files | |
26 | adding foo |
|
26 | adding foo | |
27 | updating working directory |
|
27 | updating working directory | |
28 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
28 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
General Comments 0
You need to be logged in to leave comments.
Login now