~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/push.py

  • Committer: Vincent Ladeuil
  • Date: 2012-01-18 14:09:19 UTC
  • mto: This revision was merged to the branch mainline in revision 6468.
  • Revision ID: v.ladeuil+lp@free.fr-20120118140919-rlvdrhpc0nq1lbwi
Change set/remove to require a lock for the branch config files.

This means that tests (or any plugin for that matter) do not requires an
explicit lock on the branch anymore to change a single option. This also
means the optimisation becomes "opt-in" and as such won't be as
spectacular as it may be and/or harder to get right (nothing fails
anymore).

This reduces the diff by ~300 lines.

Code/tests that were updating more than one config option is still taking
a lock to at least avoid some IOs and demonstrate the benefits through
the decreased number of hpss calls.

The duplication between BranchStack and BranchOnlyStack will be removed
once the same sharing is in place for local config files, at which point
the Stack class itself may be able to host the changes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2008, 2009, 2010 Canonical Ltd
 
1
# Copyright (C) 2008-2012 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
16
16
 
17
17
"""UI helper for the push command."""
18
18
 
 
19
from __future__ import absolute_import
 
20
 
19
21
from bzrlib import (
20
 
    bzrdir,
 
22
    controldir,
21
23
    errors,
22
24
    revision as _mod_revision,
23
25
    transport,
26
28
    note,
27
29
    warning,
28
30
    )
 
31
from bzrlib.i18n import gettext
29
32
 
30
33
 
31
34
class PushResult(object):
47
50
        """Write a human-readable description of the result."""
48
51
        if self.branch_push_result is None:
49
52
            if self.stacked_on is not None:
50
 
                note('Created new stacked branch referring to %s.' %
 
53
                note(gettext('Created new stacked branch referring to %s.') %
51
54
                    self.stacked_on)
52
55
            else:
53
 
                note('Created new branch.')
 
56
                note(gettext('Created new branch.'))
54
57
        else:
55
58
            self.branch_push_result.report(to_file)
56
59
 
57
60
 
58
61
def _show_push_branch(br_from, revision_id, location, to_file, verbose=False,
59
62
    overwrite=False, remember=False, stacked_on=None, create_prefix=False,
60
 
    use_existing_dir=False):
 
63
    use_existing_dir=False, no_tree=False):
61
64
    """Push a branch to a location.
62
65
 
63
66
    :param br_from: the source branch
78
81
    """
79
82
    to_transport = transport.get_transport(location)
80
83
    try:
81
 
        dir_to = bzrdir.BzrDir.open_from_transport(to_transport)
 
84
        dir_to = controldir.ControlDir.open_from_transport(to_transport)
82
85
    except errors.NotBranchError:
83
86
        # Didn't find anything
84
87
        dir_to = None
87
90
        try:
88
91
            br_to = br_from.create_clone_on_transport(to_transport,
89
92
                revision_id=revision_id, stacked_on=stacked_on,
90
 
                create_prefix=create_prefix, use_existing_dir=use_existing_dir)
 
93
                create_prefix=create_prefix, use_existing_dir=use_existing_dir,
 
94
                no_tree=no_tree)
91
95
        except errors.FileExists, err:
92
96
            if err.path.endswith('/.bzr'):
93
 
                raise errors.BzrCommandError(
 
97
                raise errors.BzrCommandError(gettext(
94
98
                    "Target directory %s already contains a .bzr directory, "
95
 
                    "but it is not valid." % (location,))
 
99
                    "but it is not valid.") % (location,))
96
100
            if not use_existing_dir:
97
 
                raise errors.BzrCommandError("Target directory %s"
 
101
                raise errors.BzrCommandError(gettext("Target directory %s"
98
102
                     " already exists, but does not have a .bzr"
99
103
                     " directory. Supply --use-existing-dir to push"
100
 
                     " there anyway." % location)
 
104
                     " there anyway.") % location)
101
105
            # This shouldn't occur, but if it does the FileExists error will be
102
106
            # more informative than an UnboundLocalError for br_to.
103
107
            raise
104
108
        except errors.NoSuchFile:
105
109
            if not create_prefix:
106
 
                raise errors.BzrCommandError("Parent directory of %s"
 
110
                raise errors.BzrCommandError(gettext("Parent directory of %s"
107
111
                    " does not exist."
108
112
                    "\nYou may supply --create-prefix to create all"
109
 
                    " leading parent directories."
 
113
                    " leading parent directories.")
110
114
                    % location)
111
115
            # This shouldn't occur (because create_prefix is true, so
112
116
            # create_clone_on_transport should be catching NoSuchFile and
115
119
            # UnboundLocalError for br_to.
116
120
            raise
117
121
        except errors.TooManyRedirections:
118
 
            raise errors.BzrCommandError("Too many redirections trying "
119
 
                                         "to make %s." % location)
 
122
            raise errors.BzrCommandError(gettext("Too many redirections trying "
 
123
                                         "to make %s.") % location)
120
124
        push_result = PushResult()
121
125
        # TODO: Some more useful message about what was copied
122
126
        try:
128
132
        push_result.target_branch = br_to
129
133
        push_result.old_revid = _mod_revision.NULL_REVISION
130
134
        push_result.old_revno = 0
131
 
        if br_from.get_push_location() is None or remember:
 
135
        # Remembers if asked explicitly or no previous location is set
 
136
        if (remember
 
137
            or (remember is None and br_from.get_push_location() is None)):
 
138
            # FIXME: Should be done only if we succeed ? -- vila 2012-01-18
132
139
            br_from.set_push_location(br_to.base)
133
140
    else:
134
141
        if stacked_on is not None:
138
145
            push_result = dir_to.push_branch(br_from, revision_id, overwrite, 
139
146
                remember, create_prefix)
140
147
        except errors.DivergedBranches:
141
 
            raise errors.BzrCommandError('These branches have diverged.'
 
148
            raise errors.BzrCommandError(gettext('These branches have diverged.'
142
149
                                    '  See "bzr help diverged-branches"'
143
 
                                    ' for more information.')
 
150
                                    ' for more information.'))
144
151
        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." % 
 
152
            raise errors.BzrCommandError(gettext("It is not possible to losslessly "
 
153
                "push to %s. You may want to use dpush instead.") % 
147
154
                    e.target_branch.mapping.vcs.abbreviation)
148
155
        except errors.NoRepositoryPresent:
149
 
            # we have a bzrdir but no branch or repository
 
156
            # we have a controldir but no branch or repository
150
157
            # XXX: Figure out what to do other than complain.
151
 
            raise errors.BzrCommandError("At %s you have a valid .bzr"
 
158
            raise errors.BzrCommandError(gettext("At %s you have a valid .bzr"
152
159
                " control directory, but not a branch or repository. This"
153
160
                " is an unsupported configuration. Please move the target"
154
 
                " directory out of the way and try again." % location)
 
161
                " directory out of the way and try again.") % location)
155
162
        if push_result.workingtree_updated == False:
156
163
            warning("This transport does not update the working " 
157
164
                    "tree of: %s. See 'bzr help working-trees' for "