def upgrade_repository(repository, generate_rebase_map, determine_new_revid, revision_id=None, allow_changes=False, verbose=False): """Upgrade the revisions in repository until the specified stop revision. :param repository: Repository in which to upgrade. :param foreign_repository: Repository to fetch new revisions from. :param new_mapping: New mapping. :param revision_id: Revision id up until which to upgrade, or None for all revisions. :param allow_changes: Allow changes to mappings. :param verbose: Whether to print list of rewrites :return: Dictionary of mapped revisions """ # Find revisions that need to be upgraded, create # dictionary with revision ids in key, new parents in value try: repository.lock_write() (plan, revid_renames) = create_upgrade_plan(repository, generate_rebase_map, determine_new_revid, revision_id=revision_id, allow_changes=allow_changes) if verbose: for revid in rebase_todo(repository, plan): trace.note("%s -> %s" % (revid, plan[revid][0])) rebase(repository, plan, CommitBuilderRevisionRewriter(repository)) return revid_renames finally: repository.unlock()
def test_halfway(self): class Repository: def has_revision(self, revid): return revid == "bloe" self.assertEquals(["ha"], list(rebase_todo(Repository(), { "bla": ("bloe", []), "ha": ("hee", [])})))
def run(self, directory="."): from bzrlib.plugins.rewrite.rebase import RebaseState1, rebase_todo from bzrlib.workingtree import WorkingTree wt = WorkingTree.open_containing(directory)[0] wt.lock_read() try: state = RebaseState1(wt) try: replace_map = state.read_plan()[1] except NoSuchFile: raise BzrCommandError(gettext("No rebase in progress")) currentrevid = state.read_active_revid() if currentrevid is not None: note(gettext("Currently replaying: %s") % currentrevid) for revid in rebase_todo(wt.branch.repository, replace_map): note(gettext("{0} -> {1}").format(revid, replace_map[revid][0])) finally: wt.unlock()
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, directory=".", ): from bzrlib.branch import Branch from bzrlib.revisionspec import RevisionSpec from bzrlib.workingtree import WorkingTree from bzrlib.plugins.rewrite.rebase import ( generate_simple_plan, rebase, RebaseState1, WorkingTreeRevisionRewriter, regenerate_default_revid, rebase_todo, ) if revision is not None and pending_merges: raise BzrCommandError(gettext("--revision and --pending-merges are mutually exclusive")) wt = WorkingTree.open_containing(directory)[0] wt.lock_write() try: state = RebaseState1(wt) if upstream_location is None: if pending_merges: upstream_location = directory else: upstream_location = wt.branch.get_parent() if upstream_location is None: raise BzrCommandError(gettext("No upstream branch specified.")) note(gettext("Rebasing on %s"), upstream_location) upstream = Branch.open_containing(upstream_location)[0] upstream_repository = upstream.repository upstream_revision = upstream.last_revision() # Abort if there already is a plan file if state.has_plan(): raise BzrCommandError( gettext( "A rebase operation was interrupted. " "Continue using 'bzr rebase-continue' or abort using 'bzr " "rebase-abort'" ) ) start_revid = None stop_revid = None if revision is not None: if len(revision) == 1: if revision[0] is not None: stop_revid = revision[0].as_revision_id(wt.branch) elif len(revision) == 2: if revision[0] is not None: start_revid = revision[0].as_revision_id(wt.branch) if revision[1] is not None: stop_revid = revision[1].as_revision_id(wt.branch) else: raise BzrCommandError(gettext("--revision takes only one or two arguments")) if pending_merges: wt_parents = wt.get_parent_ids() if len(wt_parents) in (0, 1): raise BzrCommandError(gettext("No pending merges present.")) elif len(wt_parents) > 2: raise BzrCommandError(gettext("Rebasing more than one pending merge not supported")) stop_revid = wt_parents[1] assert stop_revid is not None, "stop revid invalid" # Check for changes in the working tree. if not pending_merges and wt.basis_tree().changes_from(wt).has_changed(): raise UncommittedChanges(wt) # Pull required revisions wt.branch.repository.fetch(upstream_repository, upstream_revision) if onto is None: onto = upstream.last_revision() else: rev_spec = RevisionSpec.from_string(onto) onto = rev_spec.as_revision_id(upstream) wt.branch.repository.fetch(upstream_repository, onto) if stop_revid is None: stop_revid = wt.branch.last_revision() repo_graph = wt.branch.repository.get_graph() our_new, onto_unique = repo_graph.find_difference(stop_revid, onto) if start_revid is None: if not onto_unique: self.outf.write(gettext("No revisions to rebase.\n")) return if not our_new: self.outf.write(gettext("Base branch is descendant of current " "branch. Pulling instead.\n")) if not dry_run: wt.pull(upstream, onto) return # else: include extra revisions needed to make start_revid mean # something. # Create plan replace_map = generate_simple_plan( our_new, start_revid, stop_revid, onto, repo_graph, lambda revid, ps: regenerate_default_revid(wt.branch.repository, revid), not always_rebase_merges, ) if verbose or dry_run: todo = list(rebase_todo(wt.branch.repository, replace_map)) note(gettext("%d revisions will be rebased:") % len(todo)) for revid in todo: note("%s" % revid) if not dry_run: # Write plan file state.write_plan(replace_map) replayer = WorkingTreeRevisionRewriter(wt, state, merge_type=merge_type) finish_rebase(state, wt, replace_map, replayer) finally: wt.unlock()
def test_notstarted(self): class Repository: def has_revision(self, revid): return False self.assertEquals(["bla"], list(rebase_todo(Repository(), { "bla": ("bloe", [])})))