144
143
"""Destroy the repository in this ControlDir."""
145
144
raise NotImplementedError(self.destroy_repository)
147
def create_branch(self, name=None, repository=None):
146
def create_branch(self, name=None):
148
147
"""Create a branch in this ControlDir.
150
149
:param name: Name of the colocated branch to create, None for
365
364
:param create_tree_if_local: If true, a working-tree will be created
366
365
when working locally.
368
operation = cleanup.OperationWithCleanups(self._sprout)
369
return operation.run(url, revision_id=revision_id,
370
force_new_repo=force_new_repo, recurse=recurse,
371
possible_transports=possible_transports,
372
accelerator_tree=accelerator_tree, hardlink=hardlink,
373
stacked=stacked, source_branch=source_branch,
374
create_tree_if_local=create_tree_if_local)
376
def _sprout(self, op, url, revision_id=None, force_new_repo=False,
377
recurse='down', possible_transports=None,
378
accelerator_tree=None, hardlink=False, stacked=False,
379
source_branch=None, create_tree_if_local=True):
380
add_cleanup = op.add_cleanup
381
367
target_transport = get_transport(url, possible_transports)
382
368
target_transport.ensure_base()
383
369
cloning_format = self.cloning_metadir(stacked)
387
373
# even if the origin was stacked
388
374
stacked_branch_url = None
389
375
if source_branch is not None:
390
add_cleanup(source_branch.lock_read().unlock)
392
377
stacked_branch_url = self.root_transport.base
393
378
source_repository = source_branch.repository
403
388
source_repository = self.open_repository()
404
389
except errors.NoRepositoryPresent:
405
390
source_repository = None
407
add_cleanup(source_repository.lock_read().unlock)
409
add_cleanup(source_branch.lock_read().unlock)
410
391
repository_policy = result.determine_repository_policy(
411
392
force_new_repo, stacked_branch_url, require_stacking=stacked)
412
393
result_repo, is_new_repo = repository_policy.acquire_repository()
413
add_cleanup(result_repo.lock_write().unlock)
414
394
is_stacked = stacked or (len(result_repo._fallback_repositories) != 0)
415
395
if is_new_repo and revision_id is not None and not is_stacked:
416
396
fetch_spec = graph.PendingAncestryResult(
432
412
result_branch = result.create_branch()
434
414
result_branch = source_branch.sprout(result,
435
revision_id=revision_id, repository_policy=repository_policy,
436
repository=result_repo)
415
revision_id=revision_id, repository_policy=repository_policy)
437
416
mutter("created new branch %r" % (result_branch,))
439
418
# Create/update the result working tree
441
420
isinstance(target_transport, local.LocalTransport) and
442
421
(result_repo is None or result_repo.make_working_trees())):
443
422
wt = result.create_workingtree(accelerator_tree=accelerator_tree,
444
hardlink=hardlink, from_branch=result_branch)
447
426
if wt.path2id('') is None: