Mercurial > hg
comparison hgext/rebase.py @ 16531:b9f51f49bf2a stable
rebase: preserve mq series order, guarded patches (issue2849)
The previous code was rebasing an applied series like:
patch1 +guarded
patch2
patch3 +guarded
patch4
patch5 +guarded
into:
patch2
patch4
patch1 +guarded
patch3 +guarded
patch5 +guarded
Reported by Lars Westerhoff <lars.westerhoff@newtec.eu>
Also rename mq.series_dirty into mq.seriesdirty, missed by 599a72895c0d, and
without effect since mq.qimport() was setting it already.
author | Patrick Mezard <patrick@mezard.eu> |
---|---|
date | Wed, 25 Apr 2012 17:04:18 +0200 |
parents | 0806823370d8 |
children | ebf6d38c9063 |
comparison
equal
deleted
inserted
replaced
16530:e37199a1f9d4 | 16531:b9f51f49bf2a |
---|---|
444 def updatemq(repo, state, skipped, **opts): | 444 def updatemq(repo, state, skipped, **opts): |
445 'Update rebased mq patches - finalize and then import them' | 445 'Update rebased mq patches - finalize and then import them' |
446 mqrebase = {} | 446 mqrebase = {} |
447 mq = repo.mq | 447 mq = repo.mq |
448 original_series = mq.fullseries[:] | 448 original_series = mq.fullseries[:] |
449 skippedpatches = set() | |
449 | 450 |
450 for p in mq.applied: | 451 for p in mq.applied: |
451 rev = repo[p.node].rev() | 452 rev = repo[p.node].rev() |
452 if rev in state: | 453 if rev in state: |
453 repo.ui.debug('revision %d is an mq patch (%s), finalize it.\n' % | 454 repo.ui.debug('revision %d is an mq patch (%s), finalize it.\n' % |
454 (rev, p.name)) | 455 (rev, p.name)) |
455 mqrebase[rev] = (p.name, isagitpatch(repo, p.name)) | 456 mqrebase[rev] = (p.name, isagitpatch(repo, p.name)) |
457 else: | |
458 # Applied but not rebased, not sure this should happen | |
459 skippedpatches.add(p.name) | |
456 | 460 |
457 if mqrebase: | 461 if mqrebase: |
458 mq.finish(repo, mqrebase.keys()) | 462 mq.finish(repo, mqrebase.keys()) |
459 | 463 |
460 # We must start import from the newest revision | 464 # We must start import from the newest revision |
462 if rev not in skipped: | 466 if rev not in skipped: |
463 name, isgit = mqrebase[rev] | 467 name, isgit = mqrebase[rev] |
464 repo.ui.debug('import mq patch %d (%s)\n' % (state[rev], name)) | 468 repo.ui.debug('import mq patch %d (%s)\n' % (state[rev], name)) |
465 mq.qimport(repo, (), patchname=name, git=isgit, | 469 mq.qimport(repo, (), patchname=name, git=isgit, |
466 rev=[str(state[rev])]) | 470 rev=[str(state[rev])]) |
467 | 471 else: |
468 # restore missing guards | 472 # Rebased and skipped |
469 for s in original_series: | 473 skippedpatches.add(mqrebase[rev][0]) |
470 pname = mq.guard_re.split(s, 1)[0] | 474 |
471 if pname in mq.fullseries: | 475 # Patches were either applied and rebased and imported in |
472 repo.ui.debug('restoring guard for patch %s' % (pname)) | 476 # order, applied and removed or unapplied. Discard the removed |
473 mq.fullseries[mq.fullseries.index(pname)] = s | 477 # ones while preserving the original series order and guards. |
474 mq.series_dirty = True | 478 newseries = [s for s in original_series |
479 if mq.guard_re.split(s, 1)[0] not in skippedpatches] | |
480 mq.fullseries[:] = newseries | |
481 mq.seriesdirty = True | |
475 mq.savedirty() | 482 mq.savedirty() |
476 | 483 |
477 def updatebookmarks(repo, nstate, originalbookmarks, **opts): | 484 def updatebookmarks(repo, nstate, originalbookmarks, **opts): |
478 'Move bookmarks to their correct changesets' | 485 'Move bookmarks to their correct changesets' |
479 current = repo._bookmarkcurrent | 486 current = repo._bookmarkcurrent |