[PATCH 4 of 6 V3] histedit: add obsolete support

pierre-yves.david at logilab.fr pierre-yves.david at logilab.fr
Wed Oct 10 03:59:57 CDT 2012


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at logilab.fr>
# Date 1348747188 -7200
# Node ID 7cc1185729ca3ca279a45b6447e99c023963acd4
# Parent  c786719a979b028f259e2ccd50b74ba5881ff5b2
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.

diff --git a/hgext/histedit.py b/hgext/histedit.py
--- a/hgext/histedit.py
+++ b/hgext/histedit.py
@@ -154,10 +154,11 @@ from mercurial import hg
 from mercurial import lock as lockmod
 from mercurial import node
 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 _
 
 cmdtable = {}
 command = cmdutil.command(cmdtable)
@@ -506,11 +507,19 @@ def histedit(ui, repo, *parent, **opts):
 
     if not keep:
         if mapping:
             movebookmarks(ui, repo, mapping)
             # 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'))
     if os.path.exists(repo.sjoin('undo')):
         os.unlink(repo.sjoin('undo'))
diff --git a/tests/test-histedit-obsolete.t b/tests/test-histedit-obsolete.t
new file mode 100644
--- /dev/null
+++ b/tests/test-histedit-obsolete.t
@@ -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)


More information about the Mercurial-devel mailing list