~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/branch.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2010-04-22 17:08:27 UTC
  • mfrom: (5107.3.8 new_branch_and_repo_hooks)
  • Revision ID: pqm@pqm.ubuntu.com-20100422170827-h0bb41yq5nkosu6t
(vila) Add 'post_repo_init', 'post_branch_init' and 'post_switch' hooks. (Marco Pantaleoni)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1543
1543
        """Return the short format description for this format."""
1544
1544
        raise NotImplementedError(self.get_format_description)
1545
1545
 
 
1546
    def _run_post_branch_init_hooks(self, a_bzrdir, name, branch):
 
1547
        hooks = Branch.hooks['post_branch_init']
 
1548
        if not hooks:
 
1549
            return
 
1550
        params = BranchInitHookParams(self, a_bzrdir, name, branch)
 
1551
        for hook in hooks:
 
1552
            hook(params)
 
1553
 
1546
1554
    def _initialize_helper(self, a_bzrdir, utf8_files, name=None,
1547
1555
                           lock_type='metadir', set_format=True):
1548
1556
        """Initialize a branch in a bzrdir, with specified files
1584
1592
        finally:
1585
1593
            if lock_taken:
1586
1594
                control_files.unlock()
1587
 
        return self.open(a_bzrdir, name, _found=True)
 
1595
        branch = self.open(a_bzrdir, name, _found=True)
 
1596
        self._run_post_branch_init_hooks(a_bzrdir, name, branch)
 
1597
        return branch
1588
1598
 
1589
1599
    def initialize(self, a_bzrdir, name=None):
1590
1600
        """Create a branch of this format in a_bzrdir.
1750
1760
            "should return a tag name or None if no tag name could be "
1751
1761
            "determined. The first non-None tag name returned will be used.",
1752
1762
            (2, 2), None))
 
1763
        self.create_hook(HookPoint('post_branch_init',
 
1764
            "Called after new branch initialization completes. "
 
1765
            "post_branch_init is called with a "
 
1766
            "bzrlib.branch.BranchInitHookParams. "
 
1767
            "Note that init, branch and checkout (both heavyweight and "
 
1768
            "lightweight) will all trigger this hook.", (2, 2), None))
 
1769
        self.create_hook(HookPoint('post_switch',
 
1770
            "Called after a checkout switches branch. "
 
1771
            "post_switch is called with a "
 
1772
            "bzrlib.branch.SwitchHookParams.", (2, 2), None))
1753
1773
 
1754
1774
 
1755
1775
 
1795
1815
            self.old_revno, self.old_revid, self.new_revno, self.new_revid)
1796
1816
 
1797
1817
 
 
1818
class BranchInitHookParams(object):
 
1819
    """Object holding parameters passed to *_branch_init hooks.
 
1820
 
 
1821
    There are 4 fields that hooks may wish to access:
 
1822
 
 
1823
    :ivar format: the branch format
 
1824
    :ivar bzrdir: the BzrDir where the branch will be/has been initialized
 
1825
    :ivar name: name of colocated branch, if any (or None)
 
1826
    :ivar branch: the branch created
 
1827
 
 
1828
    Note that for lightweight checkouts, the bzrdir and format fields refer to
 
1829
    the checkout, hence they are different from the corresponding fields in
 
1830
    branch, which refer to the original branch.
 
1831
    """
 
1832
 
 
1833
    def __init__(self, format, a_bzrdir, name, branch):
 
1834
        """Create a group of BranchInitHook parameters.
 
1835
 
 
1836
        :param format: the branch format
 
1837
        :param a_bzrdir: the BzrDir where the branch will be/has been
 
1838
            initialized
 
1839
        :param name: name of colocated branch, if any (or None)
 
1840
        :param branch: the branch created
 
1841
 
 
1842
        Note that for lightweight checkouts, the bzrdir and format fields refer
 
1843
        to the checkout, hence they are different from the corresponding fields
 
1844
        in branch, which refer to the original branch.
 
1845
        """
 
1846
        self.format = format
 
1847
        self.bzrdir = a_bzrdir
 
1848
        self.name = name
 
1849
        self.branch = branch
 
1850
 
 
1851
    def __eq__(self, other):
 
1852
        return self.__dict__ == other.__dict__
 
1853
 
 
1854
    def __repr__(self):
 
1855
        if self.branch:
 
1856
            return "<%s of %s>" % (self.__class__.__name__, self.branch)
 
1857
        else:
 
1858
            return "<%s of format:%s bzrdir:%s>" % (
 
1859
                self.__class__.__name__, self.branch,
 
1860
                self.format, self.bzrdir)
 
1861
 
 
1862
 
 
1863
class SwitchHookParams(object):
 
1864
    """Object holding parameters passed to *_switch hooks.
 
1865
 
 
1866
    There are 4 fields that hooks may wish to access:
 
1867
 
 
1868
    :ivar control_dir: BzrDir of the checkout to change
 
1869
    :ivar to_branch: branch that the checkout is to reference
 
1870
    :ivar force: skip the check for local commits in a heavy checkout
 
1871
    :ivar revision_id: revision ID to switch to (or None)
 
1872
    """
 
1873
 
 
1874
    def __init__(self, control_dir, to_branch, force, revision_id):
 
1875
        """Create a group of SwitchHook parameters.
 
1876
 
 
1877
        :param control_dir: BzrDir of the checkout to change
 
1878
        :param to_branch: branch that the checkout is to reference
 
1879
        :param force: skip the check for local commits in a heavy checkout
 
1880
        :param revision_id: revision ID to switch to (or None)
 
1881
        """
 
1882
        self.control_dir = control_dir
 
1883
        self.to_branch = to_branch
 
1884
        self.force = force
 
1885
        self.revision_id = revision_id
 
1886
 
 
1887
    def __eq__(self, other):
 
1888
        return self.__dict__ == other.__dict__
 
1889
 
 
1890
    def __repr__(self):
 
1891
        return "<%s for %s to (%s, %s)>" % (self.__class__.__name__,
 
1892
            self.control_dir, self.to_branch,
 
1893
            self.revision_id)
 
1894
 
 
1895
 
1798
1896
class BzrBranchFormat4(BranchFormat):
1799
1897
    """Bzr branch format 4.
1800
1898
 
2069
2167
        branch_transport.put_bytes('location',
2070
2168
            target_branch.bzrdir.root_transport.base)
2071
2169
        branch_transport.put_bytes('format', self.get_format_string())
2072
 
        return self.open(
 
2170
        branch = self.open(
2073
2171
            a_bzrdir, name, _found=True,
2074
2172
            possible_transports=[target_branch.bzrdir.root_transport])
 
2173
        self._run_post_branch_init_hooks(a_bzrdir, name, branch)
 
2174
        return branch
2075
2175
 
2076
2176
    def __init__(self):
2077
2177
        super(BranchReferenceFormat, self).__init__()