/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/push.py

  • Committer: John Arbash Meinel
  • Date: 2009-04-21 23:54:16 UTC
  • mto: (4300.1.7 groupcompress_info)
  • mto: This revision was merged to the branch mainline in revision 4301.
  • Revision ID: john@arbash-meinel.com-20090421235416-f0cz6ilf5cufbugi
Fix bug #364900, properly remove the 64kB that was just encoded in the copy.
Also, stop supporting None as a copy length in 'encode_copy_instruction'.
It was only used by the test suite, and it is good to pull that sort of thing out of
production code. (Besides, setting the copy to 64kB has the same effect.)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2008, 2009, 2010 Canonical Ltd
 
1
# Copyright (C) 2008 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
17
17
"""UI helper for the push command."""
18
18
 
19
19
from bzrlib import (
 
20
    builtins,
 
21
    branch,
20
22
    bzrdir,
21
23
    errors,
22
24
    revision as _mod_revision,
77
79
        directory exists without a current .bzr directory in it
78
80
    """
79
81
    to_transport = transport.get_transport(location)
 
82
    br_to = repository_to = dir_to = None
80
83
    try:
81
84
        dir_to = bzrdir.BzrDir.open_from_transport(to_transport)
82
85
    except errors.NotBranchError:
83
 
        # Didn't find anything
84
 
        dir_to = None
 
86
        pass # Didn't find anything
85
87
 
 
88
    push_result = PushResult()
86
89
    if dir_to is None:
 
90
        # The destination doesn't exist; create it.
 
91
        # XXX: Refactor the create_prefix/no_create_prefix code into a
 
92
        #      common helper function
 
93
 
 
94
        def make_directory(transport):
 
95
            transport.mkdir('.')
 
96
            return transport
 
97
 
 
98
        def redirected(transport, e, redirection_notice):
 
99
            note(redirection_notice)
 
100
            return transport._redirected_to(e.source, e.target)
 
101
 
87
102
        try:
88
 
            br_to = br_from.create_clone_on_transport(to_transport,
89
 
                revision_id=revision_id, stacked_on=stacked_on,
90
 
                create_prefix=create_prefix, use_existing_dir=use_existing_dir)
91
 
        except errors.FileExists, err:
92
 
            if err.path.endswith('/.bzr'):
93
 
                raise errors.BzrCommandError(
94
 
                    "Target directory %s already contains a .bzr directory, "
95
 
                    "but it is not valid." % (location,))
 
103
            to_transport = transport.do_catching_redirections(
 
104
                make_directory, to_transport, redirected)
 
105
        except errors.FileExists:
96
106
            if not use_existing_dir:
97
107
                raise errors.BzrCommandError("Target directory %s"
98
 
                     " already exists, but does not have a .bzr"
 
108
                     " already exists, but does not have a valid .bzr"
99
109
                     " directory. Supply --use-existing-dir to push"
100
110
                     " there anyway." % location)
101
 
            # This shouldn't occur, but if it does the FileExists error will be
102
 
            # more informative than an UnboundLocalError for br_to.
103
 
            raise
104
111
        except errors.NoSuchFile:
105
112
            if not create_prefix:
106
113
                raise errors.BzrCommandError("Parent directory of %s"
108
115
                    "\nYou may supply --create-prefix to create all"
109
116
                    " leading parent directories."
110
117
                    % location)
111
 
            # This shouldn't occur (because create_prefix is true, so
112
 
            # create_clone_on_transport should be catching NoSuchFile and
113
 
            # creating the missing directories) but if it does the original
114
 
            # NoSuchFile error will be more informative than an
115
 
            # UnboundLocalError for br_to.
116
 
            raise
 
118
            builtins._create_prefix(to_transport)
117
119
        except errors.TooManyRedirections:
118
120
            raise errors.BzrCommandError("Too many redirections trying "
119
121
                                         "to make %s." % location)
120
 
        push_result = PushResult()
 
122
 
 
123
        # Now the target directory exists, but doesn't have a .bzr
 
124
        # directory. So we need to create it, along with any work to create
 
125
        # all of the dependent branches, etc.
 
126
        br_to = br_from.create_clone_on_transport(to_transport,
 
127
            revision_id=revision_id, stacked_on=stacked_on)
121
128
        # TODO: Some more useful message about what was copied
122
129
        try:
123
130
            push_result.stacked_on = br_to.get_stacked_on_url()
136
143
                    "already exists at the destination location.")
137
144
        try:
138
145
            push_result = dir_to.push_branch(br_from, revision_id, overwrite, 
139
 
                remember, create_prefix)
 
146
                remember)
140
147
        except errors.DivergedBranches:
141
148
            raise errors.BzrCommandError('These branches have diverged.'
142
 
                                    '  See "bzr help diverged-branches"'
143
 
                                    ' for more information.')
144
 
        except errors.NoRoundtrippingSupport, e:
145
 
            raise errors.BzrCommandError("It is not possible to losslessly "
146
 
                "push to %s. You may want to use dpush instead." % 
147
 
                    e.target_branch.mapping.vcs.abbreviation)
 
149
                                    '  Try using "merge" and then "push".')
148
150
        except errors.NoRepositoryPresent:
149
151
            # we have a bzrdir but no branch or repository
150
152
            # XXX: Figure out what to do other than complain.