/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz
0.8.9 by Szilveszter Farkas (Phanatic)
2006-07-08 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
1
# Copyright (C) 2006 by Szilveszter Farkas (Phanatic) <szilveszter.farkas@gmail.com>
0.8.7 by Szilveszter Farkas (Phanatic)
2006-06-20 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
2
# Some parts of the code are:
3
# Copyright (C) 2005, 2006 by Canonical Ltd
0.8.37 by Szilveszter Farkas (Phanatic)
Implemented Make directory functionality; some cleanups.
4
#
0.8.7 by Szilveszter Farkas (Phanatic)
2006-06-20 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
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.
0.8.37 by Szilveszter Farkas (Phanatic)
Implemented Make directory functionality; some cleanups.
9
#
0.8.7 by Szilveszter Farkas (Phanatic)
2006-06-20 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
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.
0.8.37 by Szilveszter Farkas (Phanatic)
Implemented Make directory functionality; some cleanups.
14
#
0.8.7 by Szilveszter Farkas (Phanatic)
2006-06-20 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
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 bzrlib.errors as errors
20
21
from bzrlib.workingtree import WorkingTree
22
0.8.36 by Szilveszter Farkas (Phanatic)
Implemented pull functionality.
23
from errors import NoLocationKnown, NotBranchError
0.8.7 by Szilveszter Farkas (Phanatic)
2006-06-20 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
24
25
def missing(branch, other_branch=None, reverse=False):
26
    """ Get the number of missing or extra revisions of local branch.
27
    
28
    :param branch: path to local branch
29
    
30
    :param other_branch: location of the other branch
31
    
32
    :param reverse: reverse the order of revisions
33
    
34
    :return: number of missing revisions (if < 0, then extra revisions * -1)
35
    """
36
    import bzrlib
37
    from bzrlib.missing import find_unmerged
38
    
39
    local_branch = bzrlib.branch.Branch.open_containing(branch)[0]
40
    parent = local_branch.get_parent()
41
    if other_branch is None:
42
        other_branch = parent
43
        if other_branch is None:
44
            raise NoLocationKnown
45
    remote_branch = bzrlib.branch.Branch.open(other_branch)
46
    if remote_branch.base == local_branch.base:
47
        remote_branch = local_branch
48
    local_branch.lock_read()
49
50
    ret = 0
51
52
    try:
53
        remote_branch.lock_read()
54
        try:
55
            local_extra, remote_extra = find_unmerged(local_branch, remote_branch)
56
57
            if reverse is False:
58
                local_extra.reverse()
59
                remote_extra.reverse()
60
61
            if local_extra:
62
                ret = len(local_extra) * -1
63
64
            if remote_extra:
65
                ret = len(remote_extra)
66
67
            if not remote_extra and not local_extra:
68
                ret = 0
69
70
        finally:
71
            remote_branch.unlock()
72
    finally:
73
        local_branch.unlock()
74
75
    if not ret and parent is None and other_branch is not None:
76
        local_branch.lock_write()
77
        try:
78
            # handle race conditions - a parent might be set while we run.
79
            if local_branch.get_parent() is None:
80
                local_branch.set_parent(remote_branch.base)
81
        finally:
82
            local_branch.unlock()
83
    
84
    return ret
85
86
87
def pull(branch, location=None, remember=False, overwrite=False, revision=None):
88
    """ Pull revisions from another branch.
89
    
90
    :param branch: the local branch where you want to pull
91
    
92
    :param location: location of branch you'd like to pull from (can be a bundle, too)
93
    
94
    :param remeber: if True, the location will be stored
95
    
96
    :param overwrite: if True, forget local changes, and update the branch to match the remote one
97
    
98
    :param revision: if specified, only the given revision will be pulled (revno)
99
    
100
    :return: number of revisions pulled
101
    """
102
    from bzrlib.branch import Branch
103
    from bzrlib.bundle import read_bundle_from_url
104
    from bzrlib.bundle.apply_bundle import install_bundle
105
    
106
    try:
107
        tree_to = WorkingTree.open_containing(branch)[0]
108
        branch_to = tree_to.branch
109
    except errors.NoWorkingTree:
110
        tree_to = None
0.8.36 by Szilveszter Farkas (Phanatic)
Implemented pull functionality.
111
        try:
112
            branch_to = Branch.open_containing(branch)[0]
113
        except errors.NotBranchError:
114
            raise NotBranchError(location)
115
    except errors.NotBranchError:
116
        raise NotBranchError(location)
0.8.7 by Szilveszter Farkas (Phanatic)
2006-06-20 Szilveszter Farkas <Szilveszter.Farkas@gmail.com>
117
118
    reader = None
119
    if location is not None:
120
        try:
121
            reader = read_bundle_from_url(location)
122
        except errors.NotABundle:
123
            pass # Continue on considering this url a Branch
124
125
    stored_loc = branch_to.get_parent()
126
    if location is None:
127
        if stored_loc is None:
128
            raise NoLocationKnown
129
        else:
130
            location = stored_loc
131
132
    if reader is not None:
133
        install_bundle(branch_to.repository, reader)
134
        branch_from = branch_to
135
    else:
136
        branch_from = Branch.open(location)
137
138
        if branch_to.get_parent() is None or remember:
139
            branch_to.set_parent(branch_from.base)
140
141
    rev_id = None
142
    
143
    if revision is not None:
144
        rev_id = branch_from.get_rev_id(revision)
145
    else:
146
        if reader is not None:
147
            rev_id = reader.info.target
148
        
149
    old_rh = branch_to.revision_history()
150
    if tree_to is not None:
151
        count = tree_to.pull(branch_from, overwrite, rev_id)
152
    else:
153
        count = branch_to.pull(branch_from, overwrite, rev_id)
154
    
155
    return count
156
157
def update(location):
158
    """ Update a tree to have the latest code committed to its branch.
159
    
160
    :param location: the path to the branch/working tree
161
    
162
    :return: None if tree is up to date, 1 if there are conflicts, 0 if updated without having conflicts
163
    """
164
    tree = WorkingTree.open_containing(location)[0]
165
    tree.lock_write()
166
    try:
167
        if tree.last_revision() == tree.branch.last_revision():
168
            # may be up to date, check master too.
169
            master = tree.branch.get_master_branch()
170
            if master is None or master.last_revision == tree.last_revision():
171
                # tree is up to date.
172
                return None
173
        conflicts = tree.update()
174
        if conflicts != 0:
175
            return 1
176
        else:
177
            return 0
178
    finally:
179
        tree.unlock()