Mercurial > evolve
annotate hgext/drophack.py @ 883:d2fa1061df16
evolve: do not exchange obsolescence markers when server refuse it
The server can be configured to refuse obsolescence markers exchange. See
changeset 48804a8d7472 for details about it. We respect server will in the
client.
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Wed, 12 Mar 2014 13:01:32 -0700 |
parents | 60dd0c401034 |
children | f7f4a1fac6c0 |
rev | line source |
---|---|
790
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
1 # This software may be used and distributed according to the terms of the |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
2 # GNU General Public License version 2 or any later version. |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
3 '''This extension add a hacky command to drop changeset during review |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
4 |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
5 This extension is intended as a temporary hack to allow Matt Mackall to use |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
6 evolve in the Mercurial review it self. You should probably not use it if your |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
7 name is not Matt Mackall. |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
8 ''' |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
9 |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
10 import os |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
11 import time |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
12 import contextlib |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
13 |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
14 from mercurial.i18n import _ |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
15 from mercurial import cmdutil |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
16 from mercurial import repair |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
17 from mercurial import scmutil |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
18 from mercurial import lock as lockmod |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
19 from mercurial import util |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
20 from mercurial import commands |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
21 |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
22 cmdtable = {} |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
23 command = cmdutil.command(cmdtable) |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
24 |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
25 |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
26 @contextlib.contextmanager |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
27 def timed(ui, caption): |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
28 ostart = os.times() |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
29 cstart = time.time() |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
30 yield |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
31 cstop = time.time() |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
32 ostop = os.times() |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
33 wall = cstop - cstart |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
34 user = ostop[0] - ostart[0] |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
35 sys = ostop[1] - ostart[1] |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
36 comb = user + sys |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
37 ui.write("%s: wall %f comb %f user %f sys %f\n" |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
38 % (caption, wall, comb, user, sys)) |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
39 |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
40 def obsmarkerchainfrom(obsstore, nodes): |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
41 """return all marker chain starting from node |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
42 |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
43 Starting from mean "use as successors".""" |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
44 # XXX need something smarter for descendant of bumped changeset |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
45 seennodes = set(nodes) |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
46 seenmarkers = set() |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
47 pendingnodes = set(nodes) |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
48 precursorsmarkers = obsstore.precursors |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
49 while pendingnodes: |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
50 current = pendingnodes.pop() |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
51 new = set() |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
52 for precmark in precursorsmarkers.get(current, ()): |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
53 if precmark in seenmarkers: |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
54 continue |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
55 seenmarkers.add(precmark) |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
56 new.add(precmark[0]) |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
57 yield precmark |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
58 new -= seennodes |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
59 pendingnodes |= new |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
60 |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
61 def stripmarker(ui, repo, markers): |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
62 """remove <markers> from the repo obsstore |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
63 |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
64 The old obsstore content is saved in a `obsstore.prestrip` file |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
65 """ |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
66 repo = repo.unfiltered() |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
67 repo.destroying() |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
68 oldmarkers = list(repo.obsstore._all) |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
69 util.rename(repo.sjoin('obsstore'), |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
70 repo.join('obsstore.prestrip')) |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
71 del repo.obsstore # drop the cache |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
72 newstore = repo.obsstore |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
73 assert not newstore # should be empty after rename |
812
60dd0c401034
drophack: major speedup to marker stripping
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
790
diff
changeset
|
74 newmarkers = [m for m in oldmarkers if m not in markers] |
790
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
75 tr = repo.transaction('drophack') |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
76 try: |
812
60dd0c401034
drophack: major speedup to marker stripping
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
790
diff
changeset
|
77 newstore.add(tr, newmarkers) |
790
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
78 tr.close() |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
79 finally: |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
80 tr.release() |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
81 repo.destroyed() |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
82 |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
83 |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
84 @command('drop', [('r', 'rev', [], 'revision to update')], _('[-r] revs')) |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
85 def cmddrop(ui, repo, *revs, **opts): |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
86 """I'm hacky do not use me! |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
87 |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
88 This command strip a changeset, its precursors and all obsolescence marker |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
89 associated to its chain. |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
90 |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
91 There is no way to limit the extend of the purge yet. You may have to |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
92 repull from other source to get some changeset and obsolescence marker |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
93 back. |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
94 |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
95 This intended for Matt Mackall usage only. do not use me. |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
96 """ |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
97 revs = list(revs) |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
98 revs.extend(opts['rev']) |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
99 if not revs: |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
100 revs = ['.'] |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
101 # get the changeset |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
102 revs = scmutil.revrange(repo, revs) |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
103 if not revs: |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
104 ui.write_err('no revision to drop\n') |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
105 return 1 |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
106 # lock from the beginning to prevent race |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
107 wlock = lock = None |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
108 try: |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
109 lock = repo.wlock() |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
110 lock = repo.lock() |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
111 # check they have no children |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
112 if repo.revs('%ld and public()', revs): |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
113 ui.write_err('cannot drop public revision') |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
114 return 1 |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
115 if repo.revs('children(%ld) - %ld', revs, revs): |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
116 ui.write_err('cannot drop revision with children') |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
117 return 1 |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
118 if repo.revs('. and %ld', revs): |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
119 newrevs = repo.revs('max(::. - %ld)', revs) |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
120 if newrevs: |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
121 assert len(newrevs) == 1 |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
122 newrev = newrevs[0] |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
123 else: |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
124 newrev = -1 |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
125 commands.update(ui, repo, newrev) |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
126 ui.status(_('working directory now at %s\n') % repo[newrev]) |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
127 # get all markers and successors up to root |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
128 nodes = [repo[r].node() for r in revs] |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
129 with timed(ui, 'search obsmarker'): |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
130 markers = set(obsmarkerchainfrom(repo.obsstore, nodes)) |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
131 ui.write('%i obsmarkers found\n' % len(markers)) |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
132 cl = repo.unfiltered().changelog |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
133 with timed(ui, 'search nodes'): |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
134 allnodes = set(nodes) |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
135 allnodes.update(m[0] for m in markers if cl.hasnode(m[0])) |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
136 ui.write('%i nodes found\n' % len(allnodes)) |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
137 cl = repo.changelog |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
138 visiblenodes = set(n for n in allnodes if cl.hasnode(n)) |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
139 # check constraint again |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
140 if repo.revs('%ln and public()', visiblenodes): |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
141 ui.write_err('cannot drop public revision') |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
142 return 1 |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
143 if repo.revs('children(%ln) - %ln', visiblenodes, visiblenodes): |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
144 ui.write_err('cannot drop revision with children') |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
145 return 1 |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
146 |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
147 if markers: |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
148 # strip them |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
149 with timed(ui, 'strip obsmarker'): |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
150 stripmarker(ui, repo, markers) |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
151 # strip the changeset |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
152 with timed(ui, 'strip nodes'): |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
153 repair.strip(ui, repo, allnodes, backup="all", topic='drophack') |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
154 |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
155 finally: |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
156 lockmod.release(lock, wlock) |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
157 |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
158 # rewrite the whole file. |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
159 # print data. |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
160 # - time to compute the chain |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
161 # - time to strip the changeset |
5af309865040
drophack: add a new drop hack extension for Matt Mackall usage
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
162 # - time to strip the obs marker. |