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