# HG changeset patch # User Levi Bard # Date 1360574471 0 # Node ID 070bbbb0e6f201a2b91584a8e55bc82d429e9a18 # Parent 3867f7b1fe6e7fe99a2340ff773d5c26e385b288 prune: add strip-like bookmark This prune changesets pointed by the specified bookmark only (and removes the bookmarks) diff -r 3867f7b1fe6e -r 070bbbb0e6f2 README --- a/README Sun Feb 10 16:17:01 2013 +0100 +++ b/README Mon Feb 11 09:21:11 2013 +0000 @@ -46,12 +46,13 @@ 3.1.0 -- -- prune: various minor improvements - amend: drop deprecated --change option for amend - alias: add a grab aliast to be used instead of graft -O - touch: add a --duplicate option to *not* obsolete the old version - touch: fix touching multiple revision at the same time - evolve: add a --all option +- prune: various minor improvements +- prune: add option to prune a specific bookmark 3.0.0 -- 2013-02-02 diff -r 3867f7b1fe6e -r 070bbbb0e6f2 hgext/evolve.py --- a/hgext/evolve.py Sun Feb 10 16:17:01 2013 +0100 +++ b/hgext/evolve.py Mon Feb 11 09:21:11 2013 +0000 @@ -1242,10 +1242,42 @@ ui.warn(_('Multiple non-obsolete children, explicitly update to one\n')) return 1 +def _reachablefrombookmark(repo, revs, mark): + """filter revisions and bookmarks reachable from the given bookmark + yoinked from mq.py + """ + marks = repo._bookmarks + if mark not in marks: + raise util.Abort(_("bookmark '%s' not found") % mark) + + # 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 marks.iteritems(): + if m != mark and n == repo[mark].node(): + uniquebm = False + break + if uniquebm: + rsrevs = repo.revs("ancestors(bookmark(%s)) - " + "ancestors(head() and not bookmark(%s)) - " + "ancestors(bookmark() and not bookmark(%s)) - " + "obsolete()", + mark, mark, mark) + revs.update(set(rsrevs)) + return marks,revs + +def _deletebookmark(ui, marks, mark): + del marks[mark] + marks.write() + ui.write(_("bookmark '%s' deleted\n") % mark) + @command('^prune|obsolete|kill', [('n', 'new', [], _("successor changeset (DEPRECATED)")), ('s', 'succ', [], _("successor changeset")), - ('r', 'rev', [], _("revisions to prune"))], + ('r', 'rev', [], _("revisions to prune")), + ('B', 'bookmark', '', _("remove revs only reachable from given" + " bookmark"))], _('[OPTION] [-r] REV...')) # -d --date # -u --user @@ -1263,12 +1295,20 @@ you can use the ``--succ`` option to informs mercurial that a newer version of the pruned changeset exists. + """ + revs = set(scmutil.revrange(repo, list(revs) + opts.get('rev'))) + succs = opts['new'] + opts['succ'] + bookmark = opts.get('bookmark') - XXX this commands needs bookmarks support. - """ - revs = list(revs) - revs.extend(opts['rev']) - succs = opts['new'] + opts['succ'] + if bookmark: + marks,revs = _reachablefrombookmark(repo, revs, bookmark) + if not revs: + # no revisions to prune - delete bookmark immediately + _deletebookmark(ui, marks, bookmark) + + if not revs: + raise util.Abort(_('nothing to prune')) + wlock = lock = None wlock = repo.wlock() sortedrevs = lambda specs: sorted(set(scmutil.revrange(repo, specs))) @@ -1303,16 +1343,15 @@ if newnode.node() != wdp.node(): commands.update(ui, repo, newnode.rev()) ui.status(_('working directory now at %s\n') % newnode) - # upVdate bookmarks + # update bookmarks + if bookmark: + _deletebookmark(ui, marks, bookmark) for ctx in repo.unfiltered().set('bookmark() and %ld', precs): ldest = list(repo.set('max((::%d) - obsolete())', ctx)) if ldest: dest = ldest[0] updatebookmarks = _bookmarksupdater(repo, ctx.node()) updatebookmarks(dest.node()) - else: - # delete bookmarks - pass finally: lockmod.release(lock, wlock) diff -r 3867f7b1fe6e -r 070bbbb0e6f2 tests/test-prune.t --- a/tests/test-prune.t Sun Feb 10 16:17:01 2013 +0100 +++ b/tests/test-prune.t Mon Feb 11 09:21:11 2013 +0000 @@ -194,3 +194,41 @@ 00ded550b1e28bba454bd34cec1269d22cf3ef25 aa96dc3f04c2c2341fe6880aeb6dc9fbffff9ef9 8ee176ff1d4b2034ce51e3efc579c2de346b631d 0 {'date': '**', 'user': 'test'} (glob) 814c38b95e72dfe2cbf675b1649ea9d780c89a80 6f6f25e4f748d8f7571777e6e168aedf50350ce8 0 {'date': '*', 'user': 'test'} (glob) 354011cd103f58bbbd9091a3cee6d6a6bd0dddf7 6f6f25e4f748d8f7571777e6e168aedf50350ce8 0 {'date': '*', 'user': 'test'} (glob) + +test hg prune -B bookmark +yoinked from test-mq-strip.t + + $ cd .. + $ hg init bookmarks + $ cd bookmarks + $ hg debugbuilddag '..<2.*1/2:m<2+3:c