diff -r ffcc649a4e8f -r 445a25bb70be mercurial/repair.py --- a/mercurial/repair.py Tue Apr 12 03:40:53 2016 -0700 +++ b/mercurial/repair.py Tue Apr 12 04:06:50 2016 -0700 @@ -17,6 +17,7 @@ changegroup, error, exchange, + obsolete, util, ) @@ -313,3 +314,32 @@ "ancestors(head() and not bookmark(%s)) - " "ancestors(bookmark() and not bookmark(%s))", mark, mark, mark) + +def deleteobsmarkers(obsstore, indices): + """Delete some obsmarkers from obsstore and return how many were deleted + + 'indices' is a list of ints which are the indices + of the markers to be deleted. + + Every invocation of this function completely rewrites the obsstore file, + skipping the markers we want to be removed. The new temporary file is + created, remaining markers are written there and on .close() this file + gets atomically renamed to obsstore, thus guaranteeing consistency.""" + if not indices: + # we don't want to rewrite the obsstore with the same content + return + + left = [] + current = obsstore._all + n = 0 + for i, m in enumerate(current): + if i in indices: + n += 1 + continue + left.append(m) + + newobsstorefile = obsstore.svfs('obsstore', 'w', atomictemp=True) + for bytes in obsolete.encodemarkers(left, True, obsstore._version): + newobsstorefile.write(bytes) + newobsstorefile.close() + return n