Show More
@@ -3076,7 +3076,7 b' def debugobsolete(ui, repo, precursor=No' | |||||
3076 | 'of transaction.')) |
|
3076 | 'of transaction.')) | |
3077 |
|
3077 | |||
3078 | with repo.lock(): |
|
3078 | with repo.lock(): | |
3079 |
n = repo.obsstore |
|
3079 | n = repair.deleteobsmarkers(repo.obsstore, indices) | |
3080 | ui.write(_('deleted %i obsolescense markers\n') % n) |
|
3080 | ui.write(_('deleted %i obsolescense markers\n') % n) | |
3081 |
|
3081 | |||
3082 | return |
|
3082 | return |
@@ -628,30 +628,6 b' class obsstore(object):' | |||||
628 | transaction.hookargs['new_obsmarkers'] = str(previous + len(new)) |
|
628 | transaction.hookargs['new_obsmarkers'] = str(previous + len(new)) | |
629 | return len(new) |
|
629 | return len(new) | |
630 |
|
630 | |||
631 | def delete(self, indices): |
|
|||
632 | """Delete some obsmarkers from store and return how many were deleted |
|
|||
633 |
|
||||
634 | Indices is a list of ints which are the indices |
|
|||
635 | of the markers to be deleted.""" |
|
|||
636 | if not indices: |
|
|||
637 | # we don't want to rewrite the obsstore with the same content |
|
|||
638 | return |
|
|||
639 |
|
||||
640 | left = [] |
|
|||
641 | current = self._all |
|
|||
642 | n = 0 |
|
|||
643 | for i, m in enumerate(current): |
|
|||
644 | if i in indices: |
|
|||
645 | n += 1 |
|
|||
646 | continue |
|
|||
647 | left.append(m) |
|
|||
648 |
|
||||
649 | newobsstore = self.svfs('obsstore', 'w', atomictemp=True) |
|
|||
650 | for bytes in encodemarkers(left, True, self._version): |
|
|||
651 | newobsstore.write(bytes) |
|
|||
652 | newobsstore.close() |
|
|||
653 | return n |
|
|||
654 |
|
||||
655 | def mergemarkers(self, transaction, data): |
|
631 | def mergemarkers(self, transaction, data): | |
656 | """merge a binary stream of markers inside the obsstore |
|
632 | """merge a binary stream of markers inside the obsstore | |
657 |
|
633 |
@@ -17,6 +17,7 b' from . import (' | |||||
17 | changegroup, |
|
17 | changegroup, | |
18 | error, |
|
18 | error, | |
19 | exchange, |
|
19 | exchange, | |
|
20 | obsolete, | |||
20 | util, |
|
21 | util, | |
21 | ) |
|
22 | ) | |
22 |
|
23 | |||
@@ -313,3 +314,32 b' def stripbmrevset(repo, mark):' | |||||
313 | "ancestors(head() and not bookmark(%s)) - " |
|
314 | "ancestors(head() and not bookmark(%s)) - " | |
314 | "ancestors(bookmark() and not bookmark(%s))", |
|
315 | "ancestors(bookmark() and not bookmark(%s))", | |
315 | mark, mark, mark) |
|
316 | mark, mark, mark) | |
|
317 | ||||
|
318 | def deleteobsmarkers(obsstore, indices): | |||
|
319 | """Delete some obsmarkers from obsstore and return how many were deleted | |||
|
320 | ||||
|
321 | 'indices' is a list of ints which are the indices | |||
|
322 | of the markers to be deleted. | |||
|
323 | ||||
|
324 | Every invocation of this function completely rewrites the obsstore file, | |||
|
325 | skipping the markers we want to be removed. The new temporary file is | |||
|
326 | created, remaining markers are written there and on .close() this file | |||
|
327 | gets atomically renamed to obsstore, thus guaranteeing consistency.""" | |||
|
328 | if not indices: | |||
|
329 | # we don't want to rewrite the obsstore with the same content | |||
|
330 | return | |||
|
331 | ||||
|
332 | left = [] | |||
|
333 | current = obsstore._all | |||
|
334 | n = 0 | |||
|
335 | for i, m in enumerate(current): | |||
|
336 | if i in indices: | |||
|
337 | n += 1 | |||
|
338 | continue | |||
|
339 | left.append(m) | |||
|
340 | ||||
|
341 | newobsstorefile = obsstore.svfs('obsstore', 'w', atomictemp=True) | |||
|
342 | for bytes in obsolete.encodemarkers(left, True, obsstore._version): | |||
|
343 | newobsstorefile.write(bytes) | |||
|
344 | newobsstorefile.close() | |||
|
345 | return n |
General Comments 0
You need to be logged in to leave comments.
Login now