annotate hgext/inhibit.py @ 1410:2c451fece7a6

evolve: unify revision handling and rework error message This changesets do a massive refactoring of the way evolve select changesets to be evolve. We now use a two stages approach: 1) read command line argument and produce a list of revision to evolve. 2) evolve all these revisions. This allow a much cleaner, robust and extensible code. In the process the error message issued when there is nothing to evolve have been updated to informs about other troubles in the repository and point at useful option to solve them. The 'update' case is handled independently at the start of the function.
author Pierre-Yves David <pierre-yves.david@fb.com>
date Fri, 19 Jun 2015 14:26:33 -0700
parents 9c3ba42c582a
children 777e5c369d99
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1339
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
1 """reduce the changesets evolution feature scope for early and noob friendly ui
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
2
1339
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
3 the full scale changeset evolution have some massive bleeding edge and it is
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
4 very easy for people not very intimate with the concept to end up in intricate
1339
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
5 situation. in order to get some of the benefit sooner, this extension is
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
6 disabling some of the less polished aspect of evolution. it should gradually
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
7 get thinner and thinner as changeset evolution will get more polished. this
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
8 extension is only recommended for large scale organisations. individual user
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
9 should probably stick on using evolution in its current state, understand its
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
10 concept and provide feedback
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
11
1339
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
12 This extension provides the ability to "inhibit" obsolescence markers. obsolete
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
13 revision can be cheaply brought back to life that way.
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
14 However as the inhibitor are not fitting in an append only model, this is
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
15 incompatible with sharing mutable history.
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
16 """
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
17 from mercurial import localrepo
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
18 from mercurial import obsolete
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
19 from mercurial import extensions
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
20 from mercurial import cmdutil
1339
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
21 from mercurial import error
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
22 from mercurial import scmutil
1233
63ee05dd557a inhibit: ensure no visible changesets are obsolete after an update
Laurent Charignon <lcharignon@fb.com>
parents: 1232
diff changeset
23 from mercurial import commands
1297
51ec3610968c inhibit: fix devel warning
Laurent Charignon <lcharignon@fb.com>
parents: 1293
diff changeset
24 from mercurial import lock as lockmod
1234
c15d4677f2ba inhibit: ensure that no obsolete changesets are visible after a bookmark change
Laurent Charignon <lcharignon@fb.com>
parents: 1233
diff changeset
25 from mercurial import bookmarks
1241
3625d006e81b inhibit: Add -D option to the bookmark command
Laurent Charignon <lcharignon@fb.com>
parents: 1240
diff changeset
26 from mercurial.i18n import _
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
27
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
28 cmdtable = {}
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
29 command = cmdutil.command(cmdtable)
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
30
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
31 def reposetup(ui, repo):
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
32
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
33 class obsinhibitedrepo(repo.__class__):
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
34
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
35 @localrepo.storecache('obsinhibit')
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
36 def _obsinhibit(self):
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
37 # XXX we should make sure it is invalidated by transaction failure
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
38 obsinhibit = set()
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
39 raw = self.sopener.tryread('obsinhibit')
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
40 for i in xrange(0, len(raw), 20):
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
41 obsinhibit.add(raw[i:i+20])
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
42 return obsinhibit
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
43
1292
62229e7451f7 inhibit: wrap repo.commit to inhibit nodes
Durham Goode <durham@fb.com>
parents: 1247
diff changeset
44 def commit(self, *args, **kwargs):
62229e7451f7 inhibit: wrap repo.commit to inhibit nodes
Durham Goode <durham@fb.com>
parents: 1247
diff changeset
45 newnode = super(obsinhibitedrepo, self).commit(*args, **kwargs)
1346
9a1415f8b21b inhbit: don't crash on commit with no changes
Laurent Charignon <lcharignon@fb.com>
parents: 1339
diff changeset
46 if newnode is not None:
9a1415f8b21b inhbit: don't crash on commit with no changes
Laurent Charignon <lcharignon@fb.com>
parents: 1339
diff changeset
47 _inhibitmarkers(repo, [newnode])
1292
62229e7451f7 inhibit: wrap repo.commit to inhibit nodes
Durham Goode <durham@fb.com>
parents: 1247
diff changeset
48 return newnode
62229e7451f7 inhibit: wrap repo.commit to inhibit nodes
Durham Goode <durham@fb.com>
parents: 1247
diff changeset
49
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
50 repo.__class__ = obsinhibitedrepo
1233
63ee05dd557a inhibit: ensure no visible changesets are obsolete after an update
Laurent Charignon <lcharignon@fb.com>
parents: 1232
diff changeset
51
63ee05dd557a inhibit: ensure no visible changesets are obsolete after an update
Laurent Charignon <lcharignon@fb.com>
parents: 1232
diff changeset
52 def _update(orig, ui, repo, *args, **kwargs):
63ee05dd557a inhibit: ensure no visible changesets are obsolete after an update
Laurent Charignon <lcharignon@fb.com>
parents: 1232
diff changeset
53 """
63ee05dd557a inhibit: ensure no visible changesets are obsolete after an update
Laurent Charignon <lcharignon@fb.com>
parents: 1232
diff changeset
54 When moving to a commit we want to inhibit any obsolete commit affecting
63ee05dd557a inhibit: ensure no visible changesets are obsolete after an update
Laurent Charignon <lcharignon@fb.com>
parents: 1232
diff changeset
55 the changeset we are updating to. In other words we don't want any visible
63ee05dd557a inhibit: ensure no visible changesets are obsolete after an update
Laurent Charignon <lcharignon@fb.com>
parents: 1232
diff changeset
56 commit to be obsolete.
63ee05dd557a inhibit: ensure no visible changesets are obsolete after an update
Laurent Charignon <lcharignon@fb.com>
parents: 1232
diff changeset
57 """
1303
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
58 wlock = None
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
59 try:
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
60 # Evolve is running a hook on lock release to display a warning message
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
61 # if the workind dir's parent is obsolete.
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
62 # We take the lock here to make sure that we inhibit the parent before
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
63 # that hook get a chance to run.
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
64 wlock = repo.wlock()
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
65 res = orig(ui, repo, *args, **kwargs)
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
66 newhead = repo['.'].node()
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
67 _inhibitmarkers(repo, [newhead])
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
68 return res
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
69 finally:
508f9911b042 inhibit: updating to a obsolete commit prints warning message
Laurent Charignon <lcharignon@fb.com>
parents: 1297
diff changeset
70 lockmod.release(wlock)
1233
63ee05dd557a inhibit: ensure no visible changesets are obsolete after an update
Laurent Charignon <lcharignon@fb.com>
parents: 1232
diff changeset
71
1234
c15d4677f2ba inhibit: ensure that no obsolete changesets are visible after a bookmark change
Laurent Charignon <lcharignon@fb.com>
parents: 1233
diff changeset
72 def _bookmarkchanged(orig, bkmstoreinst, *args, **kwargs):
c15d4677f2ba inhibit: ensure that no obsolete changesets are visible after a bookmark change
Laurent Charignon <lcharignon@fb.com>
parents: 1233
diff changeset
73 """ Add inhibition markers to every obsolete bookmarks """
c15d4677f2ba inhibit: ensure that no obsolete changesets are visible after a bookmark change
Laurent Charignon <lcharignon@fb.com>
parents: 1233
diff changeset
74 repo = bkmstoreinst._repo
c15d4677f2ba inhibit: ensure that no obsolete changesets are visible after a bookmark change
Laurent Charignon <lcharignon@fb.com>
parents: 1233
diff changeset
75 bkmstorenodes = [repo[v].node() for v in bkmstoreinst.values()]
c15d4677f2ba inhibit: ensure that no obsolete changesets are visible after a bookmark change
Laurent Charignon <lcharignon@fb.com>
parents: 1233
diff changeset
76 _inhibitmarkers(repo, bkmstorenodes)
c15d4677f2ba inhibit: ensure that no obsolete changesets are visible after a bookmark change
Laurent Charignon <lcharignon@fb.com>
parents: 1233
diff changeset
77 return orig(bkmstoreinst, *args, **kwargs)
1233
63ee05dd557a inhibit: ensure no visible changesets are obsolete after an update
Laurent Charignon <lcharignon@fb.com>
parents: 1232
diff changeset
78
1241
3625d006e81b inhibit: Add -D option to the bookmark command
Laurent Charignon <lcharignon@fb.com>
parents: 1240
diff changeset
79 def _bookmark(orig, ui, repo, *bookmarks, **opts):
3625d006e81b inhibit: Add -D option to the bookmark command
Laurent Charignon <lcharignon@fb.com>
parents: 1240
diff changeset
80 """ Add a -D option to the bookmark command, map it to prune -B """
3625d006e81b inhibit: Add -D option to the bookmark command
Laurent Charignon <lcharignon@fb.com>
parents: 1240
diff changeset
81 haspruneopt = opts.get('prune', False)
3625d006e81b inhibit: Add -D option to the bookmark command
Laurent Charignon <lcharignon@fb.com>
parents: 1240
diff changeset
82 if not haspruneopt:
3625d006e81b inhibit: Add -D option to the bookmark command
Laurent Charignon <lcharignon@fb.com>
parents: 1240
diff changeset
83 return orig(ui, repo, *bookmarks, **opts)
1293
dc5528e04c06 inhibit: remove book -D dependency on cmdprune
Durham Goode <durham@fb.com>
parents: 1292
diff changeset
84
1241
3625d006e81b inhibit: Add -D option to the bookmark command
Laurent Charignon <lcharignon@fb.com>
parents: 1240
diff changeset
85 # Call prune -B
3625d006e81b inhibit: Add -D option to the bookmark command
Laurent Charignon <lcharignon@fb.com>
parents: 1240
diff changeset
86 evolve = extensions.find('evolve')
1293
dc5528e04c06 inhibit: remove book -D dependency on cmdprune
Durham Goode <durham@fb.com>
parents: 1292
diff changeset
87 optsdict = {
dc5528e04c06 inhibit: remove book -D dependency on cmdprune
Durham Goode <durham@fb.com>
parents: 1292
diff changeset
88 'new': [],
dc5528e04c06 inhibit: remove book -D dependency on cmdprune
Durham Goode <durham@fb.com>
parents: 1292
diff changeset
89 'succ': [],
dc5528e04c06 inhibit: remove book -D dependency on cmdprune
Durham Goode <durham@fb.com>
parents: 1292
diff changeset
90 'rev': [],
dc5528e04c06 inhibit: remove book -D dependency on cmdprune
Durham Goode <durham@fb.com>
parents: 1292
diff changeset
91 'bookmark': bookmarks[0],
dc5528e04c06 inhibit: remove book -D dependency on cmdprune
Durham Goode <durham@fb.com>
parents: 1292
diff changeset
92 'keep': None,
dc5528e04c06 inhibit: remove book -D dependency on cmdprune
Durham Goode <durham@fb.com>
parents: 1292
diff changeset
93 'biject': False,
dc5528e04c06 inhibit: remove book -D dependency on cmdprune
Durham Goode <durham@fb.com>
parents: 1292
diff changeset
94 }
1241
3625d006e81b inhibit: Add -D option to the bookmark command
Laurent Charignon <lcharignon@fb.com>
parents: 1240
diff changeset
95 evolve.cmdprune(ui, repo, **optsdict)
3625d006e81b inhibit: Add -D option to the bookmark command
Laurent Charignon <lcharignon@fb.com>
parents: 1240
diff changeset
96
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
97 # obsolescence inhibitor
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
98 ########################
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
99
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
100 def _schedulewrite(tr, obsinhibit):
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
101 """Make sure on disk content will be updated on transaction commit"""
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
102 def writer(fp):
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
103 """Serialize the inhibited list to disk.
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
104 """
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
105 raw = ''.join(obsinhibit)
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
106 fp.write(raw)
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
107 tr.addfilegenerator('obsinhibit', ('obsinhibit',), writer)
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
108 tr.hookargs['obs_inbihited'] = '1'
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
109
1225
577f5340be6f inhibit: Add some inhibition clearing mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1224
diff changeset
110 def _filterpublic(repo, nodes):
577f5340be6f inhibit: Add some inhibition clearing mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1224
diff changeset
111 """filter out inhibitor on public changeset
577f5340be6f inhibit: Add some inhibition clearing mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1224
diff changeset
112
577f5340be6f inhibit: Add some inhibition clearing mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1224
diff changeset
113 Public changesets are already immune to obsolescence"""
577f5340be6f inhibit: Add some inhibition clearing mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1224
diff changeset
114 getrev = repo.changelog.nodemap.get
577f5340be6f inhibit: Add some inhibition clearing mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1224
diff changeset
115 getphase = repo._phasecache.phase
1338
77cbf9121e8a inhibit: handle inhibit marker on stripped revision
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1334
diff changeset
116 return (n for n in repo._obsinhibit
77cbf9121e8a inhibit: handle inhibit marker on stripped revision
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1334
diff changeset
117 if getrev(n) is not None and getphase(repo, getrev(n)))
1225
577f5340be6f inhibit: Add some inhibition clearing mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1224
diff changeset
118
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
119 def _inhibitmarkers(repo, nodes):
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
120 """add marker inhibitor for all obsolete revision under <nodes>
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
121
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
122 Content of <nodes> and all mutable ancestors are considered. Marker for
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
123 obsolete revision only are created.
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
124 """
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
125 newinhibit = repo.set('::%ln and obsolete()', nodes)
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
126 if newinhibit:
1297
51ec3610968c inhibit: fix devel warning
Laurent Charignon <lcharignon@fb.com>
parents: 1293
diff changeset
127 lock = tr = None
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
128 try:
1297
51ec3610968c inhibit: fix devel warning
Laurent Charignon <lcharignon@fb.com>
parents: 1293
diff changeset
129 lock = repo.lock()
51ec3610968c inhibit: fix devel warning
Laurent Charignon <lcharignon@fb.com>
parents: 1293
diff changeset
130 tr = repo.transaction('obsinhibit')
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
131 repo._obsinhibit.update(c.node() for c in newinhibit)
1225
577f5340be6f inhibit: Add some inhibition clearing mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1224
diff changeset
132 _schedulewrite(tr, _filterpublic(repo, repo._obsinhibit))
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
133 repo.invalidatevolatilesets()
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
134 tr.close()
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
135 finally:
1297
51ec3610968c inhibit: fix devel warning
Laurent Charignon <lcharignon@fb.com>
parents: 1293
diff changeset
136 lockmod.release(tr, lock)
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
137
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
138 def _deinhibitmarkers(repo, nodes):
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
139 """lift obsolescence inhibition on a set of nodes
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
140
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
141 This will be triggered when inhibited nodes received new obsolescence
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
142 markers. Otherwise the new obsolescence markers would also be inhibited.
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
143 """
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
144 deinhibited = repo._obsinhibit & set(nodes)
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
145 if deinhibited:
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
146 tr = repo.transaction('obsinhibit')
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
147 try:
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
148 repo._obsinhibit -= deinhibited
1225
577f5340be6f inhibit: Add some inhibition clearing mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1224
diff changeset
149 _schedulewrite(tr, _filterpublic(repo, repo._obsinhibit))
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
150 repo.invalidatevolatilesets()
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
151 tr.close()
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
152 finally:
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
153 tr.release()
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
154
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
155 def _createmarkers(orig, repo, relations, flag=0, date=None, metadata=None):
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
156 """wrap markers create to make sure we de-inhibit target nodes"""
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
157 # wrapping transactio to unify the one in each function
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
158 tr = repo.transaction('add-obsolescence-marker')
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
159 try:
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
160 orig(repo, relations, flag, date, metadata)
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
161 precs = (r[0].node() for r in relations)
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
162 _deinhibitmarkers(repo, precs)
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
163 tr.close()
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
164 finally:
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
165 tr.release()
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
166
1240
e1347ce2f954 inhibit: don't leave any obsolete commit visible after closing transaction
Laurent Charignon <lcharignon@fb.com>
parents: 1234
diff changeset
167 def transactioncallback(orig, repo, *args, **kwargs):
e1347ce2f954 inhibit: don't leave any obsolete commit visible after closing transaction
Laurent Charignon <lcharignon@fb.com>
parents: 1234
diff changeset
168 """ Wrap localrepo.transaction to inhibit new obsolete changes """
e1347ce2f954 inhibit: don't leave any obsolete commit visible after closing transaction
Laurent Charignon <lcharignon@fb.com>
parents: 1234
diff changeset
169 def inhibitposttransaction(transaction):
e1347ce2f954 inhibit: don't leave any obsolete commit visible after closing transaction
Laurent Charignon <lcharignon@fb.com>
parents: 1234
diff changeset
170 # At the end of the transaction we catch all the new visible and
e1347ce2f954 inhibit: don't leave any obsolete commit visible after closing transaction
Laurent Charignon <lcharignon@fb.com>
parents: 1234
diff changeset
171 # obsolete commit to inhibit them
1362
73e5b5280c1c inhibit: improve performance of transaction wrapping
Laurent Charignon <lcharignon@fb.com>
parents: 1346
diff changeset
172 visibleobsolete = repo.revs('obsolete() - hidden()')
1321
8fa74845eb1f inhibit: don't inhibit pinned commits during rebase
Durham Goode <durham@fb.com>
parents: 1303
diff changeset
173 ignoreset = set(getattr(repo, '_rebaseset', []))
8fa74845eb1f inhibit: don't inhibit pinned commits during rebase
Durham Goode <durham@fb.com>
parents: 1303
diff changeset
174 visibleobsolete = list(r for r in visibleobsolete if r not in ignoreset)
1240
e1347ce2f954 inhibit: don't leave any obsolete commit visible after closing transaction
Laurent Charignon <lcharignon@fb.com>
parents: 1234
diff changeset
175 if visibleobsolete:
e1347ce2f954 inhibit: don't leave any obsolete commit visible after closing transaction
Laurent Charignon <lcharignon@fb.com>
parents: 1234
diff changeset
176 _inhibitmarkers(repo, [repo[r].node() for r in visibleobsolete])
e1347ce2f954 inhibit: don't leave any obsolete commit visible after closing transaction
Laurent Charignon <lcharignon@fb.com>
parents: 1234
diff changeset
177 transaction = orig(repo, *args, **kwargs)
e1347ce2f954 inhibit: don't leave any obsolete commit visible after closing transaction
Laurent Charignon <lcharignon@fb.com>
parents: 1234
diff changeset
178 transaction.addpostclose('inhibitposttransaction', inhibitposttransaction)
e1347ce2f954 inhibit: don't leave any obsolete commit visible after closing transaction
Laurent Charignon <lcharignon@fb.com>
parents: 1234
diff changeset
179 return transaction
e1347ce2f954 inhibit: don't leave any obsolete commit visible after closing transaction
Laurent Charignon <lcharignon@fb.com>
parents: 1234
diff changeset
180
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
181 def extsetup(ui):
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
182 # lets wrap the computation of the obsolete set
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
183 # We apply inhibition there
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
184 obsfunc = obsolete.cachefuncs['obsolete']
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
185 def _computeobsoleteset(repo):
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
186 """remove any inhibited nodes from the obsolete set
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
187
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
188 This will trickle down to other part of mercurial (hidden, log, etc)"""
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
189 obs = obsfunc(repo)
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
190 getrev = repo.changelog.nodemap.get
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
191 for n in repo._obsinhibit:
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
192 obs.discard(getrev(n))
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
193 return obs
1339
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
194 try:
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
195 extensions.find('directaccess')
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
196 except KeyError:
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
197 errormsg = _('Cannot use inhibit without the direct access extension')
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
198 raise error.Abort(errormsg)
1366
9c3ba42c582a inhibit: move transaction wrapping outside of repo setup
Laurent Charignon <lcharignon@fb.com>
parents: 1362
diff changeset
199
9c3ba42c582a inhibit: move transaction wrapping outside of repo setup
Laurent Charignon <lcharignon@fb.com>
parents: 1362
diff changeset
200 # Wrapping this to inhibit obsolete revs resulting from a transaction
9c3ba42c582a inhibit: move transaction wrapping outside of repo setup
Laurent Charignon <lcharignon@fb.com>
parents: 1362
diff changeset
201 extensions.wrapfunction(localrepo.localrepository,
9c3ba42c582a inhibit: move transaction wrapping outside of repo setup
Laurent Charignon <lcharignon@fb.com>
parents: 1362
diff changeset
202 'transaction', transactioncallback)
9c3ba42c582a inhibit: move transaction wrapping outside of repo setup
Laurent Charignon <lcharignon@fb.com>
parents: 1362
diff changeset
203
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
204 obsolete.cachefuncs['obsolete'] = _computeobsoleteset
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
205 # wrap create marker to make it able to lift the inhibition
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
206 extensions.wrapfunction(obsolete, 'createmarkers', _createmarkers)
1339
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
207 # drop divergence computation since it is incompatible with "light revive"
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
208 obsolete.cachefuncs['divergent'] = lambda repo: set()
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
209 # drop bumped computation since it is incompatible with "light revive"
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
210 obsolete.cachefuncs['bumped'] = lambda repo: set()
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
211 # wrap update to make sure that no obsolete commit is visible after an
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
212 # update
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
213 extensions.wrapcommand(commands.table, 'update', _update)
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
214 # There are two ways to save bookmark changes during a transation, we
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
215 # wrap both to add inhibition markers.
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
216 extensions.wrapfunction(bookmarks.bmstore, 'recordchange', _bookmarkchanged)
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
217 extensions.wrapfunction(bookmarks.bmstore, 'write', _bookmarkchanged)
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
218 # Add bookmark -D option
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
219 entry = extensions.wrapcommand(commands.table, 'bookmark', _bookmark)
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
220 entry[1].append(('D','prune',None,
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents: 1338
diff changeset
221 _('delete the bookmark and prune the commits underneath')))
1224
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
222
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
223 @command('debugobsinhibit', [], '')
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
224 def cmddebugobsinhibit(ui, repo, *revs):
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
225 """inhibit obsolescence markers effect on a set of revs"""
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
226 nodes = (repo[r].node() for r in scmutil.revrange(repo, revs))
859a854cedc3 add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
227 _inhibitmarkers(repo, nodes)