D6987: strip: move strip extension to core

navaneeth.suresh (Navaneeth Suresh) phabricator at mercurial-scm.org
Sun Oct 6 13:59:02 EDT 2019


navaneeth.suresh updated this revision to Diff 16914.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D6987?vs=16856&id=16914

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6987/new/

REVISION DETAIL
  https://phab.mercurial-scm.org/D6987

AFFECTED FILES
  hgext/mq.py
  hgext/strip.py
  mercurial/debugcommands.py
  mercurial/strip.py
  tests/remotefilelog-library.sh
  tests/test-backout.t
  tests/test-blackbox.t
  tests/test-bookmarks-pushpull.t
  tests/test-bookmarks-strip.t
  tests/test-bookmarks.t
  tests/test-branches.t
  tests/test-bundle-phases.t
  tests/test-commandserver.t
  tests/test-completion.t
  tests/test-convert-filemap.t
  tests/test-convert-svn-sink.t
  tests/test-copy-move-merge.t
  tests/test-debugcommands.t
  tests/test-debugstrip.t
  tests/test-exchange-obsmarkers-case-D1.t
  tests/test-exchange-obsmarkers-case-D2.t
  tests/test-exchange-obsmarkers-case-D3.t
  tests/test-extension.t
  tests/test-flagprocessor.t
  tests/test-generaldelta.t
  tests/test-graft.t
  tests/test-help.t
  tests/test-hgweb-bundle.t
  tests/test-histedit-arguments.t
  tests/test-histedit-edit.t
  tests/test-histedit-obsolete.t
  tests/test-hook.t
  tests/test-import-bypass.t
  tests/test-import-merge.t
  tests/test-import.t
  tests/test-keyword.t
  tests/test-lfs.t
  tests/test-mq-qpush-exact.t
  tests/test-mq.t
  tests/test-narrow-strip.t
  tests/test-obsolete-changeset-exchange.t
  tests/test-obsolete.t
  tests/test-phase-archived.t
  tests/test-phases-exchange.t
  tests/test-phases.t
  tests/test-pull-update.t
  tests/test-push-http.t
  tests/test-push.t
  tests/test-rebase-abort.t
  tests/test-rebase-cache.t
  tests/test-rebase-collapse.t
  tests/test-rebase-inmemory.t
  tests/test-remotefilelog-bgprefetch.t
  tests/test-remotefilelog-bundles.t
  tests/test-remotefilelog-linknodes.t
  tests/test-remotefilelog-local.t
  tests/test-remotefilelog-prefetch.t
  tests/test-remotefilelog-push-pull.t
  tests/test-remotefilelog-repack-fast.t
  tests/test-remotefilelog-repack.t
  tests/test-remotefilelog-sparse.t
  tests/test-repair-strip.t
  tests/test-shelve.t
  tests/test-shelve2.t
  tests/test-single-head.t
  tests/test-sparse-clear.t
  tests/test-sparse-clone.t
  tests/test-sparse-fsmonitor.t
  tests/test-sparse-import.t
  tests/test-sparse-merges.t
  tests/test-sparse-profiles.t
  tests/test-sparse-verbose-json.t
  tests/test-sparse.t
  tests/test-ssh-proto-unbundle.t
  tests/test-strip.t
  tests/test-subrepo-missing.t
  tests/test-subrepo.t
  tests/test-tags.t
  tests/test-template-map.t
  tests/test-transplant.t
  tests/test-treemanifest.t
  tests/testlib/exchange-obsmarker-util.sh
  tests/testlib/push-checkheads-util.sh

CHANGE DETAILS

diff --git a/tests/testlib/push-checkheads-util.sh b/tests/testlib/push-checkheads-util.sh
--- a/tests/testlib/push-checkheads-util.sh
+++ b/tests/testlib/push-checkheads-util.sh
@@ -9,10 +9,6 @@
 # non publishing server
 publish=False
 
-[extensions]
-# we need to strip some changeset for some test cases
-strip=
-
 [experimental]
 # enable evolution
 evolution=all
diff --git a/tests/testlib/exchange-obsmarker-util.sh b/tests/testlib/exchange-obsmarker-util.sh
--- a/tests/testlib/exchange-obsmarker-util.sh
+++ b/tests/testlib/exchange-obsmarker-util.sh
@@ -28,10 +28,6 @@
 # enable evolution
 evolution=true
 
-[extensions]
-# we need to strip some changeset for some test cases
-hgext.strip=
-
 [devel]
 strip-obsmarkers = no
 
diff --git a/tests/test-treemanifest.t b/tests/test-treemanifest.t
--- a/tests/test-treemanifest.t
+++ b/tests/test-treemanifest.t
@@ -316,7 +316,7 @@
 
   $ hg st --change tip
   M dir1/a
-  $ hg --config extensions.strip= strip tip
+  $ hg debugstrip tip
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/repo-mixed/.hg/strip-backup/51cfd7b1e13b-78a2f3ed-backup.hg
   $ hg debugindex --dir dir1
@@ -343,7 +343,7 @@
   added 1 changesets with 1 changes to 1 files
   new changesets 51cfd7b1e13b (1 drafts)
   (run 'hg update' to get a working copy)
-  $ hg --config extensions.strip= strip tip
+  $ hg debugstrip tip
   saved backup bundle to $TESTTMP/repo-mixed/.hg/strip-backup/*-backup.hg (glob)
   $ hg unbundle -q .hg/strip-backup/*
   $ hg debugindex --dir dir1
@@ -897,4 +897,4 @@
   $ hg log -r 'tip + tip^' -T '{manifest}\n'
   1:678d3574b88c
   1:678d3574b88c
-  $ hg --config extensions.strip= strip -r . -q
+  $ hg debugstrip -r . -q
diff --git a/tests/test-transplant.t b/tests/test-transplant.t
--- a/tests/test-transplant.t
+++ b/tests/test-transplant.t
@@ -647,7 +647,7 @@
 
 test "--merge" causing pull from source repository on local host
 
-  $ hg --config extensions.mq= -q strip 2
+  $ hg --config extensions.mq= -q debugstrip 2
   $ hg transplant -s ../t --merge tip
   searching for changes
   searching for changes
@@ -660,7 +660,7 @@
 
 test interactive transplant
 
-  $ hg --config extensions.strip= -q strip 0
+  $ hg -q debugstrip 0
   $ hg -R ../t log -G --template "{rev}:{node|short}"
   @  4:a53251cdf717
   |
diff --git a/tests/test-template-map.t b/tests/test-template-map.t
--- a/tests/test-template-map.t
+++ b/tests/test-template-map.t
@@ -294,7 +294,7 @@
 Remove commit with empty commit message, so as to not pollute further
 tests.
 
-  $ hg --config extensions.strip= strip -q .
+  $ hg debugstrip -q .
 
 Revision with no copies (used to print a traceback):
 
diff --git a/tests/test-tags.t b/tests/test-tags.t
--- a/tests/test-tags.t
+++ b/tests/test-tags.t
@@ -407,7 +407,7 @@
   $ f --size .hg/cache/hgtagsfnodes1
   .hg/cache/hgtagsfnodes1: size=168
 
-  $ hg -q --config extensions.strip= strip -r 6 --no-backup
+  $ hg -q debugstrip -r 6 --no-backup
 #endif
 
 Stripping doesn't truncate the tags cache until new data is available
@@ -420,7 +420,7 @@
   $ f --size .hg/cache/hgtagsfnodes1
   .hg/cache/hgtagsfnodes1: size=144
 
-  $ hg -q --config extensions.strip= strip -r 5 --no-backup
+  $ hg -q debugstrip -r 5 --no-backup
   $ hg tags
   tip                                4:0c192d7d5e6b
   bar                                1:78391a272241
@@ -452,7 +452,7 @@
   $ f --size .hg/cache/hgtagsfnodes1
   .hg/cache/hgtagsfnodes1: size=144
 
-  $ hg -q --config extensions.strip= strip -r 5 --no-backup
+  $ hg -q debugstrip -r 5 --no-backup
 
 Test tag removal:
 
@@ -541,7 +541,7 @@
 
 Strip 1: expose an old head:
 
-  $ hg --config extensions.mq= strip 5
+  $ hg --config extensions.mq= debugstrip 5
   saved backup bundle to $TESTTMP/t3/.hg/strip-backup/*-backup.hg (glob)
   $ hg tags                  # partly stale cache
   tip                                5:735c3ca72986
@@ -552,7 +552,7 @@
 
 Strip 2: destroy whole branch, no old head exposed
 
-  $ hg --config extensions.mq= strip 4
+  $ hg --config extensions.mq= debugstrip 4
   saved backup bundle to $TESTTMP/t3/.hg/strip-backup/*-backup.hg (glob)
   $ hg tags                  # partly stale
   tip                                4:735c3ca72986
diff --git a/tests/test-subrepo.t b/tests/test-subrepo.t
--- a/tests/test-subrepo.t
+++ b/tests/test-subrepo.t
@@ -465,11 +465,7 @@
 
   $ hg co -C 10
   2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cat >> $HGRCPATH <<EOF
-  > [extensions]
-  > strip=
-  > EOF
-  $ hg strip -r 11:15
+  $ hg debugstrip -r 11:15
   saved backup bundle to $TESTTMP/t/.hg/strip-backup/*-backup.hg (glob)
 
 clone
diff --git a/tests/test-subrepo-missing.t b/tests/test-subrepo-missing.t
--- a/tests/test-subrepo-missing.t
+++ b/tests/test-subrepo-missing.t
@@ -108,7 +108,7 @@
 verify will warn if locked-in subrepo revisions are hidden or missing
 
   $ hg ci -m "amended subrepo (again)"
-  $ hg --config extensions.strip= --hidden strip -R subrepo -qr 'tip' --config devel.strip-obsmarkers=no
+  $ hg --hidden debugstrip -R subrepo -qr 'tip' --config devel.strip-obsmarkers=no
   $ hg verify
   checking changesets
   checking manifests
diff --git a/tests/test-ssh-proto-unbundle.t b/tests/test-ssh-proto-unbundle.t
--- a/tests/test-ssh-proto-unbundle.t
+++ b/tests/test-ssh-proto-unbundle.t
@@ -11,13 +11,13 @@
   >   tip=`hg log -r tip -T '{node}'`
   >   echo "${commands}" | hg --verbose debugwireproto --localssh --noreadstderr
   >   if [ -n "$1" ]; then
-  >       hg --config extensions.strip= strip --no-backup -r "all() - ::${tip}"
+  >       hg debugstrip --no-backup -r "all() - ::${tip}"
   >   fi
   >   echo ""
   >   echo 'testing ssh2'
   >   echo "${commands}" | HGRCPATH=$TESTTMP/hgrc-sshv2 hg --verbose debugwireproto --localssh --noreadstderr
   >   if [ -n "$1" ]; then
-  >       hg --config extensions.strip= strip --no-backup -r "all() - ::${tip}"
+  >       hg debugstrip --no-backup -r "all() - ::${tip}"
   >   fi
   > }
 
diff --git a/tests/test-sparse.t b/tests/test-sparse.t
--- a/tests/test-sparse.t
+++ b/tests/test-sparse.t
@@ -5,7 +5,6 @@
   $ cat > .hg/hgrc <<EOF
   > [extensions]
   > sparse=
-  > strip=
   > EOF
 
   $ echo a > show
@@ -260,7 +259,7 @@
    show2 |  1 +
    4 files changed, 4 insertions(+), 2 deletions(-)
   
-  $ hg strip -r . -k
+  $ hg debugstrip -r . -k
   saved backup bundle to $TESTTMP/myrepo/.hg/strip-backup/39278f7c08a9-ce59e002-backup.hg
   $ hg status
   M show
diff --git a/tests/test-sparse-verbose-json.t b/tests/test-sparse-verbose-json.t
--- a/tests/test-sparse-verbose-json.t
+++ b/tests/test-sparse-verbose-json.t
@@ -5,7 +5,6 @@
   $ cat > .hg/hgrc <<EOF
   > [extensions]
   > sparse=
-  > strip=
   > EOF
 
   $ echo a > show
diff --git a/tests/test-sparse-profiles.t b/tests/test-sparse-profiles.t
--- a/tests/test-sparse-profiles.t
+++ b/tests/test-sparse-profiles.t
@@ -6,7 +6,6 @@
   > [extensions]
   > sparse=
   > purge=
-  > strip=
   > rebase=
   > EOF
 
@@ -167,7 +166,7 @@
 
 Verify stripping refreshes dirstate
 
-  $ hg strip -q -r .
+  $ hg debugstrip -q -r .
   $ ls
   backend.sparse
   index.html
diff --git a/tests/test-sparse-merges.t b/tests/test-sparse-merges.t
--- a/tests/test-sparse-merges.t
+++ b/tests/test-sparse-merges.t
@@ -49,7 +49,7 @@
 Test merging things outside of the sparse checkout that are not in the working
 copy
 
-  $ hg strip -q -r . --config extensions.strip=
+  $ hg debugstrip -q -r .
   $ hg up -q feature
   $ touch branchonly
   $ hg ci -Aqm 'add branchonly'
diff --git a/tests/test-sparse-import.t b/tests/test-sparse-import.t
--- a/tests/test-sparse-import.t
+++ b/tests/test-sparse-import.t
@@ -6,7 +6,6 @@
   > [extensions]
   > sparse=
   > purge=
-  > strip=
   > rebase=
   > EOF
 
diff --git a/tests/test-sparse-fsmonitor.t b/tests/test-sparse-fsmonitor.t
--- a/tests/test-sparse-fsmonitor.t
+++ b/tests/test-sparse-fsmonitor.t
@@ -9,7 +9,6 @@
   $ cat > .hg/hgrc <<EOF
   > [extensions]
   > sparse=
-  > strip=
   > EOF
 
 Test fsmonitor integration (if available)
diff --git a/tests/test-sparse-clone.t b/tests/test-sparse-clone.t
--- a/tests/test-sparse-clone.t
+++ b/tests/test-sparse-clone.t
@@ -7,7 +7,6 @@
   > [extensions]
   > sparse=
   > purge=
-  > strip=
   > rebase=
   > EOF
 
diff --git a/tests/test-sparse-clear.t b/tests/test-sparse-clear.t
--- a/tests/test-sparse-clear.t
+++ b/tests/test-sparse-clear.t
@@ -6,7 +6,6 @@
   > [extensions]
   > sparse=
   > purge=
-  > strip=
   > rebase=
   > EOF
 
diff --git a/tests/test-single-head.t b/tests/test-single-head.t
--- a/tests/test-single-head.t
+++ b/tests/test-single-head.t
@@ -197,7 +197,7 @@
 
 actual stripping
 
-  $ hg strip --config extensions.strip= --rev 'desc("c_dH0")'
+  $ hg debugstrip --rev 'desc("c_dH0")'
   saved backup bundle to $TESTTMP/client/.hg/strip-backup/fe47ea669cea-a41bf5a9-backup.hg
 
 Test that closing heads are ignored by default
diff --git a/tests/test-shelve2.t b/tests/test-shelve2.t
--- a/tests/test-shelve2.t
+++ b/tests/test-shelve2.t
@@ -868,7 +868,7 @@
 
   $ cat .hg/shelved/default.shelve
   node=82e0cb9893247d12667017593ce1e5655860f1ac
-  $ hg strip --hidden --rev 82e0cb989324 --no-backup
+  $ hg debugstrip --hidden --rev 82e0cb989324 --no-backup
   $ rm .hg/shelved/default.shelve
   $ hg unshelve
   unshelving change 'default'
diff --git a/tests/test-shelve.t b/tests/test-shelve.t
--- a/tests/test-shelve.t
+++ b/tests/test-shelve.t
@@ -149,7 +149,7 @@
 cleaning the branches made for name checking tests
 
   $ hg up default -q
-  $ hg strip e9177275307e+6a6d231f43d+882bae7c62c2 -q
+  $ hg debugstrip e9177275307e+6a6d231f43d+882bae7c62c2 -q
 
 create an mq patch - shelving should work fine with a patch applied
 
diff --git a/tests/test-repair-strip.t b/tests/test-repair-strip.t
--- a/tests/test-repair-strip.t
+++ b/tests/test-repair-strip.t
@@ -15,7 +15,7 @@
   >   echo % before update $1, strip $2
   >   hg parents
   >   chmod -$3 $4
-  >   hg strip $2 2>&1 | sed 's/\(bundle\).*/\1/' | sed 's/Permission denied.*\.hg\/store\/\(.*\)/Permission denied \.hg\/store\/\1/'
+  >   hg debugstrip $2 2>&1 | sed 's/\(bundle\).*/\1/' | sed 's/Permission denied.*\.hg\/store\/\(.*\)/Permission denied \.hg\/store\/\1/'
   >   echo % after update $1, strip $2
   >   chmod +$3 $4
   >   hg verify
diff --git a/tests/test-remotefilelog-sparse.t b/tests/test-remotefilelog-sparse.t
--- a/tests/test-remotefilelog-sparse.t
+++ b/tests/test-remotefilelog-sparse.t
@@ -46,7 +46,7 @@
 # prefetch sparse only on pull when configured
 
   $ printf "[remotefilelog]\npullprefetch=bookmark()\n" >> .hg/hgrc
-  $ hg strip tip
+  $ hg debugstrip tip
   saved backup bundle to $TESTTMP/shallow/.hg/strip-backup/876b1317060d-b2e91d8d-backup.hg (glob)
 
   $ hg debugsparse --delete z
diff --git a/tests/test-remotefilelog-repack.t b/tests/test-remotefilelog-repack.t
--- a/tests/test-remotefilelog-repack.t
+++ b/tests/test-remotefilelog-repack.t
@@ -249,10 +249,10 @@
   Node          P1 Node       P2 Node       Link Node     Copy From
   577959738234  1bb2e6237e03  000000000000  c7faf2fc439a  x
   21f46f2721e7  000000000000  000000000000  d6868642b790  
-  $ hg strip -r '.^'
+  $ hg debugstrip -r '.^'
   1 files updated, 0 files merged, 1 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/shallow/.hg/strip-backup/609547eda446-b26b56a8-backup.hg (glob)
-  $ hg -R ../master strip -r '.^'
+  $ hg -R ../master debugstrip -r '.^'
   1 files updated, 0 files merged, 1 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/master/.hg/strip-backup/609547eda446-b26b56a8-backup.hg (glob)
 
diff --git a/tests/test-remotefilelog-repack-fast.t b/tests/test-remotefilelog-repack-fast.t
--- a/tests/test-remotefilelog-repack-fast.t
+++ b/tests/test-remotefilelog-repack-fast.t
@@ -239,10 +239,10 @@
   Node          P1 Node       P2 Node       Link Node     Copy From
   577959738234  1bb2e6237e03  000000000000  c7faf2fc439a  x
   21f46f2721e7  000000000000  000000000000  d6868642b790  
-  $ hg strip -r '.^'
+  $ hg debugstrip -r '.^'
   1 files updated, 0 files merged, 1 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/shallow/.hg/strip-backup/609547eda446-b26b56a8-backup.hg (glob)
-  $ hg -R ../master strip -r '.^'
+  $ hg -R ../master debugstrip -r '.^'
   1 files updated, 0 files merged, 1 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/master/.hg/strip-backup/609547eda446-b26b56a8-backup.hg (glob)
 
diff --git a/tests/test-remotefilelog-push-pull.t b/tests/test-remotefilelog-push-pull.t
--- a/tests/test-remotefilelog-push-pull.t
+++ b/tests/test-remotefilelog-push-pull.t
@@ -78,7 +78,7 @@
 
 # pull from shallow to shallow (ssh)
 
-  $ hg strip -r 1
+  $ hg debugstrip -r 1
   saved backup bundle to $TESTTMP/shallow2/.hg/strip-backup/d34c38483be9-89d325c9-backup.hg (glob)
   $ hg pull ssh://user@dummy/$TESTTMP/shallow --config remotefilelog.cachepath=${CACHEDIR}2
   pulling from ssh://user@dummy/$TESTTMP/shallow
@@ -96,8 +96,8 @@
   $ cat z
   z
 
-  $ hg -R ../shallow strip -qr 3
-  $ hg strip -qr 3
+  $ hg -R ../shallow debugstrip -qr 3
+  $ hg debugstrip -qr 3
   $ cd ..
 
 # push from shallow to shallow
diff --git a/tests/test-remotefilelog-prefetch.t b/tests/test-remotefilelog-prefetch.t
--- a/tests/test-remotefilelog-prefetch.t
+++ b/tests/test-remotefilelog-prefetch.t
@@ -84,7 +84,7 @@
 # prefetch on pull when configured
 
   $ printf "[remotefilelog]\npullprefetch=bookmark()\n" >> .hg/hgrc
-  $ hg strip tip
+  $ hg debugstrip tip
   saved backup bundle to $TESTTMP/shallow/.hg/strip-backup/109c3a557a73-3f43405e-backup.hg (glob)
 
   $ clearcache
@@ -106,7 +106,7 @@
 
 # prefetch only fetches changes not in working copy
 
-  $ hg strip tip
+  $ hg debugstrip tip
   1 files updated, 0 files merged, 1 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/shallow/.hg/strip-backup/109c3a557a73-3f43405e-backup.hg (glob)
   1 files fetched over 1 fetches - (1 misses, 0.00% hit ratio) over *s (glob)
@@ -131,7 +131,7 @@
 
   $ hg prefetch -r 'all()'
   2 files fetched over 1 fetches - (2 misses, 0.00% hit ratio) over *s (glob)
-  $ hg strip -q -r 0
+  $ hg debugstrip -q -r 0
   $ echo x > x
   $ echo z > z
   $ hg commit -qAm x
@@ -142,7 +142,7 @@
 # prefetch server versions, even if local versions are available
 
   $ clearcache
-  $ hg strip -q tip
+  $ hg debugstrip -q tip
   $ hg pull
   pulling from ssh://user@dummy/master
   searching for changes
diff --git a/tests/test-remotefilelog-local.t b/tests/test-remotefilelog-local.t
--- a/tests/test-remotefilelog-local.t
+++ b/tests/test-remotefilelog-local.t
@@ -83,7 +83,7 @@
 
 # restore state for future tests
 
-  $ hg -q strip .
+  $ hg -q debugstrip .
   $ hg -q up tip
 
 # rebase
@@ -113,7 +113,7 @@
 
   $ clearcache
   $ hg debugrebuilddirstate # fixes dirstate non-determinism
-  $ hg strip -r .
+  $ hg debugstrip -r .
   2 files updated, 0 files merged, 1 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/shallow/.hg/strip-backup/19edf50f4de7-df3d0f74-backup.hg (glob)
   4 files fetched over 2 fetches - (4 misses, 0.00% hit ratio) over *s (glob)
@@ -189,7 +189,7 @@
   3 files updated, 0 files merged, 0 files removed, 0 files unresolved
   (branch merge, don't forget to commit)
   $ hg commit -m merge
-  $ hg strip -q -r ".^"
+  $ hg debugstrip -q -r ".^"
 
 # commit without producing new node
 
diff --git a/tests/test-remotefilelog-linknodes.t b/tests/test-remotefilelog-linknodes.t
--- a/tests/test-remotefilelog-linknodes.t
+++ b/tests/test-remotefilelog-linknodes.t
@@ -100,7 +100,7 @@
 # system cache has invalid linknode, but .hg/store/data has valid
 
   $ cd shallow
-  $ hg strip -r 1 -q
+  $ hg debugstrip -r 1 -q
   $ rm -rf .hg/store/data/*
   $ echo x >> x
   $ hg commit -Aqm xx_local
diff --git a/tests/test-remotefilelog-bundles.t b/tests/test-remotefilelog-bundles.t
--- a/tests/test-remotefilelog-bundles.t
+++ b/tests/test-remotefilelog-bundles.t
@@ -23,7 +23,7 @@
 
 Unbundling a shallow bundle
 
-  $ hg strip -r 66ee28d0328c
+  $ hg debugstrip -r 66ee28d0328c
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/shallow/.hg/strip-backup/66ee28d0328c-3d7aafd1-backup.hg (glob)
   1 files fetched over 1 fetches - (1 misses, 0.00% hit ratio) over *s (glob)
@@ -39,7 +39,7 @@
 
   $ hg -R ../master bundle -r 66ee28d0328c:: --base "66ee28d0328c^" ../fullbundle.hg
   2 changesets found
-  $ hg strip -r 66ee28d0328c
+  $ hg debugstrip -r 66ee28d0328c
   saved backup bundle to $TESTTMP/shallow/.hg/strip-backup/66ee28d0328c-3d7aafd1-backup.hg (glob)
   $ hg unbundle ../fullbundle.hg
   adding changesets
@@ -51,7 +51,7 @@
 
 Pulling from a shallow bundle
 
-  $ hg strip -r 66ee28d0328c
+  $ hg debugstrip -r 66ee28d0328c
   saved backup bundle to $TESTTMP/shallow/.hg/strip-backup/66ee28d0328c-3d7aafd1-backup.hg (glob)
   $ hg pull -r 66ee28d0328c .hg/strip-backup/66ee28d0328c-3d7aafd1-backup.hg
   pulling from .hg/strip-backup/66ee28d0328c-3d7aafd1-backup.hg
@@ -65,7 +65,7 @@
 
 Pulling from a full bundle
 
-  $ hg strip -r 66ee28d0328c
+  $ hg debugstrip -r 66ee28d0328c
   saved backup bundle to $TESTTMP/shallow/.hg/strip-backup/66ee28d0328c-b6ee89e7-backup.hg (glob)
   $ hg pull -r 66ee28d0328c ../fullbundle.hg
   pulling from ../fullbundle.hg
diff --git a/tests/test-remotefilelog-bgprefetch.t b/tests/test-remotefilelog-bgprefetch.t
--- a/tests/test-remotefilelog-bgprefetch.t
+++ b/tests/test-remotefilelog-bgprefetch.t
@@ -63,7 +63,7 @@
   > pullprefetch=bookmark()
   > backgroundprefetch=True
   > EOF
-  $ hg strip tip
+  $ hg debugstrip tip
   saved backup bundle to $TESTTMP/shallow/.hg/strip-backup/6b4b6f66ef8c-b4b8bdaf-backup.hg (glob)
 
   $ clearcache
@@ -92,7 +92,7 @@
   > [remotefilelog]
   > backgroundrepack=True
   > EOF
-  $ hg strip tip
+  $ hg debugstrip tip
   saved backup bundle to $TESTTMP/shallow/.hg/strip-backup/6b4b6f66ef8c-b4b8bdaf-backup.hg (glob)
 
   $ clearcache
diff --git a/tests/test-rebase-inmemory.t b/tests/test-rebase-inmemory.t
--- a/tests/test-rebase-inmemory.t
+++ b/tests/test-rebase-inmemory.t
@@ -6,7 +6,6 @@
   > amend=
   > rebase=
   > debugdrawdag=$TESTDIR/drawdag.py
-  > strip=
   > [rebase]
   > experimental.inmemory=1
   > [diff]
@@ -517,7 +516,7 @@
   $ cd ..
   $ hg clone repo3 repo4 -q
   $ cd repo4
-  $ hg strip 7 -q
+  $ hg debugstrip 7 -q
   $ hg log -G --template "{rev}:{short(node)} {person(author)}\n{firstline(desc)} {topic}\n\n"
   @  6:baf10c5166d4 test
   |  g
diff --git a/tests/test-rebase-collapse.t b/tests/test-rebase-collapse.t
--- a/tests/test-rebase-collapse.t
+++ b/tests/test-rebase-collapse.t
@@ -249,7 +249,7 @@
   575c4b5ec114d64b681d33f8792853568bfb2b2c o default
   64e264db77f061f16d9132b70c5a58e2461fb630 o default
 
-  $ hg strip 4
+  $ hg debugstrip 4
   saved backup bundle to $TESTTMP/branch-heads/.hg/strip-backup/4e4f9194f9f1-5ec4b5e6-backup.hg
 
   $ cat $TESTTMP/branch-heads/.hg/cache/branch2-served
@@ -641,7 +641,7 @@
   2:dc0947a82db884575bb76ea10ac97b08536bfa03 default: C
   1:112478962961147124edd43549aedd1a335e44bf default: B
 
-  $ hg strip C
+  $ hg debugstrip C
   saved backup bundle to $TESTTMP/f/.hg/strip-backup/dc0947a82db8-d21b92a4-backup.hg
 
   $ hg tglog
diff --git a/tests/test-rebase-cache.t b/tests/test-rebase-cache.t
--- a/tests/test-rebase-cache.t
+++ b/tests/test-rebase-cache.t
@@ -268,7 +268,7 @@
 Stripping multiple branches in one go bypasses the fast-case code to
 update the branch cache.
 
-  $ hg strip 2
+  $ hg debugstrip 2
   0 files updated, 0 files merged, 4 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/a3/.hg/strip-backup/0a03079c47fd-11b7c407-backup.hg
 
@@ -327,7 +327,7 @@
   2: 'A' branch1
   1: 'branch2' branch2
 
-  $ hg strip 2
+  $ hg debugstrip 2
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/a3/b/.hg/strip-backup/a5b4b27ed7b4-a3b6984e-backup.hg
 
@@ -372,14 +372,14 @@
   o  0: 'A'
   
 
-  $ hg strip 3 4
+  $ hg debugstrip 3 4
   0 files updated, 0 files merged, 2 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/a3/c/.hg/strip-backup/67a385d4e6f2-b9243789-backup.hg
 
   $ hg theads
   2: 'C' 
 
-  $ hg strip 2 1
+  $ hg debugstrip 2 1
   0 files updated, 0 files merged, 2 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/a3/c/.hg/strip-backup/6c81ed0049f8-a687065f-backup.hg
 
diff --git a/tests/test-rebase-abort.t b/tests/test-rebase-abort.t
--- a/tests/test-rebase-abort.t
+++ b/tests/test-rebase-abort.t
@@ -167,7 +167,7 @@
 
   $ mv .hg/rebasestate .hg/rebasestate.back
   $ hg update --quiet --clean 2
-  $ hg --config extensions.mq= strip --quiet "destination()"
+  $ hg --config extensions.mq= debugstrip --quiet "destination()"
   $ mv .hg/rebasestate.back .hg/rebasestate
 
   $ hg continue
diff --git a/tests/test-push.t b/tests/test-push.t
--- a/tests/test-push.t
+++ b/tests/test-push.t
@@ -291,8 +291,8 @@
   wlock: free
   added 1 changesets with 1 changes to 1 files
 
-  $ hg --cwd 1 --config extensions.strip= strip tip -q
-  $ hg --cwd 2 --config extensions.strip= strip tip -q
+  $ hg --cwd 1 debugstrip tip -q
+  $ hg --cwd 2 debugstrip tip -q
   $ hg --cwd 3 push ../2 # bundle2+
   pushing to ../2
   searching for changes
diff --git a/tests/test-push-http.t b/tests/test-push-http.t
--- a/tests/test-push-http.t
+++ b/tests/test-push-http.t
@@ -370,7 +370,7 @@
   % serve errors
 #endif
 
-  $ hg --config extensions.strip= strip -r 1:
+  $ hg debugstrip -r 1:
   saved backup bundle to $TESTTMP/test/.hg/strip-backup/ba677d0156c1-eea704d7-backup.hg
 
 Now do a variant of the above, except on a non-publishing repository
@@ -483,7 +483,7 @@
   % serve errors
 #endif
 
-  $ hg --config extensions.strip= strip -r 1:
+  $ hg debugstrip -r 1:
   saved backup bundle to $TESTTMP/test/.hg/strip-backup/ba677d0156c1-eea704d7-backup.hg
 
 #if bundle2
diff --git a/tests/test-pull-update.t b/tests/test-pull-update.t
--- a/tests/test-pull-update.t
+++ b/tests/test-pull-update.t
@@ -30,7 +30,7 @@
   1 local changesets published
   abort: uncommitted changes
   [255]
-  $ hg --config extensions.strip= strip --no-backup tip
+  $ hg debugstrip --no-backup tip
   $ hg co -qC tip
 
 Should not update to the other topological branch:
diff --git a/tests/test-phases.t b/tests/test-phases.t
--- a/tests/test-phases.t
+++ b/tests/test-phases.t
@@ -255,7 +255,7 @@
 
 
 Restore condition prior extra insertion.
-  $ hg -q --config extensions.mq= strip .
+  $ hg -q --config extensions.mq= debugstrip .
   $ hg up -q 7
   $ cd ..
 
diff --git a/tests/test-phases-exchange.t b/tests/test-phases-exchange.t
--- a/tests/test-phases-exchange.t
+++ b/tests/test-phases-exchange.t
@@ -836,7 +836,7 @@
 
 (reset some stat on remote repo to avoid confusing other tests)
 
-  $ hg -R ../alpha --config extensions.strip= strip --no-backup 967b449fbc94
+  $ hg -R ../alpha debugstrip --no-backup 967b449fbc94
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   $ hg phase --force --draft b740e3e5c05d 967b449fbc94
   test-debug-phase: move rev 8: 0 -> 1
diff --git a/tests/test-phase-archived.t b/tests/test-phase-archived.t
--- a/tests/test-phase-archived.t
+++ b/tests/test-phase-archived.t
@@ -5,8 +5,6 @@
   $ cat << EOF >> $HGRCPATH
   > [format]
   > internal-phase=yes
-  > [extensions]
-  > strip=
   > [experimental]
   > EOF
 
@@ -35,7 +33,7 @@
      date:        Thu Jan 01 00:00:00 1970 +0000
      summary:     root
   
-  $ hg strip --soft --rev '.'
+  $ hg debugstrip --soft --rev '.'
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/repo/.hg/strip-backup/883aadbbf309-efc55adc-backup.hg
   $ hg log -G
diff --git a/tests/test-obsolete.t b/tests/test-obsolete.t
--- a/tests/test-obsolete.t
+++ b/tests/test-obsolete.t
@@ -1297,7 +1297,7 @@
   tiptag                             2:323a9c3ddd91
   tip                                2:323a9c3ddd91
   visible                            1:29f0c6921ddd
-  $ hg --config extensions.strip= strip -r tip --no-backup
+  $ hg debugstrip -r tip --no-backup
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   $ hg tags
   visible                            1:29f0c6921ddd
@@ -1522,7 +1522,7 @@
   o  0:a78f55e5508c (draft) [ ] 0
   
 
-  $ hg strip --hidden -r 2 --config extensions.strip= --config devel.strip-obsmarkers=no
+  $ hg debugstrip --hidden -r 2 --config devel.strip-obsmarkers=no
   saved backup bundle to $TESTTMP/tmpe/issue4845/.hg/strip-backup/e008cf283490-ede36964-backup.hg
   $ hg debugobsolete
   e008cf2834908e5d6b0f792a9d4b0e2272260fb8 b0551702f918510f01ae838ab03a463054c67b46 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '8', 'operation': 'amend', 'user': 'test'}
@@ -1573,7 +1573,7 @@
 
 Testing that strip remove markers:
 
-  $ hg strip -r 1 --config extensions.strip=
+  $ hg debugstrip -r 1
   0 files updated, 0 files merged, 2 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/tmpe/issue4845/.hg/strip-backup/e016b03fd86f-65ede734-backup.hg
   $ hg debugobsolete
@@ -1681,7 +1681,7 @@
   $ hg bundle -r . --base .~1 ../bundle-2.hg
   1 changesets found
   $ getid .
-  $ hg --config extensions.strip= strip -r .
+  $ hg debugstrip -r .
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/tmpe/issue4845/doindexrev/.hg/strip-backup/9bc153528424-ee80edd4-backup.hg
   $ hg debugobsolete 9bc153528424ea266d13e57f9ff0d799dfe61e4b
diff --git a/tests/test-obsolete-changeset-exchange.t b/tests/test-obsolete-changeset-exchange.t
--- a/tests/test-obsolete-changeset-exchange.t
+++ b/tests/test-obsolete-changeset-exchange.t
@@ -64,7 +64,7 @@
   $ hg phase --draft --force f89bcc95eba5
   $ hg phase -R ../other --draft --force f89bcc95eba5
   $ hg commit --amend -m "A''"
-  $ hg --hidden --config extensions.mq= strip  --no-backup f89bcc95eba5
+  $ hg --hidden --config extensions.mq= debugstrip  --no-backup f89bcc95eba5
   $ hg pull ../other
   pulling from ../other
   searching for changes
@@ -80,7 +80,7 @@
 
   $ hg bundle --hidden --rev f89bcc95eba5 --base "f89bcc95eba5^" ../f89bcc95eba5.hg
   1 changesets found
-  $ hg --hidden --config extensions.mq= strip --no-backup f89bcc95eba5
+  $ hg --hidden --config extensions.mq= debugstrip --no-backup f89bcc95eba5
   $ hg unbundle ../f89bcc95eba5.hg
   adding changesets
   adding manifests
diff --git a/tests/test-narrow-strip.t b/tests/test-narrow-strip.t
--- a/tests/test-narrow-strip.t
+++ b/tests/test-narrow-strip.t
@@ -54,17 +54,13 @@
   updating to branch default
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ cd narrow
-  $ cat >> $HGRCPATH <<EOF
-  > [extensions]
-  > strip=
-  > EOF
 
 Can strip and recover changesets affecting only files within narrow spec
 
   $ hg co -r 'desc("modify inside")'
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ rm -f .hg/strip-backup/*-backup.hg
-  $ hg strip .
+  $ hg debugstrip .
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/narrow/.hg/strip-backup/*-backup.hg (glob)
   $ hg unbundle .hg/strip-backup/*-backup.hg
@@ -93,7 +89,7 @@
   outside\x00255c2627ebdd3c7dcaa6945246f9b9f02bd45a09t (esc) (tree !)
 
   $ rm -f .hg/strip-backup/*-backup.hg
-  $ hg strip .
+  $ hg debugstrip .
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/narrow/.hg/strip-backup/*-backup.hg (glob)
   $ hg unbundle .hg/strip-backup/*-backup.hg
@@ -121,7 +117,7 @@
   $ hg co -r 'desc("modify inside")'
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ rm .hg/strip-backup/*-backup.hg
-  $ hg strip .
+  $ hg debugstrip .
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/narrow/.hg/strip-backup/*-backup.hg (glob)
 #if repobundlerepo
@@ -136,7 +132,7 @@
   (run 'hg heads' to see heads, 'hg merge' to merge)
 
   $ rm .hg/strip-backup/*-backup.hg
-  $ hg strip 0
+  $ hg debugstrip 0
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/narrow/.hg/strip-backup/*-backup.hg (glob)
 
diff --git a/tests/test-mq.t b/tests/test-mq.t
--- a/tests/test-mq.t
+++ b/tests/test-mq.t
@@ -792,7 +792,7 @@
   $ echo x>x
   $ hg ci -Ama
   adding x
-  $ hg strip tip
+  $ hg debugstrip tip
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/b/.hg/strip-backup/*-backup.hg (glob)
   $ hg unbundle .hg/strip-backup/*
@@ -810,13 +810,13 @@
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ echo y>y
   $ hg add y
-  $ hg strip tip
+  $ hg debugstrip tip
   abort: uncommitted changes
   [255]
 
 --force strip with local changes
 
-  $ hg strip -f tip
+  $ hg debugstrip -f tip
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/b/.hg/strip-backup/770eb8fce608-0ddcae0f-backup.hg
   $ cd ..
@@ -917,7 +917,7 @@
   $ hg qpop
   popping bar
   now at: foo
-  $ hg strip -qn tip
+  $ hg debugstrip -qn tip
   $ hg tip
   changeset:   0:cb9a9f314b8b
   tag:         tip
@@ -1217,7 +1217,7 @@
   date:        Thu Jan 01 00:00:00 1970 +0000
   summary:     add foo
   
-  $ hg strip 1
+  $ hg debugstrip 1
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/strip/.hg/strip-backup/*-backup.hg (glob)
   $ checkundo strip
diff --git a/tests/test-mq-qpush-exact.t b/tests/test-mq-qpush-exact.t
--- a/tests/test-mq-qpush-exact.t
+++ b/tests/test-mq-qpush-exact.t
@@ -27,7 +27,7 @@
   $ hg add fp0
   $ hg ci -m p0 -d "0 0"
   $ hg export -r. > p0
-  $ hg strip -qn .
+  $ hg debugstrip -qn .
   $ hg qimport p0
   adding p0 to series file
   $ hg qpush
diff --git a/tests/test-lfs.t b/tests/test-lfs.t
--- a/tests/test-lfs.t
+++ b/tests/test-lfs.t
@@ -419,7 +419,7 @@
        * (changelog) (glob)
        * (manifests) (glob)
       * a (glob)
-  $ hg --config extensions.strip= strip -r 2 --no-backup --force -q
+  $ hg debugstrip -r 2 --no-backup --force -q
   $ hg -R bundle.hg log -p -T '{rev} {desc}\n' a
   5 branching
   diff --git a/a b/a
diff --git a/tests/test-keyword.t b/tests/test-keyword.t
--- a/tests/test-keyword.t
+++ b/tests/test-keyword.t
@@ -228,7 +228,7 @@
   $ hg status -A --rev 3:4 i
   C i
 
-  $ hg -q strip --no-backup 2
+  $ hg -q debugstrip --no-backup 2
 
 Test hook execution
 
@@ -585,7 +585,7 @@
   $ head -1 a
   expand $Id: a,v 67d8c481a6be 1970/01/01 00:00:15 test $
 
-  $ hg -q strip --no-backup tip
+  $ hg -q debugstrip --no-backup tip
 
 Test patch queue repo
 
diff --git a/tests/test-import.t b/tests/test-import.t
--- a/tests/test-import.t
+++ b/tests/test-import.t
@@ -121,7 +121,7 @@
   d8804f3f5396d800812f579c8452796a5993bdb2
   $ hg --cwd b export -o ../empty-log.diff .
   $ hg --cwd b update -q -C ".^1"
-  $ hg --cwd b --config extensions.strip= strip -q tip
+  $ hg --cwd b debugstrip -q tip
   $ HGEDITOR=cat hg --cwd b import --exact ../empty-log.diff
   applying ../empty-log.diff
   $ hg --cwd b tip -T "{node}\n"
@@ -467,7 +467,7 @@
   parent: 1
 
   $ hg --cwd b update -q -C 0
-  $ hg --cwd b --config extensions.strip= strip -q 1
+  $ hg --cwd b debugstrip -q 1
 
 Test visibility of in-memory dirstate changes inside transaction to
 external process
diff --git a/tests/test-import-merge.t b/tests/test-import-merge.t
--- a/tests/test-import-merge.t
+++ b/tests/test-import-merge.t
@@ -65,7 +65,7 @@
   $ tipparents
   1:540395c44225 changea
   3:102a90ea7b4a addb
-  $ hg strip --no-backup tip
+  $ hg debugstrip --no-backup tip
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
 
 Test without --exact and diff.p1 != workingdir.p1
@@ -78,7 +78,7 @@
   (use --exact to import the patch as a merge)
   $ tipparents
   2:890ecaa90481 addc
-  $ hg strip --no-backup tip
+  $ hg debugstrip --no-backup tip
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
 
 Test with --exact
@@ -89,7 +89,7 @@
   $ tipparents
   1:540395c44225 changea
   3:102a90ea7b4a addb
-  $ hg strip --no-backup tip
+  $ hg debugstrip --no-backup tip
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
 
 Test with --bypass and diff.p1 == workingdir.p1
@@ -101,7 +101,7 @@
   $ tipparents
   1:540395c44225 changea
   3:102a90ea7b4a addb
-  $ hg strip --no-backup tip
+  $ hg debugstrip --no-backup tip
 
 Test with --bypass and diff.p1 != workingdir.p1
 
@@ -113,7 +113,7 @@
   (use --exact to import the patch as a merge)
   $ tipparents
   2:890ecaa90481 addc
-  $ hg strip --no-backup tip
+  $ hg debugstrip --no-backup tip
 
 Test with --bypass and --exact
 
@@ -122,7 +122,7 @@
   $ tipparents
   1:540395c44225 changea
   3:102a90ea7b4a addb
-  $ hg strip --no-backup tip
+  $ hg debugstrip --no-backup tip
 
   $ cd ..
 
diff --git a/tests/test-import-bypass.t b/tests/test-import-bypass.t
--- a/tests/test-import-bypass.t
+++ b/tests/test-import-bypass.t
@@ -183,7 +183,7 @@
   @@ -1,1 +1,2 @@
    cc
   +cc
-  $ hg -q --config extensions.strip= strip .
+  $ hg -q debugstrip .
 
 Test unsupported combinations
 
@@ -323,7 +323,7 @@
   1b77bc7d1db9f0e7f1716d515b630516ab386c89
   $ hg export -o ../empty-log.diff .
   $ hg update -q -C ".^1"
-  $ hg --config extensions.strip= strip -q tip
+  $ hg debugstrip -q tip
   $ HGEDITOR=cat hg import --exact --bypass ../empty-log.diff
   applying ../empty-log.diff
   $ hg tip -T "{node}\n"
diff --git a/tests/test-hook.t b/tests/test-hook.t
--- a/tests/test-hook.t
+++ b/tests/test-hook.t
@@ -1251,7 +1251,7 @@
   > [hooks]
   > pretxnclose.error = exit 1
   > EOF
-  $ hg strip -r 0 --config extensions.strip=
+  $ hg debugstrip -r 0
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   saved backup bundle to * (glob)
   transaction abort!
diff --git a/tests/test-histedit-obsolete.t b/tests/test-histedit-obsolete.t
--- a/tests/test-histedit-obsolete.t
+++ b/tests/test-histedit-obsolete.t
@@ -79,7 +79,7 @@
   ? plan
   $ hg commit --amend -X . -m XXXXXX
   $ hg commit --amend -X . -m b2
-  $ hg --hidden --config extensions.strip= strip 'desc(XXXXXX)' --no-backup
+  $ hg --hidden debugstrip 'desc(XXXXXX)' --no-backup
   $ hg histedit --continue
   $ hg log -G
   @  8:273c1f3b8626 c
diff --git a/tests/test-histedit-edit.t b/tests/test-histedit-edit.t
--- a/tests/test-histedit-edit.t
+++ b/tests/test-histedit-edit.t
@@ -3,7 +3,6 @@
   $ cat >> $HGRCPATH <<EOF
   > [extensions]
   > histedit=
-  > strip=
   > mockmakedate = $TESTDIR/mockmakedate.py
   > EOF
 
@@ -139,7 +138,7 @@
   [255]
 
 Try to delete necessary commit
-  $ hg strip -r 652413b
+  $ hg debugstrip -r 652413b
   abort: histedit in progress, can't strip 652413bf663e
   [255]
 
@@ -209,7 +208,7 @@
   (hg histedit --continue to resume)
 
   $ mv .hg/histedit-state .hg/histedit-state.bak
-  $ hg strip -q -r b5f70786f9b0
+  $ hg debugstrip -q -r b5f70786f9b0
   $ mv .hg/histedit-state.bak .hg/histedit-state
   $ hg histedit --abort
   adding changesets
diff --git a/tests/test-histedit-arguments.t b/tests/test-histedit-arguments.t
--- a/tests/test-histedit-arguments.t
+++ b/tests/test-histedit-arguments.t
@@ -175,7 +175,7 @@
   ~
 
   $ hg unbundle -q $TESTTMP/foo/.hg/strip-backup/08d98a8350f3-02594089-histedit.hg
-  $ hg strip -q -r f5ed --config extensions.strip=
+  $ hg debugstrip -q -r f5ed
   $ hg up -q 08d98a8350f3
 
 Test that missing revisions are detected
@@ -330,7 +330,7 @@
 
 Test --continue with --keep
 
-  $ hg strip -q -r . --config extensions.strip=
+  $ hg debugstrip -q -r .
   $ hg histedit '.^' -q --keep --commands - << EOF
   > edit eb57da33312f 2 three
   > pick f3cfcca30c44 4 x
diff --git a/tests/test-hgweb-bundle.t b/tests/test-hgweb-bundle.t
--- a/tests/test-hgweb-bundle.t
+++ b/tests/test-hgweb-bundle.t
@@ -2,10 +2,6 @@
 
   $ hg init server
   $ cd server
-  $ cat >> .hg/hgrc << EOF
-  > [extensions]
-  > strip=
-  > EOF
 
   $ echo 1 > foo
   $ hg commit -A -m 'first'
@@ -16,7 +12,7 @@
 
 Produce a bundle to use
 
-  $ hg strip -r 1
+  $ hg debugstrip -r 1
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/server/.hg/strip-backup/ed602e697e0f-cc9fff6a-backup.hg
 
diff --git a/tests/test-help.t b/tests/test-help.t
--- a/tests/test-help.t
+++ b/tests/test-help.t
@@ -1051,6 +1051,7 @@
    debugsidedata
                  dump the side data for a cl/manifest/file revision
    debugssl      test a secure connection to a server
+   debugstrip    strip changesets and all their descendants from the repository
    debugsub      (no help text available)
    debugsuccessorssets
                  show set of successors for revision
diff --git a/tests/test-graft.t b/tests/test-graft.t
--- a/tests/test-graft.t
+++ b/tests/test-graft.t
@@ -64,7 +64,7 @@
   $ hg st --change .
   M d
 
-  $ hg -q strip . --config extensions.strip=
+  $ hg -q debugstrip .
 
 Test --base for collapsing changesets 2 and 3, thus getting both b and c
 
@@ -78,7 +78,7 @@
   A c
   R a
 
-  $ hg -q strip . --config extensions.strip=
+  $ hg -q debugstrip .
 
 Specifying child as --base revision fails safely (perhaps slightly confusing, but consistent)
 
@@ -307,7 +307,7 @@
   $ echo c >> e
   $ hg ci -mtest
 
-  $ hg strip . --config extensions.strip=
+  $ hg debugstrip .
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/a/.hg/strip-backup/*-backup.hg (glob)
 
@@ -877,7 +877,7 @@
 
   $ hg up -qC 7
   $ hg tag -l -r 13 tmp
-  $ hg --config extensions.strip= strip 2
+  $ hg debugstrip 2
   saved backup bundle to $TESTTMP/a/.hg/strip-backup/5c095ad7e90f-d323a1e4-backup.hg
   $ hg graft tmp
   skipping already grafted revision 8:7a4785234d87 (2:ef0ef43d49e7 also has unknown origin 5c095ad7e90f)
diff --git a/tests/test-generaldelta.t b/tests/test-generaldelta.t
--- a/tests/test-generaldelta.t
+++ b/tests/test-generaldelta.t
@@ -146,7 +146,7 @@
         1       1        2        0    prev         61         86        120   1.39535       120         0    0.00000
         2       1        2        0      p2         62        301        121   0.40199       182        61    0.50413
 
-  $ hg strip -q -r . --config extensions.strip=
+  $ hg debugstrip -q -r .
 
 - Verify aggressive merge uses p2 (commit 0) as delta parent
   $ hg up -q -C 1
@@ -159,7 +159,7 @@
         2       1        2        0      p2         62        301        121   0.40199       182        61    0.50413
 
 Test that strip bundle use bundle2
-  $ hg --config extensions.strip= strip .
+  $ hg debugstrip .
   0 files updated, 0 files merged, 5 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/aggressive/.hg/strip-backup/1c5d4dc9a8b8-6c68e60c-backup.hg
   $ hg debugbundle .hg/strip-backup/*
diff --git a/tests/test-flagprocessor.t b/tests/test-flagprocessor.t
--- a/tests/test-flagprocessor.t
+++ b/tests/test-flagprocessor.t
@@ -242,7 +242,7 @@
 #if repobundlerepo
   $ hg bundle --base 1 bundle.hg
   4 changesets found
-  $ hg --config extensions.strip= strip -r 2 --no-backup --force -q
+  $ hg debugstrip -r 2 --no-backup --force -q
   $ hg -R bundle.hg log --stat -T '{rev} {desc}\n' base64
   5 branching
    base64 |  2 +-
diff --git a/tests/test-extension.t b/tests/test-extension.t
--- a/tests/test-extension.t
+++ b/tests/test-extension.t
@@ -1019,7 +1019,7 @@
 #if no-extraextensions
   $ hg debugextensions
   mq
-  strip
+  strip (untested!)
 #endif
 
 For extensions, which name matches one of its commands, help
@@ -1546,7 +1546,7 @@
   $ echo 'getversion = lambda: b"1.twentythree"' >> throw.py
   $ rm -f throw.pyc throw.pyo
   $ rm -Rf __pycache__
-  $ hg version -v --config extensions.throw=throw.py --config extensions.strip=
+  $ hg version -v --config extensions.throw=throw.py
   Mercurial Distributed SCM (version *) (glob)
   (see https://mercurial-scm.org for more information)
   
@@ -1557,15 +1557,13 @@
   Enabled extensions:
   
     throw  external  1.twentythree
-    strip  internal  
 
   $ hg version -q --config extensions.throw=throw.py
   Mercurial Distributed SCM (version *) (glob)
 
 Test template output:
 
-  $ hg version --config extensions.strip= -T'{extensions}'
-  strip
+  $ hg version -T'{extensions}'
 
 Test JSON output of version:
 
@@ -1585,20 +1583,19 @@
    }
   ]
 
-  $ hg version --config extensions.strip= -Tjson
+  $ hg version -Tjson
   [
    {
-    "extensions": [{"bundled": true, "name": "strip", "ver": null}],
+    "extensions": [],
     "ver": "*" (glob)
    }
   ]
 
 Test template output of version:
 
-  $ hg version --config extensions.throw=throw.py --config extensions.strip= \
+  $ hg version --config extensions.throw=throw.py \
   > -T'{extensions % "{name}  {pad(ver, 16)}  ({if(bundled, "internal", "external")})\n"}'
   throw  1.twentythree     (external)
-  strip                    (internal)
 
 Refuse to load extensions with minimum version requirements
 
@@ -1679,7 +1676,7 @@
   dudu (untested!)
   mq
   reposetuptest (untested!)
-  strip
+  strip (untested!)
 #endif
 
   $ hg clone -U src clone-dst1
diff --git a/tests/test-exchange-obsmarkers-case-D3.t b/tests/test-exchange-obsmarkers-case-D3.t
--- a/tests/test-exchange-obsmarkers-case-D3.t
+++ b/tests/test-exchange-obsmarkers-case-D3.t
@@ -62,7 +62,7 @@
   $ hg prune -d '0 0' .
   1 new obsolescence markers
   obsoleted 1 changesets
-  $ hg strip --hidden -q 'desc(A1)'
+  $ hg debugstrip --hidden -q 'desc(A1)'
   $ hg log -G --hidden
   @  35b183996678 (draft): B
   |
diff --git a/tests/test-exchange-obsmarkers-case-D2.t b/tests/test-exchange-obsmarkers-case-D2.t
--- a/tests/test-exchange-obsmarkers-case-D2.t
+++ b/tests/test-exchange-obsmarkers-case-D2.t
@@ -59,7 +59,7 @@
   $ hg prune --date '0 0' .
   1 new obsolescence markers
   obsoleted 1 changesets
-  $ hg strip --hidden -q 'desc(A1)'
+  $ hg debugstrip --hidden -q 'desc(A1)'
   $ hg log -G --hidden
   x  28b51eb45704 (draft): A0
   |
diff --git a/tests/test-exchange-obsmarkers-case-D1.t b/tests/test-exchange-obsmarkers-case-D1.t
--- a/tests/test-exchange-obsmarkers-case-D1.t
+++ b/tests/test-exchange-obsmarkers-case-D1.t
@@ -67,7 +67,7 @@
   $ hg prune -d '0 0' 'desc(B)'
   1 new obsolescence markers
   obsoleted 1 changesets
-  $ hg strip --hidden -q 'desc(A0)'
+  $ hg debugstrip --hidden -q 'desc(A0)'
   $ hg log -G --hidden
   @  e5ea8f9c7314 (draft): A1
   |
diff --git a/tests/test-strip.t b/tests/test-strip.t
--- a/tests/test-strip.t
+++ b/tests/test-strip.t
@@ -882,7 +882,7 @@
 
 check strip behavior
 
-  $ hg --config extensions.strip= strip 'desc(commitD)' --debug
+  $ hg strip 'desc(commitD)' --debug
   resolving manifests
    branchmerge: False, force: True, partial: False
    ancestor: d8db9d137221+, local: d8db9d137221+, remote: eca11cf91c71
diff --git a/tests/test-strip.t b/tests/test-debugstrip.t
copy from tests/test-strip.t
copy to tests/test-debugstrip.t
--- a/tests/test-strip.t
+++ b/tests/test-debugstrip.t
@@ -1,5 +1,4 @@
   $ echo "[extensions]" >> $HGRCPATH
-  $ echo "strip=" >> $HGRCPATH
   $ echo "drawdag=$TESTDIR/drawdag.py" >> $HGRCPATH
 
   $ restore() {
@@ -8,10 +7,10 @@
   > }
   $ teststrip() {
   >     hg up -C $1
-  >     echo % before update $1, strip $2
+  >     echo % before update $1, debugstrip $2
   >     hg log -G -T '{rev}:{node}'
-  >     hg --traceback strip $2
-  >     echo % after update $1, strip $2
+  >     hg --traceback debugstrip $2
+  >     echo % after update $1, debugstrip $2
   >     hg log -G -T '{rev}:{node}'
   >     restore
   > }
@@ -69,7 +68,7 @@
 
   $ teststrip 4 4
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  % before update 4, strip 4
+  % before update 4, debugstrip 4
   @  4:443431ffac4f5b5a19b0b6c298a21b7ba736bcce
   |
   o  3:65bd5f99a4a376cdea23a1153f07856b0d881d64
@@ -82,7 +81,7 @@
   
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
-  % after update 4, strip 4
+  % after update 4, debugstrip 4
   @  3:65bd5f99a4a376cdea23a1153f07856b0d881d64
   |
   | o  2:264128213d290d868c54642d13aeaa3675551a78
@@ -93,7 +92,7 @@
   
   $ teststrip 4 3
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  % before update 4, strip 3
+  % before update 4, debugstrip 3
   @  4:443431ffac4f5b5a19b0b6c298a21b7ba736bcce
   |
   o  3:65bd5f99a4a376cdea23a1153f07856b0d881d64
@@ -106,7 +105,7 @@
   
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
-  % after update 4, strip 3
+  % after update 4, debugstrip 3
   o  2:264128213d290d868c54642d13aeaa3675551a78
   |
   @  1:ef3a871183d7199c541cc140218298bbfcc6c28a
@@ -115,7 +114,7 @@
   
   $ teststrip 1 4
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  % before update 1, strip 4
+  % before update 1, debugstrip 4
   o  4:443431ffac4f5b5a19b0b6c298a21b7ba736bcce
   |
   o  3:65bd5f99a4a376cdea23a1153f07856b0d881d64
@@ -127,7 +126,7 @@
   o  0:9ab35a2d17cb64271241ea881efcc19dd953215b
   
   saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
-  % after update 1, strip 4
+  % after update 1, debugstrip 4
   o  3:65bd5f99a4a376cdea23a1153f07856b0d881d64
   |
   | o  2:264128213d290d868c54642d13aeaa3675551a78
@@ -138,7 +137,7 @@
   
   $ teststrip 4 2
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  % before update 4, strip 2
+  % before update 4, debugstrip 2
   @  4:443431ffac4f5b5a19b0b6c298a21b7ba736bcce
   |
   o  3:65bd5f99a4a376cdea23a1153f07856b0d881d64
@@ -150,7 +149,7 @@
   o  0:9ab35a2d17cb64271241ea881efcc19dd953215b
   
   saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
-  % after update 4, strip 2
+  % after update 4, debugstrip 2
   @  3:443431ffac4f5b5a19b0b6c298a21b7ba736bcce
   |
   o  2:65bd5f99a4a376cdea23a1153f07856b0d881d64
@@ -161,7 +160,7 @@
   
   $ teststrip 4 1
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  % before update 4, strip 1
+  % before update 4, debugstrip 1
   @  4:264128213d290d868c54642d13aeaa3675551a78
   |
   | o  3:443431ffac4f5b5a19b0b6c298a21b7ba736bcce
@@ -174,12 +173,12 @@
   
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
-  % after update 4, strip 1
+  % after update 4, debugstrip 1
   @  0:9ab35a2d17cb64271241ea881efcc19dd953215b
   
   $ teststrip null 4
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  % before update null, strip 4
+  % before update null, debugstrip 4
   o  4:264128213d290d868c54642d13aeaa3675551a78
   |
   | o  3:443431ffac4f5b5a19b0b6c298a21b7ba736bcce
@@ -191,7 +190,7 @@
   o  0:9ab35a2d17cb64271241ea881efcc19dd953215b
   
   saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
-  % after update null, strip 4
+  % after update null, debugstrip 4
   o  3:443431ffac4f5b5a19b0b6c298a21b7ba736bcce
   |
   o  2:65bd5f99a4a376cdea23a1153f07856b0d881d64
@@ -240,7 +239,7 @@
   summary:     c
   
 
-  $ hg --traceback strip 4
+  $ hg --traceback debugstrip 4
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/test/.hg/strip-backup/264128213d29-0b39d6bf-backup.hg
   $ hg parents
@@ -314,12 +313,12 @@
   summary:     c
   
 ##strip not allowed with merge in progress
-  $ hg strip 4
+  $ hg debugstrip 4
   abort: outstanding uncommitted merge
   (use 'hg commit' or 'hg merge --abort')
   [255]
 ##strip allowed --force with merge in progress
-  $ hg strip 4 --force
+  $ hg debugstrip 4 --force
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
 
@@ -368,7 +367,7 @@
 
 2 is parent of 3, only one strip should happen
 
-  $ hg strip "roots(2)" 3
+  $ hg debugstrip "roots(2)" 3
   saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
   $ hg log -G
   @  changeset:   2:264128213d29
@@ -418,7 +417,7 @@
   
 Failed hook while applying "saveheads" bundle.
 
-  $ hg strip 2 --config hooks.pretxnchangegroup.bad=false
+  $ hg debugstrip 2 --config hooks.pretxnchangegroup.bad=false
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
   transaction abort!
@@ -460,7 +459,7 @@
 
 2 different branches: 2 strips
 
-  $ hg strip 2 4
+  $ hg debugstrip 2 4
   saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
   $ hg log -G
   o  changeset:   2:65bd5f99a4a3
@@ -483,7 +482,7 @@
 
 2 different branches and a common ancestor: 1 strip
 
-  $ hg strip 1 "2|4"
+  $ hg debugstrip 1 "2|4"
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
   $ restore
@@ -498,7 +497,7 @@
   data/bar.i
 #endif
 
-  $ hg strip tip
+  $ hg debugstrip tip
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
 #if repofncache
@@ -508,13 +507,13 @@
 
 stripping an empty revset
 
-  $ hg strip "1 and not 1"
+  $ hg debugstrip "1 and not 1"
   abort: empty revision set
   [255]
 
 remove branchy history for qimport tests
 
-  $ hg strip 3
+  $ hg debugstrip 3
   saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
 
 
@@ -536,7 +535,7 @@
 
 stripping revision in queue
 
-  $ hg strip 3
+  $ hg debugstrip 3
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
 
@@ -547,7 +546,7 @@
 
 stripping ancestor of queue
 
-  $ hg strip 1
+  $ hg debugstrip 1
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
 
@@ -592,10 +591,10 @@
   mq:     3 unapplied
 
   $ echo c > b
-  $ hg strip tip
+  $ hg debugstrip tip
   abort: uncommitted changes
   [255]
-  $ hg strip tip --keep
+  $ hg debugstrip tip --keep
   saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
   $ hg log --graph
   @  changeset:   0:9ab35a2d17cb
@@ -632,7 +631,7 @@
   $ hg rm bar
   $ hg commit -mc
   $ hg status
-  $ hg strip --keep tip
+  $ hg debugstrip --keep tip
   saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
   $ hg status
   ! bar
@@ -646,7 +645,7 @@
   $ hg status
   $ echo b > b
   $ echo d > d
-  $ hg strip --keep tip
+  $ hg debugstrip --keep tip
   saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
   $ hg status
   M b
@@ -659,7 +658,7 @@
   $ hg commit -mc
   $ hg rm c
   $ hg commit -mc
-  $ hg strip --keep '.^' -q
+  $ hg debugstrip --keep '.^' -q
   $ cd ..
 
 stripping many nodes on a complex graph (issue3299)
@@ -667,10 +666,10 @@
   $ hg init issue3299
   $ cd issue3299
   $ hg debugbuilddag '@a.:a at b.:b.:x<a at a.:a<b at b.:b<a at a.:a'
-  $ hg strip 'not ancestors(x)'
+  $ hg debugstrip 'not ancestors(x)'
   saved backup bundle to $TESTTMP/issue3299/.hg/strip-backup/*-backup.hg (glob)
 
-test hg strip -B bookmark
+test hg debugstrip -B bookmark
 
   $ cd ..
   $ hg init bookmarks
@@ -687,11 +686,11 @@
   $ hg up -C todelete
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   (activating bookmark todelete)
-  $ hg strip -B nostrip
+  $ hg debugstrip -B nostrip
   bookmark 'nostrip' deleted
   abort: empty revision set
   [255]
-  $ hg strip -B todelete
+  $ hg debugstrip -B todelete
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/bookmarks/.hg/strip-backup/*-backup.hg (glob)
   bookmark 'todelete' deleted
@@ -707,7 +706,7 @@
      multipledelete2           12:b4594d867745
      singlenode1               13:43227190fef8
      singlenode2               13:43227190fef8
-  $ hg strip -B multipledelete1 -B multipledelete2
+  $ hg debugstrip -B multipledelete1 -B multipledelete2
   saved backup bundle to $TESTTMP/bookmarks/.hg/strip-backup/e46a4836065c-89ec65c2-backup.hg
   bookmark 'multipledelete1' deleted
   bookmark 'multipledelete2' deleted
@@ -717,23 +716,23 @@
   $ hg id -ir b4594d867745
   abort: unknown revision 'b4594d867745'!
   [255]
-  $ hg strip -B singlenode1 -B singlenode2
+  $ hg debugstrip -B singlenode1 -B singlenode2
   saved backup bundle to $TESTTMP/bookmarks/.hg/strip-backup/43227190fef8-8da858f2-backup.hg
   bookmark 'singlenode1' deleted
   bookmark 'singlenode2' deleted
   $ hg id -ir 43227190fef8
   abort: unknown revision '43227190fef8'!
   [255]
-  $ hg strip -B unknownbookmark
+  $ hg debugstrip -B unknownbookmark
   abort: bookmark 'unknownbookmark' not found
   [255]
-  $ hg strip -B unknownbookmark1 -B unknownbookmark2
+  $ hg debugstrip -B unknownbookmark1 -B unknownbookmark2
   abort: bookmark 'unknownbookmark1,unknownbookmark2' not found
   [255]
-  $ hg strip -B delete -B unknownbookmark
+  $ hg debugstrip -B delete -B unknownbookmark
   abort: bookmark 'unknownbookmark' not found
   [255]
-  $ hg strip -B delete
+  $ hg debugstrip -B delete
   saved backup bundle to $TESTTMP/bookmarks/.hg/strip-backup/*-backup.hg (glob)
   bookmark 'delete' deleted
   $ hg id -ir 6:2702dd0c91e7
@@ -744,7 +743,7 @@
   (activating bookmark B)
   $ echo a > a
   $ hg add a
-  $ hg strip -B B
+  $ hg debugstrip -B B
   abort: uncommitted changes
   [255]
   $ hg bookmarks
@@ -752,14 +751,12 @@
 
 Make sure no one adds back a -b option:
 
-  $ hg strip -b tip
-  hg strip: option -b not recognized
+  $ hg debugstrip -b tip
+  hg debugstrip: option -b not recognized
   hg strip [-k] [-f] [-B bookmark] [-r] REV...
   
   strip changesets and all their descendants from the repository
   
-  (use 'hg help -e strip' to show help for the strip extension)
-  
   options ([+] can be repeated):
   
    -r --rev REV [+]           strip specified revision (optional, can specify
@@ -771,7 +768,7 @@
    -B --bookmark BOOKMARK [+] remove revs only reachable from given bookmark
       --mq                    operate on patch repository
   
-  (use 'hg strip -h' to show more help)
+  (use 'hg debugstrip -h' to show more help)
   [255]
 
   $ cd ..
@@ -784,14 +781,14 @@
   $ hg commit -Aqm a
   $ touch b
   $ hg commit -Aqm b
-  $ hg strip -r 0
+  $ hg debugstrip -r 0
   0 files updated, 0 files merged, 2 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/doublebundle/.hg/strip-backup/3903775176ed-e68910bd-backup.hg
   $ ls .hg/strip-backup
   3903775176ed-e68910bd-backup.hg
 #if repobundlerepo
   $ hg pull -q -r 3903775176ed .hg/strip-backup/3903775176ed-e68910bd-backup.hg
-  $ hg strip -r 0
+  $ hg debugstrip -r 0
   saved backup bundle to $TESTTMP/doublebundle/.hg/strip-backup/3903775176ed-54390173-backup.hg
   $ ls .hg/strip-backup
   3903775176ed-54390173-backup.hg
@@ -882,7 +879,7 @@
 
 check strip behavior
 
-  $ hg --config extensions.strip= strip 'desc(commitD)' --debug
+  $ hg debugstrip 'desc(commitD)' --debug
   resolving manifests
    branchmerge: False, force: True, partial: False
    ancestor: d8db9d137221+, local: d8db9d137221+, remote: eca11cf91c71
@@ -972,7 +969,7 @@
   $ hg add l
   $ hg commit -m commitL
   $ hg book -r tip blah
-  $ hg strip ".^" --config extensions.crash=$TESTTMP/stripstalephasecache.py
+  $ hg debugstrip ".^" --config extensions.crash=$TESTTMP/stripstalephasecache.py
   0 files updated, 0 files merged, 2 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/issue4736/.hg/strip-backup/8f0b4384875c-4fa10deb-backup.hg
   $ hg up -C 1
@@ -993,7 +990,7 @@
   >             return tr
   >     repo.__class__ = crashstriprepo
   > EOF
-  $ hg strip tip --config extensions.crash=$TESTTMP/crashstrip.py
+  $ hg debugstrip tip --config extensions.crash=$TESTTMP/crashstrip.py
   saved backup bundle to $TESTTMP/issue4736/.hg/strip-backup/5c51d8d6557d-70daef06-backup.hg
   strip failed, backup bundle stored in '$TESTTMP/issue4736/.hg/strip-backup/5c51d8d6557d-70daef06-backup.hg'
   abort: boom
@@ -1060,7 +1057,7 @@
      summary:     commitA
   
 
-  $ hg strip --force -r 35358f982181
+  $ hg debugstrip --force -r 35358f982181
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/issue4736/.hg/strip-backup/35358f982181-50d992d4-backup.hg
   $ hg log -G
@@ -1137,7 +1134,7 @@
      summary:     commitA
   
 
-  $ hg strip -r 35358f982181
+  $ hg debugstrip -r 35358f982181
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/issue4736/.hg/strip-backup/35358f982181-a6f020aa-backup.hg
   $ hg log -G
@@ -1173,7 +1170,7 @@
   new changesets 35358f982181:4cf5e92caec2 (2 drafts)
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
 
-  $ hg strip -k -r 35358f982181
+  $ hg debugstrip -k -r 35358f982181
   saved backup bundle to $TESTTMP/issue4736/.hg/strip-backup/35358f982181-a6f020aa-backup.hg
   $ hg log -G
   @  changeset:   3:f62c6c09b707
@@ -1386,7 +1383,7 @@
   $ hg ci --amend -m a2
   $ hg debugobsolete
   cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b 489bac576828490c0bb8d45eac9e5e172e4ec0a8 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
-  $ hg strip .
+  $ hg debugstrip .
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/issue5678/.hg/strip-backup/489bac576828-bef27e14-backup.hg
   $ hg unbundle -q .hg/strip-backup/*
diff --git a/tests/test-debugcommands.t b/tests/test-debugcommands.t
--- a/tests/test-debugcommands.t
+++ b/tests/test-debugcommands.t
@@ -370,7 +370,7 @@
   9 1
   10 2
   11 1
-  $ hg --config extensions.strip= strip --no-backup -r 1
+  $ hg debugstrip --no-backup -r 1
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
 
 Test max chain len
diff --git a/tests/test-copy-move-merge.t b/tests/test-copy-move-merge.t
--- a/tests/test-copy-move-merge.t
+++ b/tests/test-copy-move-merge.t
@@ -79,7 +79,7 @@
 
 - next verify copy metadata is lost when disabled
 
-  $ hg strip -r . --config extensions.strip=
+  $ hg debugstrip -r .
   2 files updated, 0 files merged, 0 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/t/.hg/strip-backup/550bd84c0cd3-fc575957-backup.hg
   $ hg up -qC 2
diff --git a/tests/test-convert-svn-sink.t b/tests/test-convert-svn-sink.t
--- a/tests/test-convert-svn-sink.t
+++ b/tests/test-convert-svn-sink.t
@@ -255,7 +255,7 @@
 
   $ hg --cwd a up 5
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ hg --cwd a --config extensions.strip= strip -r 6
+  $ hg --cwd a debugstrip -r 6
   saved backup bundle to $TESTTMP/a/.hg/strip-backup/bd4f7b7a7067-ed505e42-backup.hg
 
 #endif
diff --git a/tests/test-convert-filemap.t b/tests/test-convert-filemap.t
--- a/tests/test-convert-filemap.t
+++ b/tests/test-convert-filemap.t
@@ -670,7 +670,7 @@
   
 
   $ cd namedbranch
-  $ hg --config extensions.mq= strip tip
+  $ hg --config extensions.mq= debugstrip tip
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/namedbranch/.hg/strip-backup/73899bcbe45c-92adf160-backup.hg
   $ hg up foo
diff --git a/tests/test-completion.t b/tests/test-completion.t
--- a/tests/test-completion.t
+++ b/tests/test-completion.t
@@ -126,6 +126,7 @@
   debugsetparents
   debugsidedata
   debugssl
+  debugstrip
   debugsub
   debugsuccessorssets
   debugtemplate
@@ -308,6 +309,7 @@
   debugsetparents: 
   debugsidedata: changelog, manifest, dir
   debugssl: 
+  debugstrip: rev, force, no-backup, nobackup, , keep, bookmark, soft
   debugsub: rev
   debugsuccessorssets: closest
   debugtemplate: rev, define
diff --git a/tests/test-commandserver.t b/tests/test-commandserver.t
--- a/tests/test-commandserver.t
+++ b/tests/test-commandserver.t
@@ -441,7 +441,7 @@
   ...     # load _phasecache._phaserevs and _phasesets
   ...     runcommand(server, [b'log', b'-qr', b'draft()'])
   ...     # strip cached revisions by another process
-  ...     os.system('hg --config extensions.strip= strip -q 5')
+  ...     os.system('hg debugstrip -q 5')
   ...     # shouldn't abort by "unknown revision '6'"
   ...     runcommand(server, [b'log', b'-qr', b'draft()'])
   ...     bprint(b'')
@@ -475,7 +475,7 @@
   ...     runcommand(server, [b'phase', b'.'], outfilter=sep)
   ... 
   ...     # strip 1::4 outside server
-  ...     os.system('hg -q --config extensions.mq= strip 1')
+  ...     os.system('hg -q --config extensions.mq= debugstrip 1')
   ... 
   ...     # shouldn't raise "7966c8e3734d: no node!"
   ...     runcommand(server, [b'branches'])
diff --git a/tests/test-bundle-phases.t b/tests/test-bundle-phases.t
--- a/tests/test-bundle-phases.t
+++ b/tests/test-bundle-phases.t
@@ -2,7 +2,6 @@
   > [experimental]
   > bundle-phases=yes
   > [extensions]
-  > strip=
   > drawdag=$TESTDIR/drawdag.py
   > EOF
 
@@ -45,7 +44,7 @@
   cache:rev-branch-cache -- {} (mandatory: False)
   phase-heads -- {} (mandatory: True)
       26805aba1e600a82e93661149f2313866a221a7b draft
-  $ hg strip --no-backup C
+  $ hg debugstrip --no-backup C
   $ hg unbundle -q bundle
   $ rm bundle
   $ hg log -G -T '{desc} {phase}\n'
@@ -62,7 +61,7 @@
 Root revision's phase is preserved
   $ hg bundle -a bundle
   5 changesets found
-  $ hg strip --no-backup A
+  $ hg debugstrip --no-backup A
   $ hg unbundle -q bundle
   $ rm bundle
   $ hg log -G -T '{desc} {phase}\n'
@@ -80,7 +79,7 @@
   $ hg phase --public E
   $ hg bundle -a bundle
   5 changesets found
-  $ hg strip --no-backup A
+  $ hg debugstrip --no-backup A
   $ hg unbundle -q bundle
   $ rm bundle
   $ hg log -G -T '{desc} {phase}\n'
@@ -98,7 +97,7 @@
   $ hg phase --secret --force D
   $ hg bundle -a bundle
   5 changesets found
-  $ hg strip --no-backup A
+  $ hg debugstrip --no-backup A
   $ hg unbundle -q bundle
   $ rm bundle
   $ hg log -G -T '{desc} {phase}\n'
@@ -116,7 +115,7 @@
   $ hg phase --draft --force B
   $ hg bundle --base B -r E bundle
   3 changesets found
-  $ hg strip --no-backup C
+  $ hg debugstrip --no-backup C
   $ hg phase --public B
   $ hg unbundle -q bundle
   $ rm bundle
@@ -134,7 +133,7 @@
 Phase of ancestors of stripped node get advanced to accommodate child
   $ hg bundle --base B -r E bundle
   3 changesets found
-  $ hg strip --no-backup C
+  $ hg debugstrip --no-backup C
   $ hg phase --force --secret B
   $ hg unbundle -q bundle
   $ rm bundle
@@ -172,7 +171,7 @@
   o  A public
   
 Unbundling change in the middle of a stack does not affect later changes
-  $ hg strip --no-backup E
+  $ hg debugstrip --no-backup E
   $ hg phase --secret --force D
   $ hg log -G -T '{desc} {phase}\n'
   o  D secret
@@ -238,7 +237,7 @@
   phase-heads -- {} (mandatory: True)
       dc0947a82db884575bb76ea10ac97b08536bfa03 public
       03ca77807e919db8807c3749086dc36fb478cac0 draft
-  $ hg strip --no-backup A
+  $ hg debugstrip --no-backup A
   $ hg unbundle -q bundle
   $ rm bundle
   $ hg log -G -T '{node|short} {desc} {phase}\n'
diff --git a/tests/test-branches.t b/tests/test-branches.t
--- a/tests/test-branches.t
+++ b/tests/test-branches.t
@@ -860,7 +860,7 @@
   0090: c9 14 c9 9f 00 00 00 06 cd 21 a8 0b 80 00 00 05 |.........!......|
 cache is updated/truncated when stripping - it is thus very hard to get in a
 situation where the cache is out of sync and the hash check detects it
-  $ hg --config extensions.strip= strip -r tip --nob
+  $ hg debugstrip -r tip --nob
   $ f --size .hg/cache/rbc-revs*
   .hg/cache/rbc-revs-v1: size=152
 
diff --git a/tests/test-bookmarks.t b/tests/test-bookmarks.t
--- a/tests/test-bookmarks.t
+++ b/tests/test-bookmarks.t
@@ -882,7 +882,7 @@
   1 files updated, 0 files merged, 1 files removed, 0 files unresolved
   (leaving bookmark should-end-on-two)
   $ hg book four
-  $ hg --config extensions.mq= strip 3
+  $ hg --config extensions.mq= debugstrip 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.
diff --git a/tests/test-bookmarks-strip.t b/tests/test-bookmarks-strip.t
--- a/tests/test-bookmarks-strip.t
+++ b/tests/test-bookmarks-strip.t
@@ -55,7 +55,7 @@
 
 strip to revision 1
 
-  $ hg strip 1
+  $ hg debugstrip 1
   saved backup bundle to $TESTTMP/.hg/strip-backup/*-backup.hg (glob)
 
 list bookmarks
diff --git a/tests/test-bookmarks-pushpull.t b/tests/test-bookmarks-pushpull.t
--- a/tests/test-bookmarks-pushpull.t
+++ b/tests/test-bookmarks-pushpull.t
@@ -904,7 +904,7 @@
   $ hg -R repo1 bookmarks -f -r 2 ADV_ON_REPO1
   $ hg -R repo1 bookmarks -f -r 3 DIFF_ADV_ON_REPO1
   $ hg -R repo1 bookmarks -f -r 3 DIFF_DIVERGED
-  $ hg -R repo1 -q --config extensions.mq= strip 4
+  $ hg -R repo1 -q --config extensions.mq= debugstrip 4
   $ hg -R repo1 log -G --template '{node|short} ({bookmarks})'
   o  6100d3090acf (DIFF_ADV_ON_REPO1 DIFF_DIVERGED)
   |
@@ -921,7 +921,7 @@
   $ hg -R repo2 bookmarks -f -r 2 DIVERGED
   $ hg -R repo2 bookmarks -f -r 4 DIFF_ADV_ON_REPO2
   $ hg -R repo2 bookmarks -f -r 4 DIFF_DIVERGED
-  $ hg -R repo2 -q --config extensions.mq= strip 3
+  $ hg -R repo2 -q --config extensions.mq= debugstrip 3
   $ hg -R repo2 log -G --template '{node|short} ({bookmarks})'
   o  e7bd5218ca15 (DIFF_ADV_ON_REPO2 DIFF_DIVERGED)
   |
diff --git a/tests/test-blackbox.t b/tests/test-blackbox.t
--- a/tests/test-blackbox.t
+++ b/tests/test-blackbox.t
@@ -180,15 +180,15 @@
   $ hg commit -Amd
   adding d
   created new head
-  $ hg strip tip
+  $ hg debugstrip tip
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/blackboxtest2/.hg/strip-backup/*-backup.hg (glob)
   $ hg blackbox -l 6
-  1970/01/01 00:00:00 bob @73f6ee326b27d820b0472f1a825e3a50f3dc489b (5000)> strip tip
+  1970/01/01 00:00:00 bob @73f6ee326b27d820b0472f1a825e3a50f3dc489b (5000)> debugstrip tip
   1970/01/01 00:00:00 bob @6563da9dcf87b1949716e38ff3e3dfaa3198eb06 (5000)> saved backup bundle to $TESTTMP/blackboxtest2/.hg/strip-backup/73f6ee326b27-7612e004-backup.hg
   1970/01/01 00:00:00 bob @6563da9dcf87b1949716e38ff3e3dfaa3198eb06 (5000)> updated branch cache (base) in * seconds (glob)
   1970/01/01 00:00:00 bob @6563da9dcf87b1949716e38ff3e3dfaa3198eb06 (5000)> wrote branch cache (base) with 1 labels and 2 nodes
-  1970/01/01 00:00:00 bob @6563da9dcf87b1949716e38ff3e3dfaa3198eb06 (5000)> strip tip exited 0 after * seconds (glob)
+  1970/01/01 00:00:00 bob @6563da9dcf87b1949716e38ff3e3dfaa3198eb06 (5000)> debugstrip tip exited 0 after * seconds (glob)
   1970/01/01 00:00:00 bob @6563da9dcf87b1949716e38ff3e3dfaa3198eb06 (5000)> blackbox -l 6
 
 extension and python hooks - use the eol extension for a pythonhook
diff --git a/tests/test-backout.t b/tests/test-backout.t
--- a/tests/test-backout.t
+++ b/tests/test-backout.t
@@ -279,7 +279,7 @@
 == test visibility to external preupdate hook
 
   $ hg update -q -C 2
-  $ hg --config extensions.strip= strip 3
+  $ hg debugstrip 3
   saved backup bundle to * (glob)
 
   $ cat >> .hg/hgrc <<EOF
@@ -316,7 +316,7 @@
 == test visibility to external update hook
 
   $ hg update -q -C 2
-  $ hg --config extensions.strip= strip 3
+  $ hg debugstrip 3
   saved backup bundle to * (glob)
 
   $ cat >> .hg/hgrc <<EOF
diff --git a/tests/remotefilelog-library.sh b/tests/remotefilelog-library.sh
--- a/tests/remotefilelog-library.sh
+++ b/tests/remotefilelog-library.sh
@@ -6,7 +6,6 @@
 [extensions]
 remotefilelog=
 rebase=
-strip=
 [ui]
 ssh=python "$TESTDIR/dummyssh"
 [server]
diff --git a/hgext/strip.py b/mercurial/strip.py
copy from hgext/strip.py
copy to mercurial/strip.py
--- a/hgext/strip.py
+++ b/mercurial/strip.py
@@ -5,26 +5,19 @@
 """
 from __future__ import absolute_import
 
-from mercurial.i18n import _
-from mercurial import (
+from .i18n import _
+from . import (
     bookmarks as bookmarksmod,
     cmdutil,
-    error,
     hg,
     lock as lockmod,
-    merge,
     node as nodemod,
-    pycompat,
-    registrar,
     repair,
-    scmutil,
     util,
 )
 nullid = nodemod.nullid
 release = lockmod.release
 
-cmdtable = {}
-command = registrar.command(cmdtable)
 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
 # be specifying the version(s) of Mercurial they are tested with, or
@@ -40,7 +33,7 @@
         cmdutil.checkunfinished(repo, skipmerge=True)
     return s
 
-def _findupdatetarget(repo, nodes):
+def findupdatetarget(repo, nodes):
     unode, p2 = repo.changelog.parents(nodes[0])
     currentbranch = repo[None].branch()
 
@@ -64,7 +57,7 @@
 
         if update:
             checklocalchanges(repo, force=force)
-            urev = _findupdatetarget(repo, revs)
+            urev = findupdatetarget(repo, revs)
             hg.clean(repo, urev)
             repo.dirstate.write(repo.currenttransaction())
 
@@ -81,150 +74,3 @@
                 repomarks.applychanges(repo, tr, [(b, None) for b in bookmarks])
             for bookmark in sorted(bookmarks):
                 ui.write(_("bookmark '%s' deleted\n") % bookmark)
-
- at command("strip",
-         [
-          ('r', 'rev', [], _('strip specified revision (optional, '
-                               'can specify revisions without this '
-                               'option)'), _('REV')),
-          ('f', 'force', None, _('force removal of changesets, discard '
-                                 'uncommitted changes (no backup)')),
-          ('', 'no-backup', None, _('do not save backup bundle')),
-          ('', 'nobackup', None, _('do not save backup bundle '
-                                   '(DEPRECATED)')),
-          ('n', '', None, _('ignored  (DEPRECATED)')),
-          ('k', 'keep', None, _("do not modify working directory during "
-                                "strip")),
-          ('B', 'bookmark', [], _("remove revs only reachable from given"
-                                  " bookmark"), _('BOOKMARK')),
-          ('', 'soft', None,
-          _("simply drop changesets from visible history (EXPERIMENTAL)")),
-         ],
-          _('hg strip [-k] [-f] [-B bookmark] [-r] REV...'),
-          helpcategory=command.CATEGORY_MAINTENANCE)
-def stripcmd(ui, repo, *revs, **opts):
-    """strip changesets and all their descendants from the repository
-
-    The strip command removes the specified changesets and all their
-    descendants. If the working directory has uncommitted changes, the
-    operation is aborted unless the --force flag is supplied, in which
-    case changes will be discarded.
-
-    If a parent of the working directory is stripped, then the working
-    directory will automatically be updated to the most recent
-    available ancestor of the stripped parent after the operation
-    completes.
-
-    Any stripped changesets are stored in ``.hg/strip-backup`` as a
-    bundle (see :hg:`help bundle` and :hg:`help unbundle`). They can
-    be restored by running :hg:`unbundle .hg/strip-backup/BUNDLE`,
-    where BUNDLE is the bundle file created by the strip. Note that
-    the local revision numbers will in general be different after the
-    restore.
-
-    Use the --no-backup option to discard the backup bundle once the
-    operation completes.
-
-    Strip is not a history-rewriting operation and can be used on
-    changesets in the public phase. But if the stripped changesets have
-    been pushed to a remote repository you will likely pull them again.
-
-    Return 0 on success.
-    """
-    opts = pycompat.byteskwargs(opts)
-    backup = True
-    if opts.get('no_backup') or opts.get('nobackup'):
-        backup = False
-
-    cl = repo.changelog
-    revs = list(revs) + opts.get('rev')
-    revs = set(scmutil.revrange(repo, revs))
-
-    with repo.wlock():
-        bookmarks = set(opts.get('bookmark'))
-        if bookmarks:
-            repomarks = repo._bookmarks
-            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.
-            nodetobookmarks = {}
-            for mark, node in repomarks.iteritems():
-                nodetobookmarks.setdefault(node, []).append(mark)
-            for marks in nodetobookmarks.values():
-                if bookmarks.issuperset(marks):
-                    rsrevs = scmutil.bookmarkrevs(repo, marks[0])
-                    revs.update(set(rsrevs))
-            if not revs:
-                with repo.lock(), repo.transaction('bookmark') as tr:
-                    bmchanges = [(b, None) for b in bookmarks]
-                    repomarks.applychanges(repo, tr, bmchanges)
-                for bookmark in sorted(bookmarks):
-                    ui.write(_("bookmark '%s' deleted\n") % bookmark)
-
-        if not revs:
-            raise error.Abort(_('empty revision set'))
-
-        descendants = set(cl.descendants(revs))
-        strippedrevs = revs.union(descendants)
-        roots = revs.difference(descendants)
-
-        # if one of the wdir parent is stripped we'll need
-        # to update away to an earlier revision
-        update = any(p != nullid and cl.rev(p) in strippedrevs
-                     for p in repo.dirstate.parents())
-
-        rootnodes = set(cl.node(r) for r in roots)
-
-        q = getattr(repo, 'mq', None)
-        if q is not None and q.applied:
-            # refresh queue state if we're about to strip
-            # applied patches
-            if cl.rev(repo.lookup('qtip')) in strippedrevs:
-                q.applieddirty = True
-                start = 0
-                end = len(q.applied)
-                for i, statusentry in enumerate(q.applied):
-                    if statusentry.node in rootnodes:
-                        # if one of the stripped roots is an applied
-                        # patch, only part of the queue is stripped
-                        start = i
-                        break
-                del q.applied[start:end]
-                q.savedirty()
-
-        revs = sorted(rootnodes)
-        if update and opts.get('keep'):
-            urev = _findupdatetarget(repo, revs)
-            uctx = repo[urev]
-
-            # only reset the dirstate for files that would actually change
-            # between the working context and uctx
-            descendantrevs = repo.revs(b"%d::.", uctx.rev())
-            changedfiles = []
-            for rev in descendantrevs:
-                # blindly reset the files, regardless of what actually changed
-                changedfiles.extend(repo[rev].files())
-
-            # reset files that only changed in the dirstate too
-            dirstate = repo.dirstate
-            dirchanges = [f for f in dirstate if dirstate[f] != 'n']
-            changedfiles.extend(dirchanges)
-
-            repo.dirstate.rebuild(urev, uctx.manifest(), changedfiles)
-            repo.dirstate.write(repo.currenttransaction())
-
-            # clear resolve state
-            merge.mergestate.clean(repo, repo['.'].node())
-
-            update = False
-
-
-        strip(ui, repo, revs, backup=backup, update=update,
-              force=opts.get('force'), bookmarks=bookmarks,
-              soft=opts['soft'])
-
-    return 0
diff --git a/mercurial/debugcommands.py b/mercurial/debugcommands.py
--- a/mercurial/debugcommands.py
+++ b/mercurial/debugcommands.py
@@ -70,6 +70,7 @@
     sshpeer,
     sslutil,
     streamclone,
+    strip as stripmod,
     templater,
     treediscovery,
     upgrade,
@@ -2726,6 +2727,150 @@
     finally:
         s.close()
 
+ at command("debugstrip",
+    [
+     ('r', 'rev', [], _('strip specified revision (optional, can specify '
+                        'revisions without this option)'), _('REV')),
+     ('f', 'force', None, _('force removal of changesets, discard uncommitted'
+                            ' changes (no backup)')),
+     ('', 'no-backup', None, _('do not save backup bundle')),
+     ('', 'nobackup', None, _('do not save backup bundle (DEPRECATED)')),
+     ('n', '', None, _('ignored  (DEPRECATED)')),
+     ('k', 'keep', None, _("do not modify working directory during strip")),
+     ('B', 'bookmark', [], _("remove revs only reachable from given bookmark"),
+                           _('BOOKMARK')),
+     ('', 'soft', None,
+     _("simply drop changesets from visible history (EXPERIMENTAL)")),
+    ],
+    _('hg strip [-k] [-f] [-B bookmark] [-r] REV...'),
+    helpcategory=command.CATEGORY_MAINTENANCE)
+def debugstrip(ui, repo, *revs, **opts):
+    """strip changesets and all their descendants from the repository
+
+    The strip command removes the specified changesets and all their
+    descendants. If the working directory has uncommitted changes, the
+    operation is aborted unless the --force flag is supplied, in which
+    case changes will be discarded.
+
+    If a parent of the working directory is stripped, then the working
+    directory will automatically be updated to the most recent
+    available ancestor of the stripped parent after the operation
+    completes.
+
+    Any stripped changesets are stored in ``.hg/strip-backup`` as a
+    bundle (see :hg:`help bundle` and :hg:`help unbundle`). They can
+    be restored by running :hg:`unbundle .hg/strip-backup/BUNDLE`,
+    where BUNDLE is the bundle file created by the strip. Note that
+    the local revision numbers will in general be different after the
+    restore.
+
+    Use the --no-backup option to discard the backup bundle once the
+    operation completes.
+
+    Strip is not a history-rewriting operation and can be used on
+    changesets in the public phase. But if the stripped changesets have
+    been pushed to a remote repository you will likely pull them again.
+
+    Return 0 on success.
+    """
+    opts = pycompat.byteskwargs(opts)
+    backup = True
+    if opts.get('no_backup') or opts.get('nobackup'):
+        backup = False
+
+    cl = repo.changelog
+    revs = list(revs) + opts.get('rev')
+    revs = set(scmutil.revrange(repo, revs))
+
+    with repo.wlock():
+        bookmarks = set(opts.get('bookmark'))
+        if bookmarks:
+            repomarks = repo._bookmarks
+            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.
+            nodetobookmarks = {}
+            for mark, node in repomarks.iteritems():
+                nodetobookmarks.setdefault(node, []).append(mark)
+            for marks in nodetobookmarks.values():
+                if bookmarks.issuperset(marks):
+                    rsrevs = scmutil.bookmarkrevs(repo, marks[0])
+                    revs.update(set(rsrevs))
+            if not revs:
+                with repo.lock(), repo.transaction('bookmark') as tr:
+                    bmchanges = [(b, None) for b in bookmarks]
+                    repomarks.applychanges(repo, tr, bmchanges)
+                for bookmark in sorted(bookmarks):
+                    ui.write(_("bookmark '%s' deleted\n") % bookmark)
+
+        if not revs:
+            raise error.Abort(_('empty revision set'))
+
+        descendants = set(cl.descendants(revs))
+        strippedrevs = revs.union(descendants)
+        roots = revs.difference(descendants)
+
+        # if one of the wdir parent is stripped we'll need
+        # to update away to an earlier revision
+        update = any(p != nullid and cl.rev(p) in strippedrevs
+                     for p in repo.dirstate.parents())
+
+        rootnodes = set(cl.node(r) for r in roots)
+
+        q = getattr(repo, 'mq', None)
+        if q is not None and q.applied:
+            # refresh queue state if we're about to strip
+            # applied patches
+            if cl.rev(repo.lookup('qtip')) in strippedrevs:
+                q.applieddirty = True
+                start = 0
+                end = len(q.applied)
+                for i, statusentry in enumerate(q.applied):
+                    if statusentry.node in rootnodes:
+                        # if one of the stripped roots is an applied
+                        # patch, only part of the queue is stripped
+                        start = i
+                        break
+                del q.applied[start:end]
+                q.savedirty()
+
+        revs = sorted(rootnodes)
+        if update and opts.get('keep'):
+            urev = stripmod.findupdatetarget(repo, revs)
+            uctx = repo[urev]
+
+            # only reset the dirstate for files that would actually change
+            # between the working context and uctx
+            descendantrevs = repo.revs(b"%d::.", uctx.rev())
+            changedfiles = []
+            for rev in descendantrevs:
+                # blindly reset the files, regardless of what actually changed
+                changedfiles.extend(repo[rev].files())
+
+            # reset files that only changed in the dirstate too
+            dirstate = repo.dirstate
+            dirchanges = [f for f in dirstate if dirstate[f] != 'n']
+            changedfiles.extend(dirchanges)
+
+            repo.dirstate.rebuild(urev, uctx.manifest(), changedfiles)
+            repo.dirstate.write(repo.currenttransaction())
+
+            # clear resolve state
+            mergemod.mergestate.clean(repo, repo['.'].node())
+
+            update = False
+
+
+        stripmod.strip(ui, repo, revs, backup=backup, update=update,
+                       force=opts.get('force'), bookmarks=bookmarks,
+                       soft=opts['soft'])
+
+    return 0
+
 @command('debugsub',
     [('r', 'rev', '',
      _('revision to check'), _('REV'))],
diff --git a/hgext/strip.py b/hgext/strip.py
--- a/hgext/strip.py
+++ b/hgext/strip.py
@@ -1,107 +1,42 @@
 """strip changesets and their descendants from history
 
-This extension allows you to strip changesets and all their descendants from the
-repository. See the command help for details.
+strip extension has been renamed to debugstrip and moved to core. However,
+this extension is to preserve the old `strip` name forusers that are used
+to that.
 """
+
 from __future__ import absolute_import
-
 from mercurial.i18n import _
+from mercurial.node import nullid
 from mercurial import (
-    bookmarks as bookmarksmod,
-    cmdutil,
     error,
-    hg,
-    lock as lockmod,
-    merge,
-    node as nodemod,
+    merge as mergemod,
     pycompat,
     registrar,
-    repair,
     scmutil,
-    util,
+    strip as stripmod,
 )
-nullid = nodemod.nullid
-release = lockmod.release
 
 cmdtable = {}
 command = registrar.command(cmdtable)
-# Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
-# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
-# be specifying the version(s) of Mercurial they are tested with, or
-# leave the attribute unspecified.
-testedwith = 'ships-with-hg-core'
-
-def checklocalchanges(repo, force=False):
-    s = repo.status()
-    if not force:
-        cmdutil.checkunfinished(repo)
-        cmdutil.bailifchanged(repo)
-    else:
-        cmdutil.checkunfinished(repo, skipmerge=True)
-    return s
-
-def _findupdatetarget(repo, nodes):
-    unode, p2 = repo.changelog.parents(nodes[0])
-    currentbranch = repo[None].branch()
-
-    if (util.safehasattr(repo, 'mq') and p2 != nullid
-        and p2 in [x.node for x in repo.mq.applied]):
-        unode = p2
-    elif currentbranch != repo[unode].branch():
-        pwdir = 'parents(wdir())'
-        revset = 'max(((parents(%ln::%r) + %r) - %ln::%r) and branch(%s))'
-        branchtarget = repo.revs(revset, nodes, pwdir, pwdir, nodes, pwdir,
-                                 currentbranch)
-        if branchtarget:
-            cl = repo.changelog
-            unode = cl.node(branchtarget.first())
-
-    return unode
-
-def strip(ui, repo, revs, update=True, backup=True, force=None, bookmarks=None,
-          soft=False):
-    with repo.wlock(), repo.lock():
-
-        if update:
-            checklocalchanges(repo, force=force)
-            urev = _findupdatetarget(repo, revs)
-            hg.clean(repo, urev)
-            repo.dirstate.write(repo.currenttransaction())
-
-        if soft:
-            repair.softstrip(ui, repo, revs, backup)
-        else:
-            repair.strip(ui, repo, revs, backup)
-
-        repomarks = repo._bookmarks
-        if bookmarks:
-            with repo.transaction('strip') as tr:
-                if repo._activebookmark in bookmarks:
-                    bookmarksmod.deactivate(repo)
-                repomarks.applychanges(repo, tr, [(b, None) for b in bookmarks])
-            for bookmark in sorted(bookmarks):
-                ui.write(_("bookmark '%s' deleted\n") % bookmark)
 
 @command("strip",
-         [
-          ('r', 'rev', [], _('strip specified revision (optional, '
-                               'can specify revisions without this '
-                               'option)'), _('REV')),
-          ('f', 'force', None, _('force removal of changesets, discard '
-                                 'uncommitted changes (no backup)')),
-          ('', 'no-backup', None, _('do not save backup bundle')),
-          ('', 'nobackup', None, _('do not save backup bundle '
-                                   '(DEPRECATED)')),
-          ('n', '', None, _('ignored  (DEPRECATED)')),
-          ('k', 'keep', None, _("do not modify working directory during "
-                                "strip")),
-          ('B', 'bookmark', [], _("remove revs only reachable from given"
-                                  " bookmark"), _('BOOKMARK')),
-          ('', 'soft', None,
-          _("simply drop changesets from visible history (EXPERIMENTAL)")),
-         ],
-          _('hg strip [-k] [-f] [-B bookmark] [-r] REV...'),
-          helpcategory=command.CATEGORY_MAINTENANCE)
+    [
+     ('r', 'rev', [], _('strip specified revision (optional, can specify '
+                        'revisions without this option)'), _('REV')),
+     ('f', 'force', None, _('force removal of changesets, discard uncommitted'
+                            ' changes (no backup)')),
+     ('', 'no-backup', None, _('do not save backup bundle')),
+     ('', 'nobackup', None, _('do not save backup bundle (DEPRECATED)')),
+     ('n', '', None, _('ignored  (DEPRECATED)')),
+     ('k', 'keep', None, _("do not modify working directory during strip")),
+     ('B', 'bookmark', [], _("remove revs only reachable from given bookmark"),
+                           _('BOOKMARK')),
+     ('', 'soft', None,
+     _("simply drop changesets from visible history (EXPERIMENTAL)")),
+    ],
+    _('hg strip [-k] [-f] [-B bookmark] [-r] REV...'),
+    helpcategory=command.CATEGORY_MAINTENANCE)
 def stripcmd(ui, repo, *revs, **opts):
     """strip changesets and all their descendants from the repository
 
@@ -198,7 +133,7 @@
 
         revs = sorted(rootnodes)
         if update and opts.get('keep'):
-            urev = _findupdatetarget(repo, revs)
+            urev = stripmod.findupdatetarget(repo, revs)
             uctx = repo[urev]
 
             # only reset the dirstate for files that would actually change
@@ -218,13 +153,13 @@
             repo.dirstate.write(repo.currenttransaction())
 
             # clear resolve state
-            merge.mergestate.clean(repo, repo['.'].node())
+            mergemod.mergestate.clean(repo, repo['.'].node())
 
             update = False
 
 
-        strip(ui, repo, revs, backup=backup, update=update,
-              force=opts.get('force'), bookmarks=bookmarks,
-              soft=opts['soft'])
+        stripmod.strip(ui, repo, revs, backup=backup, update=update,
+                       force=opts.get('force'), bookmarks=bookmarks,
+                       soft=opts['soft'])
 
     return 0
diff --git a/hgext/mq.py b/hgext/mq.py
--- a/hgext/mq.py
+++ b/hgext/mq.py
@@ -94,6 +94,7 @@
     revsetlang,
     scmutil,
     smartset,
+    strip as stripmod,
     subrepoutil,
     util,
     vfs as vfsmod,
@@ -130,20 +131,7 @@
     default=False,
 )
 
-# force load strip extension formerly included in mq and import some utility
-try:
-    stripext = extensions.find('strip')
-except KeyError:
-    # note: load is lazy so we could avoid the try-except,
-    # but I (marmoute) prefer this explicit code.
-    class dummyui(object):
-        def debug(self, msg):
-            pass
-        def log(self, event, msgfmt, *msgargs, **opts):
-            pass
-    stripext = extensions.load(dummyui(), 'strip', '')
-
-strip = stripext.strip
+strip = stripmod.strip
 
 def checksubstate(repo, baserev=None):
     '''return list of subrepos at a different revision than substate.



To: navaneeth.suresh, durin42, #hg-reviewers
Cc: mjpieters, mercurial-devel


More information about the Mercurial-devel mailing list