hgext/strip.py
author Gregory Szorc <gregory.szorc@gmail.com>
Sat, 08 Aug 2015 00:16:02 -0700
changeset 26056 5f2a4fc3c4fa
parent 25186 80c5b2666a96
child 26587 56b2bcea2529
permissions -rw-r--r--
ui: move URL and path detection into path API ui.expandpath() has code for recognizing URLs or local filesystem paths. Our goal is to use ``path`` class instances everywhere a path is represented. Changing ui.expandpath() to return path instances is a lot of work. Our goal is to slowly marginalize it by moving logic into the paths API and to convert callers to the paths API. Many callers of ui.expandpath() pass in a value that could be a local filesystem path or URI. We move the detection of these strings from ui.expandpath() to paths.getpath() and path.__init__(). To do this properly in a way that is compatible with future callers, we need to parse the "#branch" syntax out of locations. This is a bit complicated, but it is necessary. The code for URL parsing is essentially a copy of hg.parseurl(). Once all consumers are speaking the paths API, it is likely that this function won't be called any more and it can be deleted.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
23139
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 22925
diff changeset
     1
"""strip changesets and their descendants from history
19826
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
     2
19945
3d42a85f6922 strip: fix spelling: "allows to" -> "allows you to"
Javi Merino <cibervicho@gmail.com>
parents: 19828
diff changeset
     3
This extension allows you to strip changesets and all their descendants from the
19826
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
     4
repository. See the command help for details.
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
     5
"""
19823
6fb14d21fe9d strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19822
diff changeset
     6
from mercurial.i18n import _
19825
4b4997068143 strip: move the strip helper function for mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19824
diff changeset
     7
from mercurial.node import nullid
4b4997068143 strip: move the strip helper function for mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19824
diff changeset
     8
from mercurial.lock import release
19826
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
     9
from mercurial import cmdutil, hg, scmutil, util
24709
69154e0ae384 strip: properly clear resolve state with --keep (issue4593)
Matt Mackall <mpm@selenic.com>
parents: 24471
diff changeset
    10
from mercurial import repair, bookmarks, merge
19822
a194a33f8cb2 mq: prepare a strip extension for extraction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    11
a194a33f8cb2 mq: prepare a strip extension for extraction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    12
cmdtable = {}
a194a33f8cb2 mq: prepare a strip extension for extraction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    13
command = cmdutil.command(cmdtable)
25186
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24947
diff changeset
    14
# Note for extension authors: ONLY specify testedwith = 'internal' for
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24947
diff changeset
    15
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24947
diff changeset
    16
# be specifying the version(s) of Mercurial they are tested with, or
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24947
diff changeset
    17
# leave the attribute unspecified.
19822
a194a33f8cb2 mq: prepare a strip extension for extraction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    18
testedwith = 'internal'
19823
6fb14d21fe9d strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19822
diff changeset
    19
6fb14d21fe9d strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19822
diff changeset
    20
def checksubstate(repo, baserev=None):
6fb14d21fe9d strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19822
diff changeset
    21
    '''return list of subrepos at a different revision than substate.
6fb14d21fe9d strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19822
diff changeset
    22
    Abort if any subrepos have uncommitted changes.'''
6fb14d21fe9d strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19822
diff changeset
    23
    inclsubs = []
6fb14d21fe9d strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19822
diff changeset
    24
    wctx = repo[None]
6fb14d21fe9d strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19822
diff changeset
    25
    if baserev:
6fb14d21fe9d strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19822
diff changeset
    26
        bctx = repo[baserev]
6fb14d21fe9d strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19822
diff changeset
    27
    else:
6fb14d21fe9d strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19822
diff changeset
    28
        bctx = wctx.parents()[0]
6fb14d21fe9d strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19822
diff changeset
    29
    for s in sorted(wctx.substate):
24471
1ff35d76421c subrepo: add bailifchanged to centralize raising Abort if subrepo is dirty
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24364
diff changeset
    30
        wctx.sub(s).bailifchanged(True)
1ff35d76421c subrepo: add bailifchanged to centralize raising Abort if subrepo is dirty
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24364
diff changeset
    31
        if s not in bctx.substate or bctx.sub(s).dirty():
19823
6fb14d21fe9d strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19822
diff changeset
    32
            inclsubs.append(s)
6fb14d21fe9d strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19822
diff changeset
    33
    return inclsubs
6fb14d21fe9d strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19822
diff changeset
    34
19824
237e40b2c1ff strip: move checklocalchanges from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19823
diff changeset
    35
def checklocalchanges(repo, force=False, excsuffix=''):
237e40b2c1ff strip: move checklocalchanges from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19823
diff changeset
    36
    cmdutil.checkunfinished(repo)
22925
68df36ce3d8a strip: make checklocalchanges() return full status tuple
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22057
diff changeset
    37
    s = repo.status()
19824
237e40b2c1ff strip: move checklocalchanges from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19823
diff changeset
    38
    if not force:
22925
68df36ce3d8a strip: make checklocalchanges() return full status tuple
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22057
diff changeset
    39
        if s.modified or s.added or s.removed or s.deleted:
19824
237e40b2c1ff strip: move checklocalchanges from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19823
diff changeset
    40
            _("local changes found") # i18n tool detection
237e40b2c1ff strip: move checklocalchanges from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19823
diff changeset
    41
            raise util.Abort(_("local changes found" + excsuffix))
237e40b2c1ff strip: move checklocalchanges from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19823
diff changeset
    42
        if checksubstate(repo):
237e40b2c1ff strip: move checklocalchanges from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19823
diff changeset
    43
            _("local changed subrepos found") # i18n tool detection
237e40b2c1ff strip: move checklocalchanges from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19823
diff changeset
    44
            raise util.Abort(_("local changed subrepos found" + excsuffix))
22925
68df36ce3d8a strip: make checklocalchanges() return full status tuple
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22057
diff changeset
    45
    return s
19824
237e40b2c1ff strip: move checklocalchanges from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19823
diff changeset
    46
22057
445472225ccd strip: remove -b/--backup codepaths
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21854
diff changeset
    47
def strip(ui, repo, revs, update=True, backup=True, force=None, bookmark=None):
19825
4b4997068143 strip: move the strip helper function for mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19824
diff changeset
    48
    wlock = lock = None
4b4997068143 strip: move the strip helper function for mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19824
diff changeset
    49
    try:
4b4997068143 strip: move the strip helper function for mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19824
diff changeset
    50
        wlock = repo.wlock()
4b4997068143 strip: move the strip helper function for mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19824
diff changeset
    51
        lock = repo.lock()
4b4997068143 strip: move the strip helper function for mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19824
diff changeset
    52
4b4997068143 strip: move the strip helper function for mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19824
diff changeset
    53
        if update:
4b4997068143 strip: move the strip helper function for mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19824
diff changeset
    54
            checklocalchanges(repo, force=force)
4b4997068143 strip: move the strip helper function for mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19824
diff changeset
    55
            urev, p2 = repo.changelog.parents(revs[0])
20009
2802bedbd45f strip: fix last unprotected mq reference (issue4097)
Matt Mackall <mpm@selenic.com>
parents: 19945
diff changeset
    56
            if (util.safehasattr(repo, 'mq') and
2802bedbd45f strip: fix last unprotected mq reference (issue4097)
Matt Mackall <mpm@selenic.com>
parents: 19945
diff changeset
    57
                p2 != nullid
2802bedbd45f strip: fix last unprotected mq reference (issue4097)
Matt Mackall <mpm@selenic.com>
parents: 19945
diff changeset
    58
                and p2 in [x.node for x in repo.mq.applied]):
19825
4b4997068143 strip: move the strip helper function for mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19824
diff changeset
    59
                urev = p2
4b4997068143 strip: move the strip helper function for mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19824
diff changeset
    60
            hg.clean(repo, urev)
4b4997068143 strip: move the strip helper function for mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19824
diff changeset
    61
            repo.dirstate.write()
4b4997068143 strip: move the strip helper function for mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19824
diff changeset
    62
4b4997068143 strip: move the strip helper function for mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19824
diff changeset
    63
        repair.strip(ui, repo, revs, backup)
21847
f6f122f4813b strip: remove bookmarks after strip succeed (issue4295)
David Soria Parra <davidsp@fb.com>
parents: 20102
diff changeset
    64
f6f122f4813b strip: remove bookmarks after strip succeed (issue4295)
David Soria Parra <davidsp@fb.com>
parents: 20102
diff changeset
    65
        marks = repo._bookmarks
f6f122f4813b strip: remove bookmarks after strip succeed (issue4295)
David Soria Parra <davidsp@fb.com>
parents: 20102
diff changeset
    66
        if bookmark:
24947
a02d293a1079 bookmarks: rename bookmarkcurrent to activebookmark (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24944
diff changeset
    67
            if bookmark == repo._activebookmark:
24944
08ec11e3ae4c bookmarks: rename unsetcurrent to deactivate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24709
diff changeset
    68
                bookmarks.deactivate(repo)
21847
f6f122f4813b strip: remove bookmarks after strip succeed (issue4295)
David Soria Parra <davidsp@fb.com>
parents: 20102
diff changeset
    69
            del marks[bookmark]
f6f122f4813b strip: remove bookmarks after strip succeed (issue4295)
David Soria Parra <davidsp@fb.com>
parents: 20102
diff changeset
    70
            marks.write()
f6f122f4813b strip: remove bookmarks after strip succeed (issue4295)
David Soria Parra <davidsp@fb.com>
parents: 20102
diff changeset
    71
            ui.write(_("bookmark '%s' deleted\n") % bookmark)
19825
4b4997068143 strip: move the strip helper function for mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19824
diff changeset
    72
    finally:
4b4997068143 strip: move the strip helper function for mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19824
diff changeset
    73
        release(lock, wlock)
4b4997068143 strip: move the strip helper function for mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19824
diff changeset
    74
19826
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    75
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    76
@command("strip",
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    77
         [
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    78
          ('r', 'rev', [], _('strip specified revision (optional, '
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    79
                               'can specify revisions without this '
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    80
                               'option)'), _('REV')),
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    81
          ('f', 'force', None, _('force removal of changesets, discard '
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    82
                                 'uncommitted changes (no backup)')),
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    83
          ('', 'no-backup', None, _('no backups')),
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    84
          ('', 'nobackup', None, _('no backups (DEPRECATED)')),
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    85
          ('n', '', None, _('ignored  (DEPRECATED)')),
24364
135b23868f45 commands: replace "working copy" with "working directory" in help/messages
Yuya Nishihara <yuya@tcha.org>
parents: 23139
diff changeset
    86
          ('k', 'keep', None, _("do not modify working directory during "
135b23868f45 commands: replace "working copy" with "working directory" in help/messages
Yuya Nishihara <yuya@tcha.org>
parents: 23139
diff changeset
    87
                                "strip")),
19826
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    88
          ('B', 'bookmark', '', _("remove revs only reachable from given"
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    89
                                  " bookmark"))],
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    90
          _('hg strip [-k] [-f] [-n] [-B bookmark] [-r] REV...'))
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    91
def stripcmd(ui, repo, *revs, **opts):
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    92
    """strip changesets and all their descendants from the repository
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    93
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    94
    The strip command removes the specified changesets and all their
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    95
    descendants. If the working directory has uncommitted changes, the
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    96
    operation is aborted unless the --force flag is supplied, in which
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    97
    case changes will be discarded.
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    98
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
    99
    If a parent of the working directory is stripped, then the working
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   100
    directory will automatically be updated to the most recent
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   101
    available ancestor of the stripped parent after the operation
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   102
    completes.
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   103
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   104
    Any stripped changesets are stored in ``.hg/strip-backup`` as a
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   105
    bundle (see :hg:`help bundle` and :hg:`help unbundle`). They can
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   106
    be restored by running :hg:`unbundle .hg/strip-backup/BUNDLE`,
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   107
    where BUNDLE is the bundle file created by the strip. Note that
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   108
    the local revision numbers will in general be different after the
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   109
    restore.
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   110
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   111
    Use the --no-backup option to discard the backup bundle once the
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   112
    operation completes.
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   113
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   114
    Strip is not a history-rewriting operation and can be used on
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   115
    changesets in the public phase. But if the stripped changesets have
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   116
    been pushed to a remote repository you will likely pull them again.
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   117
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   118
    Return 0 on success.
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   119
    """
22057
445472225ccd strip: remove -b/--backup codepaths
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21854
diff changeset
   120
    backup = True
445472225ccd strip: remove -b/--backup codepaths
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21854
diff changeset
   121
    if opts.get('no_backup') or opts.get('nobackup'):
445472225ccd strip: remove -b/--backup codepaths
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21854
diff changeset
   122
        backup = False
19826
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   123
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   124
    cl = repo.changelog
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   125
    revs = list(revs) + opts.get('rev')
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   126
    revs = set(scmutil.revrange(repo, revs))
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   127
20096
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   128
    wlock = repo.wlock()
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   129
    try:
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   130
        if opts.get('bookmark'):
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   131
            mark = opts.get('bookmark')
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   132
            marks = repo._bookmarks
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   133
            if mark not in marks:
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   134
                raise util.Abort(_("bookmark '%s' not found") % mark)
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   135
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   136
            # If the requested bookmark is not the only one pointing to a
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   137
            # a revision we have to only delete the bookmark and not strip
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   138
            # anything. revsets cannot detect that case.
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   139
            uniquebm = True
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   140
            for m, n in marks.iteritems():
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   141
                if m != mark and n == repo[mark].node():
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   142
                    uniquebm = False
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   143
                    break
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   144
            if uniquebm:
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   145
                rsrevs = repo.revs("ancestors(bookmark(%s)) - "
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   146
                                   "ancestors(head() and not bookmark(%s)) - "
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   147
                                   "ancestors(bookmark() and not bookmark(%s))",
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   148
                                   mark, mark, mark)
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   149
                revs.update(set(rsrevs))
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   150
            if not revs:
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   151
                del marks[mark]
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   152
                marks.write()
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   153
                ui.write(_("bookmark '%s' deleted\n") % mark)
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   154
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   155
        if not revs:
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   156
            raise util.Abort(_('empty revision set'))
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   157
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   158
        descendants = set(cl.descendants(revs))
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   159
        strippedrevs = revs.union(descendants)
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   160
        roots = revs.difference(descendants)
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   161
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   162
        update = False
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   163
        # if one of the wdir parent is stripped we'll need
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   164
        # to update away to an earlier revision
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   165
        for p in repo.dirstate.parents():
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   166
            if p != nullid and cl.rev(p) in strippedrevs:
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   167
                update = True
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   168
                break
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   169
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   170
        rootnodes = set(cl.node(r) for r in roots)
19826
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   171
20096
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   172
        q = getattr(repo, 'mq', None)
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   173
        if q is not None and q.applied:
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   174
            # refresh queue state if we're about to strip
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   175
            # applied patches
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   176
            if cl.rev(repo.lookup('qtip')) in strippedrevs:
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   177
                q.applieddirty = True
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   178
                start = 0
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   179
                end = len(q.applied)
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   180
                for i, statusentry in enumerate(q.applied):
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   181
                    if statusentry.node in rootnodes:
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   182
                        # if one of the stripped roots is an applied
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   183
                        # patch, only part of the queue is stripped
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   184
                        start = i
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   185
                        break
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   186
                del q.applied[start:end]
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   187
                q.savedirty()
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   188
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   189
        revs = sorted(rootnodes)
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   190
        if update and opts.get('keep'):
20102
04eaa8eec6a0 strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents: 20101
diff changeset
   191
            urev, p2 = repo.changelog.parents(revs[0])
04eaa8eec6a0 strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents: 20101
diff changeset
   192
            if (util.safehasattr(repo, 'mq') and p2 != nullid
04eaa8eec6a0 strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents: 20101
diff changeset
   193
                and p2 in [x.node for x in repo.mq.applied]):
04eaa8eec6a0 strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents: 20101
diff changeset
   194
                urev = p2
04eaa8eec6a0 strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents: 20101
diff changeset
   195
            uctx = repo[urev]
20096
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   196
20102
04eaa8eec6a0 strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents: 20101
diff changeset
   197
            # only reset the dirstate for files that would actually change
04eaa8eec6a0 strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents: 20101
diff changeset
   198
            # between the working context and uctx
04eaa8eec6a0 strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents: 20101
diff changeset
   199
            descendantrevs = repo.revs("%s::." % uctx.rev())
04eaa8eec6a0 strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents: 20101
diff changeset
   200
            changedfiles = []
04eaa8eec6a0 strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents: 20101
diff changeset
   201
            for rev in descendantrevs:
04eaa8eec6a0 strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents: 20101
diff changeset
   202
                # blindly reset the files, regardless of what actually changed
04eaa8eec6a0 strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents: 20101
diff changeset
   203
                changedfiles.extend(repo[rev].files())
20096
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   204
20102
04eaa8eec6a0 strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents: 20101
diff changeset
   205
            # reset files that only changed in the dirstate too
04eaa8eec6a0 strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents: 20101
diff changeset
   206
            dirstate = repo.dirstate
04eaa8eec6a0 strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents: 20101
diff changeset
   207
            dirchanges = [f for f in dirstate if dirstate[f] != 'n']
04eaa8eec6a0 strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents: 20101
diff changeset
   208
            changedfiles.extend(dirchanges)
20096
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   209
20102
04eaa8eec6a0 strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents: 20101
diff changeset
   210
            repo.dirstate.rebuild(urev, uctx.manifest(), changedfiles)
04eaa8eec6a0 strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents: 20101
diff changeset
   211
            repo.dirstate.write()
24709
69154e0ae384 strip: properly clear resolve state with --keep (issue4593)
Matt Mackall <mpm@selenic.com>
parents: 24471
diff changeset
   212
69154e0ae384 strip: properly clear resolve state with --keep (issue4593)
Matt Mackall <mpm@selenic.com>
parents: 24471
diff changeset
   213
            # clear resolve state
69154e0ae384 strip: properly clear resolve state with --keep (issue4593)
Matt Mackall <mpm@selenic.com>
parents: 24471
diff changeset
   214
            ms = merge.mergestate(repo)
69154e0ae384 strip: properly clear resolve state with --keep (issue4593)
Matt Mackall <mpm@selenic.com>
parents: 24471
diff changeset
   215
            ms.reset(repo['.'].node())
69154e0ae384 strip: properly clear resolve state with --keep (issue4593)
Matt Mackall <mpm@selenic.com>
parents: 24471
diff changeset
   216
20102
04eaa8eec6a0 strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents: 20101
diff changeset
   217
            update = False
20096
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   218
19826
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   219
20096
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   220
        strip(ui, repo, revs, backup=backup, update=update,
21847
f6f122f4813b strip: remove bookmarks after strip succeed (issue4295)
David Soria Parra <davidsp@fb.com>
parents: 20102
diff changeset
   221
              force=opts.get('force'), bookmark=opts.get('bookmark'))
20096
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   222
    finally:
88e172871ad7 strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents: 20009
diff changeset
   223
        wlock.release()
19826
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   224
4b1cbcfdabf7 mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19825
diff changeset
   225
    return 0