Show More
@@ -193,13 +193,44 b' def _revinfogetter(repo):' | |||
|
193 | 193 | changelogrevision = cl.changelogrevision |
|
194 | 194 | flags = cl.flags |
|
195 | 195 | |
|
196 | # A small cache to avoid doing the work twice for merges | |
|
197 | # | |
|
198 | # In the vast majority of cases, if we ask information for a revision | |
|
199 | # about 1 parent, we'll later ask it for the other. So it make sense to | |
|
200 | # keep the information around when reaching the first parent of a merge | |
|
201 | # and dropping it after it was provided for the second parents. | |
|
202 | # | |
|
203 | # It exists cases were only one parent of the merge will be walked. It | |
|
204 | # happens when the "destination" the copy tracing is descendant from a | |
|
205 | # new root, not common with the "source". In that case, we will only walk | |
|
206 | # through merge parents that are descendant of changesets common | |
|
207 | # between "source" and "destination". | |
|
208 | # | |
|
209 | # With the current case implementation if such changesets have a copy | |
|
210 | # information, we'll keep them in memory until the end of | |
|
211 | # _changesetforwardcopies. We don't expect the case to be frequent | |
|
212 | # enough to matters. | |
|
213 | # | |
|
214 | # In addition, it would be possible to reach pathological case, were | |
|
215 | # many first parent are met before any second parent is reached. In | |
|
216 | # that case the cache could grow. If this even become an issue one can | |
|
217 | # safely introduce a maximum cache size. This would trade extra CPU/IO | |
|
218 | # time to save memory. | |
|
219 | merge_caches = {} | |
|
220 | ||
|
196 | 221 | def revinfo(rev): |
|
197 | 222 | p1, p2 = parents(rev) |
|
198 | 223 | if flags(rev) & REVIDX_SIDEDATA: |
|
224 | e = merge_caches.pop(rev, None) | |
|
225 | if e is not None: | |
|
226 | return e | |
|
199 | 227 | c = changelogrevision(rev) |
|
200 | 228 | p1copies = c.p1copies |
|
201 | 229 | p2copies = c.p2copies |
|
202 | 230 | removed = c.filesremoved |
|
231 | if p1 != node.nullrev and p2 != node.nullrev: | |
|
232 | # XXX some case we over cache, IGNORE | |
|
233 | merge_caches[rev] = (p1, p2, p1copies, p2copies, removed) | |
|
203 | 234 | else: |
|
204 | 235 | p1copies = {} |
|
205 | 236 | p2copies = {} |
General Comments 0
You need to be logged in to leave comments.
Login now