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).
This commit is contained in:
Kostia Balytskyi 2016-04-12 04:06:50 -07:00
parent ab0e2307c2
commit 47727221bc
3 changed files with 31 additions and 25 deletions

View File

@ -3076,7 +3076,7 @@ def debugobsolete(ui, repo, precursor=None, *successors, **opts):
'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

View File

@ -628,30 +628,6 @@ class obsstore(object):
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

View File

@ -17,6 +17,7 @@ from . import (
changegroup,
error,
exchange,
obsolete,
util,
)
@ -313,3 +314,32 @@ def stripbmrevset(repo, mark):
"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