Mercurial > hg
annotate hgext/strip.py @ 21761:b2dc026a9bd2 stable
push: restore contents of HG_URL for hooks (issue4268)
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Wed, 18 Jun 2014 19:46:18 -0500 |
parents | 04eaa8eec6a0 |
children | f6f122f4813b |
rev | line source |
---|---|
19828
0a986233ecbf
strip: bring extension description in line with style and copy-edit
Kevin Bullock <kbullock@ringworld.org>
parents:
19826
diff
changeset
|
1 """strip changesets and their descendents 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 |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
10 from mercurial import repair, bookmarks |
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) |
a194a33f8cb2
mq: prepare a strip extension for extraction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
14 testedwith = 'internal' |
19823
6fb14d21fe9d
strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19822
diff
changeset
|
15 |
6fb14d21fe9d
strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19822
diff
changeset
|
16 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
|
17 '''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
|
18 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
|
19 inclsubs = [] |
6fb14d21fe9d
strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19822
diff
changeset
|
20 wctx = repo[None] |
6fb14d21fe9d
strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19822
diff
changeset
|
21 if baserev: |
6fb14d21fe9d
strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19822
diff
changeset
|
22 bctx = repo[baserev] |
6fb14d21fe9d
strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19822
diff
changeset
|
23 else: |
6fb14d21fe9d
strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19822
diff
changeset
|
24 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
|
25 for s in sorted(wctx.substate): |
6fb14d21fe9d
strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19822
diff
changeset
|
26 if wctx.sub(s).dirty(True): |
6fb14d21fe9d
strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19822
diff
changeset
|
27 raise util.Abort( |
6fb14d21fe9d
strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19822
diff
changeset
|
28 _("uncommitted changes in subrepository %s") % s) |
6fb14d21fe9d
strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19822
diff
changeset
|
29 elif s not in bctx.substate or bctx.sub(s).dirty(): |
6fb14d21fe9d
strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19822
diff
changeset
|
30 inclsubs.append(s) |
6fb14d21fe9d
strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19822
diff
changeset
|
31 return inclsubs |
6fb14d21fe9d
strip: move checksubstate from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19822
diff
changeset
|
32 |
19824
237e40b2c1ff
strip: move checklocalchanges from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19823
diff
changeset
|
33 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
|
34 cmdutil.checkunfinished(repo) |
237e40b2c1ff
strip: move checklocalchanges from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19823
diff
changeset
|
35 m, a, r, d = repo.status()[:4] |
237e40b2c1ff
strip: move checklocalchanges from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19823
diff
changeset
|
36 if not force: |
237e40b2c1ff
strip: move checklocalchanges from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19823
diff
changeset
|
37 if (m or a or r or d): |
237e40b2c1ff
strip: move checklocalchanges from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19823
diff
changeset
|
38 _("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
|
39 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
|
40 if checksubstate(repo): |
237e40b2c1ff
strip: move checklocalchanges from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19823
diff
changeset
|
41 _("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
|
42 raise util.Abort(_("local changed subrepos found" + excsuffix)) |
237e40b2c1ff
strip: move checklocalchanges from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19823
diff
changeset
|
43 return m, a, r, d |
237e40b2c1ff
strip: move checklocalchanges from mq to strip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19823
diff
changeset
|
44 |
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
|
45 def strip(ui, repo, revs, update=True, backup="all", force=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
|
46 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
|
47 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
|
48 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
|
49 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
|
50 |
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 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
|
52 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
|
53 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
|
54 if (util.safehasattr(repo, 'mq') and |
2802bedbd45f
strip: fix last unprotected mq reference (issue4097)
Matt Mackall <mpm@selenic.com>
parents:
19945
diff
changeset
|
55 p2 != nullid |
2802bedbd45f
strip: fix last unprotected mq reference (issue4097)
Matt Mackall <mpm@selenic.com>
parents:
19945
diff
changeset
|
56 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
|
57 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
|
58 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
|
59 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
|
60 |
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 repair.strip(ui, repo, revs, backup) |
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 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
|
63 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
|
64 |
19826
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
65 |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
66 @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
|
67 [ |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
68 ('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
|
69 '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
|
70 '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
|
71 ('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
|
72 '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
|
73 ('b', 'backup', None, _('bundle only changesets with local revision' |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
74 ' number greater than REV which are not' |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
75 ' descendants of REV (DEPRECATED)')), |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
76 ('', '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
|
77 ('', '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
|
78 ('n', '', None, _('ignored (DEPRECATED)')), |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
79 ('k', 'keep', None, _("do not modify working copy during strip")), |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
80 ('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
|
81 " bookmark"))], |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
82 _('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
|
83 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
|
84 """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
|
85 |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
86 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
|
87 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
|
88 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
|
89 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
|
90 |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
91 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
|
92 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
|
93 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
|
94 completes. |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
95 |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
96 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
|
97 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
|
98 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
|
99 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
|
100 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
|
101 restore. |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
102 |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
103 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
|
104 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
|
105 |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
106 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
|
107 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
|
108 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
|
109 |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
110 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
|
111 """ |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
112 backup = 'all' |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
113 if opts.get('backup'): |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
114 backup = 'strip' |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
115 elif opts.get('no_backup') or opts.get('nobackup'): |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
116 backup = 'none' |
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 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
|
119 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
|
120 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
|
121 |
20096
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
122 wlock = repo.wlock() |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
123 try: |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
124 if opts.get('bookmark'): |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
125 mark = opts.get('bookmark') |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
126 marks = repo._bookmarks |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
127 if mark not in marks: |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
128 raise util.Abort(_("bookmark '%s' not found") % mark) |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
129 |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
130 # 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
|
131 # 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
|
132 # anything. revsets cannot detect that case. |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
133 uniquebm = True |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
134 for m, n in marks.iteritems(): |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
135 if m != mark and n == repo[mark].node(): |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
136 uniquebm = False |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
137 break |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
138 if uniquebm: |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
139 rsrevs = repo.revs("ancestors(bookmark(%s)) - " |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
140 "ancestors(head() and not bookmark(%s)) - " |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
141 "ancestors(bookmark() and not bookmark(%s))", |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
142 mark, mark, mark) |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
143 revs.update(set(rsrevs)) |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
144 if not revs: |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
145 del marks[mark] |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
146 marks.write() |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
147 ui.write(_("bookmark '%s' deleted\n") % mark) |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
148 |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
149 if not revs: |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
150 raise util.Abort(_('empty revision set')) |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
151 |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
152 descendants = set(cl.descendants(revs)) |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
153 strippedrevs = revs.union(descendants) |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
154 roots = revs.difference(descendants) |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
155 |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
156 update = False |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
157 # 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
|
158 # to update away to an earlier revision |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
159 for p in repo.dirstate.parents(): |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
160 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
|
161 update = True |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
162 break |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
163 |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
164 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
|
165 |
20096
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
166 q = getattr(repo, 'mq', None) |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
167 if q is not None and q.applied: |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
168 # 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
|
169 # applied patches |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
170 if cl.rev(repo.lookup('qtip')) in strippedrevs: |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
171 q.applieddirty = True |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
172 start = 0 |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
173 end = len(q.applied) |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
174 for i, statusentry in enumerate(q.applied): |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
175 if statusentry.node in rootnodes: |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
176 # 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
|
177 # patch, only part of the queue is stripped |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
178 start = i |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
179 break |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
180 del q.applied[start:end] |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
181 q.savedirty() |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
182 |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
183 revs = sorted(rootnodes) |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
184 if update and opts.get('keep'): |
20102
04eaa8eec6a0
strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents:
20101
diff
changeset
|
185 urev, p2 = repo.changelog.parents(revs[0]) |
04eaa8eec6a0
strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents:
20101
diff
changeset
|
186 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
|
187 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
|
188 urev = p2 |
04eaa8eec6a0
strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents:
20101
diff
changeset
|
189 uctx = repo[urev] |
20096
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
190 |
20102
04eaa8eec6a0
strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents:
20101
diff
changeset
|
191 # 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
|
192 # between the working context and uctx |
04eaa8eec6a0
strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents:
20101
diff
changeset
|
193 descendantrevs = repo.revs("%s::." % uctx.rev()) |
04eaa8eec6a0
strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents:
20101
diff
changeset
|
194 changedfiles = [] |
04eaa8eec6a0
strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents:
20101
diff
changeset
|
195 for rev in descendantrevs: |
04eaa8eec6a0
strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents:
20101
diff
changeset
|
196 # 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
|
197 changedfiles.extend(repo[rev].files()) |
20096
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
198 |
20102
04eaa8eec6a0
strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents:
20101
diff
changeset
|
199 # 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
|
200 dirstate = repo.dirstate |
04eaa8eec6a0
strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents:
20101
diff
changeset
|
201 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
|
202 changedfiles.extend(dirchanges) |
20096
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
203 |
20102
04eaa8eec6a0
strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents:
20101
diff
changeset
|
204 repo.dirstate.rebuild(urev, uctx.manifest(), changedfiles) |
04eaa8eec6a0
strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents:
20101
diff
changeset
|
205 repo.dirstate.write() |
04eaa8eec6a0
strip.stripcmd: remove redundant wlock acquire/release
Siddharth Agarwal <sid0@fb.com>
parents:
20101
diff
changeset
|
206 update = False |
20096
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
207 |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
208 if opts.get('bookmark'): |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
209 if mark == repo._bookmarkcurrent: |
20101 | 210 bookmarks.unsetcurrent(repo) |
19826
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
211 del marks[mark] |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
212 marks.write() |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
213 ui.write(_("bookmark '%s' deleted\n") % mark) |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
214 |
20096
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
215 strip(ui, repo, revs, backup=backup, update=update, |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
216 force=opts.get('force')) |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
217 finally: |
88e172871ad7
strip: hold wlock for entire duration
Siddharth Agarwal <sid0@fb.com>
parents:
20009
diff
changeset
|
218 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
|
219 |
4b1cbcfdabf7
mq: extract strip function as its standalone extension (issue3824)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19825
diff
changeset
|
220 return 0 |