Merge lp:~mbp/bzr/715000-more-fallbacks into lp:bzr

Proposed by Martin Pool
Status: Merged
Approved by: Martin Pool
Approved revision: no longer in the source branch.
Merged at revision: 5663
Proposed branch: lp:~mbp/bzr/715000-more-fallbacks
Merge into: lp:bzr
Diff against target: 1033 lines (+601/-96) (has conflicts)
11 files modified
bzrlib/groupcompress.py (+5/-5)
bzrlib/knit.py (+13/-13)
bzrlib/tests/blackbox/test_branch.py (+42/-0)
bzrlib/tests/blackbox/test_pull.py (+22/-0)
bzrlib/tests/per_branch/test_pull.py (+57/-0)
bzrlib/tests/per_controldir/test_controldir.py (+100/-0)
bzrlib/tests/per_repository_reference/test_graph.py (+48/-0)
bzrlib/versionedfile.py (+21/-4)
bzrlib/workingtree.py (+14/-0)
doc/en/release-notes/bzr-2.2.txt (+150/-74)
doc/en/release-notes/bzr-2.4.txt (+129/-0)
Text conflict in bzrlib/tests/blackbox/test_branch.py
Text conflict in bzrlib/tests/blackbox/test_pull.py
Text conflict in bzrlib/tests/per_branch/test_pull.py
Text conflict in bzrlib/tests/per_controldir/test_controldir.py
Text conflict in bzrlib/tests/per_repository_reference/test_graph.py
Text conflict in bzrlib/versionedfile.py
Text conflict in bzrlib/workingtree.py
Text conflict in doc/en/release-notes/bzr-2.2.txt
Text conflict in doc/en/release-notes/bzr-2.4.txt
To merge this branch: bzr merge lp:~mbp/bzr/715000-more-fallbacks
Reviewer Review Type Date Requested Status
Andrew Bennetts Approve
Review via email: mp+49028@code.launchpad.net

This proposal supersedes a proposal from 2011-02-09.

Commit message

rename _fallback_vfs to _immediate_fallback_vfs to make the meaning more clear

Description of the change

follow-through from bug 715000: rename _fallback_vfs to _immediate_fallbacks to make it clear it's not the whole stack.

To post a comment you must log in.
Revision history for this message
John A Meinel (jameinel) wrote : Posted in a previous version of this proposal

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 2/9/2011 2:08 AM, Martin Pool wrote:
> 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://code.launchpad.net/~mbp/bzr/715000-more-fallbacks/+merge/49025
>
> follow-through from bug 715000: rename _fallback_vfs to _immediate_fallbacks to make it clear it's not the whole stack.

I'm ok with the change, but I would make it "_immediate_fallback_vfs" to
distinguish it from "_immediate_fallback_repositories".
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
=:->
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk1St0oACgkQJdeBCYSNAAOLHQCg0Yj/BsMKAzL4Sr5OhGQbxBoZ
9FMAnj/yOfdMjxhNnjLFiYvdnY9+ansx
=LcsQ
-----END PGP SIGNATURE-----

Revision history for this message
John A Meinel (jameinel) wrote : Posted in a previous version of this proposal

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 2/9/2011 2:09 AM, Martin Pool wrote:
> Martin Pool has proposed merging lp:~mbp/bzr/715000-more-fallbacks into lp:bzr/2.2.
>
> Requested reviews:
> bzr-core (bzr-core)
>
> For more details, see:
> https://code.launchpad.net/~mbp/bzr/715000-more-fallbacks/+merge/49026
>
> follow-through from bug 715000: rename _fallback_vfs to _immediate_fallbacks to make it clear it's not the whole stack.

I don't really like changing the name of things in a stable series. Do
you feel this is really necessary?

 review: needs_information

John
=:->

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk1St2gACgkQJdeBCYSNAAPIYwCeJ4s9T48rbxRduTts3rarhkPu
1UMAoKDzNFENu713ShbJuPiCF9zDJQdi
=F4wU
-----END PGP SIGNATURE-----

review: Needs Information
Revision history for this message
John A Meinel (jameinel) wrote :

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 2/9/2011 2:16 AM, Martin Pool wrote:
> 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://code.launchpad.net/~mbp/bzr/715000-more-fallbacks/+merge/49028
>
> follow-through from bug 715000: rename _fallback_vfs to _immediate_fallbacks to make it clear it's not the whole stack.

I got something like 5 of these emails from you. I'm guessing some of
them were accidental, but it is unclear from the messages. Can you
clarify which ones of these you actually want reviewed?

John
=:->

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk1St5QACgkQJdeBCYSNAAPIcgCdHZbDk8uCtmjnymDQTgv5aDck
MKYAoIQY4xBvQpWhrWUVhZqEHTW0PMCU
=9S+7
-----END PGP SIGNATURE-----

Revision history for this message
Andrew Bennetts (spiv) wrote :

Like John, I think _immediate_fallbacks_vfs (or maybe _immediate_vfs_fallbacks?) would be a little clearer, because repositories also have a fallbacks attribute. I'm ok with whatever name you decide on.

The patch itself seems to be just a mechanical rename of the variable, plus the merge of the bug 715000 fix, so that all looks good.

review: Approve
Revision history for this message
Martin Pool (mbp) wrote :

I'll update it to _immediate_fallback_vfs

Revision history for this message
Martin Pool (mbp) wrote :

On 10 February 2011 02:49, John Arbash Meinel <email address hidden> wrote:
> I got something like 5 of these emails from you. I'm guessing some of
> them were accidental, but it is unclear from the messages. Can you
> clarify which ones of these you actually want reviewed?

not my fault - see https://bugs.launchpad.net/launchpad/+bug/716169 -
it should be clear on the web pages which ones are still alive.

Revision history for this message
Martin Pool (mbp) wrote :

sent to pqm by email

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'bzrlib/branch.py'
=== modified file 'bzrlib/builtins.py'
=== modified file 'bzrlib/bzrdir.py'
=== modified file 'bzrlib/groupcompress.py'
--- bzrlib/groupcompress.py 2011-02-09 06:35:00 +0000
+++ bzrlib/groupcompress.py 2011-02-14 03:03:52 +0000
@@ -1186,7 +1186,7 @@
1186 _unadded_refs = {}1186 _unadded_refs = {}
1187 self._unadded_refs = _unadded_refs1187 self._unadded_refs = _unadded_refs
1188 self._group_cache = LRUSizeCache(max_size=50*1024*1024)1188 self._group_cache = LRUSizeCache(max_size=50*1024*1024)
1189 self._fallback_vfs = []1189 self._immediate_fallback_vfs = []
11901190
1191 def without_fallbacks(self):1191 def without_fallbacks(self):
1192 """Return a clone of this object without any fallbacks configured."""1192 """Return a clone of this object without any fallbacks configured."""
@@ -1266,7 +1266,7 @@
12661266
1267 :param a_versioned_files: A VersionedFiles object.1267 :param a_versioned_files: A VersionedFiles object.
1268 """1268 """
1269 self._fallback_vfs.append(a_versioned_files)1269 self._immediate_fallback_vfs.append(a_versioned_files)
12701270
1271 def annotate(self, key):1271 def annotate(self, key):
1272 """See VersionedFiles.annotate."""1272 """See VersionedFiles.annotate."""
@@ -1342,7 +1342,7 @@
1342 and so on.1342 and so on.
1343 """1343 """
1344 result = {}1344 result = {}
1345 sources = [self._index] + self._fallback_vfs1345 sources = [self._index] + self._immediate_fallback_vfs
1346 source_results = []1346 source_results = []
1347 missing = set(keys)1347 missing = set(keys)
1348 for source in sources:1348 for source in sources:
@@ -1449,7 +1449,7 @@
1449 parent_map = {}1449 parent_map = {}
1450 key_to_source_map = {}1450 key_to_source_map = {}
1451 source_results = []1451 source_results = []
1452 for source in self._fallback_vfs:1452 for source in self._immediate_fallback_vfs:
1453 if not missing:1453 if not missing:
1454 break1454 break
1455 source_parents = source.get_parent_map(missing)1455 source_parents = source.get_parent_map(missing)
@@ -1832,7 +1832,7 @@
1832 """See VersionedFiles.keys."""1832 """See VersionedFiles.keys."""
1833 if 'evil' in debug.debug_flags:1833 if 'evil' in debug.debug_flags:
1834 trace.mutter_callsite(2, "keys scales with size of history")1834 trace.mutter_callsite(2, "keys scales with size of history")
1835 sources = [self._index] + self._fallback_vfs1835 sources = [self._index] + self._immediate_fallback_vfs
1836 result = set()1836 result = set()
1837 for source in sources:1837 for source in sources:
1838 result.update(source.keys())1838 result.update(source.keys())
18391839
=== modified file 'bzrlib/knit.py'
--- bzrlib/knit.py 2011-02-09 06:35:00 +0000
+++ bzrlib/knit.py 2011-02-14 03:03:52 +0000
@@ -883,7 +883,7 @@
883 self._factory = KnitAnnotateFactory()883 self._factory = KnitAnnotateFactory()
884 else:884 else:
885 self._factory = KnitPlainFactory()885 self._factory = KnitPlainFactory()
886 self._fallback_vfs = []886 self._immediate_fallback_vfs = []
887 self._reload_func = reload_func887 self._reload_func = reload_func
888888
889 def __repr__(self):889 def __repr__(self):
@@ -897,7 +897,7 @@
897897
898 :param a_versioned_files: A VersionedFiles object.898 :param a_versioned_files: A VersionedFiles object.
899 """899 """
900 self._fallback_vfs.append(a_versioned_files)900 self._immediate_fallback_vfs.append(a_versioned_files)
901901
902 def add_lines(self, key, parents, lines, parent_texts=None,902 def add_lines(self, key, parents, lines, parent_texts=None,
903 left_matching_blocks=None, nostore_sha=None, random_id=False,903 left_matching_blocks=None, nostore_sha=None, random_id=False,
@@ -1070,7 +1070,7 @@
1070 raise errors.KnitCorrupt(self,1070 raise errors.KnitCorrupt(self,
1071 "Missing basis parent %s for %s" % (1071 "Missing basis parent %s for %s" % (
1072 compression_parent, key))1072 compression_parent, key))
1073 for fallback_vfs in self._fallback_vfs:1073 for fallback_vfs in self._immediate_fallback_vfs:
1074 fallback_vfs.check()1074 fallback_vfs.check()
10751075
1076 def _check_add(self, key, lines, random_id, check_content):1076 def _check_add(self, key, lines, random_id, check_content):
@@ -1226,7 +1226,7 @@
1226 and so on.1226 and so on.
1227 """1227 """
1228 result = {}1228 result = {}
1229 sources = [self._index] + self._fallback_vfs1229 sources = [self._index] + self._immediate_fallback_vfs
1230 source_results = []1230 source_results = []
1231 missing = set(keys)1231 missing = set(keys)
1232 for source in sources:1232 for source in sources:
@@ -1526,7 +1526,7 @@
1526 yield KnitContentFactory(key, global_map[key],1526 yield KnitContentFactory(key, global_map[key],
1527 record_details, None, raw_data, self._factory.annotated, None)1527 record_details, None, raw_data, self._factory.annotated, None)
1528 else:1528 else:
1529 vf = self._fallback_vfs[parent_maps.index(source) - 1]1529 vf = self._immediate_fallback_vfs[parent_maps.index(source) - 1]
1530 for record in vf.get_record_stream(keys, ordering,1530 for record in vf.get_record_stream(keys, ordering,
1531 include_delta_closure):1531 include_delta_closure):
1532 yield record1532 yield record
@@ -1542,7 +1542,7 @@
1542 # record entry 2 is the 'digest'.1542 # record entry 2 is the 'digest'.
1543 result[key] = details[2]1543 result[key] = details[2]
1544 missing.difference_update(set(result))1544 missing.difference_update(set(result))
1545 for source in self._fallback_vfs:1545 for source in self._immediate_fallback_vfs:
1546 if not missing:1546 if not missing:
1547 break1547 break
1548 new_result = source.get_sha1s(missing)1548 new_result = source.get_sha1s(missing)
@@ -1619,7 +1619,7 @@
1619 raise RevisionNotPresent([record.key], self)1619 raise RevisionNotPresent([record.key], self)
1620 elif ((record.storage_kind in knit_types)1620 elif ((record.storage_kind in knit_types)
1621 and (compression_parent is None1621 and (compression_parent is None
1622 or not self._fallback_vfs1622 or not self._immediate_fallback_vfs
1623 or self._index.has_key(compression_parent)1623 or self._index.has_key(compression_parent)
1624 or not self.has_key(compression_parent))):1624 or not self.has_key(compression_parent))):
1625 # we can insert the knit record literally if either it has no1625 # we can insert the knit record literally if either it has no
@@ -1797,11 +1797,11 @@
1797 # vfs, and hope to find them there. Note that if the keys are found1797 # vfs, and hope to find them there. Note that if the keys are found
1798 # but had no changes or no content, the fallback may not return1798 # but had no changes or no content, the fallback may not return
1799 # anything.1799 # anything.
1800 if keys and not self._fallback_vfs:1800 if keys and not self._immediate_fallback_vfs:
1801 # XXX: strictly the second parameter is meant to be the file id1801 # XXX: strictly the second parameter is meant to be the file id
1802 # but it's not easily accessible here.1802 # but it's not easily accessible here.
1803 raise RevisionNotPresent(keys, repr(self))1803 raise RevisionNotPresent(keys, repr(self))
1804 for source in self._fallback_vfs:1804 for source in self._immediate_fallback_vfs:
1805 if not keys:1805 if not keys:
1806 break1806 break
1807 source_keys = set()1807 source_keys = set()
@@ -2016,7 +2016,7 @@
2016 """See VersionedFiles.keys."""2016 """See VersionedFiles.keys."""
2017 if 'evil' in debug.debug_flags:2017 if 'evil' in debug.debug_flags:
2018 trace.mutter_callsite(2, "keys scales with size of history")2018 trace.mutter_callsite(2, "keys scales with size of history")
2019 sources = [self._index] + self._fallback_vfs2019 sources = [self._index] + self._immediate_fallback_vfs
2020 result = set()2020 result = set()
2021 for source in sources:2021 for source in sources:
2022 result.update(source.keys())2022 result.update(source.keys())
@@ -2062,7 +2062,7 @@
20622062
2063 missing_keys = set(nonlocal_keys)2063 missing_keys = set(nonlocal_keys)
2064 # Read from remote versioned file instances and provide to our caller.2064 # Read from remote versioned file instances and provide to our caller.
2065 for source in self.vf._fallback_vfs:2065 for source in self.vf._immediate_fallback_vfs:
2066 if not missing_keys:2066 if not missing_keys:
2067 break2067 break
2068 # Loop over fallback repositories asking them for texts - ignore2068 # Loop over fallback repositories asking them for texts - ignore
@@ -3521,8 +3521,8 @@
3521 return records, ann_keys3521 return records, ann_keys
35223522
3523 def _get_needed_texts(self, key, pb=None):3523 def _get_needed_texts(self, key, pb=None):
3524 # if True or len(self._vf._fallback_vfs) > 0:3524 # if True or len(self._vf._immediate_fallback_vfs) > 0:
3525 if len(self._vf._fallback_vfs) > 0:3525 if len(self._vf._immediate_fallback_vfs) > 0:
3526 # If we have fallbacks, go to the generic path3526 # If we have fallbacks, go to the generic path
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):
3528 yield v3528 yield v
35293529
=== modified file 'bzrlib/plugins/launchpad/lp_api.py'
=== modified file 'bzrlib/repofmt/weaverepo.py'
=== modified file 'bzrlib/repository.py'
=== modified file 'bzrlib/tests/__init__.py'
=== modified file 'bzrlib/tests/blackbox/test_branch.py'
--- bzrlib/tests/blackbox/test_branch.py 2011-02-11 05:57:31 +0000
+++ bzrlib/tests/blackbox/test_branch.py 2011-02-14 03:03:52 +0000
@@ -28,7 +28,10 @@
28from bzrlib.repofmt.knitrepo import RepositoryFormatKnit128from bzrlib.repofmt.knitrepo import RepositoryFormatKnit1
29from bzrlib.tests import TestCaseWithTransport29from bzrlib.tests import TestCaseWithTransport
30from bzrlib.tests import (30from bzrlib.tests import (
31<<<<<<< TREE
31 fixtures,32 fixtures,
33=======
34>>>>>>> MERGE-SOURCE
32 HardlinkFeature,35 HardlinkFeature,
33 test_server,36 test_server,
34 )37 )
@@ -269,6 +272,7 @@
269 self.run_bzr('checkout --lightweight a b')272 self.run_bzr('checkout --lightweight a b')
270 self.assertLength(2, calls)273 self.assertLength(2, calls)
271274
275<<<<<<< TREE
272 def test_branch_fetches_all_tags(self):276 def test_branch_fetches_all_tags(self):
273 builder = self.make_branch_builder('source')277 builder = self.make_branch_builder('source')
274 source = fixtures.build_branch_with_non_ancestral_rev(builder)278 source = fixtures.build_branch_with_non_ancestral_rev(builder)
@@ -280,6 +284,22 @@
280 self.assertEqual('rev-2', new_branch.tags.lookup_tag('tag-a'))284 self.assertEqual('rev-2', new_branch.tags.lookup_tag('tag-a'))
281 new_branch.repository.get_revision('rev-2')285 new_branch.repository.get_revision('rev-2')
282286
287=======
288 def test_branch_fetches_all_tags(self):
289 builder = self.make_branch_builder('source')
290 builder.build_commit(message="Rev 1", rev_id='rev-1')
291 builder.build_commit(message="Rev 2", rev_id='rev-2')
292 source = builder.get_branch()
293 source.tags.set_tag('tag-a', 'rev-2')
294 source.set_last_revision_info(1, 'rev-1')
295 # Now source has a tag not in its ancestry. Make a branch from it.
296 self.run_bzr('branch source new-branch')
297 new_branch = branch.Branch.open('new-branch')
298 # The tag is present, and so is its revision.
299 self.assertEqual('rev-2', new_branch.tags.lookup_tag('tag-a'))
300 new_branch.repository.get_revision('rev-2')
301
302>>>>>>> MERGE-SOURCE
283303
284class TestBranchStacked(TestCaseWithTransport):304class TestBranchStacked(TestCaseWithTransport):
285 """Tests for branch --stacked"""305 """Tests for branch --stacked"""
@@ -461,6 +481,7 @@
461 # upwards without agreement from bzr's network support maintainers.481 # upwards without agreement from bzr's network support maintainers.
462 self.assertLength(14, self.hpss_calls)482 self.assertLength(14, self.hpss_calls)
463483
484<<<<<<< TREE
464 def test_branch_from_branch_with_tags(self):485 def test_branch_from_branch_with_tags(self):
465 self.setup_smart_server_with_call_log()486 self.setup_smart_server_with_call_log()
466 builder = self.make_branch_builder('source')487 builder = self.make_branch_builder('source')
@@ -477,6 +498,27 @@
477 # upwards without agreement from bzr's network support maintainers.498 # upwards without agreement from bzr's network support maintainers.
478 self.assertLength(9, self.hpss_calls)499 self.assertLength(9, self.hpss_calls)
479500
501=======
502 def test_branch_from_branch_with_tags(self):
503 self.setup_smart_server_with_call_log()
504 builder = self.make_branch_builder('source')
505 builder.build_commit(message="Rev 1", rev_id='rev-1')
506 builder.build_commit(message="Rev 2", rev_id='rev-2')
507 source = builder.get_branch()
508 source.tags.set_tag('tag-a', 'rev-2')
509 source.tags.set_tag('tag-missing', 'missing-rev')
510 source.set_last_revision_info(1, 'rev-1')
511 # Now source has a tag not in its ancestry. Make a branch from it.
512 self.reset_smart_call_log()
513 out, err = self.run_bzr(['branch', self.get_url('source'), 'target'])
514 # This figure represent the amount of work to perform this use case. It
515 # is entirely ok to reduce this number if a test fails due to rpc_count
516 # being too low. If rpc_count increases, more network roundtrips have
517 # become necessary for this use case. Please do not adjust this number
518 # upwards without agreement from bzr's network support maintainers.
519 self.assertLength(9, self.hpss_calls)
520
521>>>>>>> MERGE-SOURCE
480522
481class TestRemoteBranch(TestCaseWithSFTPServer):523class TestRemoteBranch(TestCaseWithSFTPServer):
482524
483525
=== modified file 'bzrlib/tests/blackbox/test_pull.py'
--- bzrlib/tests/blackbox/test_pull.py 2011-02-11 05:57:31 +0000
+++ bzrlib/tests/blackbox/test_pull.py 2011-02-14 03:03:52 +0000
@@ -145,6 +145,7 @@
145 self.run_bzr('pull -r 4')145 self.run_bzr('pull -r 4')
146 self.assertEqual(a.revision_history(), b.revision_history())146 self.assertEqual(a.revision_history(), b.revision_history())
147147
148<<<<<<< TREE
148 def test_pull_tags(self):149 def test_pull_tags(self):
149 """Tags are updated by pull, and revisions named in those tags are150 """Tags are updated by pull, and revisions named in those tags are
150 fetched.151 fetched.
@@ -160,6 +161,27 @@
160 # The tag is present, and so is its revision.161 # The tag is present, and so is its revision.
161 self.assertEqual('rev-2', target.tags.lookup_tag('tag-a'))162 self.assertEqual('rev-2', target.tags.lookup_tag('tag-a'))
162 target.repository.get_revision('rev-2')163 target.repository.get_revision('rev-2')
164=======
165 def test_pull_tags(self):
166 """Tags are updated by pull, and revisions named in those tags are
167 fetched.
168 """
169 # Make a source, sprout a target off it
170 builder = self.make_branch_builder('source')
171 builder.build_commit(message="Rev 1", rev_id='rev-1')
172 source = builder.get_branch()
173 target_bzrdir = source.bzrdir.sprout('target')
174 # Add a non-ancestry tag to source
175 builder.build_commit(message="Rev 2", rev_id='rev-2')
176 source.tags.set_tag('tag-a', 'rev-2')
177 source.set_last_revision_info(1, 'rev-1')
178 # Pull from source
179 self.run_bzr('pull -d target source')
180 target = target_bzrdir.open_branch()
181 # The tag is present, and so is its revision.
182 self.assertEqual('rev-2', target.tags.lookup_tag('tag-a'))
183 target.repository.get_revision('rev-2')
184>>>>>>> MERGE-SOURCE
163185
164 def test_overwrite_uptodate(self):186 def test_overwrite_uptodate(self):
165 # Make sure pull --overwrite overwrites187 # Make sure pull --overwrite overwrites
166188
=== modified file 'bzrlib/tests/per_branch/test_pull.py'
--- bzrlib/tests/per_branch/test_pull.py 2011-02-09 06:36:35 +0000
+++ bzrlib/tests/per_branch/test_pull.py 2011-02-14 03:03:52 +0000
@@ -25,11 +25,15 @@
25 memorytree,25 memorytree,
26 revision,26 revision,
27 )27 )
28<<<<<<< TREE
28from bzrlib.tests import (29from bzrlib.tests import (
29 fixtures,30 fixtures,
30 per_branch,31 per_branch,
31 TestNotApplicable,32 TestNotApplicable,
32 )33 )
34=======
35from bzrlib.tests import per_branch, TestNotApplicable
36>>>>>>> MERGE-SOURCE
3337
3438
35class TestPull(per_branch.TestCaseWithBranch):39class TestPull(per_branch.TestCaseWithBranch):
@@ -139,6 +143,7 @@
139 self.assertEqual(tree_b.branch.revision_history(),143 self.assertEqual(tree_b.branch.revision_history(),
140 tree_a.branch.revision_history())144 tree_a.branch.revision_history())
141145
146<<<<<<< TREE
142 def test_pull_merges_and_fetches_tags(self):147 def test_pull_merges_and_fetches_tags(self):
143 """Tags are updated by br.pull(source), and revisions named in those148 """Tags are updated by br.pull(source), and revisions named in those
144 tags are fetched.149 tags are fetched.
@@ -182,6 +187,58 @@
182 self.assertEqual('rev-2', target.tags.lookup_tag('tag-a'))187 self.assertEqual('rev-2', target.tags.lookup_tag('tag-a'))
183 target.repository.get_revision('rev-2')188 target.repository.get_revision('rev-2')
184189
190=======
191 def test_pull_merges_and_fetches_tags(self):
192 """Tags are updated by br.pull(source), and revisions named in those
193 tags are fetched.
194 """
195 # Make a source, sprout a target off it
196 try:
197 builder = self.make_branch_builder('source')
198 except errors.UninitializableFormat:
199 raise TestNotApplicable('uninitializeable format')
200 builder.build_commit(message="Rev 1", rev_id='rev-1')
201 source = builder.get_branch()
202 target = source.bzrdir.sprout('target').open_branch()
203 # Add a non-ancestry tag to source
204 builder.build_commit(message="Rev 2", rev_id='rev-2')
205 try:
206 source.tags.set_tag('tag-a', 'rev-2')
207 except errors.TagsNotSupported:
208 raise TestNotApplicable('format does not support tags.')
209 source.set_last_revision_info(1, 'rev-1')
210 # Pull from source
211 target.pull(source)
212 # The tag is present, and so is its revision.
213 self.assertEqual('rev-2', target.tags.lookup_tag('tag-a'))
214 target.repository.get_revision('rev-2')
215
216 def test_pull_stop_revision_merges_and_fetches_tags(self):
217 """br.pull(source, stop_revision=REV) updates and fetches tags."""
218 # Make a source, sprout a target off it
219 try:
220 builder = self.make_branch_builder('source')
221 except errors.UninitializableFormat:
222 raise TestNotApplicable('uninitializeable format')
223 builder.build_commit(message="Rev 1", rev_id='rev-1')
224 source = builder.get_branch()
225 target = source.bzrdir.sprout('target').open_branch()
226 # Add a non-ancestry tag to source
227 builder.build_commit(message="Rev 2", rev_id='rev-2')
228 try:
229 source.tags.set_tag('tag-a', 'rev-2')
230 except errors.TagsNotSupported:
231 raise TestNotApplicable('format does not support tags.')
232 source.set_last_revision_info(1, 'rev-1')
233 # Add a new commit to the ancestry
234 builder.build_commit(message="Rev 2 again", rev_id='rev-2-again')
235 # Pull from source
236 target.pull(source, 'rev-2-again')
237 # The tag is present, and so is its revision.
238 self.assertEqual('rev-2', target.tags.lookup_tag('tag-a'))
239 target.repository.get_revision('rev-2')
240
241>>>>>>> MERGE-SOURCE
185242
186class TestPullHook(per_branch.TestCaseWithBranch):243class TestPullHook(per_branch.TestCaseWithBranch):
187244
188245
=== modified file 'bzrlib/tests/per_controldir/test_controldir.py'
--- bzrlib/tests/per_controldir/test_controldir.py 2011-02-11 05:57:31 +0000
+++ bzrlib/tests/per_controldir/test_controldir.py 2011-02-14 03:03:52 +0000
@@ -673,6 +673,7 @@
673 target = dir.sprout(self.get_url('target'), revision_id='1')673 target = dir.sprout(self.get_url('target'), revision_id='1')
674 self.assertEqual('1', target.open_branch().last_revision())674 self.assertEqual('1', target.open_branch().last_revision())
675675
676<<<<<<< TREE
676 def test_sprout_bzrdir_branch_with_tags(self):677 def test_sprout_bzrdir_branch_with_tags(self):
677 # when sprouting a branch all revisions named in the tags are copied678 # when sprouting a branch all revisions named in the tags are copied
678 # too.679 # too.
@@ -767,6 +768,105 @@
767 ['base-rev', 'rev-b1', 'rev-b2', 'rev-c1', 'rev-c2'],768 ['base-rev', 'rev-b1', 'rev-b2', 'rev-c1', 'rev-c2'],
768 sorted(new_branch.repository.all_revision_ids()))769 sorted(new_branch.repository.all_revision_ids()))
769770
771=======
772 def test_sprout_bzrdir_branch_with_tags(self):
773 # when sprouting a branch all revisions named in the tags are copied
774 # too.
775 builder = self.make_branch_builder('source')
776 builder.build_commit(message="Rev 1", rev_id='rev-1')
777 builder.build_commit(message="Rev 2", rev_id='rev-2')
778 source = builder.get_branch()
779 try:
780 source.tags.set_tag('tag-a', 'rev-2')
781 except errors.TagsNotSupported:
782 raise TestNotApplicable('Branch format does not support tags.')
783 source.set_last_revision_info(1, 'rev-1')
784 # Now source has a tag not in its ancestry. Sprout its controldir.
785 dir = source.bzrdir
786 target = dir.sprout(self.get_url('target'))
787 # The tag is present, and so is its revision.
788 new_branch = target.open_branch()
789 self.assertEqual('rev-2', new_branch.tags.lookup_tag('tag-a'))
790 new_branch.repository.get_revision('rev-2')
791
792 def test_sprout_bzrdir_branch_with_absent_tag(self):
793 # tags referencing absent revisions are copied (and those absent
794 # revisions do not prevent the sprout.)
795 builder = self.make_branch_builder('source')
796 builder.build_commit(message="Rev 1", rev_id='rev-1')
797 source = builder.get_branch()
798 try:
799 source.tags.set_tag('tag-a', 'missing-rev')
800 except errors.TagsNotSupported:
801 raise TestNotApplicable('Branch format does not support tags.')
802 # Now source has a tag pointing to an absent revision. Sprout its
803 # controldir.
804 dir = source.bzrdir
805 target = dir.sprout(self.get_url('target'))
806 # The tag is present in the target
807 new_branch = target.open_branch()
808 self.assertEqual('missing-rev', new_branch.tags.lookup_tag('tag-a'))
809
810 def test_sprout_bzrdir_passing_source_branch_with_absent_tag(self):
811 # tags referencing absent revisions are copied (and those absent
812 # revisions do not prevent the sprout.)
813 builder = self.make_branch_builder('source')
814 builder.build_commit(message="Rev 1", rev_id='rev-1')
815 source = builder.get_branch()
816 try:
817 source.tags.set_tag('tag-a', 'missing-rev')
818 except errors.TagsNotSupported:
819 raise TestNotApplicable('Branch format does not support tags.')
820 # Now source has a tag pointing to an absent revision. Sprout its
821 # controldir.
822 dir = source.bzrdir
823 target = dir.sprout(self.get_url('target'), source_branch=source)
824 # The tag is present in the target
825 new_branch = target.open_branch()
826 self.assertEqual('missing-rev', new_branch.tags.lookup_tag('tag-a'))
827
828 def test_sprout_bzrdir_passing_rev_not_source_branch_copies_tags(self):
829 # dir.sprout(..., revision_id='rev1') copies rev1, and all the tags of
830 # the branch at that bzrdir, the ancestry of all of those, but no other
831 # revs (not even the tip of the source branch).
832 builder = self.make_branch_builder('source')
833 builder.build_commit(message="Base", rev_id='base-rev')
834 # Make three parallel lines of ancestry off this base.
835 source = builder.get_branch()
836 builder.build_commit(message="Rev A1", rev_id='rev-a1')
837 builder.build_commit(message="Rev A2", rev_id='rev-a2')
838 builder.build_commit(message="Rev A3", rev_id='rev-a3')
839 source.set_last_revision_info(1, 'base-rev')
840 builder.build_commit(message="Rev B1", rev_id='rev-b1')
841 builder.build_commit(message="Rev B2", rev_id='rev-b2')
842 builder.build_commit(message="Rev B3", rev_id='rev-b3')
843 source.set_last_revision_info(1, 'base-rev')
844 builder.build_commit(message="Rev C1", rev_id='rev-c1')
845 builder.build_commit(message="Rev C2", rev_id='rev-c2')
846 builder.build_commit(message="Rev C3", rev_id='rev-c3')
847 # Set the branch tip to A2
848 source.set_last_revision_info(3, 'rev-a2')
849 try:
850 # Create a tag for B2, and for an absent rev
851 source.tags.set_tag('tag-non-ancestry', 'rev-b2')
852 source.tags.set_tag('tag-absent', 'absent-rev')
853 except errors.TagsNotSupported:
854 raise TestNotApplicable('Branch format does not support tags.')
855 # And ask sprout for C2
856 dir = source.bzrdir
857 target = dir.sprout(self.get_url('target'), revision_id='rev-c2')
858 # The tags are present
859 new_branch = target.open_branch()
860 self.assertEqual(
861 {'tag-absent': 'absent-rev', 'tag-non-ancestry': 'rev-b2'},
862 new_branch.tags.get_tag_dict())
863 # And the revs for A2, B2 and C2's ancestries are present, but no
864 # others.
865 self.assertEqual(
866 ['base-rev', 'rev-b1', 'rev-b2', 'rev-c1', 'rev-c2'],
867 sorted(new_branch.repository.all_revision_ids()))
868
869>>>>>>> MERGE-SOURCE
770 def test_sprout_bzrdir_tree_branch_reference(self):870 def test_sprout_bzrdir_tree_branch_reference(self):
771 # sprouting should create a repository if needed and a sprouted branch.871 # sprouting should create a repository if needed and a sprouted branch.
772 # the tree state should not be copied.872 # the tree state should not be copied.
773873
=== modified file 'bzrlib/tests/per_repository_reference/test_graph.py'
--- bzrlib/tests/per_repository_reference/test_graph.py 2011-02-08 08:01:40 +0000
+++ bzrlib/tests/per_repository_reference/test_graph.py 2011-02-14 03:03:52 +0000
@@ -1,3 +1,4 @@
1<<<<<<< TREE
1# Copyright (C) 2011 Canonical Ltd2# Copyright (C) 2011 Canonical Ltd
2#3#
3# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
@@ -43,3 +44,50 @@
43 branch_c.set_stacked_on_url('../b')44 branch_c.set_stacked_on_url('../b')
44 revid_1 = wt_a.commit('first commit')45 revid_1 = wt_a.commit('first commit')
45 return branch_a, branch_b, branch_c, revid_146 return branch_a, branch_b, branch_c, revid_1
47=======
48# Copyright (C) 2011 Canonical Ltd
49#
50# This program is free software; you can redistribute it and/or modify
51# it under the terms of the GNU General Public License as published by
52# the Free Software Foundation; either version 2 of the License, or
53# (at your option) any later version.
54#
55# This program is distributed in the hope that it will be useful,
56# but WITHOUT ANY WARRANTY; without even the implied warranty of
57# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
58# GNU General Public License for more details.
59#
60# You should have received a copy of the GNU General Public License
61# along with this program; if not, write to the Free Software
62# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
63
64
65"""Tests for graph operations on stacked repositories."""
66
67
68from bzrlib.tests.per_repository import TestCaseWithRepository
69
70
71class TestGraph(TestCaseWithRepository):
72
73 def test_get_known_graph_ancestry_stacked(self):
74 """get_known_graph_ancestry works correctly on stacking.
75
76 See <https://bugs.launchpad.net/bugs/715000>.
77 """
78 branch_a, branch_b, branch_c, revid_1 = self.make_double_stacked_branches()
79 for br in [branch_a, branch_b, branch_c]:
80 self.assertEquals(
81 [revid_1],
82 br.repository.get_known_graph_ancestry([revid_1]).topo_sort())
83
84 def make_double_stacked_branches(self):
85 wt_a = self.make_branch_and_tree('a')
86 branch_a = wt_a.branch
87 branch_b = self.make_branch('b')
88 branch_b.set_stacked_on_url('../a')
89 branch_c = self.make_branch('c')
90 branch_c.set_stacked_on_url('../b')
91 revid_1 = wt_a.commit('first commit')
92 return branch_a, branch_b, branch_c, revid_1
93>>>>>>> MERGE-SOURCE
4694
=== modified file 'bzrlib/tests/test_bzrdir.py'
=== modified file 'bzrlib/tests/test_http.py'
=== modified file 'bzrlib/tests/test_remote.py'
=== modified file 'bzrlib/tests/test_repository.py'
=== modified file 'bzrlib/tests/test_server.py'
=== modified file 'bzrlib/versionedfile.py'
--- bzrlib/versionedfile.py 2011-02-09 06:35:00 +0000
+++ bzrlib/versionedfile.py 2011-02-14 03:03:52 +0000
@@ -1,7 +1,4 @@
1# Copyright (C) 2006-2010 Canonical Ltd1# Copyright (C) 2006-2011 Canonical Ltd
2#
3# Authors:
4# Johan Rydberg <jrydberg@gnu.org>
5#2#
6# This program is free software; you can redistribute it and/or modify3# This program is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by4# it under the terms of the GNU General Public License as published by
@@ -930,6 +927,10 @@
930927
931 The use of tuples allows a single code base to support several different928 The use of tuples allows a single code base to support several different
932 uses with only the mapping logic changing from instance to instance.929 uses with only the mapping logic changing from instance to instance.
930
931 :ivar _immediate_fallback_vfs: For subclasses that support stacking,
932 this is a list of other VersionedFiles immediately underneath this
933 one. They may in turn each have further fallbacks.
933 """934 """
934935
935 def add_lines(self, key, parents, lines, parent_texts=None,936 def add_lines(self, key, parents, lines, parent_texts=None,
@@ -1193,6 +1194,7 @@
1193 def _extract_blocks(self, version_id, source, target):1194 def _extract_blocks(self, version_id, source, target):
1194 return None1195 return None
11951196
1197<<<<<<< TREE
1196 def _transitive_fallbacks(self):1198 def _transitive_fallbacks(self):
1197 """Return the whole stack of fallback versionedfiles.1199 """Return the whole stack of fallback versionedfiles.
11981200
@@ -1206,6 +1208,21 @@
1206 all_fallbacks.extend(a_vfs._transitive_fallbacks())1208 all_fallbacks.extend(a_vfs._transitive_fallbacks())
1207 return all_fallbacks1209 return all_fallbacks
12081210
1211=======
1212 def _transitive_fallbacks(self):
1213 """Return the whole stack of fallback versionedfiles.
1214
1215 This VersionedFiles may have a list of fallbacks, but it doesn't
1216 necessarily know about the whole stack going down, and it can't know
1217 at open time because they may change after the objects are opened.
1218 """
1219 all_fallbacks = []
1220 for a_vfs in self._immediate_fallback_vfs:
1221 all_fallbacks.append(a_vfs)
1222 all_fallbacks.extend(a_vfs._transitive_fallbacks())
1223 return all_fallbacks
1224
1225>>>>>>> MERGE-SOURCE
12091226
1210class ThunkedVersionedFiles(VersionedFiles):1227class ThunkedVersionedFiles(VersionedFiles):
1211 """Storage for many versioned files thunked onto a 'VersionedFile' class.1228 """Storage for many versioned files thunked onto a 'VersionedFile' class.
12121229
=== modified file 'bzrlib/workingtree.py'
--- bzrlib/workingtree.py 2011-02-11 17:58:56 +0000
+++ bzrlib/workingtree.py 2011-02-14 03:03:52 +0000
@@ -2889,6 +2889,7 @@
28892889
2890 upgrade_recommended = False2890 upgrade_recommended = False
28912891
2892<<<<<<< TREE
2892 requires_normalized_unicode_filenames = False2893 requires_normalized_unicode_filenames = False
28932894
2894 case_sensitive_filename = "FoRMaT"2895 case_sensitive_filename = "FoRMaT"
@@ -2896,6 +2897,12 @@
2896 missing_parent_conflicts = False2897 missing_parent_conflicts = False
2897 """If this format supports missing parent conflicts."""2898 """If this format supports missing parent conflicts."""
28982899
2900=======
2901 requires_normalized_unicode_filenames = False
2902
2903 case_sensitive_filename = "FoRMaT"
2904
2905>>>>>>> MERGE-SOURCE
2899 @classmethod2906 @classmethod
2900 def find_format(klass, a_bzrdir):2907 def find_format(klass, a_bzrdir):
2901 """Return the format for the working tree object in a_bzrdir."""2908 """Return the format for the working tree object in a_bzrdir."""
@@ -2978,12 +2985,19 @@
29782985
2979 upgrade_recommended = True2986 upgrade_recommended = True
29802987
2988<<<<<<< TREE
2981 requires_normalized_unicode_filenames = True2989 requires_normalized_unicode_filenames = True
29822990
2983 case_sensitive_filename = "Branch-FoRMaT"2991 case_sensitive_filename = "Branch-FoRMaT"
29842992
2985 missing_parent_conflicts = False2993 missing_parent_conflicts = False
29862994
2995=======
2996 requires_normalized_unicode_filenames = True
2997
2998 case_sensitive_filename = "Branch-FoRMaT"
2999
3000>>>>>>> MERGE-SOURCE
2987 def get_format_description(self):3001 def get_format_description(self):
2988 """See WorkingTreeFormat.get_format_description()."""3002 """See WorkingTreeFormat.get_format_description()."""
2989 return "Working tree format 2"3003 return "Working tree format 2"
29903004
=== modified file 'bzrlib/workingtree_4.py'
=== modified file 'doc/en/release-notes/bzr-2.2.txt'
--- doc/en/release-notes/bzr-2.2.txt 2011-02-09 08:24:25 +0000
+++ doc/en/release-notes/bzr-2.2.txt 2011-02-14 03:03:52 +0000
@@ -2,80 +2,156 @@
2Bazaar Release Notes2Bazaar Release Notes
3####################3####################
44
5.. contents:: List of Releases5<<<<<<< TREE
6 :depth: 16.. contents:: List of Releases
77 :depth: 1
8bzr 2.2.58
9#########9bzr 2.2.5
1010#########
11:Codename: Suggestions welcome11
12:2.2.5: NOT RELEASED YET12:Codename: Suggestions welcome
1313:2.2.5: NOT RELEASED YET
14Compatibility Breaks14
15********************15Compatibility Breaks
1616********************
17New Features17
18************18New Features
1919************
20Bug Fixes20
21*********21Bug Fixes
2222*********
23* Correctly handle ``bzr log`` and `get_known_graph_ancestry` on a23
24 doubly-stacked branch.24* Correctly handle ``bzr log`` and `get_known_graph_ancestry` on a
25 (James Westby, Martin Pool, #715000)25 doubly-stacked branch.
2626 (James Westby, Martin Pool, #715000)
27Improvements27
28************28Improvements
2929************
30Documentation30
31*************31Documentation
3232*************
33API Changes33
34***********34API Changes
3535***********
36Internals36
37*********37Internals
3838*********
39Testing39
40*******40Testing
4141*******
4242
43bzr 2.2.443
44#########44bzr 2.2.4
4545#########
46:2.2.4: 2011-02-0446
4747:2.2.4: 2011-02-04
48This is a bugfix release. Only one bug has been fixed, a regression from 2.2.348
49involving only certain operations with launchpad. Upgrading is recommended for49This is a bugfix release. Only one bug has been fixed, a regression from 2.2.3
50all users on earlier 2.2 releases.50involving only certain operations with launchpad. Upgrading is recommended for
5151all users on earlier 2.2 releases.
52Bug Fixes52
53*********53Bug Fixes
5454*********
55* Fix communications with the Launchpad web service when using55
56 launchpadlib >= 1.5.5. This was a latent bug in bzr's communication56* Fix communications with the Launchpad web service when using
57 with Launchpad's production instance, which only became a problem when57 launchpadlib >= 1.5.5. This was a latent bug in bzr's communication
58 the default instance was switched from edge to production in bzr 2.2.3.58 with Launchpad's production instance, which only became a problem when
59 (Max Bowsher, #707075)59 the default instance was switched from edge to production in bzr 2.2.3.
6060 (Max Bowsher, #707075)
6161
62bzr 2.2.362
63#########63bzr 2.2.3
6464#########
65:2.2.3: 2011-01-2065
6666:2.2.3: 2011-01-20
67This is a bugfix release. Upgrading is recommended for all users67
68on earlier 2.2 releases.68This is a bugfix release. Upgrading is recommended for all users
6969on earlier 2.2 releases.
70Compatibility Breaks70
71********************71Compatibility Breaks
7272********************
73* Launchpad has announced that the ``edge.launchpad.net`` instance is73
74 deprecated and may be shut down in the future74* Launchpad has announced that the ``edge.launchpad.net`` instance is
75 <http://blog.launchpad.net/general/edge-is-deprecated>. Bazaar has therefore75 deprecated and may be shut down in the future
76 been updated in this release to talk to the main (``launchpad.net``) servers,76 <http://blog.launchpad.net/general/edge-is-deprecated>. Bazaar has therefore
77 rather than the ``edge`` ones. (Vincent Ladeuil, #583667)77 been updated in this release to talk to the main (``launchpad.net``) servers,
7878 rather than the ``edge`` ones. (Vincent Ladeuil, #583667)
79
80=======
81.. contents:: List of Releases
82 :depth: 1
83
84bzr 2.2.5
85#########
86
87:Codename: Suggestions welcome
88:2.2.5: NOT RELEASED YET
89
90Compatibility Breaks
91********************
92
93New Features
94************
95
96Bug Fixes
97*********
98
99* Correctly handle ``bzr log`` and `get_known_graph_ancestry` on a
100 doubly-stacked branch.
101 (James Westby, Martin Pool, #715000)
102
103Improvements
104************
105
106Documentation
107*************
108
109API Changes
110***********
111
112Internals
113*********
114
115Testing
116*******
117
118
119bzr 2.2.4
120#########
121
122:2.2.4: 2011-02-04
123
124This is a bugfix release. Only one bug has been fixed, a regression from 2.2.3
125involving only certain operations with launchpad. Upgrading is recommended for
126all users on earlier 2.2 releases.
127
128Bug Fixes
129*********
130
131* Fix communications with the Launchpad web service when using
132 launchpadlib >= 1.5.5. This was a latent bug in bzr's communication
133 with Launchpad's production instance, which only became a problem when
134 the default instance was switched from edge to production in bzr 2.2.3.
135 (Max Bowsher, #707075)
136
137
138bzr 2.2.3
139#########
140
141:2.2.3: 2011-01-20
142
143This is a bugfix release. Upgrading is recommended for all users
144on earlier 2.2 releases.
145
146Compatibility Breaks
147********************
148
149* Launchpad has announced that the ``edge.launchpad.net`` instance is
150 deprecated and may be shut down in the future
151 <http://blog.launchpad.net/general/edge-is-deprecated>. Bazaar has therefore
152 been updated in this release to talk to the main (``launchpad.net``) servers,
153 rather than the ``edge`` ones. (Vincent Ladeuil, #583667)
154>>>>>>> MERGE-SOURCE
79bzr 2.2.4155bzr 2.2.4
80#########156#########
81157
82158
=== modified file 'doc/en/release-notes/bzr-2.4.txt'
--- doc/en/release-notes/bzr-2.4.txt 2011-02-11 17:12:35 +0000
+++ doc/en/release-notes/bzr-2.4.txt 2011-02-14 03:03:52 +0000
@@ -1,3 +1,4 @@
1<<<<<<< TREE
1####################2####################
2Bazaar Release Notes3Bazaar Release Notes
3####################4####################
@@ -147,3 +148,131 @@
147148
148..149..
149 vim: tw=74 ft=rst ff=unix150 vim: tw=74 ft=rst ff=unix
151=======
152####################
153Bazaar Release Notes
154####################
155
156.. toctree::
157 :maxdepth: 1
158
159bzr 2.4b1
160#########
161
162:2.4b1: NOT RELEASED YET
163
164External Compatibility Breaks
165*****************************
166
167.. These may require users to change the way they use Bazaar.
168
169New Features
170************
171
172.. New commands, options, etc that users may wish to try out.
173
174* The ``lp:`` directory service now supports Launchpad's QA staging.
175 (Jelmer Vernooij, #667483)
176
177* External merge tools can now be configured in bazaar.conf. See
178 ``bzr help configuration`` for more information. (Gordon Tyler, #489915)
179
180Improvements
181************
182
183.. Improvements to existing commands, especially improved performance
184 or memory usage, or better results.
185
186* A new hidden command ``bzr repair-workingtree``. This is a way to force
187 the dirstate file to be rebuilt, rather than using a ``bzr checkout``
188 workaround. (John Arbash Meinel)
189
190* Branching, merging and pulling a branch now copies revisions named in
191 tags, not just the tag metadata. (Andrew Bennetts, #309682)
192
193* ``bzr cat-revision`` no longer requires a working tree. (Jelmer Vernooij, #704405)
194
195Bug Fixes
196*********
197
198.. Fixes for situations where bzr would previously crash or give incorrect
199 or undesirable results.
200
201* ``bzr push --overwrite`` with an older revision specified will now correctly
202 roll back the target branch. (Jelmer Vernooij, #386576)
203
204* ``bzr lp-propose`` can now propose merges against packaging branches on
205 Launchpad without requiring the target branch to be specified.
206 (Jelmer Vernooij, #704647)
207
208* ``bzr lp-propose`` no longer requires a reviewer to be specified. It will
209 instead leave setting the reviewer up to Launchpad if it was not specified.
210 (Jelmer Vernooij, #583772)
211
212* ``bzr pull`` will now exit with exit code 1 if there were tag conflicts.
213 (Jelmer Vernooij, #213185)
214
215* ``bzr mv`` user errors no longer throw UnicodeEncodeError with non-ascii
216 paths, however they may still print junk if not on a UTF-8 terminal.
217 (Martin [gz], #707954)
218
219* ``bzr serve`` no longer crashes when a server_started hook is installed and
220 IPv6 support is available on the system. (Jelmer Vernooij, #293697)
221
222* ``bzr whoami`` will now display an error if both a new identity and
223 ``--email`` were specified. (Jelmer Vernooij, #680449)
224
225* ``launchpadlib`` doesn't provide the ``uris`` module in some old versions.
226 (Vincent Ladeuil, #706835)
227
228* Empty entries in the ``NO_PROXY`` variable are no longer treated as matching
229 every host.
230 (Martin Pool, #586341)
231
232* Plugins incompatible with the current version of bzr no longer produce a
233 warning on every command invocation. Instead, a message is shown by
234 ``bzr plugins`` and in crash reports.
235 (#704195, Martin Pool)
236
237Documentation
238*************
239
240.. Improved or updated documentation.
241
242API Changes
243***********
244
245.. Changes that may require updates in plugins or other code that uses
246 bzrlib.
247
248* Added ``bzrlib.mergetools`` module with helper functions for working with
249 the list of external merge tools. (Gordon Tyler, #489915)
250
251* ``Branch.fetch`` implementations must now accept an optional
252 ``fetch_spec`` keyword argument. (Andrew Bennetts)
253
254* ``Branch.import_last_revision_info`` is deprecated. Use the
255 ``import_last_revision_info_and_tags`` method instead.
256 (Andrew Bennetts)
257
258* The ``revision_id`` parameter of
259 ``Repository.search_missing_revision_ids`` and
260 ``InterRepository.search_missing_revision_ids`` is deprecated. It is
261 replaced by the ``revision_ids`` parameter. (Andrew Bennetts)
262
263Internals
264*********
265
266.. Major internal changes, unlikely to be visible to users or plugin
267 developers, but interesting for bzr developers.
268
269Testing
270*******
271
272.. Fixes and changes that are only relevant to bzr's test framework and
273 suite. This can include new facilities for writing tests, fixes to
274 spurious test failures and changes to the way things should be tested.
275
276..
277 vim: tw=74 ft=rst ff=unix
278>>>>>>> MERGE-SOURCE