78
78
note("basis_branch is not supported for fast weave copy yet.")
79
79
branch_from.lock_read()
81
if not (branch_from.weave_store.listable()
82
and branch_from.revision_store.listable()):
83
return copy_branch_slower(branch_from, to_location, revision,
85
81
history = _get_truncated_history(branch_from, revision)
86
82
if not bzrlib.osutils.lexists(to_location):
87
83
os.mkdir(to_location)
88
84
branch_to = Branch.initialize(to_location)
89
85
mutter("copy branch from %s to %s", branch_from, branch_to)
90
86
branch_to.working_tree().set_root_id(branch_from.get_root_id())
91
_copy_control_weaves(branch_from, branch_to)
92
_copy_text_weaves(branch_from, branch_to)
93
_copy_revision_store(branch_from, branch_to)
87
_copy_control_weaves(branch_from, branch_to, history)
88
_copy_text_weaves(branch_from, branch_to, history)
89
_copy_revision_store(branch_from, branch_to, history)
94
90
branch_to.set_parent(branch_from.base)
95
91
# must be done *after* history is copied across
96
92
branch_to.append_revision(*history)
111
106
raise InvalidRevisionId(revision_id=revision, branch=branch_from)
112
107
return history[:idx+1]
114
def _copy_text_weaves(branch_from, branch_to):
115
copy_all(branch_from.weave_store, branch_to.weave_store)
118
def _copy_revision_store(branch_from, branch_to):
119
copy_all(branch_from.revision_store, branch_to.revision_store)
122
def _copy_control_weaves(branch_from, branch_to):
109
def _copy_text_weaves(branch_from, branch_to, history):
110
from_set = set(branch_from.get_ancestry(history[-1])[1:])
111
file_ids = branch_from.fileid_involved_by_set( from_set )
112
branch_to.weave_store.copy_multi(branch_from.weave_store, file_ids )
114
def _copy_revision_store(branch_from, branch_to, history):
116
from_set = set(branch_from.get_ancestry(history[-1])[1:])
117
branch_to.revision_store.copy_multi(branch_from.revision_store, from_set )
119
def _copy_control_weaves(branch_from, branch_to, history):
123
120
to_control = branch_to.control_weaves
124
121
from_control = branch_from.control_weaves
122
# TODO Goffredo 20051215: we need only the minimal revision !!!!!
125
123
to_control.copy_multi(from_control, ['inventory'])
128
def copy_branch_slower(branch_from, to_location, revision=None, basis_branch=None):
129
"""Copy branch_from into the existing directory to_location.
132
If not None, only revisions up to this point will be copied.
133
The head of the new branch will be that revision. Must be a
136
to_location -- The destination directory; must either exist and be
137
empty, or not exist, in which case it is created.
140
The revision to copy up to
143
A local branch to copy revisions from, related to branch_from.
144
This is used when branching from a remote (slow) branch, and we have
145
a local branch that might contain some relevant revisions.
147
assert isinstance(branch_from, Branch)
148
assert isinstance(to_location, basestring)
149
if not bzrlib.osutils.lexists(to_location):
150
os.mkdir(to_location)
151
br_to = Branch.initialize(to_location)
152
mutter("copy branch from %s to %s", branch_from, br_to)
153
if basis_branch is not None:
154
basis_branch.push_stores(br_to)
155
br_to.working_tree().set_root_id(branch_from.get_root_id())
157
revision = branch_from.last_revision()
158
br_to.update_revisions(branch_from, stop_revision=revision)
159
build_working_dir(to_location)
160
br_to.set_parent(branch_from.base)