Show More
@@ -5,7 +5,7 b'' | |||||
5 | # This software may be used and distributed according to the terms of the |
|
5 | # This software may be used and distributed according to the terms of the | |
6 | # GNU General Public License version 2 or any later version. |
|
6 | # GNU General Public License version 2 or any later version. | |
7 |
|
7 | |||
8 |
import |
|
8 | import heapq, util | |
9 | from node import nullrev |
|
9 | from node import nullrev | |
10 |
|
10 | |||
11 | def ancestors(pfunc, *orignodes): |
|
11 | def ancestors(pfunc, *orignodes): | |
@@ -213,51 +213,6 b' def genericancestor(a, b, pfunc):' | |||||
213 | except StopIteration: |
|
213 | except StopIteration: | |
214 | return None |
|
214 | return None | |
215 |
|
215 | |||
216 | def finddepths(nodes, pfunc): |
|
|||
217 | visit = list(nodes) |
|
|||
218 | rootpl = [nullrev, nullrev] |
|
|||
219 | depth = {} |
|
|||
220 | while visit: |
|
|||
221 | vertex = visit[-1] |
|
|||
222 | pl = pfunc(vertex) |
|
|||
223 | if not pl or pl == rootpl: |
|
|||
224 | depth[vertex] = 0 |
|
|||
225 | visit.pop() |
|
|||
226 | else: |
|
|||
227 | for p in pl: |
|
|||
228 | if p != nullrev and p not in depth: |
|
|||
229 | visit.append(p) |
|
|||
230 | if visit[-1] == vertex: |
|
|||
231 | dp = [depth[p] for p in pl if p != nullrev] |
|
|||
232 | if dp: |
|
|||
233 | depth[vertex] = max(dp) + 1 |
|
|||
234 | else: |
|
|||
235 | depth[vertex] = 0 |
|
|||
236 | visit.pop() |
|
|||
237 | return depth |
|
|||
238 |
|
||||
239 | def ancestor(a, b, pfunc): |
|
|||
240 | xs = ancestors(pfunc, a, b) |
|
|||
241 | y = genericancestor(a, b, pfunc) |
|
|||
242 | if y == -1: |
|
|||
243 | y = None |
|
|||
244 | if not xs: |
|
|||
245 | if y is None: |
|
|||
246 | return None |
|
|||
247 | print xs, y |
|
|||
248 | raise error.RepoError('ancestors disagree on whether a gca exists') |
|
|||
249 | elif y is None: |
|
|||
250 | print xs, y |
|
|||
251 | raise error.RepoError('ancestors disagree on whether a gca exists') |
|
|||
252 | if y in xs: |
|
|||
253 | return y |
|
|||
254 | xds = finddepths(xs, pfunc) |
|
|||
255 | xds = [ds[x] for x in xs] |
|
|||
256 | yd = finddepths([y], pfunc)[y] |
|
|||
257 | if len([xd != yd for xd in xds]) > 0: |
|
|||
258 | raise error.RepoError('ancestor depths do not match') |
|
|||
259 | return xs.pop() |
|
|||
260 |
|
||||
261 | def missingancestors(revs, bases, pfunc): |
|
216 | def missingancestors(revs, bases, pfunc): | |
262 | """Return all the ancestors of revs that are not ancestors of bases. |
|
217 | """Return all the ancestors of revs that are not ancestors of bases. | |
263 |
|
218 |
@@ -705,17 +705,12 b' class revlog(object):' | |||||
705 | def ancestor(self, a, b): |
|
705 | def ancestor(self, a, b): | |
706 | """calculate the least common ancestor of nodes a and b""" |
|
706 | """calculate the least common ancestor of nodes a and b""" | |
707 |
|
707 | |||
708 | # fast path, check if it is a descendant |
|
|||
709 | a, b = self.rev(a), self.rev(b) |
|
708 | a, b = self.rev(a), self.rev(b) | |
710 | start, end = sorted((a, b)) |
|
709 | ancs = ancestor.ancestors(self.parentrevs, a, b) | |
711 | if self.descendant(start, end): |
|
710 | if ancs: | |
712 | return self.node(start) |
|
711 | # choose a consistent winner when there's a tie | |
713 |
|
712 | return min(map(self.node, ancs)) | ||
714 | c = ancestor.ancestor(a, b, self.parentrevs) |
|
713 | return nullid | |
715 | if c is None: |
|
|||
716 | return nullid |
|
|||
717 |
|
||||
718 | return self.node(c) |
|
|||
719 |
|
714 | |||
720 | def _match(self, id): |
|
715 | def _match(self, id): | |
721 | if isinstance(id, int): |
|
716 | if isinstance(id, int): |
General Comments 0
You need to be logged in to leave comments.
Login now