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())