# HG changeset patch # User Augie Fackler # Date 1343339870 18000 # Node ID ec7b9bec19c9de89c7c0527a9603fd93fff673fe # Parent c4ebdc36c17e975779f6316549e1118c732cb00c strip: move bookmarks to nearest ancestor rather than '.' If you've got this graph: 0-1-2 \ 3 and 3 is checked out, 2 is bookmarked with "broken", and you do "hg strip 2", the bookmark will move to 3, not 1. That's always struck me as a bug. This change makes bookmarks move to the tipmost ancestor of the stripped set rather than the currently-checked-out revision, which is what I always expected should happen. diff -r c4ebdc36c17e -r ec7b9bec19c9 mercurial/commands.py --- a/mercurial/commands.py Fri Jul 27 12:33:48 2012 -0500 +++ b/mercurial/commands.py Thu Jul 26 16:57:50 2012 -0500 @@ -1298,10 +1298,20 @@ editor=editor, extra=extra) + current = repo._bookmarkcurrent + marks = old.bookmarks() node = cmdutil.amend(ui, repo, commitfunc, old, extra, pats, opts) if node == old.node(): ui.status(_("nothing changed\n")) return 1 + elif marks: + ui.debug('moving bookmarks %r from %s to %s\n' % + (marks, old.hex(), hex(node))) + for bm in marks: + repo._bookmarks[bm] = node + if bm == current: + bookmarks.setcurrent(repo, bm) + bookmarks.write(repo) else: e = cmdutil.commiteditor if opts.get('force_editor'): diff -r c4ebdc36c17e -r ec7b9bec19c9 mercurial/repair.py --- a/mercurial/repair.py Fri Jul 27 12:33:48 2012 -0500 +++ b/mercurial/repair.py Thu Jul 26 16:57:50 2012 -0500 @@ -111,6 +111,13 @@ saverevs.difference_update(descendants) savebases = [cl.node(r) for r in saverevs] stripbases = [cl.node(r) for r in tostrip] + rset = ' or '.join([str(r) for r in tostrip]) + newbmtarget = repo.revs('sort(heads(ancestors(%r) - (%r)), -rev)', + rset, rset) + if newbmtarget: + newbmtarget = newbmtarget[0] + else: + newbmtarget = '.' bm = repo._bookmarks updatebm = [] @@ -174,7 +181,7 @@ ui.warn(_('error removing %s: %s\n') % (undofile, str(e))) for m in updatebm: - bm[m] = repo['.'].node() + bm[m] = repo[newbmtarget].node() bookmarks.write(repo) except: # re-raises if backupfile: @@ -192,4 +199,3 @@ # Multiple branches involved in strip. Will allow branchcache to become # invalid and later on rebuilt from scratch repo.destroyed() - diff -r c4ebdc36c17e -r ec7b9bec19c9 tests/test-bookmarks-strip.t --- a/tests/test-bookmarks-strip.t Fri Jul 27 12:33:48 2012 -0500 +++ b/tests/test-bookmarks-strip.t Thu Jul 26 16:57:50 2012 -0500 @@ -60,8 +60,8 @@ list bookmarks $ hg book - test 1:8cf31af87a2b - test2 1:8cf31af87a2b + test 0:5c9ad3787638 + test2 0:5c9ad3787638 immediate rollback and reentrancy issue diff -r c4ebdc36c17e -r ec7b9bec19c9 tests/test-bookmarks.t --- a/tests/test-bookmarks.t Fri Jul 27 12:33:48 2012 -0500 +++ b/tests/test-bookmarks.t Thu Jul 26 16:57:50 2012 -0500 @@ -390,3 +390,70 @@ $ echo "925d80f479bc z" > .hg/bookmarks $ hg book no bookmarks set + +test stripping a non-checked-out but bookmarked revision + + $ hg --config extensions.graphlog= log --graph + o changeset: 4:9ba5f110a0b3 + | branch: test + | tag: tip + | parent: 2:db815d6d32e6 + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: y + | + | @ changeset: 3:125c9a1d6df6 + |/ user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: x + | + o changeset: 2:db815d6d32e6 + | parent: 0:f7b1eb17ad24 + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: 2 + | + | o changeset: 1:925d80f479bb + |/ user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: 1 + | + o changeset: 0:f7b1eb17ad24 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: 0 + + $ hg book should-end-on-two + $ hg co --clean 4 + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg book four + $ hg --config extensions.mq= strip 3 + saved backup bundle to * (glob) +should-end-on-two should end up pointing to revision 2, as that's the +tipmost surviving ancestor of the stripped revision. + $ hg --config extensions.graphlog= log --graph + @ changeset: 3:9ba5f110a0b3 + | branch: test + | bookmark: four + | tag: tip + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: y + | + o changeset: 2:db815d6d32e6 + | bookmark: should-end-on-two + | parent: 0:f7b1eb17ad24 + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: 2 + | + | o changeset: 1:925d80f479bb + |/ user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: 1 + | + o changeset: 0:f7b1eb17ad24 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: 0 +