~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/branchbuilder.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2007-04-17 00:59:30 UTC
  • mfrom: (1551.15.4 Aaron's mergeable stuff)
  • Revision ID: pqm@pqm.ubuntu.com-20070417005930-rofskshyjsfzrahh
Fix ftp transport with servers that don't support atomic rename

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
 
 
19
 
from bzrlib import bzrdir, errors, memorytree
20
 
 
21
 
 
22
 
class BranchBuilder(object):
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
 
    """
36
 
 
37
 
    def __init__(self, transport, format=None):
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.
43
 
        :param format: The name of a format in the bzrdir format registry
44
 
            for the branch to be built.
45
 
        """
46
 
        if not transport.has('.'):
47
 
            transport.mkdir('.')
48
 
        if format is None:
49
 
            format = 'default'
50
 
        self._branch = bzrdir.BzrDir.create_branch_convenience(transport.base,
51
 
            format=bzrdir.format_registry.make_bzrdir(format))
52
 
 
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()
57
 
        try:
58
 
            tree.add('')
59
 
            return tree.commit('commit %d' % (self._branch.revno() + 1))
60
 
        finally:
61
 
            tree.unlock()
62
 
 
63
 
    def get_branch(self):
64
 
        """Return the branch created by the builder."""
65
 
        return self._branch