/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
3221.19.1 by Ian Clatworthy
refactor cmd_push to use a helper function
1
# Copyright (C) 2008 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
"""UI helper for the push command."""
18
3978.3.2 by Jelmer Vernooij
Move most of push to IterGenericBranchBzrDir.
19
from bzrlib import (builtins, branch, bzrdir, errors, revision as _mod_revision,
3848.1.18 by Aaron Bentley
Update push to use show_branch_change
20
                    transport)
3221.19.1 by Ian Clatworthy
refactor cmd_push to use a helper function
21
from bzrlib.trace import note, warning
22
23
24
def _show_push_branch(br_from, revision_id, location, to_file, verbose=False,
3549.1.1 by Martin Pool
rename push --reference to --stacked-on
25
    overwrite=False, remember=False, stacked_on=None, create_prefix=False,
3221.19.1 by Ian Clatworthy
refactor cmd_push to use a helper function
26
    use_existing_dir=False):
27
    """Push a branch to a location.
28
29
    :param br_from: the source branch
30
    :param revision_id: the revision-id to push up to
31
    :param location: the url of the destination
32
    :param to_file: the output stream
33
    :param verbose: if True, display more output than normal
34
    :param overwrite: if False, a current branch at the destination may not
35
        have diverged from the source, otherwise the push fails
36
    :param remember: if True, store the location as the push location for
37
        the source branch
3549.1.1 by Martin Pool
rename push --reference to --stacked-on
38
    :param stacked_on: the url of the branch, if any, to stack on;
3221.19.1 by Ian Clatworthy
refactor cmd_push to use a helper function
39
        if set, only the revisions not in that branch are pushed
40
    :param create_prefix: if True, create the necessary parent directories
41
        at the destination if they don't already exist
42
    :param use_existing_dir: if True, proceed even if the destination
43
        directory exists without a current .bzr directory in it
44
    """
45
    to_transport = transport.get_transport(location)
46
    br_to = repository_to = dir_to = None
47
    try:
48
        dir_to = bzrdir.BzrDir.open_from_transport(to_transport)
49
    except errors.NotBranchError:
50
        pass # Didn't find anything
51
52
    if dir_to is None:
53
        # The destination doesn't exist; create it.
54
        # XXX: Refactor the create_prefix/no_create_prefix code into a
55
        #      common helper function
56
57
        def make_directory(transport):
58
            transport.mkdir('.')
59
            return transport
60
3878.4.4 by Vincent Ladeuil
Cleanup.
61
        def redirected(transport, e, redirection_notice):
62
            note(redirection_notice)
3878.4.5 by Vincent Ladeuil
Don't use the exception as a parameter for _redirected_to.
63
            return transport._redirected_to(e.source, e.target)
3221.19.1 by Ian Clatworthy
refactor cmd_push to use a helper function
64
65
        try:
66
            to_transport = transport.do_catching_redirections(
67
                make_directory, to_transport, redirected)
68
        except errors.FileExists:
69
            if not use_existing_dir:
70
                raise errors.BzrCommandError("Target directory %s"
71
                     " already exists, but does not have a valid .bzr"
72
                     " directory. Supply --use-existing-dir to push"
73
                     " there anyway." % location)
74
        except errors.NoSuchFile:
75
            if not create_prefix:
76
                raise errors.BzrCommandError("Parent directory of %s"
77
                    " does not exist."
78
                    "\nYou may supply --create-prefix to create all"
79
                    " leading parent directories."
80
                    % location)
81
            builtins._create_prefix(to_transport)
82
        except errors.TooManyRedirections:
83
            raise errors.BzrCommandError("Too many redirections trying "
84
                                         "to make %s." % location)
85
86
        # Now the target directory exists, but doesn't have a .bzr
87
        # directory. So we need to create it, along with any work to create
88
        # all of the dependent branches, etc.
3650.5.1 by Aaron Bentley
Fix push to use clone all the time.
89
        dir_to = br_from.bzrdir.clone_on_transport(to_transport,
90
            revision_id=revision_id, stacked_on=stacked_on)
3221.19.1 by Ian Clatworthy
refactor cmd_push to use a helper function
91
        br_to = dir_to.open_branch()
3978.3.3 by Jelmer Vernooij
Use PushResult everywhere.
92
        push_result = branch.PushResult()
93
        push_result.old_revno = None
94
        push_result.old_revid = None
95
        push_result.source_branch = br_from
96
        push_result.target_branch = br_to
3221.19.1 by Ian Clatworthy
refactor cmd_push to use a helper function
97
        # TODO: Some more useful message about what was copied
3650.5.2 by Aaron Bentley
Always show stacked message if stacking done.
98
        try:
3978.3.3 by Jelmer Vernooij
Use PushResult everywhere.
99
            push_result.stacked_on = br_to.get_stacked_on_url()
3650.5.2 by Aaron Bentley
Always show stacked message if stacking done.
100
        except (errors.UnstackableBranchFormat,
101
                errors.UnstackableRepositoryFormat,
102
                errors.NotStacked):
3978.3.3 by Jelmer Vernooij
Use PushResult everywhere.
103
            push_result.stacked_on = None
104
        (push_result.new_revno, push_result.new_revid) = \
105
            br_to.last_revision_info()
3978.3.4 by Jelmer Vernooij
Fix remaining tests; set push location of source branch, not target branch.
106
        if br_from.get_push_location() is None or remember:
107
            br_from.set_push_location(br_from.base)
3978.3.2 by Jelmer Vernooij
Move most of push to IterGenericBranchBzrDir.
108
    else:
3549.1.1 by Martin Pool
rename push --reference to --stacked-on
109
        if stacked_on is not None:
3221.19.4 by Ian Clatworthy
shallow -> stacked
110
            warning("Ignoring request for a stacked branch as repository "
3221.19.2 by Ian Clatworthy
tweaks to ui during review by igc
111
                    "already exists at the destination location.")
3978.3.2 by Jelmer Vernooij
Move most of push to IterGenericBranchBzrDir.
112
        inter = branch.InterBranchBzrDir.get(br_from, dir_to)
3221.19.1 by Ian Clatworthy
refactor cmd_push to use a helper function
113
        try:
3978.3.2 by Jelmer Vernooij
Move most of push to IterGenericBranchBzrDir.
114
            push_result = inter.push(revision_id=revision_id, 
3978.3.3 by Jelmer Vernooij
Use PushResult everywhere.
115
                overwrite=overwrite, remember=remember)
3978.3.2 by Jelmer Vernooij
Move most of push to IterGenericBranchBzrDir.
116
        except errors.NoRepositoryPresent:
117
            # we have a bzrdir but no branch or repository
118
            # XXX: Figure out what to do other than complain.
119
            raise errors.BzrCommandError("At %s you have a valid .bzr control"
120
                " directory, but not a branch or repository. This is an"
121
                " unsupported configuration. Please move the target directory"
122
                " out of the way and try again."
123
                % location)
3221.19.1 by Ian Clatworthy
refactor cmd_push to use a helper function
124
        except errors.DivergedBranches:
125
            raise errors.BzrCommandError('These branches have diverged.'
126
                                    '  Try using "merge" and then "push".')
3978.3.2 by Jelmer Vernooij
Move most of push to IterGenericBranchBzrDir.
127
        if not push_result.workingtree_updated:
128
            warning("This transport does not update the working " 
129
                    "tree of: %s. See 'bzr help working-trees' for "
130
                    "more information." % push_result.target_branch.base)
131
132
3978.3.3 by Jelmer Vernooij
Use PushResult everywhere.
133
    push_result.report(to_file)
134
    old_revid = push_result.old_revid
135
    old_revno = push_result.old_revno
136
    br_to = push_result.target_branch
3848.1.19 by Aaron Bentley
Show log for non-initial push -v
137
    if verbose:
3848.1.18 by Aaron Bentley
Update push to use show_branch_change
138
        br_to.lock_read()
139
        try:
140
            from bzrlib.log import show_branch_change
3848.1.19 by Aaron Bentley
Show log for non-initial push -v
141
            show_branch_change(br_to, to_file, old_revno, old_revid)
3848.1.18 by Aaron Bentley
Update push to use show_branch_change
142
        finally:
143
            br_to.unlock()