At http://people.ubuntu.com/~robertc/baz2.0/plugins/rebase/dev
------------------------------------------------------------ revno: 115 revision-id: [email protected] parent: [email protected] committer: Robert Collins <[email protected]> branch nick: dev timestamp: Thu 2009-01-15 17:07:29 +1100 message: Add --new-nick option to replay and rebase commands. === modified file 'NEWS' --- a/NEWS 2008-11-18 00:23:44 +0000 +++ b/NEWS 2009-01-15 06:07:29 +0000 @@ -1,5 +1,10 @@ 0.4.3 UNRELEASED + FEATURES + + * --new-nick to replay and rebase will recreate the nick for revisions that + are rewritten. (Robert Collins) + 0.4.2 2008-11-18 FEATURES === modified file '__init__.py' --- a/__init__.py 2008-11-18 00:23:44 +0000 +++ b/__init__.py 2009-01-15 06:07:29 +0000 @@ -100,12 +100,15 @@ Option('pending-merges', help="Rebase pending merges onto local branch."), Option('onto', help='Different revision to replay onto.', - type=str)] + type=str), + Option('new-nick', + help='Change revisions to have the target branch nick.'), + ] @display_command def run(self, upstream_location=None, onto=None, revision=None, - merge_type=None, verbose=False, dry_run=False, - always_rebase_merges=False, pending_merges=False): + merge_type=None, verbose=False, dry_run=False, + always_rebase_merges=False, pending_merges=False, new_nick=False): from bzrlib.branch import Branch from bzrlib.revisionspec import RevisionSpec from bzrlib.workingtree import WorkingTree @@ -218,7 +221,8 @@ # Start executing plan try: rebase(wt.branch.repository, replace_map, - workingtree_replay(wt, merge_type=merge_type)) + workingtree_replay(wt, merge_type=merge_type, + new_nick=new_nick)) except ConflictsInTree: raise BzrCommandError("A conflict occurred replaying a " "commit. Resolve the conflict and run " @@ -322,11 +326,14 @@ """ - takes_options = ['revision', 'merge-type'] + takes_options = ['revision', 'merge-type', + Option('new-nick', + help='Change revisions to have the target branch nick.'), + ] takes_args = ['location'] hidden = True - def run(self, location, revision=None, merge_type=None): + def run(self, location, revision=None, merge_type=None, new_nick=False): from bzrlib.branch import Branch from bzrlib.workingtree import WorkingTree from bzrlib import ui @@ -361,8 +368,8 @@ wt.branch.repository.fetch(from_branch.repository, revid) newrevid = regenerate_default_revid(wt.branch.repository, revid) replay_delta_workingtree(wt, revid, newrevid, - [wt.last_revision()], - merge_type=merge_type) + [wt.last_revision()], merge_type=merge_type, + new_nick=new_nick) finally: pb.finished() wt.unlock() === modified file 'rebase.py' --- a/rebase.py 2008-08-31 20:30:21 +0000 +++ b/rebase.py 2009-01-15 06:07:29 +0000 @@ -147,7 +147,8 @@ """ assert start_revid is None or start_revid in todo_set, \ "invalid start revid(%r), todo_set(%r)" % (start_revid, todo_set) - assert stop_revid is None or stop_revid in todo_set, "invalid stop_revid" + assert stop_revid is None or stop_revid in todo_set, \ + "invalid stop_revid (%r), todo_set(%r)" % (stop_revid, todo_set) replace_map = {} parent_map = graph.get_parent_map(todo_set) order = topo_sort(parent_map) @@ -395,12 +396,14 @@ raise -def commit_rebase(wt, oldrev, newrevid): +def commit_rebase(wt, oldrev, newrevid, new_nick=False): """Commit a rebase. :param wt: Mutable tree with the changes. :param oldrev: Revision info of new revision to commit. - :param newrevid: New revision id.""" + :param newrevid: New revision id. + :param new_nick: Generate new nick's in revisions. + """ assert oldrev.revision_id != newrevid, "Invalid revid %r" % newrevid revprops = dict(oldrev.properties) revprops[REVPROP_REBASE_OF] = oldrev.revision_id @@ -408,6 +411,8 @@ author = oldrev.get_apparent_author() if author == committer or 'author' in revprops: author = None + if new_nick and 'branch-nick' in revprops: + del revprops['branch-nick'] wt.commit(message=oldrev.message, timestamp=oldrev.timestamp, timezone=oldrev.timezone, revprops=revprops, rev_id=newrevid, committer=committer, author=author) @@ -447,14 +452,15 @@ return oldparents[0] -def replay_delta_workingtree(wt, oldrevid, newrevid, newparents, - merge_type=None): +def replay_delta_workingtree(wt, oldrevid, newrevid, newparents, + merge_type=None, new_nick=False): """Replay a commit in a working tree, with a different base. :param wt: Working tree in which to do the replays. :param oldrevid: Old revision id :param newrevid: New revision id :param newparents: New parent revision ids + :param new_nick: Generate new nick's in revisions. """ repository = wt.branch.repository if merge_type is None: @@ -480,19 +486,21 @@ merger.do_merge() for newparent in newparents[1:]: wt.add_pending_merge(newparent) - commit_rebase(wt, oldrev, newrevid) - - -def workingtree_replay(wt, map_ids=False, merge_type=None): + commit_rebase(wt, oldrev, newrevid, new_nick=new_nick) + + +def workingtree_replay(wt, map_ids=False, merge_type=None, new_nick=False): """Returns a function that can replay revisions in wt. :param wt: Working tree in which to do the replays. - :param map_ids: Whether to try to map between file ids (False for path-based merge) + :param map_ids: Whether to try to map between file ids (False for + path-based merge) + :param new_nick: Generate new nicks for revisions that are copied across. """ def replay(repository, oldrevid, newrevid, newparents): assert wt.branch.repository == repository, "Different repository" - return replay_delta_workingtree(wt, oldrevid, newrevid, newparents, - merge_type=merge_type) + return replay_delta_workingtree(wt, oldrevid, newrevid, newparents, + merge_type=merge_type, new_nick=new_nick) return replay === modified file 'test_blackbox.py' --- a/test_blackbox.py 2008-09-01 17:51:22 +0000 +++ b/test_blackbox.py 2009-01-15 06:07:29 +0000 @@ -237,27 +237,19 @@ self.run_bzr('commit -m merge') self.run_bzr('rebase') -class ReplayTests(ExternalBase): - def test_replay(self): - os.mkdir('main') - os.chdir('main') - self.run_bzr('init') - open('bar', 'w').write('42') - self.run_bzr('add') - self.run_bzr('commit -m that') - os.mkdir('../feature') - os.chdir('../feature') - self.run_bzr('init') - branch = Branch.open('.') - open('hello', 'w').write("my data") - self.run_bzr('add') - self.run_bzr('commit -m this') - self.assertEquals(1, len(branch.revision_history())) - self.run_bzr('replay -r1 ../main') - self.assertEquals(2, len(branch.revision_history())) - self.assertTrue(os.path.exists('bar')) - -class ReplayTests(ExternalBase): + def test_new_nick(self): + source = self.make_branch_and_tree('main') + revid = source.commit('1') + other = source.bzrdir.sprout('other').open_workingtree() + other.commit('2', revprops={'branch-nick':'bad-nick'}) + source.commit('trigger') + self.run_bzr('rebase --new-nick ../main', working_dir='other') + rev = other.branch.repository.get_revision(other.last_revision()) + self.assertEqual('other', rev.properties['branch-nick']) + + +class ReplayTests(ExternalBase): + def test_replay(self): os.mkdir('main') os.chdir('main') @@ -278,3 +270,13 @@ self.run_bzr('replay -r1.. ../main') self.assertEquals(3, len(branch.revision_history())) self.assertTrue(os.path.exists('bar')) + + def test_new_nick(self): + source = self.make_branch_and_tree('main') + revid = source.commit('1') + other = source.bzrdir.sprout('other').open_workingtree() + source.commit('2') + self.run_bzr('replay -r -1 --new-nick ../main', working_dir='other') + rev = other.branch.repository.get_revision(other.last_revision()) + self.assertEqual('other', rev.properties['branch-nick']) + -- bazaar-commits mailing list [email protected] https://lists.ubuntu.com/mailman/listinfo/bazaar-commits
