5017.2.4
by Martin Pool
Move or remove some unconditionally loaded code |
1 |
# Copyright (C) 2009, 2010 Canonical Ltd
|
4367.1.2
by Jelmer Vernooij
Move send command to a separate file, move send format registry out of cmd_send. |
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 |
||
6379.6.3
by Jelmer Vernooij
Use absolute_import. |
17 |
from __future__ import absolute_import |
4367.1.2
by Jelmer Vernooij
Move send command to a separate file, move send format registry out of cmd_send. |
18 |
|
5086.3.3
by Jelmer Vernooij
Allow merge directives to output multiple patch files. |
19 |
import os |
4367.1.2
by Jelmer Vernooij
Move send command to a separate file, move send format registry out of cmd_send. |
20 |
import time |
21 |
||
22 |
from bzrlib import ( |
|
6207.3.3
by jelmer at samba
Fix tests and the like. |
23 |
controldir, |
4367.1.2
by Jelmer Vernooij
Move send command to a separate file, move send format registry out of cmd_send. |
24 |
errors, |
25 |
osutils, |
|
26 |
registry, |
|
27 |
trace, |
|
28 |
)
|
|
6138.3.5
by Jonathan Riddell
make the test suite pass |
29 |
from bzrlib.i18n import gettext |
4367.1.3
by Jelmer Vernooij
Move cmd_{send,bundle_revisions} back to bzrlib.builtins per Ians request. |
30 |
from bzrlib.branch import ( |
31 |
Branch, |
|
32 |
)
|
|
33 |
from bzrlib.revision import ( |
|
34 |
NULL_REVISION, |
|
35 |
)
|
|
4367.1.2
by Jelmer Vernooij
Move send command to a separate file, move send format registry out of cmd_send. |
36 |
|
37 |
||
38 |
format_registry = registry.Registry() |
|
39 |
||
40 |
||
6365.1.3
by Jelmer Vernooij
Pass local target branch along to merge directive handlers. |
41 |
def send(target_branch, revision, public_branch, remember, |
42 |
format, no_bundle, no_patch, output, from_, mail_to, message, body, |
|
4464.3.4
by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send. |
43 |
to_file, strict=None): |
6207.3.3
by jelmer at samba
Fix tests and the like. |
44 |
tree, branch = controldir.ControlDir.open_containing_tree_or_branch( |
45 |
from_)[:2] |
|
6365.1.3
by Jelmer Vernooij
Pass local target branch along to merge directive handlers. |
46 |
possible_transports = [tree.bzrdir.transport, branch.bzrdir.transport] |
4367.1.3
by Jelmer Vernooij
Move cmd_{send,bundle_revisions} back to bzrlib.builtins per Ians request. |
47 |
# we may need to write data into branch's repository to calculate
|
48 |
# the data to send.
|
|
49 |
branch.lock_write() |
|
50 |
try: |
|
51 |
if output is None: |
|
52 |
config = branch.get_config() |
|
53 |
if mail_to is None: |
|
54 |
mail_to = config.get_user_option('submit_to') |
|
55 |
mail_client = config.get_mail_client() |
|
56 |
if (not getattr(mail_client, 'supports_body', False) |
|
57 |
and body is not None): |
|
6138.3.7
by Jonathan Riddell
add gettext() to BzrCommandError uses |
58 |
raise errors.BzrCommandError(gettext( |
59 |
'Mail client "%s" does not support specifying body') % |
|
4367.1.3
by Jelmer Vernooij
Move cmd_{send,bundle_revisions} back to bzrlib.builtins per Ians request. |
60 |
mail_client.__class__.__name__) |
6365.1.3
by Jelmer Vernooij
Pass local target branch along to merge directive handlers. |
61 |
if remember and target_branch is None: |
6138.3.7
by Jonathan Riddell
add gettext() to BzrCommandError uses |
62 |
raise errors.BzrCommandError(gettext( |
63 |
'--remember requires a branch to be specified.')) |
|
6365.1.3
by Jelmer Vernooij
Pass local target branch along to merge directive handlers. |
64 |
stored_target_branch = branch.get_submit_branch() |
65 |
remembered_target_branch = None |
|
66 |
if target_branch is None: |
|
67 |
target_branch = stored_target_branch |
|
68 |
remembered_target_branch = "submit" |
|
4367.1.3
by Jelmer Vernooij
Move cmd_{send,bundle_revisions} back to bzrlib.builtins per Ians request. |
69 |
else: |
5861.1.4
by Vincent Ladeuil
Fix send --no-remember when no location is set. |
70 |
# Remembers if asked explicitly or no previous location is set
|
6365.1.3
by Jelmer Vernooij
Pass local target branch along to merge directive handlers. |
71 |
if remember or ( |
72 |
remember is None and stored_target_branch is None): |
|
73 |
branch.set_submit_branch(target_branch) |
|
74 |
if target_branch is None: |
|
75 |
target_branch = branch.get_parent() |
|
76 |
remembered_target_branch = "parent" |
|
77 |
if target_branch is None: |
|
6138.3.7
by Jonathan Riddell
add gettext() to BzrCommandError uses |
78 |
raise errors.BzrCommandError(gettext('No submit branch known or' |
79 |
' specified')) |
|
6365.1.3
by Jelmer Vernooij
Pass local target branch along to merge directive handlers. |
80 |
if remembered_target_branch is not None: |
6147.1.1
by Jonathan Riddell
use .format() instead of % for string formatting where there are multiple formats in one string to allow for translations |
81 |
trace.note(gettext('Using saved {0} location "{1}" to determine ' |
82 |
'what changes to submit.').format( |
|
6365.1.3
by Jelmer Vernooij
Pass local target branch along to merge directive handlers. |
83 |
remembered_target_branch, |
84 |
target_branch)) |
|
4367.1.3
by Jelmer Vernooij
Move cmd_{send,bundle_revisions} back to bzrlib.builtins per Ians request. |
85 |
|
6365.1.3
by Jelmer Vernooij
Pass local target branch along to merge directive handlers. |
86 |
submit_branch = Branch.open(target_branch, |
87 |
possible_transports=possible_transports) |
|
88 |
possible_transports.append(submit_branch.bzrdir.root_transport) |
|
4367.1.5
by Jelmer Vernooij
merge bzr.dev. |
89 |
if mail_to is None or format is None: |
6365.1.3
by Jelmer Vernooij
Pass local target branch along to merge directive handlers. |
90 |
submit_config = submit_branch.get_config() |
4367.1.5
by Jelmer Vernooij
merge bzr.dev. |
91 |
if mail_to is None: |
92 |
mail_to = submit_config.get_user_option("child_submit_to") |
|
93 |
if format is None: |
|
6365.1.3
by Jelmer Vernooij
Pass local target branch along to merge directive handlers. |
94 |
formatname = submit_branch.get_child_submit_format() |
4367.1.5
by Jelmer Vernooij
merge bzr.dev. |
95 |
try: |
96 |
format = format_registry.get(formatname) |
|
97 |
except KeyError: |
|
6138.3.7
by Jonathan Riddell
add gettext() to BzrCommandError uses |
98 |
raise errors.BzrCommandError(gettext("No such send format '%s'.") % |
4367.1.5
by Jelmer Vernooij
merge bzr.dev. |
99 |
formatname) |
4367.1.3
by Jelmer Vernooij
Move cmd_{send,bundle_revisions} back to bzrlib.builtins per Ians request. |
100 |
|
101 |
stored_public_branch = branch.get_public_branch() |
|
102 |
if public_branch is None: |
|
103 |
public_branch = stored_public_branch |
|
5861.1.4
by Vincent Ladeuil
Fix send --no-remember when no location is set. |
104 |
# Remembers if asked explicitly or no previous location is set
|
105 |
elif (remember |
|
106 |
or (remember is None and stored_public_branch is None)): |
|
4367.1.3
by Jelmer Vernooij
Move cmd_{send,bundle_revisions} back to bzrlib.builtins per Ians request. |
107 |
branch.set_public_branch(public_branch) |
108 |
if no_bundle and public_branch is None: |
|
6138.3.7
by Jonathan Riddell
add gettext() to BzrCommandError uses |
109 |
raise errors.BzrCommandError(gettext('No public branch specified or' |
110 |
' known')) |
|
4367.1.3
by Jelmer Vernooij
Move cmd_{send,bundle_revisions} back to bzrlib.builtins per Ians request. |
111 |
base_revision_id = None |
112 |
revision_id = None |
|
113 |
if revision is not None: |
|
114 |
if len(revision) > 2: |
|
6138.3.7
by Jonathan Riddell
add gettext() to BzrCommandError uses |
115 |
raise errors.BzrCommandError(gettext('bzr send takes ' |
116 |
'at most two one revision identifiers')) |
|
4367.1.3
by Jelmer Vernooij
Move cmd_{send,bundle_revisions} back to bzrlib.builtins per Ians request. |
117 |
revision_id = revision[-1].as_revision_id(branch) |
118 |
if len(revision) == 2: |
|
119 |
base_revision_id = revision[0].as_revision_id(branch) |
|
120 |
if revision_id is None: |
|
5147.2.2
by Vincent Ladeuil
Fix bug #519319 by defaulting to a warning for dirty trees. |
121 |
if tree is not None: |
5171.2.2
by Vincent Ladeuil
Explain that the uncommitted changes are not processed when |
122 |
tree.check_changed_or_out_of_date( |
123 |
strict, 'send_strict', |
|
124 |
more_error='Use --no-strict to force the send.', |
|
125 |
more_warning='Uncommitted changes will not be sent.') |
|
4367.1.3
by Jelmer Vernooij
Move cmd_{send,bundle_revisions} back to bzrlib.builtins per Ians request. |
126 |
revision_id = branch.last_revision() |
127 |
if revision_id == NULL_REVISION: |
|
6138.3.7
by Jonathan Riddell
add gettext() to BzrCommandError uses |
128 |
raise errors.BzrCommandError(gettext('No revisions to submit.')) |
4367.1.3
by Jelmer Vernooij
Move cmd_{send,bundle_revisions} back to bzrlib.builtins per Ians request. |
129 |
if format is None: |
130 |
format = format_registry.get() |
|
6365.1.3
by Jelmer Vernooij
Pass local target branch along to merge directive handlers. |
131 |
directive = format(branch, revision_id, target_branch, |
132 |
public_branch, no_patch, no_bundle, message, base_revision_id, |
|
133 |
submit_branch) |
|
4367.1.2
by Jelmer Vernooij
Move send command to a separate file, move send format registry out of cmd_send. |
134 |
if output is None: |
4367.1.3
by Jelmer Vernooij
Move cmd_{send,bundle_revisions} back to bzrlib.builtins per Ians request. |
135 |
directive.compose_merge_request(mail_client, mail_to, body, |
136 |
branch, tree) |
|
137 |
else: |
|
5086.3.3
by Jelmer Vernooij
Allow merge directives to output multiple patch files. |
138 |
if directive.multiple_output_files: |
139 |
if output == '-': |
|
6138.3.7
by Jonathan Riddell
add gettext() to BzrCommandError uses |
140 |
raise errors.BzrCommandError(gettext('- not supported for ' |
141 |
'merge directives that use more than one output file.')) |
|
5086.3.3
by Jelmer Vernooij
Allow merge directives to output multiple patch files. |
142 |
if not os.path.exists(output): |
143 |
os.mkdir(output, 0755) |
|
144 |
for (filename, lines) in directive.to_files(): |
|
145 |
path = os.path.join(output, filename) |
|
146 |
outfile = open(path, 'wb') |
|
147 |
try: |
|
148 |
outfile.writelines(lines) |
|
149 |
finally: |
|
150 |
outfile.close() |
|
4367.1.3
by Jelmer Vernooij
Move cmd_{send,bundle_revisions} back to bzrlib.builtins per Ians request. |
151 |
else: |
5086.3.3
by Jelmer Vernooij
Allow merge directives to output multiple patch files. |
152 |
if output == '-': |
153 |
outfile = to_file |
|
154 |
else: |
|
155 |
outfile = open(output, 'wb') |
|
156 |
try: |
|
157 |
outfile.writelines(directive.to_lines()) |
|
158 |
finally: |
|
159 |
if outfile is not to_file: |
|
160 |
outfile.close() |
|
4367.1.3
by Jelmer Vernooij
Move cmd_{send,bundle_revisions} back to bzrlib.builtins per Ians request. |
161 |
finally: |
162 |
branch.unlock() |
|
4367.1.2
by Jelmer Vernooij
Move send command to a separate file, move send format registry out of cmd_send. |
163 |
|
164 |
||
6365.1.3
by Jelmer Vernooij
Pass local target branch along to merge directive handlers. |
165 |
def _send_4(branch, revision_id, target_branch, public_branch, |
166 |
no_patch, no_bundle, message, |
|
167 |
base_revision_id, local_target_branch=None): |
|
5017.2.4
by Martin Pool
Move or remove some unconditionally loaded code |
168 |
from bzrlib import merge_directive |
4367.1.2
by Jelmer Vernooij
Move send command to a separate file, move send format registry out of cmd_send. |
169 |
return merge_directive.MergeDirective2.from_objects( |
170 |
branch.repository, revision_id, time.time(), |
|
6365.1.3
by Jelmer Vernooij
Pass local target branch along to merge directive handlers. |
171 |
osutils.local_time_offset(), target_branch, |
172 |
public_branch=public_branch, |
|
173 |
include_patch=not no_patch, |
|
4367.1.2
by Jelmer Vernooij
Move send command to a separate file, move send format registry out of cmd_send. |
174 |
include_bundle=not no_bundle, message=message, |
6365.1.3
by Jelmer Vernooij
Pass local target branch along to merge directive handlers. |
175 |
base_revision_id=base_revision_id, |
176 |
local_target_branch=local_target_branch) |
|
4367.1.2
by Jelmer Vernooij
Move send command to a separate file, move send format registry out of cmd_send. |
177 |
|
178 |
||
179 |
def _send_0_9(branch, revision_id, submit_branch, public_branch, |
|
6365.1.3
by Jelmer Vernooij
Pass local target branch along to merge directive handlers. |
180 |
no_patch, no_bundle, message, |
181 |
base_revision_id, local_target_branch=None): |
|
4367.1.2
by Jelmer Vernooij
Move send command to a separate file, move send format registry out of cmd_send. |
182 |
if not no_bundle: |
183 |
if not no_patch: |
|
184 |
patch_type = 'bundle' |
|
185 |
else: |
|
6138.3.7
by Jonathan Riddell
add gettext() to BzrCommandError uses |
186 |
raise errors.BzrCommandError(gettext('Format 0.9 does not' |
187 |
' permit bundle with no patch')) |
|
4367.1.2
by Jelmer Vernooij
Move send command to a separate file, move send format registry out of cmd_send. |
188 |
else: |
189 |
if not no_patch: |
|
190 |
patch_type = 'diff' |
|
191 |
else: |
|
192 |
patch_type = None |
|
5017.2.4
by Martin Pool
Move or remove some unconditionally loaded code |
193 |
from bzrlib import merge_directive |
4367.1.2
by Jelmer Vernooij
Move send command to a separate file, move send format registry out of cmd_send. |
194 |
return merge_directive.MergeDirective.from_objects( |
195 |
branch.repository, revision_id, time.time(), |
|
196 |
osutils.local_time_offset(), submit_branch, |
|
197 |
public_branch=public_branch, patch_type=patch_type, |
|
6365.1.3
by Jelmer Vernooij
Pass local target branch along to merge directive handlers. |
198 |
message=message, local_target_branch=local_target_branch) |
199 |
||
200 |
||
201 |
format_registry.register('4', |
|
4367.1.2
by Jelmer Vernooij
Move send command to a separate file, move send format registry out of cmd_send. |
202 |
_send_4, 'Bundle format 4, Merge Directive 2 (default)') |
203 |
format_registry.register('0.9', |
|
204 |
_send_0_9, 'Bundle format 0.9, Merge Directive 1') |
|
205 |
format_registry.default_key = '4' |