Mercurial > hg
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): |