~bzr-pqm/bzr/bzr.dev

2466.7.3 by Robert Collins
Create bzrlib.branchbuilder.
1
# Copyright (C) 2007 Canonical Ltd
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
"""Utility for create branches with particular contents."""
18
2466.7.6 by Robert Collins
Add BranchBuilder.build_commit.
19
from bzrlib import bzrdir, errors, memorytree
2466.7.3 by Robert Collins
Create bzrlib.branchbuilder.
20
21
22
class BranchBuilder(object):
2466.7.7 by Robert Collins
Document basic usage.
23
    """A BranchBuilder aids creating Branches with particular shapes.
24
    
25
    The expected way to use BranchBuilder is to construct a
26
    BranchBuilder on the transport you want your branch on, and then call
27
    appropriate build_ methods on it to get the shape of history you want.
28
29
    For instance:
30
      builder = BranchBuilder(self.get_transport().clone('relpath'))
31
      builder.build_commit()
32
      builder.build_commit()
33
      builder.build_commit()
34
      branch = builder.get_branch()
35
    """
2466.7.3 by Robert Collins
Create bzrlib.branchbuilder.
36
2466.7.10 by Robert Collins
Add a format parameter to BranchBuilder.
37
    def __init__(self, transport, format=None):
2466.7.5 by Robert Collins
Better docstring for BranchBuilder.__init__.
38
        """Construct a BranchBuilder on transport.
39
        
40
        :param transport: The transport the branch should be created on.
41
            If the path of the transport does not exist but its parent does
42
            it will be created.
2466.7.10 by Robert Collins
Add a format parameter to BranchBuilder.
43
        :param format: The name of a format in the bzrdir format registry
44
            for the branch to be built.
2466.7.5 by Robert Collins
Better docstring for BranchBuilder.__init__.
45
        """
2466.7.4 by Robert Collins
Add BranchBuilder.get_branch().
46
        if not transport.has('.'):
47
            transport.mkdir('.')
2466.7.10 by Robert Collins
Add a format parameter to BranchBuilder.
48
        if format is None:
49
            format = 'default'
2466.7.4 by Robert Collins
Add BranchBuilder.get_branch().
50
        self._branch = bzrdir.BzrDir.create_branch_convenience(transport.base,
2466.7.10 by Robert Collins
Add a format parameter to BranchBuilder.
51
            format=bzrdir.format_registry.make_bzrdir(format))
2466.7.4 by Robert Collins
Add BranchBuilder.get_branch().
52
2466.7.6 by Robert Collins
Add BranchBuilder.build_commit.
53
    def build_commit(self):
54
        """Build a commit on the branch."""
55
        tree = memorytree.MemoryTree.create_on_branch(self._branch)
56
        tree.lock_write()
2466.7.9 by Robert Collins
Return the commited revision id from BranchBuilder.build_commit to save later instrospection.
57
        try:
58
            tree.add('')
59
            return tree.commit('commit %d' % (self._branch.revno() + 1))
60
        finally:
61
            tree.unlock()
2466.7.6 by Robert Collins
Add BranchBuilder.build_commit.
62
2466.7.4 by Robert Collins
Add BranchBuilder.get_branch().
63
    def get_branch(self):
64
        """Return the branch created by the builder."""
65
        return self._branch