Rev 6032: Merge trunk to avoid conflicts in file:///home/vila/src/bzr/cleanup/trace-deprecations/
Vincent Ladeuil
v.ladeuil+lp at free.fr
Fri Jul 15 15:11:50 UTC 2011
At file:///home/vila/src/bzr/cleanup/trace-deprecations/
------------------------------------------------------------
revno: 6032 [merge]
revision-id: v.ladeuil+lp at free.fr-20110715151150-7i11w0xc6u6md51g
parent: v.ladeuil+lp at free.fr-20110715151038-3t48vnp2p4ivjyuu
parent: pqm at pqm.ubuntu.com-20110715150852-zin0b58lmxzw0ym6
committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
branch nick: trace-deprecations
timestamp: Fri 2011-07-15 17:11:50 +0200
message:
Merge trunk to avoid conflicts
modified:
bzrlib/atomicfile.py atomicfile.py-20050509044450-dbd24e6c564f7c66
bzrlib/log.py log.py-20050505065812-c40ce11702fe5fb1
bzrlib/tests/test_atomicfile.py test_atomicfile.py-20060809005022-s7psq6himv0hpm3v-1
bzrlib/tests/test_log.py testlog.py-20050728115707-1a514809d7d49309
bzrlib/tests/test_remote.py test_remote.py-20060720103555-yeeg2x51vn0rbtdp-2
doc/en/release-notes/bzr-2.5.txt bzr2.5.txt-20110708125756-587p0hpw7oke4h05-1
-------------- next part --------------
=== modified file 'bzrlib/atomicfile.py'
--- a/bzrlib/atomicfile.py 2011-06-28 21:47:24 +0000
+++ b/bzrlib/atomicfile.py 2011-07-15 09:04:54 +0000
@@ -80,13 +80,6 @@
if stat.S_IMODE(st.st_mode) != new_mode:
os.chmod(self.tmpfilename, new_mode)
- def _get_closed(self):
- symbol_versioning.warn('AtomicFile.closed deprecated in bzr 0.10',
- DeprecationWarning, stacklevel=2)
- return self._fd is None
-
- closed = property(_get_closed)
-
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__,
self.realfilename)
=== modified file 'bzrlib/log.py'
--- a/bzrlib/log.py 2011-07-12 11:09:57 +0000
+++ b/bzrlib/log.py 2011-07-15 13:52:32 +0000
@@ -89,10 +89,6 @@
get_terminal_encoding,
terminal_width,
)
-from bzrlib.symbol_versioning import (
- deprecated_function,
- deprecated_in,
- )
def find_touching_revisions(branch, file_id):
@@ -292,7 +288,6 @@
the empty string to match any of the preceding properties.
"""
-
# Take care of old style message_search parameter
if message_search:
if match:
@@ -302,7 +297,6 @@
match['message'] = [message_search]
else:
match={ 'message': [message_search] }
-
return {
'direction': direction,
'specific_fileids': specific_fileids,
@@ -803,25 +797,6 @@
yield rev_id, '.'.join(map(str, revno)), merge_depth
- at deprecated_function(deprecated_in((2, 2, 0)))
-def calculate_view_revisions(branch, start_revision, end_revision, direction,
- specific_fileid, generate_merge_revisions):
- """Calculate the revisions to view.
-
- :return: An iterator of (revision_id, dotted_revno, merge_depth) tuples OR
- a list of the same tuples.
- """
- start_rev_id, end_rev_id = _get_revision_limits(branch, start_revision,
- end_revision)
- view_revisions = list(_calc_view_revisions(branch, start_rev_id, end_rev_id,
- direction, generate_merge_revisions or specific_fileid))
- if specific_fileid:
- view_revisions = _filter_revisions_touching_file_id(branch,
- specific_fileid, view_revisions,
- include_merges=generate_merge_revisions)
- return _rebase_merge_depth(view_revisions)
-
-
def _rebase_merge_depth(view_revisions):
"""Adjust depths upwards so the top level is 0."""
# If either the first or last revision have a merge_depth of 0, we're done
@@ -887,7 +862,7 @@
"""
if match is None:
return log_rev_iterator
- searchRE = [(k, [re.compile(x, re.IGNORECASE) for x in v])
+ searchRE = [(k, [re.compile(x, re.IGNORECASE) for x in v])
for (k,v) in match.iteritems()]
return _filter_re(searchRE, log_rev_iterator)
@@ -905,9 +880,8 @@
'author': (rev.get_apparent_authors()),
'bugs': list(rev.iter_bugs())
}
- strings[''] = [item for inner_list in strings.itervalues()
+ strings[''] = [item for inner_list in strings.itervalues()
for item in inner_list]
-
for (k,v) in searchRE:
if k in strings and not _match_any_filter(strings[k], v):
return False
@@ -1184,50 +1158,6 @@
return mainline_revs, rev_nos, start_rev_id, end_rev_id
- at deprecated_function(deprecated_in((2, 2, 0)))
-def _filter_revision_range(view_revisions, start_rev_id, end_rev_id):
- """Filter view_revisions based on revision ranges.
-
- :param view_revisions: A list of (revision_id, dotted_revno, merge_depth)
- tuples to be filtered.
-
- :param start_rev_id: If not NONE specifies the first revision to be logged.
- If NONE then all revisions up to the end_rev_id are logged.
-
- :param end_rev_id: If not NONE specifies the last revision to be logged.
- If NONE then all revisions up to the end of the log are logged.
-
- :return: The filtered view_revisions.
- """
- if start_rev_id or end_rev_id:
- revision_ids = [r for r, n, d in view_revisions]
- if start_rev_id:
- start_index = revision_ids.index(start_rev_id)
- else:
- start_index = 0
- if start_rev_id == end_rev_id:
- end_index = start_index
- else:
- if end_rev_id:
- end_index = revision_ids.index(end_rev_id)
- else:
- end_index = len(view_revisions) - 1
- # To include the revisions merged into the last revision,
- # extend end_rev_id down to, but not including, the next rev
- # with the same or lesser merge_depth
- end_merge_depth = view_revisions[end_index][2]
- try:
- for index in xrange(end_index+1, len(view_revisions)+1):
- if view_revisions[index][2] <= end_merge_depth:
- end_index = index - 1
- break
- except IndexError:
- # if the search falls off the end then log to the end as well
- end_index = len(view_revisions) - 1
- view_revisions = view_revisions[start_index:end_index+1]
- return view_revisions
-
-
def _filter_revisions_touching_file_id(branch, file_id, view_revisions,
include_merges=True):
r"""Return the list of revision ids which touch a given file id.
@@ -1312,47 +1242,6 @@
return result
- at deprecated_function(deprecated_in((2, 2, 0)))
-def get_view_revisions(mainline_revs, rev_nos, branch, direction,
- include_merges=True):
- """Produce an iterator of revisions to show
- :return: an iterator of (revision_id, revno, merge_depth)
- (if there is no revno for a revision, None is supplied)
- """
- if not include_merges:
- revision_ids = mainline_revs[1:]
- if direction == 'reverse':
- revision_ids.reverse()
- for revision_id in revision_ids:
- yield revision_id, str(rev_nos[revision_id]), 0
- return
- graph = branch.repository.get_graph()
- # This asks for all mainline revisions, which means we only have to spider
- # sideways, rather than depth history. That said, its still size-of-history
- # and should be addressed.
- # mainline_revisions always includes an extra revision at the beginning, so
- # don't request it.
- parent_map = dict(((key, value) for key, value in
- graph.iter_ancestry(mainline_revs[1:]) if value is not None))
- # filter out ghosts; merge_sort errors on ghosts.
- rev_graph = _mod_repository._strip_NULL_ghosts(parent_map)
- merge_sorted_revisions = tsort.merge_sort(
- rev_graph,
- mainline_revs[-1],
- mainline_revs,
- generate_revno=True)
-
- if direction == 'forward':
- # forward means oldest first.
- merge_sorted_revisions = reverse_by_depth(merge_sorted_revisions)
- elif direction != 'reverse':
- raise ValueError('invalid direction %r' % direction)
-
- for (sequence, rev_id, merge_depth, revno, end_of_merge
- ) in merge_sorted_revisions:
- yield rev_id, '.'.join(map(str, revno)), merge_depth
-
-
def reverse_by_depth(merge_sorted_revisions, _depth=0):
"""Reverse revisions by depth.
@@ -1956,12 +1845,6 @@
'The committer')
-def show_one_log(revno, rev, delta, verbose, to_file, show_timezone):
- # deprecated; for compatibility
- lf = LongLogFormatter(to_file=to_file, show_timezone=show_timezone)
- lf.show(revno, rev, delta)
-
-
def show_changed_revisions(branch, old_rh, new_rh, to_file=None,
log_format='long'):
"""Show the change in revision history comparing the old revision history to the new one.
=== modified file 'bzrlib/tests/test_atomicfile.py'
--- a/bzrlib/tests/test_atomicfile.py 2011-05-13 12:51:05 +0000
+++ b/bzrlib/tests/test_atomicfile.py 2011-07-15 09:04:54 +0000
@@ -124,30 +124,3 @@
f.commit()
st = os.lstat('test')
self.assertEqualMode(0666 & ~umask, stat.S_IMODE(st.st_mode))
-
- def test_closed(self):
- local_warnings = []
- def capture_warnings(msg, cls, stacklevel=None):
- self.assertEqual(cls, DeprecationWarning)
- local_warnings.append(msg)
-
- method = symbol_versioning.warn
- try:
- symbol_versioning.set_warning_method(capture_warnings)
- f = atomicfile.AtomicFile('test', mode='wb')
- self.assertEqual(False, f.closed)
- f.abort()
- self.assertEqual(True, f.closed)
-
- f = atomicfile.AtomicFile('test', mode='wb')
- f.close()
- self.assertEqual(True, f.closed)
-
- f = atomicfile.AtomicFile('test', mode='wb')
- f.commit()
- self.assertEqual(True, f.closed)
- finally:
- symbol_versioning.set_warning_method(method)
-
- txt = 'AtomicFile.closed deprecated in bzr 0.10'
- self.assertEqual([txt]*4, local_warnings)
=== modified file 'bzrlib/tests/test_log.py'
--- a/bzrlib/tests/test_log.py 2011-04-08 03:47:34 +0000
+++ b/bzrlib/tests/test_log.py 2011-07-15 13:49:47 +0000
@@ -983,349 +983,6 @@
wt.branch, log.GnuChangelogLogFormatter,
show_log_kwargs=dict(verbose=True))
-class TestGetViewRevisions(tests.TestCaseWithTransport, TestLogMixin):
-
- def _get_view_revisions(self, *args, **kwargs):
- return self.applyDeprecated(symbol_versioning.deprecated_in((2, 2, 0)),
- log.get_view_revisions, *args, **kwargs)
-
- def make_tree_with_commits(self):
- """Create a tree with well-known revision ids"""
- wt = self.make_branch_and_tree('tree1')
- self.wt_commit(wt, 'commit one', rev_id='1')
- self.wt_commit(wt, 'commit two', rev_id='2')
- self.wt_commit(wt, 'commit three', rev_id='3')
- mainline_revs = [None, '1', '2', '3']
- rev_nos = {'1': 1, '2': 2, '3': 3}
- return mainline_revs, rev_nos, wt
-
- def make_tree_with_merges(self):
- """Create a tree with well-known revision ids and a merge"""
- mainline_revs, rev_nos, wt = self.make_tree_with_commits()
- tree2 = wt.bzrdir.sprout('tree2').open_workingtree()
- self.wt_commit(tree2, 'four-a', rev_id='4a')
- wt.merge_from_branch(tree2.branch)
- self.wt_commit(wt, 'four-b', rev_id='4b')
- mainline_revs.append('4b')
- rev_nos['4b'] = 4
- # 4a: 3.1.1
- return mainline_revs, rev_nos, wt
-
- def make_branch_with_many_merges(self):
- """Create a tree with well-known revision ids"""
- builder = self.make_branch_builder('tree1')
- builder.start_series()
- builder.build_snapshot('1', None, [
- ('add', ('', 'TREE_ROOT', 'directory', '')),
- ('add', ('f', 'f-id', 'file', '1\n'))])
- builder.build_snapshot('2', ['1'], [])
- builder.build_snapshot('3a', ['2'], [
- ('modify', ('f-id', '1\n2\n3a\n'))])
- builder.build_snapshot('3b', ['2', '3a'], [
- ('modify', ('f-id', '1\n2\n3a\n'))])
- builder.build_snapshot('3c', ['2', '3b'], [
- ('modify', ('f-id', '1\n2\n3a\n'))])
- builder.build_snapshot('4a', ['3b'], [])
- builder.build_snapshot('4b', ['3c', '4a'], [])
- builder.finish_series()
-
- # 1
- # |
- # 2-.
- # |\ \
- # | | 3a
- # | |/
- # | 3b
- # |/|
- # 3c4a
- # |/
- # 4b
-
- mainline_revs = [None, '1', '2', '3c', '4b']
- rev_nos = {'1':1, '2':2, '3c': 3, '4b':4}
- full_rev_nos_for_reference = {
- '1': '1',
- '2': '2',
- '3a': '2.1.1', #first commit tree 3
- '3b': '2.2.1', # first commit tree 2
- '3c': '3', #merges 3b to main
- '4a': '2.2.2', # second commit tree 2
- '4b': '4', # merges 4a to main
- }
- return mainline_revs, rev_nos, builder.get_branch()
-
- def test_get_view_revisions_forward(self):
- """Test the get_view_revisions method"""
- mainline_revs, rev_nos, wt = self.make_tree_with_commits()
- wt.lock_read()
- self.addCleanup(wt.unlock)
- revisions = list(self._get_view_revisions(
- mainline_revs, rev_nos, wt.branch, 'forward'))
- self.assertEqual([('1', '1', 0), ('2', '2', 0), ('3', '3', 0)],
- revisions)
- revisions2 = list(self._get_view_revisions(
- mainline_revs, rev_nos, wt.branch, 'forward',
- include_merges=False))
- self.assertEqual(revisions, revisions2)
-
- def test_get_view_revisions_reverse(self):
- """Test the get_view_revisions with reverse"""
- mainline_revs, rev_nos, wt = self.make_tree_with_commits()
- wt.lock_read()
- self.addCleanup(wt.unlock)
- revisions = list(self._get_view_revisions(
- mainline_revs, rev_nos, wt.branch, 'reverse'))
- self.assertEqual([('3', '3', 0), ('2', '2', 0), ('1', '1', 0), ],
- revisions)
- revisions2 = list(self._get_view_revisions(
- mainline_revs, rev_nos, wt.branch, 'reverse',
- include_merges=False))
- self.assertEqual(revisions, revisions2)
-
- def test_get_view_revisions_merge(self):
- """Test get_view_revisions when there are merges"""
- mainline_revs, rev_nos, wt = self.make_tree_with_merges()
- wt.lock_read()
- self.addCleanup(wt.unlock)
- revisions = list(self._get_view_revisions(
- mainline_revs, rev_nos, wt.branch, 'forward'))
- self.assertEqual([('1', '1', 0), ('2', '2', 0), ('3', '3', 0),
- ('4b', '4', 0), ('4a', '3.1.1', 1)],
- revisions)
- revisions = list(self._get_view_revisions(
- mainline_revs, rev_nos, wt.branch, 'forward',
- include_merges=False))
- self.assertEqual([('1', '1', 0), ('2', '2', 0), ('3', '3', 0),
- ('4b', '4', 0)],
- revisions)
-
- def test_get_view_revisions_merge_reverse(self):
- """Test get_view_revisions in reverse when there are merges"""
- mainline_revs, rev_nos, wt = self.make_tree_with_merges()
- wt.lock_read()
- self.addCleanup(wt.unlock)
- revisions = list(self._get_view_revisions(
- mainline_revs, rev_nos, wt.branch, 'reverse'))
- self.assertEqual([('4b', '4', 0), ('4a', '3.1.1', 1),
- ('3', '3', 0), ('2', '2', 0), ('1', '1', 0)],
- revisions)
- revisions = list(self._get_view_revisions(
- mainline_revs, rev_nos, wt.branch, 'reverse',
- include_merges=False))
- self.assertEqual([('4b', '4', 0), ('3', '3', 0), ('2', '2', 0),
- ('1', '1', 0)],
- revisions)
-
- def test_get_view_revisions_merge2(self):
- """Test get_view_revisions when there are merges"""
- mainline_revs, rev_nos, b = self.make_branch_with_many_merges()
- b.lock_read()
- self.addCleanup(b.unlock)
- revisions = list(self._get_view_revisions(
- mainline_revs, rev_nos, b, 'forward'))
- expected = [('1', '1', 0), ('2', '2', 0), ('3c', '3', 0),
- ('3b', '2.2.1', 1), ('3a', '2.1.1', 2), ('4b', '4', 0),
- ('4a', '2.2.2', 1)]
- self.assertEqual(expected, revisions)
- revisions = list(self._get_view_revisions(
- mainline_revs, rev_nos, b, 'forward',
- include_merges=False))
- self.assertEqual([('1', '1', 0), ('2', '2', 0), ('3c', '3', 0),
- ('4b', '4', 0)],
- revisions)
-
- def test_file_id_for_range(self):
- mainline_revs, rev_nos, b = self.make_branch_with_many_merges()
- b.lock_read()
- self.addCleanup(b.unlock)
-
- def rev_from_rev_id(revid, branch):
- revspec = revisionspec.RevisionSpec.from_string('revid:%s' % revid)
- return revspec.in_history(branch)
-
- def view_revs(start_rev, end_rev, file_id, direction):
- revs = self.applyDeprecated(
- symbol_versioning.deprecated_in((2, 2, 0)),
- log.calculate_view_revisions,
- b,
- start_rev, # start_revision
- end_rev, # end_revision
- direction, # direction
- file_id, # specific_fileid
- True, # generate_merge_revisions
- )
- return revs
-
- rev_3a = rev_from_rev_id('3a', b)
- rev_4b = rev_from_rev_id('4b', b)
- self.assertEqual([('3c', '3', 0), ('3b', '2.2.1', 1),
- ('3a', '2.1.1', 2)],
- view_revs(rev_3a, rev_4b, 'f-id', 'reverse'))
- # Note: 3c still appears before 3a here because of depth-based sorting
- self.assertEqual([('3c', '3', 0), ('3b', '2.2.1', 1),
- ('3a', '2.1.1', 2)],
- view_revs(rev_3a, rev_4b, 'f-id', 'forward'))
-
-
-class TestGetRevisionsTouchingFileID(tests.TestCaseWithTransport):
-
- def get_view_revisions(self, *args):
- return self.applyDeprecated(symbol_versioning.deprecated_in((2, 2, 0)),
- log.get_view_revisions, *args)
-
- def create_tree_with_single_merge(self):
- """Create a branch with a moderate layout.
-
- The revision graph looks like:
-
- A
- |\
- B C
- |/
- D
-
- In this graph, A introduced files f1 and f2 and f3.
- B modifies f1 and f3, and C modifies f2 and f3.
- D merges the changes from B and C and resolves the conflict for f3.
- """
- # TODO: jam 20070218 This seems like it could really be done
- # with make_branch_and_memory_tree() if we could just
- # create the content of those files.
- # TODO: jam 20070218 Another alternative is that we would really
- # like to only create this tree 1 time for all tests that
- # use it. Since 'log' only uses the tree in a readonly
- # fashion, it seems a shame to regenerate an identical
- # tree for each test.
- # TODO: vila 20100122 One way to address the shame above will be to
- # create a memory tree during test parametrization and give a
- # *copy* of this tree to each test. Copying a memory tree ought
- # to be cheap, at least cheaper than creating them with such
- # complex setups.
- tree = self.make_branch_and_tree('tree')
- tree.lock_write()
- self.addCleanup(tree.unlock)
-
- self.build_tree_contents([('tree/f1', 'A\n'),
- ('tree/f2', 'A\n'),
- ('tree/f3', 'A\n'),
- ])
- tree.add(['f1', 'f2', 'f3'], ['f1-id', 'f2-id', 'f3-id'])
- tree.commit('A', rev_id='A')
-
- self.build_tree_contents([('tree/f2', 'A\nC\n'),
- ('tree/f3', 'A\nC\n'),
- ])
- tree.commit('C', rev_id='C')
- # Revert back to A to build the other history.
- tree.set_last_revision('A')
- tree.branch.set_last_revision_info(1, 'A')
- self.build_tree_contents([('tree/f1', 'A\nB\n'),
- ('tree/f2', 'A\n'),
- ('tree/f3', 'A\nB\n'),
- ])
- tree.commit('B', rev_id='B')
- tree.set_parent_ids(['B', 'C'])
- self.build_tree_contents([('tree/f1', 'A\nB\n'),
- ('tree/f2', 'A\nC\n'),
- ('tree/f3', 'A\nB\nC\n'),
- ])
- tree.commit('D', rev_id='D')
-
- # Switch to a read lock for this tree.
- # We still have an addCleanup(tree.unlock) pending
- tree.unlock()
- tree.lock_read()
- return tree
-
- def check_delta(self, delta, **kw):
- """Check the filenames touched by a delta are as expected.
-
- Caller only have to pass in the list of files for each part, all
- unspecified parts are considered empty (and checked as such).
- """
- for n in 'added', 'removed', 'renamed', 'modified', 'unchanged':
- # By default we expect an empty list
- expected = kw.get(n, [])
- # strip out only the path components
- got = [x[0] for x in getattr(delta, n)]
- self.assertEqual(expected, got)
-
- def test_tree_with_single_merge(self):
- """Make sure the tree layout is correct."""
- tree = self.create_tree_with_single_merge()
- rev_A_tree = tree.branch.repository.revision_tree('A')
- rev_B_tree = tree.branch.repository.revision_tree('B')
- rev_C_tree = tree.branch.repository.revision_tree('C')
- rev_D_tree = tree.branch.repository.revision_tree('D')
-
- self.check_delta(rev_B_tree.changes_from(rev_A_tree),
- modified=['f1', 'f3'])
-
- self.check_delta(rev_C_tree.changes_from(rev_A_tree),
- modified=['f2', 'f3'])
-
- self.check_delta(rev_D_tree.changes_from(rev_B_tree),
- modified=['f2', 'f3'])
-
- self.check_delta(rev_D_tree.changes_from(rev_C_tree),
- modified=['f1', 'f3'])
-
- def assertAllRevisionsForFileID(self, tree, file_id, revisions):
- """Ensure _filter_revisions_touching_file_id returns the right values.
-
- Get the return value from _filter_revisions_touching_file_id and make
- sure they are correct.
- """
- # The api for _filter_revisions_touching_file_id is a little crazy.
- # So we do the setup here.
- mainline = tree.branch.revision_history()
- mainline.insert(0, None)
- revnos = dict((rev, idx+1) for idx, rev in enumerate(mainline))
- view_revs_iter = self.get_view_revisions(
- mainline, revnos, tree.branch, 'reverse', True)
- actual_revs = log._filter_revisions_touching_file_id(
- tree.branch, file_id, list(view_revs_iter))
- self.assertEqual(revisions, [r for r, revno, depth in actual_revs])
-
- def test_file_id_f1(self):
- tree = self.create_tree_with_single_merge()
- # f1 should be marked as modified by revisions A and B
- self.assertAllRevisionsForFileID(tree, 'f1-id', ['B', 'A'])
-
- def test_file_id_f2(self):
- tree = self.create_tree_with_single_merge()
- # f2 should be marked as modified by revisions A, C, and D
- # because D merged the changes from C.
- self.assertAllRevisionsForFileID(tree, 'f2-id', ['D', 'C', 'A'])
-
- def test_file_id_f3(self):
- tree = self.create_tree_with_single_merge()
- # f3 should be marked as modified by revisions A, B, C, and D
- self.assertAllRevisionsForFileID(tree, 'f3-id', ['D', 'C', 'B', 'A'])
-
- def test_file_id_with_ghosts(self):
- # This is testing bug #209948, where having a ghost would cause
- # _filter_revisions_touching_file_id() to fail.
- tree = self.create_tree_with_single_merge()
- # We need to add a revision, so switch back to a write-locked tree
- # (still a single addCleanup(tree.unlock) pending).
- tree.unlock()
- tree.lock_write()
- first_parent = tree.last_revision()
- tree.set_parent_ids([first_parent, 'ghost-revision-id'])
- self.build_tree_contents([('tree/f1', 'A\nB\nXX\n')])
- tree.commit('commit with a ghost', rev_id='XX')
- self.assertAllRevisionsForFileID(tree, 'f1-id', ['XX', 'B', 'A'])
- self.assertAllRevisionsForFileID(tree, 'f2-id', ['D', 'C', 'A'])
-
- def test_unknown_file_id(self):
- tree = self.create_tree_with_single_merge()
- self.assertAllRevisionsForFileID(tree, 'unknown', [])
-
- def test_empty_branch_unknown_file_id(self):
- tree = self.make_branch_and_tree('tree')
- self.assertAllRevisionsForFileID(tree, 'unknown', [])
-
class TestShowChangedRevisions(tests.TestCaseWithTransport):
=== modified file 'bzrlib/tests/test_remote.py'
--- a/bzrlib/tests/test_remote.py 2011-07-15 08:25:00 +0000
+++ b/bzrlib/tests/test_remote.py 2011-07-15 14:13:21 +0000
@@ -3408,21 +3408,46 @@
self.assertTrue(len(self.hpss_calls) > 1)
-class TestUpdateBoundBranch(tests.TestCaseWithTransport):
-
- def test_bug_786980(self):
+class TestUpdateBoundBranchWithModifiedBoundLocation(
+ tests.TestCaseWithTransport):
+ """Ensure correct handling of bound_location modifications.
+
+ This is tested against a smart server as http://pad.lv/786980 was about a
+ ReadOnlyError (write attempt during a read-only transaction) which can only
+ happen in this context.
+ """
+
+ def setUp(self):
+ super(TestUpdateBoundBranchWithModifiedBoundLocation, self).setUp()
self.transport_server = test_server.SmartTCPServer_for_testing
- wt = self.make_branch_and_tree('master')
- checkout = wt.branch.create_checkout('checkout')
- wt.commit('add stuff')
- last_revid = wt.commit('even more stuff')
- bound_location = checkout.branch.get_bound_location()
+
+ def make_master_and_checkout(self, master_name, checkout_name):
+ # Create the master branch and its associated checkout
+ self.master = self.make_branch_and_tree(master_name)
+ self.checkout = self.master.branch.create_checkout(checkout_name)
+ # Modify the master branch so there is something to update
+ self.master.commit('add stuff')
+ self.last_revid = self.master.commit('even more stuff')
+ self.bound_location = self.checkout.branch.get_bound_location()
+
+ def assertUpdateSucceeds(self, new_location):
+ self.checkout.branch.set_bound_location(new_location)
+ self.checkout.update()
+ self.assertEquals(self.last_revid, self.checkout.last_revision())
+
+ def test_without_final_slash(self):
+ self.make_master_and_checkout('master', 'checkout')
# For unclear reasons some users have a bound_location without a final
# '/', simulate that by forcing such a value
- self.assertEndsWith(bound_location, '/')
- new_location = bound_location.rstrip('/')
- checkout.branch.set_bound_location(new_location)
- # bug 786980 was raising ReadOnlyError: A write attempt was made in a
- # read only transaction during the update()
- checkout.update()
- self.assertEquals(last_revid, checkout.last_revision())
+ self.assertEndsWith(self.bound_location, '/')
+ self.assertUpdateSucceeds(self.bound_location.rstrip('/'))
+
+ def test_plus_sign(self):
+ self.make_master_and_checkout('+master', 'checkout')
+ self.assertUpdateSucceeds(self.bound_location.replace('%2B', '+', 1))
+
+ def test_tilda(self):
+ # Embed ~ in the middle of the path just to avoid any $HOME
+ # interpretation
+ self.make_master_and_checkout('mas~ter', 'checkout')
+ self.assertUpdateSucceeds(self.bound_location.replace('%2E', '~', 1))
=== modified file 'doc/en/release-notes/bzr-2.5.txt'
--- a/doc/en/release-notes/bzr-2.5.txt 2011-07-15 15:10:38 +0000
+++ b/doc/en/release-notes/bzr-2.5.txt 2011-07-15 15:11:50 +0000
@@ -56,12 +56,20 @@
.. Changes that may require updates in plugins or other code that uses
bzrlib.
+* Remove ``AtomicFile.closed`` which has been deprecated in bzr 0.10.
+ (Vincent Ladeuil)
+
* Remove ``commands._builtin_commands``, ``commands.shlex_split_unicode``,
``Command._maybe_expand_globs`` and ``Command.run_direct`` deprecated in
2.10 and 2.2.0. (Vincent Ladeuil)
* Remove ``diff.get_trees_and_branches_to_diff`` deprecated in 2.2.0.
+* Remove log.calculate_view_revisions, log._filter_revision_range,
+ log.get_view_revisions which have been deprecated in bzr 2.1.0. Also
+ remove log.show_one_log which were never properly deprecated but wasn't
+ used and is easy to inline if needed. (Vincent Ladeuil)
+
* Remove ``trace.info``, ``trace.error`` and ``trace.show_log_error``
deprecated in 2.1.0. (Vincent Ladeuil)
More information about the bazaar-commits
mailing list