~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/controldir.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2010-09-24 08:18:19 UTC
  • mfrom: (5365.6.10 annotate-revspec)
  • Revision ID: pqm@pqm.ubuntu.com-20100924081819-5b3m10xulgg6d3cv
(spiv) Add 'mainline' and 'annotate' revision specs. (Aaron Bentley) (Andrew
 Bennetts)

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
import textwrap
28
28
 
29
29
from bzrlib import (
30
 
    cleanup,
31
30
    errors,
32
31
    graph,
 
32
    registry,
33
33
    revision as _mod_revision,
 
34
    symbol_versioning,
34
35
    urlutils,
35
36
    )
36
37
from bzrlib.push import (
46
47
 
47
48
""")
48
49
 
49
 
from bzrlib import registry
50
 
 
51
50
 
52
51
class ControlComponent(object):
53
52
    """Abstract base class for control directory components.
144
143
        """Destroy the repository in this ControlDir."""
145
144
        raise NotImplementedError(self.destroy_repository)
146
145
 
147
 
    def create_branch(self, name=None, repository=None):
 
146
    def create_branch(self, name=None):
148
147
        """Create a branch in this ControlDir.
149
148
 
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.
367
366
        """
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)
375
 
 
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)
391
376
            if stacked:
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
406
 
                else:
407
 
                    add_cleanup(source_repository.lock_read().unlock)
408
 
            else:
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()
433
413
        else:
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,))
438
417
 
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)
 
423
                hardlink=hardlink)
445
424
            wt.lock_write()
446
425
            try:
447
426
                if wt.path2id('') is None: