/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/send.py

  • Committer: Robert Collins
  • Date: 2010-07-04 06:22:11 UTC
  • mto: This revision was merged to the branch mainline in revision 5332.
  • Revision ID: robertc@robertcollins.net-20100704062211-tk9hw6bnsn5x47fm
``bzrlib.lsprof.profile`` will no longer silently generate bad threaded
profiles when concurrent profile requests are made. Instead the profile
requests will be serialised. Reentrant requests will now deadlock.
(Robert Collins)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2009, 2010 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
16
 
 
17
 
 
18
import os
 
19
import time
 
20
 
 
21
from bzrlib import (
 
22
    bzrdir,
 
23
    errors,
 
24
    osutils,
 
25
    registry,
 
26
    trace,
 
27
    )
 
28
from bzrlib.branch import (
 
29
    Branch,
 
30
    )
 
31
from bzrlib.revision import (
 
32
    NULL_REVISION,
 
33
    )
 
34
 
 
35
 
 
36
format_registry = registry.Registry()
 
37
 
 
38
 
 
39
def send(submit_branch, revision, public_branch, remember, format,
 
40
         no_bundle, no_patch, output, from_, mail_to, message, body,
 
41
         to_file, strict=None):
 
42
    tree, branch = bzrdir.BzrDir.open_containing_tree_or_branch(from_)[:2]
 
43
    # we may need to write data into branch's repository to calculate
 
44
    # the data to send.
 
45
    branch.lock_write()
 
46
    try:
 
47
        if output is None:
 
48
            config = branch.get_config()
 
49
            if mail_to is None:
 
50
                mail_to = config.get_user_option('submit_to')
 
51
            mail_client = config.get_mail_client()
 
52
            if (not getattr(mail_client, 'supports_body', False)
 
53
                and body is not None):
 
54
                raise errors.BzrCommandError(
 
55
                    'Mail client "%s" does not support specifying body' %
 
56
                    mail_client.__class__.__name__)
 
57
        if remember and submit_branch is None:
 
58
            raise errors.BzrCommandError(
 
59
                '--remember requires a branch to be specified.')
 
60
        stored_submit_branch = branch.get_submit_branch()
 
61
        remembered_submit_branch = None
 
62
        if submit_branch is None:
 
63
            submit_branch = stored_submit_branch
 
64
            remembered_submit_branch = "submit"
 
65
        else:
 
66
            if stored_submit_branch is None or remember:
 
67
                branch.set_submit_branch(submit_branch)
 
68
        if submit_branch is None:
 
69
            submit_branch = branch.get_parent()
 
70
            remembered_submit_branch = "parent"
 
71
        if submit_branch is None:
 
72
            raise errors.BzrCommandError('No submit branch known or'
 
73
                                         ' specified')
 
74
        if remembered_submit_branch is not None:
 
75
            trace.note('Using saved %s location "%s" to determine what '
 
76
                       'changes to submit.', remembered_submit_branch,
 
77
                       submit_branch)
 
78
 
 
79
        if mail_to is None or format is None:
 
80
            # TODO: jam 20090716 we open the submit_branch here, but we *don't*
 
81
            #       pass it down into the format creation, so it will have to
 
82
            #       open it again
 
83
            submit_br = Branch.open(submit_branch)
 
84
            submit_config = submit_br.get_config()
 
85
            if mail_to is None:
 
86
                mail_to = submit_config.get_user_option("child_submit_to")
 
87
            if format is None:
 
88
                formatname = submit_br.get_child_submit_format()
 
89
                try:
 
90
                    format = format_registry.get(formatname)
 
91
                except KeyError:
 
92
                    raise errors.BzrCommandError("No such send format '%s'." % 
 
93
                                                 formatname)
 
94
 
 
95
        stored_public_branch = branch.get_public_branch()
 
96
        if public_branch is None:
 
97
            public_branch = stored_public_branch
 
98
        elif stored_public_branch is None or remember:
 
99
            branch.set_public_branch(public_branch)
 
100
        if no_bundle and public_branch is None:
 
101
            raise errors.BzrCommandError('No public branch specified or'
 
102
                                         ' known')
 
103
        base_revision_id = None
 
104
        revision_id = None
 
105
        if revision is not None:
 
106
            if len(revision) > 2:
 
107
                raise errors.BzrCommandError('bzr send takes '
 
108
                    'at most two one revision identifiers')
 
109
            revision_id = revision[-1].as_revision_id(branch)
 
110
            if len(revision) == 2:
 
111
                base_revision_id = revision[0].as_revision_id(branch)
 
112
        if revision_id is None:
 
113
            if tree is not None:
 
114
                tree.check_changed_or_out_of_date(
 
115
                    strict, 'send_strict',
 
116
                    more_error='Use --no-strict to force the send.',
 
117
                    more_warning='Uncommitted changes will not be sent.')
 
118
            revision_id = branch.last_revision()
 
119
        if revision_id == NULL_REVISION:
 
120
            raise errors.BzrCommandError('No revisions to submit.')
 
121
        if format is None:
 
122
            format = format_registry.get()
 
123
        directive = format(branch, revision_id, submit_branch,
 
124
            public_branch, no_patch, no_bundle, message, base_revision_id)
 
125
        if output is None:
 
126
            directive.compose_merge_request(mail_client, mail_to, body,
 
127
                                            branch, tree)
 
128
        else:
 
129
            if directive.multiple_output_files:
 
130
                if output == '-':
 
131
                    raise errors.BzrCommandError('- not supported for '
 
132
                        'merge directives that use more than one output file.')
 
133
                if not os.path.exists(output):
 
134
                    os.mkdir(output, 0755)
 
135
                for (filename, lines) in directive.to_files():
 
136
                    path = os.path.join(output, filename)
 
137
                    outfile = open(path, 'wb')
 
138
                    try:
 
139
                        outfile.writelines(lines)
 
140
                    finally:
 
141
                        outfile.close()
 
142
            else:
 
143
                if output == '-':
 
144
                    outfile = to_file
 
145
                else:
 
146
                    outfile = open(output, 'wb')
 
147
                try:
 
148
                    outfile.writelines(directive.to_lines())
 
149
                finally:
 
150
                    if outfile is not to_file:
 
151
                        outfile.close()
 
152
    finally:
 
153
        branch.unlock()
 
154
 
 
155
 
 
156
def _send_4(branch, revision_id, submit_branch, public_branch,
 
157
            no_patch, no_bundle, message, base_revision_id):
 
158
    from bzrlib import merge_directive
 
159
    return merge_directive.MergeDirective2.from_objects(
 
160
        branch.repository, revision_id, time.time(),
 
161
        osutils.local_time_offset(), submit_branch,
 
162
        public_branch=public_branch, include_patch=not no_patch,
 
163
        include_bundle=not no_bundle, message=message,
 
164
        base_revision_id=base_revision_id)
 
165
 
 
166
 
 
167
def _send_0_9(branch, revision_id, submit_branch, public_branch,
 
168
              no_patch, no_bundle, message, base_revision_id):
 
169
    if not no_bundle:
 
170
        if not no_patch:
 
171
            patch_type = 'bundle'
 
172
        else:
 
173
            raise errors.BzrCommandError('Format 0.9 does not'
 
174
                ' permit bundle with no patch')
 
175
    else:
 
176
        if not no_patch:
 
177
            patch_type = 'diff'
 
178
        else:
 
179
            patch_type = None
 
180
    from bzrlib import merge_directive
 
181
    return merge_directive.MergeDirective.from_objects(
 
182
        branch.repository, revision_id, time.time(),
 
183
        osutils.local_time_offset(), submit_branch,
 
184
        public_branch=public_branch, patch_type=patch_type,
 
185
        message=message)
 
186
 
 
187
 
 
188
format_registry.register('4', 
 
189
    _send_4, 'Bundle format 4, Merge Directive 2 (default)')
 
190
format_registry.register('0.9',
 
191
    _send_0_9, 'Bundle format 0.9, Merge Directive 1')
 
192
format_registry.default_key = '4'