Rev 2491: (Kent Gibson) Update the LogFormatter API to use a LogRevision object. in file:///home/pqm/archives/thelove/bzr/%2Btrunk/
Canonical.com Patch Queue Manager
pqm at pqm.ubuntu.com
Thu May 24 14:10:02 BST 2007
At file:///home/pqm/archives/thelove/bzr/%2Btrunk/
------------------------------------------------------------
revno: 2491
revision-id: pqm at pqm.ubuntu.com-20070524130959-7zpl03vgx35bezhf
parent: pqm at pqm.ubuntu.com-20070523095110-bqaodkh3q7v0fime
parent: john at arbash-meinel.com-20070524124224-0yyi4laqtngw6lf6
committer: Canonical.com Patch Queue Manager<pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Thu 2007-05-24 14:09:59 +0100
message:
(Kent Gibson) Update the LogFormatter API to use a LogRevision object.
modified:
NEWS NEWS-20050323055033-4e00b5db738777ff
bzrlib/builtins.py builtins.py-20050830033751-fc01482b9ca23183
bzrlib/log.py log.py-20050505065812-c40ce11702fe5fb1
bzrlib/missing.py missing.py-20050812153334-097f7097e2a8bcd1
bzrlib/tests/test_log.py testlog.py-20050728115707-1a514809d7d49309
bzrlib/tests/test_missing.py test_missing.py-20051212000028-694fa4f658a81f48
------------------------------------------------------------
revno: 2490.1.4
merged: john at arbash-meinel.com-20070524124224-0yyi4laqtngw6lf6
parent: john at arbash-meinel.com-20070524121925-jf60fhqgvtcy6n0g
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: jam-integration
timestamp: Thu 2007-05-24 07:42:24 -0500
message:
Update bzrlib.log.show_changed_revisions to use the new api
------------------------------------------------------------
revno: 2490.1.3
merged: john at arbash-meinel.com-20070524121925-jf60fhqgvtcy6n0g
parent: john at arbash-meinel.com-20070524121306-jlb942ezpitxujud
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: jam-integration
timestamp: Thu 2007-05-24 07:19:25 -0500
message:
Restore the test for iter_log_data as a deprecated function.
------------------------------------------------------------
revno: 2490.1.2
merged: john at arbash-meinel.com-20070524121306-jlb942ezpitxujud
parent: john at arbash-meinel.com-20070524115407-lcnak713swd59lvk
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: jam-integration
timestamp: Thu 2007-05-24 07:13:06 -0500
message:
Cleanup according to PEP8 and some other small whitespace fixes
------------------------------------------------------------
revno: 2490.1.1
merged: john at arbash-meinel.com-20070524115407-lcnak713swd59lvk
parent: pqm at pqm.ubuntu.com-20070523095110-bqaodkh3q7v0fime
parent: warthog618 at gmail.com-20070507115128-myp6wjqauc85kr4p
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: jam-integration
timestamp: Thu 2007-05-24 06:54:07 -0500
message:
[merge] Kent Gibson: Rework LogFormatter API
------------------------------------------------------------
revno: 2466.8.2
merged: warthog618 at gmail.com-20070507115128-myp6wjqauc85kr4p
parent: warthog618 at gmail.com-20070429034630-p3xbitz2xyl6pbie
committer: Kent Gibson <warthog618 at gmail.com>
branch nick: lf_rework
timestamp: Mon 2007-05-07 19:51:28 +0800
message:
Move begin/end calls from _show_log to show_log. Fix long line.
------------------------------------------------------------
revno: 2466.8.1
merged: warthog618 at gmail.com-20070429034630-p3xbitz2xyl6pbie
parent: pqm at pqm.ubuntu.com-20070426211103-h84prqh7a4ad3ez2
committer: Kent Gibson <warthog618 at gmail.com>
branch nick: bzr.kg
timestamp: Sun 2007-04-29 11:46:30 +0800
message:
Reworked LogFormatter API to simplify extending the attributes of the revision being logged. Added support for begin_log() and end_log() hooks in LogFormatters.
Fixed minor inconsistency between display of revids in mainline and merge revisions in long log format. Both now labelled "revision-id:" and are only displayed when --show-ids is specified.
=== modified file 'NEWS'
--- a/NEWS 2007-05-23 08:54:14 +0000
+++ b/NEWS 2007-05-24 11:54:07 +0000
@@ -1,5 +1,13 @@
IN DEVELOPMENT
+ INTERNALS:
+ * Rework of LogFormatter API to provide beginning/end of log hooks and to
+ encapsulate the details of the revision to be logged in a LogRevision
+ object.
+ In long log formats, merge revision ids are only shown when --show-ids
+ is specified, and are labelled "revision-id:", as per mainline
+ revisions, instead of "merged:". (Kent Gibson)
+
BUGFIXES:
* ``bzr push`` should only connect to the remote location one time.
=== modified file 'bzrlib/builtins.py'
--- a/bzrlib/builtins.py 2007-05-02 14:54:20 +0000
+++ b/bzrlib/builtins.py 2007-05-24 11:54:07 +0000
@@ -2965,7 +2965,7 @@
def run(self, other_branch=None, reverse=False, mine_only=False,
theirs_only=False, log_format=None, long=False, short=False, line=False,
show_ids=False, verbose=False):
- from bzrlib.missing import find_unmerged, iter_log_data
+ from bzrlib.missing import find_unmerged, iter_log_revisions
from bzrlib.log import log_formatter
local_branch = Branch.open_containing(u".")[0]
parent = local_branch.get_parent()
@@ -2996,9 +2996,10 @@
remote_extra.reverse()
if local_extra and not theirs_only:
print "You have %d extra revision(s):" % len(local_extra)
- for data in iter_log_data(local_extra, local_branch.repository,
- verbose):
- lf.show(*data)
+ for revision in iter_log_revisions(local_extra,
+ local_branch.repository,
+ verbose):
+ lf.log_revision(revision)
printed_local = True
else:
printed_local = False
@@ -3006,9 +3007,10 @@
if printed_local is True:
print "\n\n"
print "You are missing %d revision(s):" % len(remote_extra)
- for data in iter_log_data(remote_extra, remote_branch.repository,
- verbose):
- lf.show(*data)
+ for revision in iter_log_revisions(remote_extra,
+ remote_branch.repository,
+ verbose):
+ lf.log_revision(revision)
if not remote_extra and not local_extra:
status_code = 0
print "Branches are up to date."
=== modified file 'bzrlib/log.py'
--- a/bzrlib/log.py 2007-04-23 19:23:14 +0000
+++ b/bzrlib/log.py 2007-05-24 12:42:24 +0000
@@ -54,14 +54,18 @@
from itertools import izip
import re
-from bzrlib import(
+from bzrlib import (
registry,
symbol_versioning,
)
import bzrlib.errors as errors
-from bzrlib.symbol_versioning import deprecated_method, zero_eleven
+from bzrlib.symbol_versioning import (
+ deprecated_method,
+ zero_eleven,
+ zero_seventeen,
+ )
from bzrlib.trace import mutter
-from bzrlib.tsort import(
+from bzrlib.tsort import (
merge_sort,
topo_sort,
)
@@ -153,11 +157,17 @@
"""
branch.lock_read()
try:
+ if getattr(lf, 'begin_log', None):
+ lf.begin_log()
+
_show_log(branch, lf, specific_fileid, verbose, direction,
start_revision, end_revision, search)
+
+ if getattr(lf, 'end_log', None):
+ lf.end_log()
finally:
branch.unlock()
-
+
def _show_log(branch,
lf,
specific_fileid=None,
@@ -210,22 +220,28 @@
mainline_revs.insert(0, None)
else:
mainline_revs.insert(0, which_revs[start_revision-2][1])
- # how should we show merged revisions ?
- # old api: show_merge. New api: show_merge_revno
- show_merge_revno = getattr(lf, 'show_merge_revno', None)
- show_merge = getattr(lf, 'show_merge', None)
- if show_merge is None and show_merge_revno is None:
- # no merged-revno support
- include_merges = False
- else:
- include_merges = True
- if show_merge is not None and show_merge_revno is None:
+ legacy_lf = getattr(lf, 'log_revision', None) is None
+ if legacy_lf:
+ # pre-0.17 formatters use show for mainline revisions.
+ # how should we show merged revisions ?
+ # pre-0.11 api: show_merge
+ # 0.11-0.16 api: show_merge_revno
+ show_merge_revno = getattr(lf, 'show_merge_revno', None)
+ show_merge = getattr(lf, 'show_merge', None)
+ if show_merge is None and show_merge_revno is None:
+ # no merged-revno support
+ generate_merge_revisions = False
+ else:
+ generate_merge_revisions = True
# tell developers to update their code
- symbol_versioning.warn('LogFormatters should provide show_merge_revno '
- 'instead of show_merge since bzr 0.11.',
+ symbol_versioning.warn('LogFormatters should provide log_revision '
+ 'instead of show and show_merge_revno since bzr 0.17.',
DeprecationWarning, stacklevel=3)
+ else:
+ generate_merge_revisions = getattr(lf, 'supports_merge_revisions',
+ False)
view_revs_iter = get_view_revisions(mainline_revs, rev_nos, branch,
- direction, include_merges=include_merges)
+ direction, include_merges=generate_merge_revisions)
if specific_fileid:
view_revisions = _get_revisions_touching_file_id(branch,
specific_fileid,
@@ -234,12 +250,14 @@
else:
view_revisions = list(view_revs_iter)
- use_tags = getattr(lf, 'supports_tags', False)
- if use_tags:
- rev_tag_dict = {}
+ rev_tag_dict = {}
+ generate_tags = getattr(lf, 'supports_tags', False)
+ if generate_tags:
if branch.supports_tags():
rev_tag_dict = branch.tags.get_reverse_tag_dict()
+ generate_delta = verbose and getattr(lf, 'supports_delta', False)
+
def iter_revisions():
# r = revision, n = revno, d = merge depth
revision_ids = [r for r, n, d in view_revisions]
@@ -249,7 +267,7 @@
while revision_ids:
cur_deltas = {}
revisions = repository.get_revisions(revision_ids[:num])
- if verbose:
+ if generate_delta:
delta_revisions = [r for r in revisions if
r.revision_id in zeros]
deltas = repository.get_deltas_for_revisions(delta_revisions)
@@ -262,7 +280,7 @@
yield revision, cur_deltas.get(revision.revision_id)
revision_ids = revision_ids[num:]
num = min(int(num * 1.5), 200)
-
+
# now we just print all the revisions
for ((rev_id, revno, merge_depth), (rev, delta)) in \
izip(view_revisions, iter_revisions()):
@@ -271,20 +289,26 @@
if not searchRE.search(rev.message):
continue
- if merge_depth == 0:
- if use_tags:
- lf.show(revno, rev, delta, rev_tag_dict.get(rev_id))
- else:
- lf.show(revno, rev, delta)
+ if not legacy_lf:
+ lr = LogRevision(rev, revno, merge_depth, delta,
+ rev_tag_dict.get(rev_id))
+ lf.log_revision(lr)
else:
- if show_merge_revno is None:
- lf.show_merge(rev, merge_depth)
+ # support for legacy (pre-0.17) LogFormatters
+ if merge_depth == 0:
+ if generate_tags:
+ lf.show(revno, rev, delta, rev_tag_dict.get(rev_id))
+ else:
+ lf.show(revno, rev, delta)
else:
- if use_tags:
- lf.show_merge_revno(rev, merge_depth, revno,
- rev_tag_dict.get(rev_id))
+ if show_merge_revno is None:
+ lf.show_merge(rev, merge_depth)
else:
- lf.show_merge_revno(rev, merge_depth, revno)
+ if generate_tags:
+ lf.show_merge_revno(rev, merge_depth, revno,
+ rev_tag_dict.get(rev_id))
+ else:
+ lf.show_merge_revno(rev, merge_depth, revno)
def _get_revisions_touching_file_id(branch, file_id, mainline_revisions,
@@ -398,14 +422,59 @@
return result
+class LogRevision(object):
+ """A revision to be logged (by LogFormatter.log_revision).
+
+ A simple wrapper for the attributes of a revision to be logged.
+ The attributes may or may not be populated, as determined by the
+ logging options and the log formatter capabilities.
+ """
+
+ def __init__(self, rev=None, revno=None, merge_depth=0, delta=None,
+ tags=None):
+ self.rev = rev
+ self.revno = revno
+ self.merge_depth = merge_depth
+ self.delta = delta
+ self.tags = tags
+
+
class LogFormatter(object):
- """Abstract class to display log messages."""
+ """Abstract class to display log messages.
+
+ At a minimum, a derived class must implement the log_revision method.
+
+ If the LogFormatter needs to be informed of the beginning or end of
+ a log it should implement the begin_log and/or end_log hook methods.
+
+ A LogFormatter should define the following supports_XXX flags
+ to indicate which LogRevision attributes it supports:
+
+ - supports_delta must be True if this log formatter supports delta.
+ Otherwise the delta attribute may not be populated.
+ - supports_merge_revisions must be True if this log formatter supports
+ merge revisions. If not, only revisions mainline revisions (those
+ with merge_depth == 0) will be passed to the formatter.
+ - supports_tags must be True if this log formatter supports tags.
+ Otherwise the tags attribute may not be populated.
+ """
def __init__(self, to_file, show_ids=False, show_timezone='original'):
self.to_file = to_file
self.show_ids = show_ids
self.show_timezone = show_timezone
+# TODO: uncomment this block after show() has been removed.
+# Until then defining log_revision would prevent _show_log calling show()
+# in legacy formatters.
+# def log_revision(self, revision):
+# """Log a revision.
+#
+# :param revision: The LogRevision to be logged.
+# """
+# raise NotImplementedError('not implemented in abstract base')
+
+ @deprecated_method(zero_seventeen)
def show(self, revno, rev, delta):
raise NotImplementedError('not implemented in abstract base')
@@ -415,92 +484,108 @@
class LongLogFormatter(LogFormatter):
- supports_tags = True # must exist and be True
- # if this log formatter support tags.
- # .show() and .show_merge_revno() must then accept
- # the 'tags'-argument with list of tags
+ supports_merge_revisions = True
+ supports_delta = True
+ supports_tags = True
+ @deprecated_method(zero_seventeen)
def show(self, revno, rev, delta, tags=None):
- return self._show_helper(revno=revno, rev=rev, delta=delta, tags=tags)
+ lr = LogRevision(rev, revno, 0, delta, tags)
+ return self.log_revision(lr)
@deprecated_method(zero_eleven)
def show_merge(self, rev, merge_depth):
- return self._show_helper(rev=rev, indent=' '*merge_depth,
- merged=True, delta=None)
+ lr = LogRevision(rev, merge_depth=merge_depth)
+ return self.log_revision(lr)
+ @deprecated_method(zero_seventeen)
def show_merge_revno(self, rev, merge_depth, revno, tags=None):
"""Show a merged revision rev, with merge_depth and a revno."""
- return self._show_helper(rev=rev, revno=revno,
- indent=' '*merge_depth, merged=True, delta=None, tags=tags)
+ lr = LogRevision(rev, revno, merge_depth, tags=tags)
+ return self.log_revision(lr)
- def _show_helper(self, rev=None, revno=None, indent='', merged=False,
- delta=None, tags=None):
- """Show a revision, either merged or not."""
+ def log_revision(self, revision):
+ """Log a revision, either merged or not."""
from bzrlib.osutils import format_date
+ indent = ' '*revision.merge_depth
to_file = self.to_file
print >>to_file, indent+'-' * 60
- if revno is not None:
- print >>to_file, indent+'revno:', revno
- if tags:
- print >>to_file, indent+'tags: %s' % (', '.join(tags))
- if merged:
- print >>to_file, indent+'merged:', rev.revision_id
- elif self.show_ids:
- print >>to_file, indent+'revision-id:', rev.revision_id
+ if revision.revno is not None:
+ print >>to_file, indent+'revno:', revision.revno
+ if revision.tags:
+ print >>to_file, indent+'tags: %s' % (', '.join(revision.tags))
if self.show_ids:
- for parent_id in rev.parent_ids:
+ print >>to_file, indent+'revision-id:', revision.rev.revision_id
+ for parent_id in revision.rev.parent_ids:
print >>to_file, indent+'parent:', parent_id
- print >>to_file, indent+'committer:', rev.committer
+ print >>to_file, indent+'committer:', revision.rev.committer
try:
print >>to_file, indent+'branch nick: %s' % \
- rev.properties['branch-nick']
+ revision.rev.properties['branch-nick']
except KeyError:
pass
- date_str = format_date(rev.timestamp,
- rev.timezone or 0,
+ date_str = format_date(revision.rev.timestamp,
+ revision.rev.timezone or 0,
self.show_timezone)
print >>to_file, indent+'timestamp: %s' % date_str
print >>to_file, indent+'message:'
- if not rev.message:
+ if not revision.rev.message:
print >>to_file, indent+' (no message)'
else:
- message = rev.message.rstrip('\r\n')
+ message = revision.rev.message.rstrip('\r\n')
for l in message.split('\n'):
print >>to_file, indent+' ' + l
- if delta is not None:
- delta.show(to_file, self.show_ids)
+ if revision.delta is not None:
+ revision.delta.show(to_file, self.show_ids)
class ShortLogFormatter(LogFormatter):
+
+ supports_delta = True
+
+ @deprecated_method(zero_seventeen)
def show(self, revno, rev, delta):
+ lr = LogRevision(rev, revno, 0, delta)
+ return self.log_revision(lr)
+
+ def log_revision(self, revision):
from bzrlib.osutils import format_date
to_file = self.to_file
- date_str = format_date(rev.timestamp, rev.timezone or 0,
- self.show_timezone)
- print >>to_file, "%5s %s\t%s" % (revno, self.short_committer(rev),
- format_date(rev.timestamp, rev.timezone or 0,
+ date_str = format_date(revision.rev.timestamp,
+ revision.rev.timezone or 0,
+ self.show_timezone)
+ print >>to_file, "%5s %s\t%s" % (revision.revno,
+ self.short_committer(revision.rev),
+ format_date(revision.rev.timestamp,
+ revision.rev.timezone or 0,
self.show_timezone, date_fmt="%Y-%m-%d",
- show_offset=False))
+ show_offset=False))
if self.show_ids:
- print >>to_file, ' revision-id:', rev.revision_id
- if not rev.message:
+ print >>to_file, ' revision-id:', revision.rev.revision_id
+ if not revision.rev.message:
print >>to_file, ' (no message)'
else:
- message = rev.message.rstrip('\r\n')
+ message = revision.rev.message.rstrip('\r\n')
for l in message.split('\n'):
print >>to_file, ' ' + l
# TODO: Why not show the modified files in a shorter form as
# well? rewrap them single lines of appropriate length
- if delta is not None:
- delta.show(to_file, self.show_ids)
+ if revision.delta is not None:
+ revision.delta.show(to_file, self.show_ids)
print >>to_file, ''
class LineLogFormatter(LogFormatter):
+
+ def __init__(self, *args, **kwargs):
+ from bzrlib.osutils import terminal_width
+ super(LineLogFormatter, self).__init__(*args, **kwargs)
+ self._max_chars = terminal_width() - 1
+
def truncate(self, str, max_len):
if len(str) <= max_len:
return str
@@ -518,10 +603,15 @@
else:
return rev.message
+ @deprecated_method(zero_seventeen)
def show(self, revno, rev, delta):
from bzrlib.osutils import terminal_width
print >> self.to_file, self.log_string(revno, rev, terminal_width()-1)
+ def log_revision(self, revision):
+ print >>self.to_file, self.log_string(revision.revno, revision.rev,
+ self._max_chars)
+
def log_string(self, revno, rev, max_chars):
"""Format log info into one string. Truncate tail of string
:param revno: revision number (int) or None.
@@ -593,6 +683,7 @@
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.
@@ -633,7 +724,8 @@
to_file.write('\nRemoved Revisions:\n')
for i in range(base_idx, len(old_rh)):
rev = branch.repository.get_revision(old_rh[i])
- lf.show(i+1, rev, None)
+ lr = LogRevision(rev, i+1, 0, None)
+ lf.log_revision(lr)
to_file.write('*'*60)
to_file.write('\n\n')
if base_idx < len(new_rh):
=== modified file 'bzrlib/missing.py'
--- a/bzrlib/missing.py 2006-12-20 16:55:18 +0000
+++ b/bzrlib/missing.py 2007-05-24 12:13:06 +0000
@@ -16,10 +16,23 @@
"""Display what revisions are missing in 'other' from 'this' and vice versa."""
-import bzrlib.ui as ui
-
-
+from bzrlib import ui
+from bzrlib.log import (
+ LogRevision,
+ )
+from bzrlib.symbol_versioning import (
+ deprecated_function,
+ zero_seventeen,
+ )
+
+
+ at deprecated_function(zero_seventeen)
def iter_log_data(revisions, revision_source, verbose):
+ for revision in iter_log_revisions(revisions, revision_source, verbose):
+ yield revision.revno, revision.rev, revision.delta
+
+
+def iter_log_revisions(revisions, revision_source, verbose):
last_tree = revision_source.revision_tree(None)
last_rev_id = None
for revno, rev_id in revisions:
@@ -37,7 +50,7 @@
delta = revision_tree.changes_from(parent_tree)
else:
delta = None
- yield revno, rev, delta
+ yield LogRevision(rev, revno, delta=delta)
def find_unmerged(local_branch, remote_branch):
=== modified file 'bzrlib/tests/test_log.py'
--- a/bzrlib/tests/test_log.py 2007-04-18 22:37:59 +0000
+++ b/bzrlib/tests/test_log.py 2007-05-24 12:13:06 +0000
@@ -19,21 +19,17 @@
from bzrlib import log
from bzrlib.tests import BzrTestBase, TestCaseWithTransport
-from bzrlib.log import (show_log,
- get_view_revisions,
- LogFormatter,
- LongLogFormatter,
- ShortLogFormatter,
+from bzrlib.log import (show_log,
+ get_view_revisions,
+ LogRevision,
+ LogFormatter,
+ LongLogFormatter,
+ ShortLogFormatter,
LineLogFormatter)
from bzrlib.branch import Branch
from bzrlib.errors import InvalidRevisionNumber
-class _LogEntry(object):
- # should probably move into bzrlib.log?
- pass
-
-
class LogCatcher(LogFormatter):
"""Pull log messages into list rather than displaying them.
@@ -43,16 +39,15 @@
We should also test the LogFormatter.
"""
+
+ supports_delta = True
+
def __init__(self):
super(LogCatcher, self).__init__(to_file=None)
self.logs = []
- def show(self, revno, rev, delta):
- le = _LogEntry()
- le.revno = revno
- le.rev = rev
- le.delta = delta
- self.logs.append(le)
+ def log_revision(self, revision):
+ self.logs.append(revision)
class SimpleLogTest(TestCaseWithTransport):
=== modified file 'bzrlib/tests/test_missing.py'
--- a/bzrlib/tests/test_missing.py 2006-12-20 16:55:18 +0000
+++ b/bzrlib/tests/test_missing.py 2007-05-24 12:19:25 +0000
@@ -18,7 +18,12 @@
from bzrlib.builtins import merge
-from bzrlib.missing import find_unmerged, iter_log_data
+from bzrlib.missing import (
+ find_unmerged,
+ iter_log_data,
+ iter_log_revisions,
+ )
+from bzrlib.symbol_versioning import zero_seventeen
from bzrlib.tests import TestCaseWithTransport
from bzrlib.workingtree import WorkingTree
@@ -76,12 +81,16 @@
base_extra, child_extra = find_unmerged(base_tree.branch,
child_tree.branch)
- results = list(iter_log_data(base_extra, base_tree.branch.repository,
- verbose=True))
+ results = list(self.applyDeprecated(zero_seventeen, iter_log_data,
+ base_extra,
+ base_tree.branch.repository,
+ verbose=True))
self.assertEqual([], results)
- results = list(iter_log_data(child_extra, child_tree.branch.repository,
- verbose=True))
+ results = list(self.applyDeprecated(zero_seventeen, iter_log_data,
+ child_extra,
+ child_tree.branch.repository,
+ verbose=True))
self.assertEqual(4, len(results))
r0,r1,r2,r3 = results
@@ -119,3 +128,72 @@
self.assertEqual([('b', 'c', 'b-id', 'file', False, False)],
delta3.renamed)
self.assertEqual([], delta3.modified)
+
+ def test_iter_log_revisions(self):
+ base_tree = self.make_branch_and_tree('base')
+ self.build_tree(['base/a'])
+ base_tree.add(['a'], ['a-id'])
+ base_tree.commit('add a', rev_id='b-1')
+
+ child_tree = base_tree.bzrdir.sprout('child').open_workingtree()
+
+ self.build_tree(['child/b'])
+ child_tree.add(['b'], ['b-id'])
+ child_tree.commit('adding b', rev_id='c-2')
+
+ child_tree.remove(['a'])
+ child_tree.commit('removing a', rev_id='c-3')
+
+ self.build_tree_contents([('child/b', 'new contents for b\n')])
+ child_tree.commit('modifying b', rev_id='c-4')
+
+ child_tree.rename_one('b', 'c')
+ child_tree.commit('rename b=>c', rev_id='c-5')
+
+ base_extra, child_extra = find_unmerged(base_tree.branch,
+ child_tree.branch)
+ results = list(iter_log_revisions(base_extra,
+ base_tree.branch.repository,
+ verbose=True))
+ self.assertEqual([], results)
+
+ results = list(iter_log_revisions(child_extra,
+ child_tree.branch.repository,
+ verbose=True))
+ self.assertEqual(4, len(results))
+
+ r0,r1,r2,r3 = results
+
+ self.assertEqual((2, 'c-2'), (r0.revno, r0.rev.revision_id))
+ self.assertEqual((3, 'c-3'), (r1.revno, r1.rev.revision_id))
+ self.assertEqual((4, 'c-4'), (r2.revno, r2.rev.revision_id))
+ self.assertEqual((5, 'c-5'), (r3.revno, r3.rev.revision_id))
+
+ delta0 = r0.delta
+ self.assertNotEqual(None, delta0)
+ self.assertEqual([('b', 'b-id', 'file')], delta0.added)
+ self.assertEqual([], delta0.removed)
+ self.assertEqual([], delta0.renamed)
+ self.assertEqual([], delta0.modified)
+
+ delta1 = r1.delta
+ self.assertNotEqual(None, delta1)
+ self.assertEqual([], delta1.added)
+ self.assertEqual([('a', 'a-id', 'file')], delta1.removed)
+ self.assertEqual([], delta1.renamed)
+ self.assertEqual([], delta1.modified)
+
+ delta2 = r2.delta
+ self.assertNotEqual(None, delta2)
+ self.assertEqual([], delta2.added)
+ self.assertEqual([], delta2.removed)
+ self.assertEqual([], delta2.renamed)
+ self.assertEqual([('b', 'b-id', 'file', True, False)], delta2.modified)
+
+ delta3 = r3.delta
+ self.assertNotEqual(None, delta3)
+ self.assertEqual([], delta3.added)
+ self.assertEqual([], delta3.removed)
+ self.assertEqual([('b', 'c', 'b-id', 'file', False, False)],
+ delta3.renamed)
+ self.assertEqual([], delta3.modified)
More information about the bazaar-commits
mailing list