changeset 17759:9c7497cd39fd

histedit: add obsolete support When the obsolete feature is enabled, histedit creates obsolescence marker instead of stripping replaced changesets. For now, we keep stripping temporary nodes created along the way.
author Pierre-Yves David <pierre-yves.david@logilab.fr>
date Thu, 27 Sep 2012 13:59:48 +0200
parents 5863f0e4cd3a
children 1b8e820ef19d
files hgext/histedit.py tests/test-histedit-obsolete.t
diffstat 2 files changed, 104 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/histedit.py	Thu Oct 11 08:36:50 2012 +0200
+++ b/hgext/histedit.py	Thu Sep 27 13:59:48 2012 +0200
@@ -156,6 +156,7 @@
 from mercurial import repair
 from mercurial import scmutil
 from mercurial import util
+from mercurial import obsolete
 from mercurial import merge as mergemod
 from mercurial.i18n import _
 
@@ -508,7 +509,15 @@
         if mapping:
             movebookmarks(ui, repo, mapping, topmost, ntm)
             # TODO update mq state
-        cleanupnode(ui, repo, 'replaced', mapping)
+        if obsolete._enabled:
+            markers = []
+            for prec, succs in mapping.iteritems():
+                markers.append((repo[prec],
+                                tuple(repo[s] for s in succs)))
+            if markers:
+                obsolete.createmarkers(repo, markers)
+        else:
+            cleanupnode(ui, repo, 'replaced', mapping)
 
     cleanupnode(ui, repo, 'temp', tmpnodes)
     os.unlink(os.path.join(repo.path, 'histedit-state'))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-histedit-obsolete.t	Thu Sep 27 13:59:48 2012 +0200
@@ -0,0 +1,94 @@
+  $ . "$TESTDIR/histedit-helpers.sh"
+
+Enable obsolete
+
+  $ cat > ${TESTTMP}/obs.py << EOF
+  > import mercurial.obsolete
+  > mercurial.obsolete._enabled = True
+  > EOF
+
+  $ cat >> $HGRCPATH << EOF
+  > [ui]
+  > logtemplate= {rev}:{node|short} {desc|firstline}
+  > [phases]
+  > publish=False
+  > [extensions]'
+  > histedit=
+  > 
+  > obs=${TESTTMP}/obs.py
+  > EOF
+
+  $ hg init base
+  $ cd base
+
+  $ for x in a b c d e f ; do
+  >     echo $x > $x
+  >     hg add $x
+  >     hg ci -m $x
+  > done
+
+  $ hg log --graph
+  @  5:652413bf663e f
+  |
+  o  4:e860deea161a e
+  |
+  o  3:055a42cdd887 d
+  |
+  o  2:177f92b77385 c
+  |
+  o  1:d2ae7f538514 b
+  |
+  o  0:cb9a9f314b8b a
+  
+
+  $ HGEDITOR=cat hg histedit 1
+  pick d2ae7f538514 1 b
+  pick 177f92b77385 2 c
+  pick 055a42cdd887 3 d
+  pick e860deea161a 4 e
+  pick 652413bf663e 5 f
+  
+  # Edit history between d2ae7f538514 and 652413bf663e
+  #
+  # Commands:
+  #  p, pick = use commit
+  #  e, edit = use commit, but stop for amending
+  #  f, fold = use commit, but fold into previous commit (combines N and N-1)
+  #  d, drop = remove commit from history
+  #  m, mess = edit message without changing commit content
+  #
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cat >> commands.txt <<EOF
+  > pick 177f92b77385 2 c
+  > drop d2ae7f538514 1 b
+  > pick 055a42cdd887 3 d
+  > fold e860deea161a 4 e
+  > pick 652413bf663e 5 f
+  > EOF
+  $ hg histedit 1 --commands commands.txt --verbose | grep histedit
+  saved backup bundle to $TESTTMP/base/.hg/strip-backup/34a9919932c1-backup.hg (glob)
+  $ hg log --graph --hidden
+  @  8:0efacef7cb48 f
+  |
+  o  7:ae467701c500 d
+  |
+  o  6:d36c0562f908 c
+  |
+  | x  5:652413bf663e f
+  | |
+  | x  4:e860deea161a e
+  | |
+  | x  3:055a42cdd887 d
+  | |
+  | x  2:177f92b77385 c
+  | |
+  | x  1:d2ae7f538514 b
+  |/
+  o  0:cb9a9f314b8b a
+  
+  $ hg debugobsolete
+  e860deea161a2f77de56603b340ebbb4536308ae ae467701c5006bf21ffcfdb555b3d6b63280b6b7 0 {'date': '*', 'user': 'test'} (glob)
+  652413bf663ef2a641cab26574e46d5f5a64a55a 0efacef7cb481bf574f69075b82d044fdbe5c20f 0 {'date': '*': 'test'} (glob)
+  d2ae7f538514cd87c17547b0de4cea71fe1af9fb 0 {'date': '*', 'user': 'test'} (glob)
+  055a42cdd88768532f9cf79daa407fc8d138de9b ae467701c5006bf21ffcfdb555b3d6b63280b6b7 0 {'date': '*': 'test'} (glob)
+  177f92b773850b59254aa5e923436f921b55483b d36c0562f908c692f5204d606d4ff3537d41f1bf 0 {'date': '*', 'user': 'test'} (glob)