Merge lp:~jelmer/bzr/send-no-tree into lp:bzr

Proposed by Jelmer Vernooij
Status: Superseded
Proposed branch: lp:~jelmer/bzr/send-no-tree
Merge into: lp:bzr
Diff against target: 202 lines (+37/-24)
6 files modified
bzrlib/__init__.py (+4/-7)
bzrlib/controldir.py (+4/-2)
bzrlib/send.py (+2/-2)
bzrlib/tests/blackbox/test_send.py (+5/-0)
bzrlib/tests/per_repository/test_commit_builder.py (+19/-13)
doc/en/release-notes/bzr-2.5.txt (+3/-0)
To merge this branch: bzr merge lp:~jelmer/bzr/send-no-tree
Reviewer Review Type Date Requested Status
bzr-core Pending
Review via email: mp+90137@code.launchpad.net

This proposal has been superseded by a proposal from 2012-01-25.

Description of the change

Fix ``bzr send`` in treeless branches.

To post a comment you must log in.
Revision history for this message
Martin Packman (gz) wrote :

Should be targetted at 2.5?

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'bzrlib/__init__.py'
2--- bzrlib/__init__.py 2012-01-16 17:57:43 +0000
3+++ bzrlib/__init__.py 2012-01-25 16:06:25 +0000
4@@ -148,13 +148,10 @@
5 """
6 try:
7 import ctypes
8- except ImportError:
9- return
10- pythonapi = getattr(ctypes, "pythonapi", None)
11- if pythonapi is None:
12- # Not CPython ctypes implementation
13- return
14- old_ptr = ctypes.c_void_p.in_dll(pythonapi, "Py_FileSystemDefaultEncoding")
15+ old_ptr = ctypes.c_void_p.in_dll(ctypes.pythonapi,
16+ "Py_FileSystemDefaultEncoding")
17+ except (ImportError, ValueError):
18+ return # No ctypes or not CPython implementation, do nothing
19 new_ptr = ctypes.cast(ctypes.c_char_p(intern(new_enc)), ctypes.c_void_p)
20 old_ptr.value = new_ptr.value
21 if sys.getfilesystemencoding() != new_enc:
22
23=== modified file 'bzrlib/controldir.py'
24--- bzrlib/controldir.py 2012-01-18 17:46:57 +0000
25+++ bzrlib/controldir.py 2012-01-25 16:06:25 +0000
26@@ -778,7 +778,8 @@
27 return controldir._get_tree_branch()
28
29 @classmethod
30- def open_containing_tree_or_branch(klass, location):
31+ def open_containing_tree_or_branch(klass, location,
32+ possible_transports=None):
33 """Return the branch and working tree contained by a location.
34
35 Returns (tree, branch, relpath).
36@@ -787,7 +788,8 @@
37 raised
38 relpath is the portion of the path that is contained by the branch.
39 """
40- controldir, relpath = klass.open_containing(location)
41+ controldir, relpath = klass.open_containing(location,
42+ possible_transports=possible_transports)
43 tree, branch = controldir._get_tree_branch()
44 return tree, branch, relpath
45
46
47=== modified file 'bzrlib/send.py'
48--- bzrlib/send.py 2012-01-04 17:12:42 +0000
49+++ bzrlib/send.py 2012-01-25 16:06:25 +0000
50@@ -41,9 +41,9 @@
51 def send(target_branch, revision, public_branch, remember,
52 format, no_bundle, no_patch, output, from_, mail_to, message, body,
53 to_file, strict=None):
54+ possible_transports = []
55 tree, branch = controldir.ControlDir.open_containing_tree_or_branch(
56- from_)[:2]
57- possible_transports = [tree.bzrdir.transport, branch.bzrdir.transport]
58+ from_, possible_transports=possible_transports)[:2]
59 # we may need to write data into branch's repository to calculate
60 # the data to send.
61 branch.lock_write()
62
63=== modified file 'bzrlib/tests/blackbox/test_send.py'
64--- bzrlib/tests/blackbox/test_send.py 2012-01-04 17:12:42 +0000
65+++ bzrlib/tests/blackbox/test_send.py 2012-01-25 16:06:25 +0000
66@@ -24,6 +24,7 @@
67 merge_directive,
68 tests,
69 )
70+from bzrlib.controldir import ControlDir
71 from bzrlib.bundle import serializer
72 from bzrlib.transport import memory
73 from bzrlib.tests import (
74@@ -330,6 +331,10 @@
75 super(TestSendStrictWithoutChanges, self).setUp()
76 self.make_parent_and_local_branches()
77
78+ def test_send_without_workingtree(self):
79+ ControlDir.open("local").destroy_workingtree()
80+ self.assertSendSucceeds([])
81+
82 def test_send_default(self):
83 self.assertSendSucceeds([])
84
85
86=== modified file 'bzrlib/tests/per_repository/test_commit_builder.py'
87--- bzrlib/tests/per_repository/test_commit_builder.py 2011-12-22 16:17:28 +0000
88+++ bzrlib/tests/per_repository/test_commit_builder.py 2012-01-25 16:06:25 +0000
89@@ -284,6 +284,7 @@
90 if not builder.supports_record_entry_contents:
91 raise tests.TestNotApplicable("CommitBuilder doesn't support "
92 "record_entry_contents")
93+ builder.will_record_deletes()
94 ie = inventory.make_entry('directory', '', None,
95 tree.get_root_id())
96 delta, version_recorded, fs_hash = builder.record_entry_contents(
97@@ -299,7 +300,7 @@
98 if got_new_revision:
99 self.assertEqual(('', '', ie.file_id, ie), delta)
100 # The delta should be tracked
101- self.assertEqual(delta, builder._basis_delta[-1])
102+ self.assertEqual(delta, builder.get_basis_delta()[-1])
103 else:
104 self.assertEqual(None, delta)
105 # Directories do not get hashed.
106@@ -441,7 +442,7 @@
107 # the delta should be returned, and recorded in _basis_delta
108 delta = builder.record_delete("foo", "foo-id")
109 self.assertEqual(("foo", None, "foo-id", None), delta)
110- self.assertEqual(delta, builder._basis_delta[-1])
111+ self.assertEqual(delta, builder.get_basis_delta()[-1])
112 builder.finish_inventory()
113 rev_id2 = builder.commit('delete foo')
114 except:
115@@ -463,13 +464,14 @@
116 try:
117 builder = tree.branch.get_commit_builder([rev_id])
118 try:
119+ builder.will_record_deletes()
120 delete_change = ('foo-id', ('foo', None), True, (True, False),
121 (tree.path2id(''), None), ('foo', None), ('file', None),
122 (False, None))
123 list(builder.record_iter_changes(tree, rev_id,
124 [delete_change]))
125 self.assertEqual(("foo", None, "foo-id", None),
126- builder._basis_delta[0])
127+ builder.get_basis_delta()[0])
128 self.assertTrue(builder.any_changes())
129 builder.finish_inventory()
130 rev_id2 = builder.commit('delete foo')
131@@ -866,6 +868,7 @@
132 if not builder.supports_record_entry_contents:
133 raise tests.TestNotApplicable("CommitBuilder doesn't "
134 "support record_entry_contents")
135+ builder.will_record_deletes()
136 parent_tree = tree.basis_tree()
137 parent_tree.lock_read()
138 self.addCleanup(parent_tree.unlock)
139@@ -913,7 +916,8 @@
140 if delta_against_basis:
141 expected_delta = (name, new_name, file_id, new_entry)
142 # The delta should be recorded
143- self.assertEqual(expected_delta, builder._basis_delta[-1])
144+ self.assertEqual(expected_delta,
145+ builder.get_basis_delta()[-1])
146 else:
147 expected_delta = None
148 self.assertEqual(expected_delta, delta)
149@@ -954,6 +958,7 @@
150 # record_entry_contents.
151 parent_ids = tree.get_parent_ids()
152 builder = tree.branch.get_commit_builder(parent_ids)
153+ builder.will_record_deletes()
154 parent_tree = tree.basis_tree()
155 parent_tree.lock_read()
156 self.addCleanup(parent_tree.unlock)
157@@ -975,15 +980,6 @@
158 self.assertEqualStat(result[2][1], tree_file_stat[1])
159 else:
160 self.assertEqual([], result)
161- delta = builder._basis_delta
162- delta_dict = dict((change[2], change) for change in delta)
163- version_recorded = (file_id in delta_dict and
164- delta_dict[file_id][3] is not None and
165- delta_dict[file_id][3].revision == builder._new_revision_id)
166- if records_version:
167- self.assertTrue(version_recorded)
168- else:
169- self.assertFalse(version_recorded)
170 self.assertIs(None, builder.new_inventory)
171 builder.finish_inventory()
172 if tree.branch.repository._format.supports_full_versioned_files:
173@@ -993,6 +989,16 @@
174 self.assertEqual(inv_sha1, builder.inv_sha1)
175 self.assertIs(None, builder.new_inventory)
176 rev2 = builder.commit('')
177+ delta = builder.get_basis_delta()
178+ delta_dict = dict((change[2], change) for change in delta)
179+ version_recorded = (file_id in delta_dict and
180+ delta_dict[file_id][3] is not None and
181+ delta_dict[file_id][3].revision == rev2)
182+ if records_version:
183+ self.assertTrue(version_recorded)
184+ else:
185+ self.assertFalse(version_recorded)
186+
187 new_inventory = builder.revision_tree().inventory
188 new_entry = new_inventory[file_id]
189 if delta_against_basis:
190
191=== modified file 'doc/en/release-notes/bzr-2.5.txt'
192--- doc/en/release-notes/bzr-2.5.txt 2012-01-23 15:02:51 +0000
193+++ doc/en/release-notes/bzr-2.5.txt 2012-01-25 16:06:25 +0000
194@@ -51,6 +51,9 @@
195 * ``bzr branch`` now fetches revisions when branching into an empty
196 control directory. (Jelmer Vernooij, #905594)
197
198+* ``bzr send`` works on treeless branches again.
199+ (Jelmer Vernooij, #921591)
200+
201 * Support scripts that don't call bzrlib.initialize() but still call run_bzr().
202 (Vincent Ladeuil, #917733)
203