Mercurial > hg
comparison mercurial/obsolete.py @ 24393:77eace2a63cb
obsolete: avoid infinite loop from obs-cycle in divergence (issue4126)
As for other currently in place cycle detection, arbitrarily cut the first
obsolescence link that create a cycle avoiding the infinite loop. This will have
to be made more deterministic in the future but we do not really care right now.
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Thu, 19 Mar 2015 13:00:44 -0700 |
parents | d6440a5076a5 |
children | cd0068232ec0 |
comparison
equal
deleted
inserted
replaced
24392:dc7588ce06b3 | 24393:77eace2a63cb |
---|---|
1162 obsstore = repo.obsstore | 1162 obsstore = repo.obsstore |
1163 newermap = {} | 1163 newermap = {} |
1164 for ctx in repo.set('(not public()) - obsolete()'): | 1164 for ctx in repo.set('(not public()) - obsolete()'): |
1165 mark = obsstore.precursors.get(ctx.node(), ()) | 1165 mark = obsstore.precursors.get(ctx.node(), ()) |
1166 toprocess = set(mark) | 1166 toprocess = set(mark) |
1167 seen = set() | |
1167 while toprocess: | 1168 while toprocess: |
1168 prec = toprocess.pop()[0] | 1169 prec = toprocess.pop()[0] |
1170 if prec in seen: | |
1171 continue # emergency cycle hanging prevention | |
1172 seen.add(prec) | |
1169 if prec not in newermap: | 1173 if prec not in newermap: |
1170 successorssets(repo, prec, newermap) | 1174 successorssets(repo, prec, newermap) |
1171 newer = [n for n in newermap[prec] if n] | 1175 newer = [n for n in newermap[prec] if n] |
1172 if len(newer) > 1: | 1176 if len(newer) > 1: |
1173 divergent.add(ctx.rev()) | 1177 divergent.add(ctx.rev()) |