Mercurial > hg-stable
changeset 27029:8279c5d116a0
strip: strip a list of bookmarks
Currently strip works with a single bookmark,
the changes in this patch modifies the strip module
to work with a list of bookmarks
Building on this we can take a list of bookmarks as input
and remove all of them in a single go
author | Shubhanshu Agrawal <agrawal.shubhanshu@gmail.com> |
---|---|
date | Sun, 15 Nov 2015 21:03:44 +0530 |
parents | f92053df8f0b |
children | cf9ed6d32ccb |
files | hgext/strip.py |
diffstat | 1 files changed, 26 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- a/hgext/strip.py Wed Nov 18 23:23:03 2015 -0800 +++ b/hgext/strip.py Sun Nov 15 21:03:44 2015 +0530 @@ -44,7 +44,7 @@ raise error.Abort(_("local changed subrepos found" + excsuffix)) return s -def strip(ui, repo, revs, update=True, backup=True, force=None, bookmark=None): +def strip(ui, repo, revs, update=True, backup=True, force=None, bookmarks=None): wlock = lock = None try: wlock = repo.wlock() @@ -63,12 +63,14 @@ repair.strip(ui, repo, revs, backup) repomarks = repo._bookmarks - if bookmark: - if bookmark == repo._activebookmark: + if bookmarks: + if repo._activebookmark in bookmarks: bookmarksmod.deactivate(repo) - del repomarks[bookmark] + for bookmark in bookmarks: + del repomarks[bookmark] repomarks.write() - ui.write(_("bookmark '%s' deleted\n") % bookmark) + for bookmark in sorted(bookmarks): + ui.write(_("bookmark '%s' deleted\n") % bookmark) finally: release(lock, wlock) @@ -127,27 +129,31 @@ wlock = repo.wlock() try: - bookmark = opts.get('bookmark') - if bookmark: + bookmarks = None + if opts.get('bookmark'): + bookmarks = set([opts.get('bookmark')]) + if bookmarks: repomarks = repo._bookmarks - if bookmark not in repomarks: - raise error.Abort(_("bookmark '%s' not found") % bookmark) + if not bookmarks.issubset(repomarks): + raise error.Abort(_("bookmark '%s' not found") % + ','.join(sorted(bookmarks - set(repomarks.keys())))) # If the requested bookmark is not the only one pointing to a # a revision we have to only delete the bookmark and not strip # anything. revsets cannot detect that case. - uniquebm = True - for m, n in repomarks.iteritems(): - if m != bookmark and n == repo[bookmark].node(): - uniquebm = False - break - if uniquebm: - rsrevs = repair.stripbmrevset(repo, bookmark) - revs.update(set(rsrevs)) + nodetobookmarks = {} + for mark, node in repomarks.iteritems(): + nodetobookmarks.setdefault(node, []).append(mark) + for marks in nodetobookmarks.values(): + if bookmarks.issuperset(marks): + rsrevs = repair.stripbmrevset(repo, marks[0]) + revs.update(set(rsrevs)) if not revs: - del repomarks[bookmark] + for bookmark in bookmarks: + del repomarks[bookmark] repomarks.write() - ui.write(_("bookmark '%s' deleted\n") % bookmark) + for bookmark in sorted(bookmarks): + ui.write(_("bookmark '%s' deleted\n") % bookmark) if not revs: raise error.Abort(_('empty revision set')) @@ -214,7 +220,7 @@ strip(ui, repo, revs, backup=backup, update=update, - force=opts.get('force'), bookmark=bookmark) + force=opts.get('force'), bookmarks=bookmarks) finally: wlock.release()