# HG changeset patch # User Kostia Balytskyi # Date 1460459210 25200 # Node ID 445a25bb70be6a748c3eef2d5cc09d53bb65f79e # Parent ffcc649a4e8f7287e370276ba00eb347fdc16652 obsstore: move delete function from obsstore class to repair module Since one of the original patches was accepted already and people on the mailing list still have suggestions as to how this should be improved, I'm implementing those suggestions in the following patches (this and the ones that might follow). diff -r ffcc649a4e8f -r 445a25bb70be mercurial/commands.py --- a/mercurial/commands.py Tue Apr 12 03:40:53 2016 -0700 +++ b/mercurial/commands.py Tue Apr 12 04:06:50 2016 -0700 @@ -3076,7 +3076,7 @@ 'of transaction.')) with repo.lock(): - n = repo.obsstore.delete(indices) + n = repair.deleteobsmarkers(repo.obsstore, indices) ui.write(_('deleted %i obsolescense markers\n') % n) return diff -r ffcc649a4e8f -r 445a25bb70be mercurial/obsolete.py --- a/mercurial/obsolete.py Tue Apr 12 03:40:53 2016 -0700 +++ b/mercurial/obsolete.py Tue Apr 12 04:06:50 2016 -0700 @@ -628,30 +628,6 @@ transaction.hookargs['new_obsmarkers'] = str(previous + len(new)) return len(new) - def delete(self, indices): - """Delete some obsmarkers from store and return how many were deleted - - Indices is a list of ints which are the indices - of the markers to be deleted.""" - if not indices: - # we don't want to rewrite the obsstore with the same content - return - - left = [] - current = self._all - n = 0 - for i, m in enumerate(current): - if i in indices: - n += 1 - continue - left.append(m) - - newobsstore = self.svfs('obsstore', 'w', atomictemp=True) - for bytes in encodemarkers(left, True, self._version): - newobsstore.write(bytes) - newobsstore.close() - return n - def mergemarkers(self, transaction, data): """merge a binary stream of markers inside the obsstore 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