Mercurial > evolve
annotate hgext/inhibit.py @ 1472:a8a4c8b8550d stable
inhibit: add missing locking in wrapper for obsmarker creation
The develwarning for transaction without lock rightfully pointed out to this
issue. Before this patch we were not locking in the transaction for obsmarker
creation and therefore showing the warnings.
author | Laurent Charignon <lcharignon@fb.com> |
---|---|
date | Thu, 09 Jul 2015 12:42:07 -0700 |
parents | 777e5c369d99 |
children | 8e6de39b724d e8ebb2441e60 |
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() |
1465
777e5c369d99
compat: use svfs instead of sopener
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1366
diff
changeset
|
39 raw = self.svfs.tryread('obsinhibit') |
1224
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 |
1472
a8a4c8b8550d
inhibit: add missing locking in wrapper for obsmarker creation
Laurent Charignon <lcharignon@fb.com>
parents:
1465
diff
changeset
|
158 lock = tr = None |
1224
859a854cedc3
add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
159 try: |
1472
a8a4c8b8550d
inhibit: add missing locking in wrapper for obsmarker creation
Laurent Charignon <lcharignon@fb.com>
parents:
1465
diff
changeset
|
160 lock = repo.lock() |
a8a4c8b8550d
inhibit: add missing locking in wrapper for obsmarker creation
Laurent Charignon <lcharignon@fb.com>
parents:
1465
diff
changeset
|
161 tr = repo.transaction('add-obsolescence-marker') |
1224
859a854cedc3
add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
162 orig(repo, relations, flag, date, metadata) |
859a854cedc3
add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
163 precs = (r[0].node() for r in relations) |
859a854cedc3
add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
164 _deinhibitmarkers(repo, precs) |
859a854cedc3
add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
165 tr.close() |
859a854cedc3
add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
166 finally: |
1472
a8a4c8b8550d
inhibit: add missing locking in wrapper for obsmarker creation
Laurent Charignon <lcharignon@fb.com>
parents:
1465
diff
changeset
|
167 lockmod.release(tr, lock) |
1224
859a854cedc3
add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
168 |
1240
e1347ce2f954
inhibit: don't leave any obsolete commit visible after closing transaction
Laurent Charignon <lcharignon@fb.com>
parents:
1234
diff
changeset
|
169 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
|
170 """ 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
|
171 def inhibitposttransaction(transaction): |
e1347ce2f954
inhibit: don't leave any obsolete commit visible after closing transaction
Laurent Charignon <lcharignon@fb.com>
parents:
1234
diff
changeset
|
172 # 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
|
173 # obsolete commit to inhibit them |
1362
73e5b5280c1c
inhibit: improve performance of transaction wrapping
Laurent Charignon <lcharignon@fb.com>
parents:
1346
diff
changeset
|
174 visibleobsolete = repo.revs('obsolete() - hidden()') |
1321
8fa74845eb1f
inhibit: don't inhibit pinned commits during rebase
Durham Goode <durham@fb.com>
parents:
1303
diff
changeset
|
175 ignoreset = set(getattr(repo, '_rebaseset', [])) |
8fa74845eb1f
inhibit: don't inhibit pinned commits during rebase
Durham Goode <durham@fb.com>
parents:
1303
diff
changeset
|
176 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
|
177 if visibleobsolete: |
e1347ce2f954
inhibit: don't leave any obsolete commit visible after closing transaction
Laurent Charignon <lcharignon@fb.com>
parents:
1234
diff
changeset
|
178 _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
|
179 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
|
180 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
|
181 return transaction |
e1347ce2f954
inhibit: don't leave any obsolete commit visible after closing transaction
Laurent Charignon <lcharignon@fb.com>
parents:
1234
diff
changeset
|
182 |
1224
859a854cedc3
add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
183 def extsetup(ui): |
859a854cedc3
add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
184 # lets wrap the computation of the obsolete set |
859a854cedc3
add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
185 # We apply inhibition there |
859a854cedc3
add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
186 obsfunc = obsolete.cachefuncs['obsolete'] |
859a854cedc3
add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
187 def _computeobsoleteset(repo): |
859a854cedc3
add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
188 """remove any inhibited nodes from the obsolete set |
859a854cedc3
add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
189 |
859a854cedc3
add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
190 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
|
191 obs = obsfunc(repo) |
859a854cedc3
add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
192 getrev = repo.changelog.nodemap.get |
859a854cedc3
add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
193 for n in repo._obsinhibit: |
859a854cedc3
add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
194 obs.discard(getrev(n)) |
859a854cedc3
add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
195 return obs |
1339
0e2eb196923a
inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
1338
diff
changeset
|
196 try: |
0e2eb196923a
inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
1338
diff
changeset
|
197 extensions.find('directaccess') |
0e2eb196923a
inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
1338
diff
changeset
|
198 except KeyError: |
0e2eb196923a
inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
1338
diff
changeset
|
199 errormsg = _('Cannot use inhibit without the direct access extension') |
0e2eb196923a
inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
1338
diff
changeset
|
200 raise error.Abort(errormsg) |
1366
9c3ba42c582a
inhibit: move transaction wrapping outside of repo setup
Laurent Charignon <lcharignon@fb.com>
parents:
1362
diff
changeset
|
201 |
9c3ba42c582a
inhibit: move transaction wrapping outside of repo setup
Laurent Charignon <lcharignon@fb.com>
parents:
1362
diff
changeset
|
202 # 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
|
203 extensions.wrapfunction(localrepo.localrepository, |
9c3ba42c582a
inhibit: move transaction wrapping outside of repo setup
Laurent Charignon <lcharignon@fb.com>
parents:
1362
diff
changeset
|
204 'transaction', transactioncallback) |
9c3ba42c582a
inhibit: move transaction wrapping outside of repo setup
Laurent Charignon <lcharignon@fb.com>
parents:
1362
diff
changeset
|
205 |
1224
859a854cedc3
add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
206 obsolete.cachefuncs['obsolete'] = _computeobsoleteset |
859a854cedc3
add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
207 # 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
|
208 extensions.wrapfunction(obsolete, 'createmarkers', _createmarkers) |
1339
0e2eb196923a
inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
1338
diff
changeset
|
209 # 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
|
210 obsolete.cachefuncs['divergent'] = lambda repo: set() |
0e2eb196923a
inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
1338
diff
changeset
|
211 # 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
|
212 obsolete.cachefuncs['bumped'] = lambda repo: set() |
0e2eb196923a
inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
1338
diff
changeset
|
213 # 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
|
214 # update |
0e2eb196923a
inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
1338
diff
changeset
|
215 extensions.wrapcommand(commands.table, 'update', _update) |
0e2eb196923a
inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
1338
diff
changeset
|
216 # 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
|
217 # wrap both to add inhibition markers. |
0e2eb196923a
inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
1338
diff
changeset
|
218 extensions.wrapfunction(bookmarks.bmstore, 'recordchange', _bookmarkchanged) |
0e2eb196923a
inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
1338
diff
changeset
|
219 extensions.wrapfunction(bookmarks.bmstore, 'write', _bookmarkchanged) |
0e2eb196923a
inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
1338
diff
changeset
|
220 # Add bookmark -D option |
0e2eb196923a
inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
1338
diff
changeset
|
221 entry = extensions.wrapcommand(commands.table, 'bookmark', _bookmark) |
0e2eb196923a
inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
1338
diff
changeset
|
222 entry[1].append(('D','prune',None, |
0e2eb196923a
inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
1338
diff
changeset
|
223 _('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
|
224 |
859a854cedc3
add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
225 @command('debugobsinhibit', [], '') |
859a854cedc3
add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
226 def cmddebugobsinhibit(ui, repo, *revs): |
859a854cedc3
add a 'inhibit' extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
227 """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
|
228 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
|
229 _inhibitmarkers(repo, nodes) |