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