comparison hgext/inhibit.py @ 1588:983f2e4dbe5d

inhibit: fix compat with rebaseskipobsolete We wrap _computeobsoletenotrebased and _clearrebased to fix the following case: - Assuming that we have markers from revisions of the rebase set and destination set and that these markers are inhibited - At the end of the rebase the nodes are still visible because rebase operate without inhibition and skip these nodes Had we not have those markers to begin with the revisions could be hidden at the end of the rebase. We keep track in repo._obsoletenotrebased of the obsolete commits skipped by the rebase and lift the inhibition at the end of the rebase. We add three test cases to make sure that the edge cases are covered.
author Laurent Charignon <lcharignon@fb.com>
date Wed, 27 Jan 2016 13:57:08 -0800
parents aaa65373a31b
children ca5c8a827407
comparison
equal deleted inserted replaced
1587:ea7523380efa 1588:983f2e4dbe5d
205 def inhibitposttransaction(transaction): 205 def inhibitposttransaction(transaction):
206 # At the end of the transaction we catch all the new visible and 206 # At the end of the transaction we catch all the new visible and
207 # obsolete commit to inhibit them 207 # obsolete commit to inhibit them
208 visibleobsolete = repo.revs('obsolete() - hidden()') 208 visibleobsolete = repo.revs('obsolete() - hidden()')
209 ignoreset = set(getattr(repo, '_rebaseset', [])) 209 ignoreset = set(getattr(repo, '_rebaseset', []))
210 ignoreset |= set(getattr(repo, '_obsoletenotrebased', []))
210 visibleobsolete = list(r for r in visibleobsolete if r not in ignoreset) 211 visibleobsolete = list(r for r in visibleobsolete if r not in ignoreset)
211 if visibleobsolete: 212 if visibleobsolete:
212 _inhibitmarkers(repo, [repo[r].node() for r in visibleobsolete]) 213 _inhibitmarkers(repo, [repo[r].node() for r in visibleobsolete])
213 transaction = orig(repo, desc, *args, **kwargs) 214 transaction = orig(repo, desc, *args, **kwargs)
214 if desc != 'strip' and _inhibitenabled(repo): 215 if desc != 'strip' and _inhibitenabled(repo):
215 transaction.addpostclose('inhibitposttransaction', 216 transaction.addpostclose('inhibitposttransaction',
216 inhibitposttransaction) 217 inhibitposttransaction)
217 return transaction 218 return transaction
219
220
221 # We wrap these two functions to address the following scenario:
222 # - Assuming that we have markers between commits in the rebase set and
223 # destination and that these markers are inhibited
224 # - At the end of the rebase the nodes are still visible because rebase operate
225 # without inhibition and skip these nodes
226 # We keep track in repo._obsoletenotrebased of the obsolete commits skipped by
227 # the rebase and lift the inhibition in the end of the rebase.
228
229 def _computeobsoletenotrebased(orig, repo, *args, **kwargs):
230 r = orig(repo, *args, **kwargs)
231 repo._obsoletenotrebased = r.keys()
232 return r
233
234 def _clearrebased(orig, ui, repo, *args, **kwargs):
235 r = orig(ui, repo, *args, **kwargs)
236 tonode = repo.changelog.node
237 if util.safehasattr(repo, '_obsoletenotrebased'):
238 _deinhibitmarkers(repo, [tonode(k) for k in repo._obsoletenotrebased])
239 return r
240
218 241
219 def extsetup(ui): 242 def extsetup(ui):
220 # lets wrap the computation of the obsolete set 243 # lets wrap the computation of the obsolete set
221 # We apply inhibition there 244 # We apply inhibition there
222 obsfunc = obsolete.cachefuncs['obsolete'] 245 obsfunc = obsolete.cachefuncs['obsolete']
260 if rebase: 283 if rebase:
261 if util.safehasattr(rebase, '_filterobsoleterevs'): 284 if util.safehasattr(rebase, '_filterobsoleterevs'):
262 extensions.wrapfunction(rebase, 285 extensions.wrapfunction(rebase,
263 '_filterobsoleterevs', 286 '_filterobsoleterevs',
264 _filterobsoleterevswrap) 287 _filterobsoleterevswrap)
288 extensions.wrapfunction(rebase, 'clearrebased', _clearrebased)
289 if util.safehasattr(rebase, '_computeobsoletenotrebased'):
290 extensions.wrapfunction(rebase,
291 '_computeobsoletenotrebased',
292 _computeobsoletenotrebased)
293
265 except KeyError: 294 except KeyError:
266 pass 295 pass
267 # There are two ways to save bookmark changes during a transation, we 296 # There are two ways to save bookmark changes during a transation, we
268 # wrap both to add inhibition markers. 297 # wrap both to add inhibition markers.
269 extensions.wrapfunction(bookmarks.bmstore, 'recordchange', _bookmarkchanged) 298 extensions.wrapfunction(bookmarks.bmstore, 'recordchange', _bookmarkchanged)