/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz
0.8.2 by Szilveszter Farkas (Phanatic)
* backend/commit.py: commit() implemented
1
# Copyright (C) 2006 by Szilveszter Farkas (Phanatic)
2
# Some parts of the code are:
3
# Copyright (C) 2005, 2006 by Canonical Ltd
4
5
# This program is free software; you can redistribute it and/or modify
6
# it under the terms of the GNU General Public License as published by
7
# the Free Software Foundation; either version 2 of the License, or
8
# (at your option) any later version.
9
10
# This program is distributed in the hope that it will be useful,
11
# but WITHOUT ANY WARRANTY; without even the implied warranty of
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
# GNU General Public License for more details.
14
15
# You should have received a copy of the GNU General Public License
16
# along with this program; if not, write to the Free Software
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
19
import codecs
20
21
import bzrlib
22
import bzrlib.errors as errors
23
24
from errors import (EmptyMessageError, NoMessageNoFileError,
25
                    NoChangesToCommitError, ConflictsInTreeError,
26
                    StrictCommitError, BoundBranchOutOfDate,
0.8.3 by Szilveszter Farkas (Phanatic)
* backend/init.py: checkout() implemented - not tested yet
27
                    LocalRequiresBoundBranch, NotBranchError, NonExistingParent,
28
                    PathPrefixNotCreated, NoPushLocationKnown,
29
                    DivergedBranchesError)
0.8.2 by Szilveszter Farkas (Phanatic)
* backend/commit.py: commit() implemented
30
31
def commit(selected_list, message=None, file=None, unchanged=False,
32
           strict=False, local=False):
33
    """ Command to commit changes into the branch.
34
    
35
    :param selected_list: list of files you want to commit (at least the top working directory has to specified)
36
    
37
    :param message: commit message
38
    
39
    :param file: the file which contains the commit message
40
    
41
    :param unchanged: force commit if nothing has changed since the last commit
42
    
43
    :param strict: refuse to commit if there are unknown files in the working tree
44
    
45
    :param local: perform a local only commit in a bound branch
46
    """
47
    from bzrlib.builtins import tree_files
48
    from bzrlib.commit import NullCommitReporter
49
50
    try:
51
        tree, selected_list = tree_files(selected_list)
52
    except errors.NotBranchError:
53
        raise NotBranchError
54
    
55
    if local and not tree.branch.get_bound_location():
56
        raise LocalRequiresBoundBranch()
57
    if message is None and not file:
58
        if message is None:
59
            raise NoMessageNoFileError
60
    elif message and file:
61
        raise NoMessageNoFileError
62
63
    if file:
64
        message = codecs.open(file, 'rt', bzrlib.user_encoding).read()
65
66
    if message == "":
67
        raise EmptyMessageError
68
69
    reporter = NullCommitReporter()
70
71
    try:
72
        tree.commit(message, specific_files=selected_list,
73
                    allow_pointless=unchanged, strict=strict, local=local,
74
                    reporter=reporter)
75
    except errors.PointlessCommit:
76
        raise NoChangesToCommitError
77
    except errors.ConflictsInTree:
78
        raise ConflictsInTreeError
79
    except errors.StrictCommitFailed:
80
        raise StrictCommitError
81
    except errors.BoundBranchOutOfDate, e:
82
        raise BoundBranchOutOfDate(str(e))
83
0.8.3 by Szilveszter Farkas (Phanatic)
* backend/init.py: checkout() implemented - not tested yet
84
# FIXME - not tested yet
85
def push(branch, location=None, remember=False, overwrite=False,
86
         create_prefix=False):
87
    """ Update a mirror of a branch.
88
    
89
    :param branch: the source branch
90
    
91
    :param location: the location of the branch that you'd like to update
92
    
93
    :param remember: if set, the location will be stored
94
    
95
    :param overwrite: overwrite target location if it diverged
96
    
97
    :param create_prefix: create the path leading up to the branch if it doesn't exist
98
    
99
    :return: number of revisions pushed
100
    """
101
    from bzrlib.branch import Branch
102
    from bzrlib.transport import get_transport
103
        
104
    br_from = Branch.open_containing(branch)[0]
105
    stored_loc = br_from.get_push_location()
106
    if location is None:
107
        if stored_loc is None:
108
            raise NoPushLocationKnown
109
        else:
110
            location = stored_loc
111
112
    transport = get_transport(location)
113
    location_url = transport.base
114
115
    if br_from.get_push_location() is None or remember:
116
        br_from.set_push_location(location_url)
117
118
    old_rh = []
119
120
    try:
121
        dir_to = bzrlib.bzrdir.BzrDir.open(location_url)
122
        br_to = dir_to.open_branch()
123
    except NotBranchError:
124
        # create a branch.
125
        transport = transport.clone('..')
126
        if not create_prefix:
127
            try:
128
                relurl = transport.relpath(location_url)
129
                transport.mkdir(relurl)
130
            except errors.NoSuchFile:
131
                raise NonExistingParent(location)
132
        else:
133
            current = transport.base
134
            needed = [(transport, transport.relpath(location_url))]
135
            while needed:
136
                try:
137
                    transport, relpath = needed[-1]
138
                    transport.mkdir(relpath)
139
                    needed.pop()
140
                except errors.NoSuchFile:
141
                    new_transport = transport.clone('..')
142
                    needed.append((new_transport,
143
                                   new_transport.relpath(transport.base)))
144
                    if new_transport.base == transport.base:
145
                        raise PathPrefixNotCreated
146
        dir_to = br_from.bzrdir.clone(location_url,
147
            revision_id=br_from.last_revision())
148
        br_to = dir_to.open_branch()
149
        count = len(br_to.revision_history())
150
    else:
151
        old_rh = br_to.revision_history()
152
        try:
153
            try:
154
                tree_to = dir_to.open_workingtree()
155
            except errors.NotLocalUrl:
156
                # FIXME - what to do here? how should we warn the user?
157
                #warning('This transport does not update the working '
158
                #        'tree of: %s' % (br_to.base,))
159
                count = br_to.pull(br_from, overwrite)
160
            except errors.NoWorkingTree:
161
                count = br_to.pull(br_from, overwrite)
162
            else:
163
                count = tree_to.pull(br_from, overwrite)
164
        except errors.DivergedBranches:
165
            raise DivergedBranchesError
166
    
167
    return count