~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/log.py

  • Committer: Robert Collins
  • Date: 2006-03-28 14:29:13 UTC
  • mto: (1626.2.1 integration)
  • mto: This revision was merged to the branch mainline in revision 1628.
  • Revision ID: robertc@robertcollins.net-20060328142913-ac5afb37075719c6
Convert log to use the new tsort.merge_sort routine.

Show diffs side-by-side

added added

removed removed

Lines of Context:
51
51
 
52
52
 
53
53
# TODO: option to show delta summaries for merged-in revisions
 
54
import re
54
55
 
 
56
from bzrlib.delta import compare_trees
55
57
import bzrlib.errors as errors
 
58
from bzrlib.trace import mutter
56
59
from bzrlib.tree import EmptyTree
57
 
from bzrlib.delta import compare_trees
58
 
from bzrlib.trace import mutter
59
 
import re
 
60
from bzrlib.tsort import merge_sort
60
61
 
61
62
 
62
63
def find_touching_revisions(branch, file_id):
202
203
 
203
204
    # list indexes are 0-based; revisions are 1-based
204
205
    cut_revs = which_revs[(start_revision-1):(end_revision)]
 
206
    if not cut_revs:
 
207
        return
 
208
    # override the mainline to look like the revision history.
 
209
    mainline_revs = [revision_id for index, revision_id in cut_revs]
 
210
    if cut_revs[0][0] == 1:
 
211
        mainline_revs.insert(0, None)
 
212
    else:
 
213
        mainline_revs.insert(0, which_revs[start_revision-2][1])
 
214
 
 
215
    merge_sorted_revisions = merge_sort(
 
216
        branch.repository.get_revision_graph(mainline_revs[-1]),
 
217
        mainline_revs[-1],
 
218
        mainline_revs)
205
219
 
206
220
    if direction == 'reverse':
207
221
        cut_revs.reverse()
208
222
    elif direction == 'forward':
209
 
        pass
 
223
        # forward means oldest first.
 
224
        merge_sorted_revisions.reverse()
210
225
    else:
211
226
        raise ValueError('invalid direction %r' % direction)
212
227
 
213
228
    revision_history = branch.revision_history()
214
 
    for revno, rev_id in cut_revs:
215
 
        if verbose or specific_fileid:
216
 
            delta = _get_revision_delta(branch, revno)
217
 
            
218
 
        if specific_fileid:
219
 
            if not delta.touches_file_id(specific_fileid):
220
 
                continue
221
 
 
222
 
        if not verbose:
223
 
            # although we calculated it, throw it away without display
224
 
            delta = None
225
 
 
 
229
 
 
230
    # convert the revision history to a dictionary:
 
231
    rev_nos = {}
 
232
    for index, rev_id in cut_revs:
 
233
        rev_nos[rev_id] = index
 
234
 
 
235
    # now we just print all the revisions
 
236
    for sequence, rev_id, merge_depth, end_of_merge in merge_sorted_revisions:
226
237
        rev = branch.repository.get_revision(rev_id)
227
238
 
228
239
        if searchRE:
229
240
            if not searchRE.search(rev.message):
230
241
                continue
231
242
 
232
 
        lf.show(revno, rev, delta)
233
 
        if hasattr(lf, 'show_merge'):
234
 
            if revno == 1:
235
 
                excludes = set()
236
 
            else:
237
 
                # revno is 1 based, so -2 to get back 1 less.
238
 
                repository = branch.repository
239
 
                excludes = repository.get_ancestry(revision_history[revno - 2])
240
 
                excludes = set(excludes)
241
 
            pending = list(rev.parent_ids)
242
 
            while pending:
243
 
                rev_id = pending.pop()
244
 
                if rev_id in excludes:
245
 
                    continue
246
 
                # prevent showing merged revs twice if they multi-path.
247
 
                excludes.add(rev_id)
248
 
                try:
249
 
                    rev = branch.repository.get_revision(rev_id)
250
 
                except errors.NoSuchRevision:
251
 
                    continue
252
 
                pending.extend(rev.parent_ids)
253
 
                lf.show_merge(rev)
 
243
        if merge_depth == 0:
 
244
            # a mainline revision.
 
245
            if verbose or specific_fileid:
 
246
                delta = _get_revision_delta(branch, rev_nos[rev_id])
 
247
                
 
248
            if specific_fileid:
 
249
                if not delta.touches_file_id(specific_fileid):
 
250
                    continue
 
251
    
 
252
            if not verbose:
 
253
                # although we calculated it, throw it away without display
 
254
                delta = None
 
255
 
 
256
            lf.show(rev_nos[rev_id], rev, delta)
 
257
        elif hasattr(lf, 'show_merge'):
 
258
            lf.show_merge(rev, merge_depth)
254
259
 
255
260
 
256
261
def deltas_for_log_dummy(branch, which_revs):
354
359
    def show(self, revno, rev, delta):
355
360
        return self._show_helper(revno=revno, rev=rev, delta=delta)
356
361
 
357
 
    def show_merge(self, rev):
358
 
        return self._show_helper(rev=rev, indent='    ', merged=True, delta=None)
 
362
    def show_merge(self, rev, merge_depth):
 
363
        return self._show_helper(rev=rev, indent='    '*merge_depth, merged=True, delta=None)
359
364
 
360
365
    def _show_helper(self, rev=None, revno=None, indent='', merged=False, delta=None):
361
 
        """Show a revision, either merged or not."""
 
366
        """Show a revision, either merged or not."""
362
367
        from bzrlib.osutils import format_date
363
368
        to_file = self.to_file
364
369
        print >>to_file,  indent+'-' * 60