Merge lp:~mbp/bzr/715000-more-fallbacks into lp:bzr
- 715000-more-fallbacks
- Merge into bzr.dev
Proposed by
Martin Pool
Status: | Superseded |
---|---|
Proposed branch: | lp:~mbp/bzr/715000-more-fallbacks |
Merge into: | lp:bzr |
Diff against target: |
374 lines (+158/-28) 6 files modified
bzrlib/groupcompress.py (+7/-7) bzrlib/knit.py (+14/-14) bzrlib/tests/per_repository_reference/__init__.py (+1/-0) bzrlib/tests/per_repository_reference/test_graph.py (+45/-0) bzrlib/versionedfile.py (+18/-4) doc/en/release-notes/bzr-2.2.txt (+73/-3) |
To merge this branch: | bzr merge lp:~mbp/bzr/715000-more-fallbacks |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
bzr-core | Pending | ||
Review via email: mp+49025@code.launchpad.net |
This proposal has been superseded by a proposal from 2011-02-09.
Commit message
Description of the change
follow-through from bug 715000: rename _fallback_vfs to _immediate_
To post a comment you must log in.
Revision history for this message
John A Meinel (jameinel) wrote : | # |
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'bzrlib/groupcompress.py' | |||
2 | --- bzrlib/groupcompress.py 2010-09-26 20:45:28 +0000 | |||
3 | +++ bzrlib/groupcompress.py 2011-02-09 08:12:01 +0000 | |||
4 | @@ -1,4 +1,4 @@ | |||
6 | 1 | # Copyright (C) 2008, 2009, 2010 Canonical Ltd | 1 | # Copyright (C) 2008-2011 Canonical Ltd |
7 | 2 | # | 2 | # |
8 | 3 | # This program is free software; you can redistribute it and/or modify | 3 | # This program is free software; you can redistribute it and/or modify |
9 | 4 | # it under the terms of the GNU General Public License as published by | 4 | # it under the terms of the GNU General Public License as published by |
10 | @@ -1186,7 +1186,7 @@ | |||
11 | 1186 | _unadded_refs = {} | 1186 | _unadded_refs = {} |
12 | 1187 | self._unadded_refs = _unadded_refs | 1187 | self._unadded_refs = _unadded_refs |
13 | 1188 | self._group_cache = LRUSizeCache(max_size=50*1024*1024) | 1188 | self._group_cache = LRUSizeCache(max_size=50*1024*1024) |
15 | 1189 | self._fallback_vfs = [] | 1189 | self._immediate_fallbacks = [] |
16 | 1190 | 1190 | ||
17 | 1191 | def without_fallbacks(self): | 1191 | def without_fallbacks(self): |
18 | 1192 | """Return a clone of this object without any fallbacks configured.""" | 1192 | """Return a clone of this object without any fallbacks configured.""" |
19 | @@ -1266,7 +1266,7 @@ | |||
20 | 1266 | 1266 | ||
21 | 1267 | :param a_versioned_files: A VersionedFiles object. | 1267 | :param a_versioned_files: A VersionedFiles object. |
22 | 1268 | """ | 1268 | """ |
24 | 1269 | self._fallback_vfs.append(a_versioned_files) | 1269 | self._immediate_fallbacks.append(a_versioned_files) |
25 | 1270 | 1270 | ||
26 | 1271 | def annotate(self, key): | 1271 | def annotate(self, key): |
27 | 1272 | """See VersionedFiles.annotate.""" | 1272 | """See VersionedFiles.annotate.""" |
28 | @@ -1312,7 +1312,7 @@ | |||
29 | 1312 | # KnitVersionedFiles.get_known_graph_ancestry, but they don't share | 1312 | # KnitVersionedFiles.get_known_graph_ancestry, but they don't share |
30 | 1313 | # ancestry. | 1313 | # ancestry. |
31 | 1314 | parent_map, missing_keys = self._index.find_ancestry(keys) | 1314 | parent_map, missing_keys = self._index.find_ancestry(keys) |
33 | 1315 | for fallback in self._fallback_vfs: | 1315 | for fallback in self._transitive_fallbacks(): |
34 | 1316 | if not missing_keys: | 1316 | if not missing_keys: |
35 | 1317 | break | 1317 | break |
36 | 1318 | (f_parent_map, f_missing_keys) = fallback._index.find_ancestry( | 1318 | (f_parent_map, f_missing_keys) = fallback._index.find_ancestry( |
37 | @@ -1342,7 +1342,7 @@ | |||
38 | 1342 | and so on. | 1342 | and so on. |
39 | 1343 | """ | 1343 | """ |
40 | 1344 | result = {} | 1344 | result = {} |
42 | 1345 | sources = [self._index] + self._fallback_vfs | 1345 | sources = [self._index] + self._immediate_fallbacks |
43 | 1346 | source_results = [] | 1346 | source_results = [] |
44 | 1347 | missing = set(keys) | 1347 | missing = set(keys) |
45 | 1348 | for source in sources: | 1348 | for source in sources: |
46 | @@ -1449,7 +1449,7 @@ | |||
47 | 1449 | parent_map = {} | 1449 | parent_map = {} |
48 | 1450 | key_to_source_map = {} | 1450 | key_to_source_map = {} |
49 | 1451 | source_results = [] | 1451 | source_results = [] |
51 | 1452 | for source in self._fallback_vfs: | 1452 | for source in self._immediate_fallbacks: |
52 | 1453 | if not missing: | 1453 | if not missing: |
53 | 1454 | break | 1454 | break |
54 | 1455 | source_parents = source.get_parent_map(missing) | 1455 | source_parents = source.get_parent_map(missing) |
55 | @@ -1832,7 +1832,7 @@ | |||
56 | 1832 | """See VersionedFiles.keys.""" | 1832 | """See VersionedFiles.keys.""" |
57 | 1833 | if 'evil' in debug.debug_flags: | 1833 | if 'evil' in debug.debug_flags: |
58 | 1834 | trace.mutter_callsite(2, "keys scales with size of history") | 1834 | trace.mutter_callsite(2, "keys scales with size of history") |
60 | 1835 | sources = [self._index] + self._fallback_vfs | 1835 | sources = [self._index] + self._immediate_fallbacks |
61 | 1836 | result = set() | 1836 | result = set() |
62 | 1837 | for source in sources: | 1837 | for source in sources: |
63 | 1838 | result.update(source.keys()) | 1838 | result.update(source.keys()) |
64 | 1839 | 1839 | ||
65 | === modified file 'bzrlib/knit.py' | |||
66 | --- bzrlib/knit.py 2011-01-11 20:42:36 +0000 | |||
67 | +++ bzrlib/knit.py 2011-02-09 08:12:01 +0000 | |||
68 | @@ -883,7 +883,7 @@ | |||
69 | 883 | self._factory = KnitAnnotateFactory() | 883 | self._factory = KnitAnnotateFactory() |
70 | 884 | else: | 884 | else: |
71 | 885 | self._factory = KnitPlainFactory() | 885 | self._factory = KnitPlainFactory() |
73 | 886 | self._fallback_vfs = [] | 886 | self._immediate_fallbacks = [] |
74 | 887 | self._reload_func = reload_func | 887 | self._reload_func = reload_func |
75 | 888 | 888 | ||
76 | 889 | def __repr__(self): | 889 | def __repr__(self): |
77 | @@ -897,7 +897,7 @@ | |||
78 | 897 | 897 | ||
79 | 898 | :param a_versioned_files: A VersionedFiles object. | 898 | :param a_versioned_files: A VersionedFiles object. |
80 | 899 | """ | 899 | """ |
82 | 900 | self._fallback_vfs.append(a_versioned_files) | 900 | self._immediate_fallbacks.append(a_versioned_files) |
83 | 901 | 901 | ||
84 | 902 | def add_lines(self, key, parents, lines, parent_texts=None, | 902 | def add_lines(self, key, parents, lines, parent_texts=None, |
85 | 903 | left_matching_blocks=None, nostore_sha=None, random_id=False, | 903 | left_matching_blocks=None, nostore_sha=None, random_id=False, |
86 | @@ -1070,7 +1070,7 @@ | |||
87 | 1070 | raise errors.KnitCorrupt(self, | 1070 | raise errors.KnitCorrupt(self, |
88 | 1071 | "Missing basis parent %s for %s" % ( | 1071 | "Missing basis parent %s for %s" % ( |
89 | 1072 | compression_parent, key)) | 1072 | compression_parent, key)) |
91 | 1073 | for fallback_vfs in self._fallback_vfs: | 1073 | for fallback_vfs in self._immediate_fallbacks: |
92 | 1074 | fallback_vfs.check() | 1074 | fallback_vfs.check() |
93 | 1075 | 1075 | ||
94 | 1076 | def _check_add(self, key, lines, random_id, check_content): | 1076 | def _check_add(self, key, lines, random_id, check_content): |
95 | @@ -1196,7 +1196,7 @@ | |||
96 | 1196 | def get_known_graph_ancestry(self, keys): | 1196 | def get_known_graph_ancestry(self, keys): |
97 | 1197 | """Get a KnownGraph instance with the ancestry of keys.""" | 1197 | """Get a KnownGraph instance with the ancestry of keys.""" |
98 | 1198 | parent_map, missing_keys = self._index.find_ancestry(keys) | 1198 | parent_map, missing_keys = self._index.find_ancestry(keys) |
100 | 1199 | for fallback in self._fallback_vfs: | 1199 | for fallback in self._transitive_fallbacks(): |
101 | 1200 | if not missing_keys: | 1200 | if not missing_keys: |
102 | 1201 | break | 1201 | break |
103 | 1202 | (f_parent_map, f_missing_keys) = fallback._index.find_ancestry( | 1202 | (f_parent_map, f_missing_keys) = fallback._index.find_ancestry( |
104 | @@ -1226,7 +1226,7 @@ | |||
105 | 1226 | and so on. | 1226 | and so on. |
106 | 1227 | """ | 1227 | """ |
107 | 1228 | result = {} | 1228 | result = {} |
109 | 1229 | sources = [self._index] + self._fallback_vfs | 1229 | sources = [self._index] + self._immediate_fallbacks |
110 | 1230 | source_results = [] | 1230 | source_results = [] |
111 | 1231 | missing = set(keys) | 1231 | missing = set(keys) |
112 | 1232 | for source in sources: | 1232 | for source in sources: |
113 | @@ -1526,7 +1526,7 @@ | |||
114 | 1526 | yield KnitContentFactory(key, global_map[key], | 1526 | yield KnitContentFactory(key, global_map[key], |
115 | 1527 | record_details, None, raw_data, self._factory.annotated, None) | 1527 | record_details, None, raw_data, self._factory.annotated, None) |
116 | 1528 | else: | 1528 | else: |
118 | 1529 | vf = self._fallback_vfs[parent_maps.index(source) - 1] | 1529 | vf = self._immediate_fallbacks[parent_maps.index(source) - 1] |
119 | 1530 | for record in vf.get_record_stream(keys, ordering, | 1530 | for record in vf.get_record_stream(keys, ordering, |
120 | 1531 | include_delta_closure): | 1531 | include_delta_closure): |
121 | 1532 | yield record | 1532 | yield record |
122 | @@ -1542,7 +1542,7 @@ | |||
123 | 1542 | # record entry 2 is the 'digest'. | 1542 | # record entry 2 is the 'digest'. |
124 | 1543 | result[key] = details[2] | 1543 | result[key] = details[2] |
125 | 1544 | missing.difference_update(set(result)) | 1544 | missing.difference_update(set(result)) |
127 | 1545 | for source in self._fallback_vfs: | 1545 | for source in self._immediate_fallbacks: |
128 | 1546 | if not missing: | 1546 | if not missing: |
129 | 1547 | break | 1547 | break |
130 | 1548 | new_result = source.get_sha1s(missing) | 1548 | new_result = source.get_sha1s(missing) |
131 | @@ -1619,7 +1619,7 @@ | |||
132 | 1619 | raise RevisionNotPresent([record.key], self) | 1619 | raise RevisionNotPresent([record.key], self) |
133 | 1620 | elif ((record.storage_kind in knit_types) | 1620 | elif ((record.storage_kind in knit_types) |
134 | 1621 | and (compression_parent is None | 1621 | and (compression_parent is None |
136 | 1622 | or not self._fallback_vfs | 1622 | or not self._immediate_fallbacks |
137 | 1623 | or self._index.has_key(compression_parent) | 1623 | or self._index.has_key(compression_parent) |
138 | 1624 | or not self.has_key(compression_parent))): | 1624 | or not self.has_key(compression_parent))): |
139 | 1625 | # we can insert the knit record literally if either it has no | 1625 | # we can insert the knit record literally if either it has no |
140 | @@ -1797,11 +1797,11 @@ | |||
141 | 1797 | # vfs, and hope to find them there. Note that if the keys are found | 1797 | # vfs, and hope to find them there. Note that if the keys are found |
142 | 1798 | # but had no changes or no content, the fallback may not return | 1798 | # but had no changes or no content, the fallback may not return |
143 | 1799 | # anything. | 1799 | # anything. |
145 | 1800 | if keys and not self._fallback_vfs: | 1800 | if keys and not self._immediate_fallbacks: |
146 | 1801 | # XXX: strictly the second parameter is meant to be the file id | 1801 | # XXX: strictly the second parameter is meant to be the file id |
147 | 1802 | # but it's not easily accessible here. | 1802 | # but it's not easily accessible here. |
148 | 1803 | raise RevisionNotPresent(keys, repr(self)) | 1803 | raise RevisionNotPresent(keys, repr(self)) |
150 | 1804 | for source in self._fallback_vfs: | 1804 | for source in self._immediate_fallbacks: |
151 | 1805 | if not keys: | 1805 | if not keys: |
152 | 1806 | break | 1806 | break |
153 | 1807 | source_keys = set() | 1807 | source_keys = set() |
154 | @@ -2016,7 +2016,7 @@ | |||
155 | 2016 | """See VersionedFiles.keys.""" | 2016 | """See VersionedFiles.keys.""" |
156 | 2017 | if 'evil' in debug.debug_flags: | 2017 | if 'evil' in debug.debug_flags: |
157 | 2018 | trace.mutter_callsite(2, "keys scales with size of history") | 2018 | trace.mutter_callsite(2, "keys scales with size of history") |
159 | 2019 | sources = [self._index] + self._fallback_vfs | 2019 | sources = [self._index] + self._immediate_fallbacks |
160 | 2020 | result = set() | 2020 | result = set() |
161 | 2021 | for source in sources: | 2021 | for source in sources: |
162 | 2022 | result.update(source.keys()) | 2022 | result.update(source.keys()) |
163 | @@ -2062,7 +2062,7 @@ | |||
164 | 2062 | 2062 | ||
165 | 2063 | missing_keys = set(nonlocal_keys) | 2063 | missing_keys = set(nonlocal_keys) |
166 | 2064 | # Read from remote versioned file instances and provide to our caller. | 2064 | # Read from remote versioned file instances and provide to our caller. |
168 | 2065 | for source in self.vf._fallback_vfs: | 2065 | for source in self.vf._immediate_fallbacks: |
169 | 2066 | if not missing_keys: | 2066 | if not missing_keys: |
170 | 2067 | break | 2067 | break |
171 | 2068 | # Loop over fallback repositories asking them for texts - ignore | 2068 | # Loop over fallback repositories asking them for texts - ignore |
172 | @@ -3521,8 +3521,8 @@ | |||
173 | 3521 | return records, ann_keys | 3521 | return records, ann_keys |
174 | 3522 | 3522 | ||
175 | 3523 | def _get_needed_texts(self, key, pb=None): | 3523 | def _get_needed_texts(self, key, pb=None): |
178 | 3524 | # if True or len(self._vf._fallback_vfs) > 0: | 3524 | # if True or len(self._vf._immediate_fallbacks) > 0: |
179 | 3525 | if len(self._vf._fallback_vfs) > 0: | 3525 | if len(self._vf._immediate_fallbacks) > 0: |
180 | 3526 | # If we have fallbacks, go to the generic path | 3526 | # If we have fallbacks, go to the generic path |
181 | 3527 | for v in annotate.Annotator._get_needed_texts(self, key, pb=pb): | 3527 | for v in annotate.Annotator._get_needed_texts(self, key, pb=pb): |
182 | 3528 | yield v | 3528 | yield v |
183 | 3529 | 3529 | ||
184 | === modified file 'bzrlib/tests/per_repository_reference/__init__.py' | |||
185 | --- bzrlib/tests/per_repository_reference/__init__.py 2011-01-10 22:47:59 +0000 | |||
186 | +++ bzrlib/tests/per_repository_reference/__init__.py 2011-02-09 08:12:01 +0000 | |||
187 | @@ -105,6 +105,7 @@ | |||
188 | 105 | 'bzrlib.tests.per_repository_reference.test_fetch', | 105 | 'bzrlib.tests.per_repository_reference.test_fetch', |
189 | 106 | 'bzrlib.tests.per_repository_reference.test_get_record_stream', | 106 | 'bzrlib.tests.per_repository_reference.test_get_record_stream', |
190 | 107 | 'bzrlib.tests.per_repository_reference.test_get_rev_id_for_revno', | 107 | 'bzrlib.tests.per_repository_reference.test_get_rev_id_for_revno', |
191 | 108 | 'bzrlib.tests.per_repository_reference.test_graph', | ||
192 | 108 | 'bzrlib.tests.per_repository_reference.test_initialize', | 109 | 'bzrlib.tests.per_repository_reference.test_initialize', |
193 | 109 | 'bzrlib.tests.per_repository_reference.test_unlock', | 110 | 'bzrlib.tests.per_repository_reference.test_unlock', |
194 | 110 | ] | 111 | ] |
195 | 111 | 112 | ||
196 | === added file 'bzrlib/tests/per_repository_reference/test_graph.py' | |||
197 | --- bzrlib/tests/per_repository_reference/test_graph.py 1970-01-01 00:00:00 +0000 | |||
198 | +++ bzrlib/tests/per_repository_reference/test_graph.py 2011-02-09 08:12:01 +0000 | |||
199 | @@ -0,0 +1,45 @@ | |||
200 | 1 | # Copyright (C) 2011 Canonical Ltd | ||
201 | 2 | # | ||
202 | 3 | # This program is free software; you can redistribute it and/or modify | ||
203 | 4 | # it under the terms of the GNU General Public License as published by | ||
204 | 5 | # the Free Software Foundation; either version 2 of the License, or | ||
205 | 6 | # (at your option) any later version. | ||
206 | 7 | # | ||
207 | 8 | # This program is distributed in the hope that it will be useful, | ||
208 | 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
209 | 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
210 | 11 | # GNU General Public License for more details. | ||
211 | 12 | # | ||
212 | 13 | # You should have received a copy of the GNU General Public License | ||
213 | 14 | # along with this program; if not, write to the Free Software | ||
214 | 15 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
215 | 16 | |||
216 | 17 | |||
217 | 18 | """Tests for graph operations on stacked repositories.""" | ||
218 | 19 | |||
219 | 20 | |||
220 | 21 | from bzrlib.tests.per_repository import TestCaseWithRepository | ||
221 | 22 | |||
222 | 23 | |||
223 | 24 | class TestGraph(TestCaseWithRepository): | ||
224 | 25 | |||
225 | 26 | def test_get_known_graph_ancestry_stacked(self): | ||
226 | 27 | """get_known_graph_ancestry works correctly on stacking. | ||
227 | 28 | |||
228 | 29 | See <https://bugs.launchpad.net/bugs/715000>. | ||
229 | 30 | """ | ||
230 | 31 | branch_a, branch_b, branch_c, revid_1 = self.make_double_stacked_branches() | ||
231 | 32 | for br in [branch_a, branch_b, branch_c]: | ||
232 | 33 | self.assertEquals( | ||
233 | 34 | [revid_1], | ||
234 | 35 | br.repository.get_known_graph_ancestry([revid_1]).topo_sort()) | ||
235 | 36 | |||
236 | 37 | def make_double_stacked_branches(self): | ||
237 | 38 | wt_a = self.make_branch_and_tree('a') | ||
238 | 39 | branch_a = wt_a.branch | ||
239 | 40 | branch_b = self.make_branch('b') | ||
240 | 41 | branch_b.set_stacked_on_url('../a') | ||
241 | 42 | branch_c = self.make_branch('c') | ||
242 | 43 | branch_c.set_stacked_on_url('../b') | ||
243 | 44 | revid_1 = wt_a.commit('first commit') | ||
244 | 45 | return branch_a, branch_b, branch_c, revid_1 | ||
245 | 0 | 46 | ||
246 | === modified file 'bzrlib/versionedfile.py' | |||
247 | --- bzrlib/versionedfile.py 2010-08-28 15:34:24 +0000 | |||
248 | +++ bzrlib/versionedfile.py 2011-02-09 08:12:01 +0000 | |||
249 | @@ -1,7 +1,4 @@ | |||
254 | 1 | # Copyright (C) 2006-2010 Canonical Ltd | 1 | # Copyright (C) 2006-2011 Canonical Ltd |
251 | 2 | # | ||
252 | 3 | # Authors: | ||
253 | 4 | # Johan Rydberg <jrydberg@gnu.org> | ||
255 | 5 | # | 2 | # |
256 | 6 | # This program is free software; you can redistribute it and/or modify | 3 | # This program is free software; you can redistribute it and/or modify |
257 | 7 | # it under the terms of the GNU General Public License as published by | 4 | # it under the terms of the GNU General Public License as published by |
258 | @@ -930,6 +927,10 @@ | |||
259 | 930 | 927 | ||
260 | 931 | The use of tuples allows a single code base to support several different | 928 | The use of tuples allows a single code base to support several different |
261 | 932 | uses with only the mapping logic changing from instance to instance. | 929 | uses with only the mapping logic changing from instance to instance. |
262 | 930 | |||
263 | 931 | :ivar _immediate_fallbacks: For subclasses that support stacking, | ||
264 | 932 | this is a list of other VersionedFiles immediately underneath this | ||
265 | 933 | one. They may in turn each have further fallbacks. | ||
266 | 933 | """ | 934 | """ |
267 | 934 | 935 | ||
268 | 935 | def add_lines(self, key, parents, lines, parent_texts=None, | 936 | def add_lines(self, key, parents, lines, parent_texts=None, |
269 | @@ -1193,6 +1194,19 @@ | |||
270 | 1193 | def _extract_blocks(self, version_id, source, target): | 1194 | def _extract_blocks(self, version_id, source, target): |
271 | 1194 | return None | 1195 | return None |
272 | 1195 | 1196 | ||
273 | 1197 | def _transitive_fallbacks(self): | ||
274 | 1198 | """Return the whole stack of fallback versionedfiles. | ||
275 | 1199 | |||
276 | 1200 | This VersionedFiles may have a list of fallbacks, but it doesn't | ||
277 | 1201 | necessarily know about the whole stack going down, and it can't know | ||
278 | 1202 | at open time because they may change after the objects are opened. | ||
279 | 1203 | """ | ||
280 | 1204 | all_fallbacks = [] | ||
281 | 1205 | for a_vfs in self._immediate_fallbacks: | ||
282 | 1206 | all_fallbacks.append(a_vfs) | ||
283 | 1207 | all_fallbacks.extend(a_vfs._transitive_fallbacks()) | ||
284 | 1208 | return all_fallbacks | ||
285 | 1209 | |||
286 | 1196 | 1210 | ||
287 | 1197 | class ThunkedVersionedFiles(VersionedFiles): | 1211 | class ThunkedVersionedFiles(VersionedFiles): |
288 | 1198 | """Storage for many versioned files thunked onto a 'VersionedFile' class. | 1212 | """Storage for many versioned files thunked onto a 'VersionedFile' class. |
289 | 1199 | 1213 | ||
290 | === modified file 'doc/en/release-notes/bzr-2.2.txt' | |||
291 | --- doc/en/release-notes/bzr-2.2.txt 2011-02-04 14:10:48 +0000 | |||
292 | +++ doc/en/release-notes/bzr-2.2.txt 2011-02-09 08:12:01 +0000 | |||
293 | @@ -2,9 +2,79 @@ | |||
294 | 2 | Bazaar Release Notes | 2 | Bazaar Release Notes |
295 | 3 | #################### | 3 | #################### |
296 | 4 | 4 | ||
300 | 5 | .. toctree:: | 5 | .. contents:: List of Releases |
301 | 6 | :maxdepth: 1 | 6 | :depth: 1 |
302 | 7 | 7 | ||
303 | 8 | bzr 2.2.5 | ||
304 | 9 | ######### | ||
305 | 10 | |||
306 | 11 | :Codename: Suggestions welcome | ||
307 | 12 | :2.2.5: NOT RELEASED YET | ||
308 | 13 | |||
309 | 14 | Compatibility Breaks | ||
310 | 15 | ******************** | ||
311 | 16 | |||
312 | 17 | New Features | ||
313 | 18 | ************ | ||
314 | 19 | |||
315 | 20 | Bug Fixes | ||
316 | 21 | ********* | ||
317 | 22 | |||
318 | 23 | * Correctly handle ``bzr log`` and `get_known_graph_ancestry` on a | ||
319 | 24 | doubly-stacked branch. | ||
320 | 25 | (James Westby, Martin Pool, #715000) | ||
321 | 26 | |||
322 | 27 | Improvements | ||
323 | 28 | ************ | ||
324 | 29 | |||
325 | 30 | Documentation | ||
326 | 31 | ************* | ||
327 | 32 | |||
328 | 33 | API Changes | ||
329 | 34 | *********** | ||
330 | 35 | |||
331 | 36 | Internals | ||
332 | 37 | ********* | ||
333 | 38 | |||
334 | 39 | Testing | ||
335 | 40 | ******* | ||
336 | 41 | |||
337 | 42 | |||
338 | 43 | bzr 2.2.4 | ||
339 | 44 | ######### | ||
340 | 45 | |||
341 | 46 | :2.2.4: 2011-02-04 | ||
342 | 47 | |||
343 | 48 | This is a bugfix release. Only one bug has been fixed, a regression from 2.2.3 | ||
344 | 49 | involving only certain operations with launchpad. Upgrading is recommended for | ||
345 | 50 | all users on earlier 2.2 releases. | ||
346 | 51 | |||
347 | 52 | Bug Fixes | ||
348 | 53 | ********* | ||
349 | 54 | |||
350 | 55 | * Fix communications with the Launchpad web service when using | ||
351 | 56 | launchpadlib >= 1.5.5. This was a latent bug in bzr's communication | ||
352 | 57 | with Launchpad's production instance, which only became a problem when | ||
353 | 58 | the default instance was switched from edge to production in bzr 2.2.3. | ||
354 | 59 | (Max Bowsher, #707075) | ||
355 | 60 | |||
356 | 61 | |||
357 | 62 | bzr 2.2.3 | ||
358 | 63 | ######### | ||
359 | 64 | |||
360 | 65 | :2.2.3: 2011-01-20 | ||
361 | 66 | |||
362 | 67 | This is a bugfix release. Upgrading is recommended for all users | ||
363 | 68 | on earlier 2.2 releases. | ||
364 | 69 | |||
365 | 70 | Compatibility Breaks | ||
366 | 71 | ******************** | ||
367 | 72 | |||
368 | 73 | * Launchpad has announced that the ``edge.launchpad.net`` instance is | ||
369 | 74 | deprecated and may be shut down in the future | ||
370 | 75 | <http://blog.launchpad.net/general/edge-is-deprecated>. Bazaar has therefore | ||
371 | 76 | been updated in this release to talk to the main (``launchpad.net``) servers, | ||
372 | 77 | rather than the ``edge`` ones. (Vincent Ladeuil, #583667) | ||
373 | 8 | bzr 2.2.4 | 78 | bzr 2.2.4 |
374 | 9 | ######### | 79 | ######### |
375 | 10 | 80 |
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On 2/9/2011 2:08 AM, Martin Pool wrote: /code.launchpad .net/~mbp/ bzr/715000- more-fallbacks/ +merge/ 49025 fallbacks to make it clear it's not the whole stack.
> Martin Pool has proposed merging lp:~mbp/bzr/715000-more-fallbacks into lp:bzr.
>
> Requested reviews:
> bzr-core (bzr-core)
>
> For more details, see:
> https:/
>
> follow-through from bug 715000: rename _fallback_vfs to _immediate_
I'm ok with the change, but I would make it "_immediate_ fallback_ vfs" to fallback_ repositories" .
distinguish it from "_immediate_
Mostly to be easily greppable.
I don't personally find it better, mostly because the added length
doesn't add much. It seems a simple
:ivar _fallback_vfs: Immediate fallbacks, note this is not transitive
Could be a better way to go.
John enigmail. mozdev. org/
=:->
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Using GnuPG with Mozilla - http://
iEYEARECAAYFAk1 St0oACgkQJdeBCY SNAAOLHQCg0Yj/ BsMKAzL4Sr5OhGQ bxBoZ yOfdMjxhNnjLFiY vdnY9+ansx
9FMAnj/
=LcsQ
-----END PGP SIGNATURE-----