168 |
168 |
169 self.cache = (node, n, text) |
169 self.cache = (node, n, text) |
170 return node |
170 return node |
171 |
171 |
172 def ancestor(self, a, b): |
172 def ancestor(self, a, b): |
173 def expand(e1, e2, a1, a2): |
173 def expand(list, map): |
174 ne = [] |
174 a = [] |
175 for n in e1: |
175 while list: |
176 (p1, p2) = self.parents(n) |
176 n = list.pop(0) |
177 if p1 in a2: return p1 |
177 map[n] = 1 |
178 if p2 in a2: return p2 |
178 yield n |
179 if p1 != nullid and p1 not in a1: |
179 for p in self.parents(n): |
180 a1[p1] = 1 |
180 if p != nullid and p not in map: |
181 ne.append(p1) |
181 list.append(p) |
182 if p2 != nullid and p2 not in a1: |
182 yield nullid |
183 a1[p2] = 1 |
183 |
184 ne.append(p2) |
184 amap = {} |
185 return expand(e2, ne, a2, a1) |
185 bmap = {} |
186 return expand([a], [b], {a:1}, {b:1}) |
186 ag = expand([a], amap) |
|
187 bg = expand([b], bmap) |
|
188 adone = bdone = 0 |
|
189 |
|
190 while not adone or not bdone: |
|
191 if not adone: |
|
192 an = ag.next() |
|
193 if an == nullid: |
|
194 adone = 1 |
|
195 elif an in bmap: |
|
196 return an |
|
197 if not bdone: |
|
198 bn = bg.next() |
|
199 if bn == nullid: |
|
200 bdone = 1 |
|
201 elif bn in amap: |
|
202 return bn |
|
203 |
|
204 return nullid |
187 |
205 |
188 def mergedag(self, other, transaction, linkseq, accumulate = None): |
206 def mergedag(self, other, transaction, linkseq, accumulate = None): |
189 """combine the nodes from other's DAG into ours""" |
207 """combine the nodes from other's DAG into ours""" |
190 old = self.tip() |
208 old = self.tip() |
191 i = self.count() |
209 i = self.count() |