comparison hgext/rebase.py @ 29043:cf7de4aeb86b stable

destutil: add the ability to specify a search space for rebase destination In the 'hg pull --rebase', we don't want to pick a rebase destination unrelated to the pull, we lay down basic infrastructure to allow such restriction on stable (before 3.8 release) in this case. See issue 5214 for details. Actual usage and test will be in the next patch.
author Pierre-Yves David <pierre-yves.david@ens-lyon.org>
date Sat, 30 Apr 2016 18:41:08 +0200
parents b212e01fead0
children 261c25372959
comparison
equal deleted inserted replaced
29042:693b856a4d45 29043:cf7de4aeb86b
67 def extrafn(ctx, extra): 67 def extrafn(ctx, extra):
68 for c in copiers: 68 for c in copiers:
69 c(ctx, extra) 69 c(ctx, extra)
70 return extrafn 70 return extrafn
71 71
72 def _destrebase(repo, sourceset): 72 def _destrebase(repo, sourceset, destspace=None):
73 """small wrapper around destmerge to pass the right extra args 73 """small wrapper around destmerge to pass the right extra args
74 74
75 Please wrap destutil.destmerge instead.""" 75 Please wrap destutil.destmerge instead."""
76 return destutil.destmerge(repo, action='rebase', sourceset=sourceset, 76 return destutil.destmerge(repo, action='rebase', sourceset=sourceset,
77 onheadcheck=False) 77 onheadcheck=False, destspace=destspace)
78 78
79 revsetpredicate = registrar.revsetpredicate() 79 revsetpredicate = registrar.revsetpredicate()
80 80
81 @revsetpredicate('_destrebase') 81 @revsetpredicate('_destrebase')
82 def _revsetdestrebase(repo, subset, x): 82 def _revsetdestrebase(repo, subset, x):
220 # Validate input and define rebasing points 220 # Validate input and define rebasing points
221 destf = opts.get('dest', None) 221 destf = opts.get('dest', None)
222 srcf = opts.get('source', None) 222 srcf = opts.get('source', None)
223 basef = opts.get('base', None) 223 basef = opts.get('base', None)
224 revf = opts.get('rev', []) 224 revf = opts.get('rev', [])
225 # search default destination in this space
226 # used in the 'hg pull --rebase' case, see issue 5214.
227 destspace = opts.get('_destspace')
225 contf = opts.get('continue') 228 contf = opts.get('continue')
226 abortf = opts.get('abort') 229 abortf = opts.get('abort')
227 collapsef = opts.get('collapse', False) 230 collapsef = opts.get('collapse', False)
228 collapsemsg = cmdutil.logmessage(ui, opts) 231 collapsemsg = cmdutil.logmessage(ui, opts)
229 date = opts.get('date', None) 232 date = opts.get('date', None)
294 target) 297 target)
295 rebaseobsskipped = set(obsoletenotrebased) 298 rebaseobsskipped = set(obsoletenotrebased)
296 _checkobsrebase(repo, ui, rebaseobsrevs, rebasesetrevs, 299 _checkobsrebase(repo, ui, rebaseobsrevs, rebasesetrevs,
297 rebaseobsskipped) 300 rebaseobsskipped)
298 else: 301 else:
299 dest, rebaseset = _definesets(ui, repo, destf, srcf, basef, revf) 302 dest, rebaseset = _definesets(ui, repo, destf, srcf, basef, revf,
303 destspace=destspace)
300 if dest is None: 304 if dest is None:
301 return _nothingtorebase() 305 return _nothingtorebase()
302 306
303 allowunstable = obsolete.isenabled(repo, obsolete.allowunstableopt) 307 allowunstable = obsolete.isenabled(repo, obsolete.allowunstableopt)
304 if (not (keepf or allowunstable) 308 if (not (keepf or allowunstable)
523 bookmarks.activate(repo, activebookmark) 527 bookmarks.activate(repo, activebookmark)
524 528
525 finally: 529 finally:
526 release(lock, wlock) 530 release(lock, wlock)
527 531
528 def _definesets(ui, repo, destf=None, srcf=None, basef=None, revf=[]): 532 def _definesets(ui, repo, destf=None, srcf=None, basef=None, revf=[],
533 destspace=None):
529 """use revisions argument to define destination and rebase set 534 """use revisions argument to define destination and rebase set
530 """ 535 """
536 # destspace is here to work around issues with `hg pull --rebase` see
537 # issue5214 for details
531 if srcf and basef: 538 if srcf and basef:
532 raise error.Abort(_('cannot specify both a source and a base')) 539 raise error.Abort(_('cannot specify both a source and a base'))
533 if revf and basef: 540 if revf and basef:
534 raise error.Abort(_('cannot specify both a revision and a base')) 541 raise error.Abort(_('cannot specify both a revision and a base'))
535 if revf and srcf: 542 if revf and srcf:
558 if not base: 565 if not base:
559 ui.status(_('empty "base" revision set - ' 566 ui.status(_('empty "base" revision set - '
560 "can't compute rebase set\n")) 567 "can't compute rebase set\n"))
561 return None, None 568 return None, None
562 if not destf: 569 if not destf:
563 dest = repo[_destrebase(repo, base)] 570 dest = repo[_destrebase(repo, base, destspace=destspace)]
564 destf = str(dest) 571 destf = str(dest)
565 572
566 commonanc = repo.revs('ancestor(%ld, %d)', base, dest).first() 573 commonanc = repo.revs('ancestor(%ld, %d)', base, dest).first()
567 if commonanc is not None: 574 if commonanc is not None:
568 rebaseset = repo.revs('(%d::(%ld) - %d)::', 575 rebaseset = repo.revs('(%d::(%ld) - %d)::',
596 ui.status(_('nothing to rebase from %s to %s\n') % 603 ui.status(_('nothing to rebase from %s to %s\n') %
597 ('+'.join(str(repo[r]) for r in base), dest)) 604 ('+'.join(str(repo[r]) for r in base), dest))
598 return None, None 605 return None, None
599 606
600 if not destf: 607 if not destf:
601 dest = repo[_destrebase(repo, rebaseset)] 608 dest = repo[_destrebase(repo, rebaseset, destspace=destspace)]
602 destf = str(dest) 609 destf = str(dest)
603 610
604 return dest, rebaseset 611 return dest, rebaseset
605 612
606 def externalparent(repo, state, targetancestors): 613 def externalparent(repo, state, targetancestors):