~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/controldir.py

(jelmer) Factor out common code from BranchFormatRegistry,
 RepositoryFormatRegistry and WorkingTreeFormatRegistry into
 ControlComponentFormatRegistry. (Jelmer Vernooij)

Show diffs side-by-side

added added

removed removed

Lines of Context:
622
622
        raise NotImplementedError(self.clone_on_transport)
623
623
 
624
624
 
 
625
class ControlComponentFormat(object):
 
626
    """A component that can live inside of a .bzr meta directory."""
 
627
 
 
628
    def get_format_string(self):
 
629
        """Return the format of this format, if usable in meta directories."""
 
630
        raise NotImplementedError(self.get_format_string)
 
631
 
 
632
    def get_format_description(self):
 
633
        """Return the short description for this format."""
 
634
        raise NotImplementedError(self.get_format_description)
 
635
 
 
636
 
 
637
class ControlComponentFormatRegistry(registry.FormatRegistry):
 
638
    """A registry for control components (branch, workingtree, repository)."""
 
639
 
 
640
    def __init__(self, other_registry=None):
 
641
        super(ControlComponentFormatRegistry, self).__init__(other_registry)
 
642
        self._extra_formats = []
 
643
 
 
644
    def register(self, format):
 
645
        """Register a new format."""
 
646
        super(ControlComponentFormatRegistry, self).register(
 
647
            format.get_format_string(), format)
 
648
 
 
649
    def remove(self, format):
 
650
        """Remove a registered format."""
 
651
        super(ControlComponentFormatRegistry, self).remove(
 
652
            format.get_format_string())
 
653
 
 
654
    def register_extra(self, format):
 
655
        """Register a format that can not be used in a metadir.
 
656
 
 
657
        This is mainly useful to allow custom repository formats, such as older
 
658
        Bazaar formats and foreign formats, to be tested.
 
659
        """
 
660
        self._extra_formats.append(registry._ObjectGetter(format))
 
661
 
 
662
    def remove_extra(self, format):
 
663
        """Remove an extra format.
 
664
        """
 
665
        self._extra_formats.remove(registry._ObjectGetter(format))
 
666
 
 
667
    def register_extra_lazy(self, module_name, member_name):
 
668
        """Register a format lazily.
 
669
        """
 
670
        self._extra_formats.append(
 
671
            registry._LazyObjectGetter(module_name, member_name))
 
672
 
 
673
    def _get_extra(self):
 
674
        """Return all "extra" formats, not usable in meta directories."""
 
675
        result = []
 
676
        for getter in self._extra_formats:
 
677
            f = getter.get_obj()
 
678
            if callable(f):
 
679
                f = f()
 
680
            result.append(f)
 
681
        return result
 
682
 
 
683
    def _get_all(self):
 
684
        """Return all formats, even those not usable in metadirs.
 
685
        """
 
686
        result = []
 
687
        for name in self.keys():
 
688
            fmt = self.get(name)
 
689
            if callable(fmt):
 
690
                fmt = fmt()
 
691
            result.append(fmt)
 
692
        return result + self._get_extra()
 
693
 
 
694
 
625
695
class ControlDirFormat(object):
626
696
    """An encapsulation of the initialization and open routines for a format.
627
697
 
879
949
    """Registry of user-selectable ControlDir subformats.
880
950
 
881
951
    Differs from ControlDirFormat._formats in that it provides sub-formats,
882
 
    e.g. ControlDirMeta1 with weave repository.  Also, it's more user-oriented.
 
952
    e.g. BzrDirMeta1 with weave repository.  Also, it's more user-oriented.
883
953
    """
884
954
 
885
955
    def __init__(self):