~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/log.py

  • Committer: Martin Pool
  • Date: 2005-05-17 07:59:54 UTC
  • Revision ID: mbp@sourcefrog.net-20050517075954-fca3ac7ce3b6d901
- refactor log command
- log runs from most-recent to least now
  (reverse from previously)
- log -v and log on specific file temporarily broken

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 
17
17
 
18
18
 
 
19
"""Code to show logs of changes.
 
20
 
 
21
Various flavors of log can be produced:
 
22
 
 
23
* for one file, or the whole tree, and (not done yet) for
 
24
  files in a given directory
 
25
 
 
26
* in "verbose" mode with a description of what changed from one
 
27
  version to the next
 
28
 
 
29
* with file-ids and revision-ids shown
 
30
 
 
31
* from last to first or (not anymore) from first to last;
 
32
  the default is "reversed" because it shows the likely most
 
33
  relevant and interesting information first
 
34
 
 
35
* (not yet) in XML format
 
36
"""
 
37
 
 
38
 
19
39
 
20
40
def find_touching_revisions(branch, file_id):
21
41
    """Yield a description of revisions which affect the file_id.
61
81
        revno += 1
62
82
 
63
83
 
 
84
 
64
85
def show_log(branch,
65
 
             filename=None,
 
86
             specific_fileid=None,
66
87
             show_timezone='original',
67
88
             verbose=False,
68
89
             show_ids=False,
69
 
             to_file=None):
 
90
             to_file=None,
 
91
             direction='reverse'):
70
92
    """Write out human-readable log of commits to this branch.
71
93
 
72
 
    filename
 
94
    specific_fileid
73
95
        If true, list only the commits affecting the specified
74
96
        file, rather than all commits.
75
97
 
86
108
 
87
109
    to_file
88
110
        File to send log to; by default stdout.
 
111
 
 
112
    direction
 
113
        'reverse' (default) is latest to earliest;
 
114
        'forward' is earliest to latest.
89
115
    """
90
116
    from osutils import format_date
91
117
    from errors import BzrCheckError
96
122
        import sys
97
123
        to_file = sys.stdout
98
124
 
99
 
    if filename:
100
 
        file_id = branch.read_working_inventory().path2id(filename)
101
 
        def which_revs():
102
 
            for revno, revid, why in find_touching_revisions(branch, file_id):
103
 
                yield revno, revid
104
 
    else:
105
 
        def which_revs():
106
 
            for i, revid in enumerate(branch.revision_history()):
107
 
                yield i+1, revid
108
 
        
109
 
    branch._need_readlock()
 
125
    if specific_fileid or verbose:
 
126
        raise NotImplementedError('sorry, option not implemented at the moment')
 
127
    
 
128
    which_revs = branch.enum_history(direction)
 
129
 
 
130
    for revno, revision_id in which_revs:
 
131
        # TODO: if filename given, check if it's changed; if not
 
132
        # changed, skip this one
 
133
 
 
134
        # TODO: if verbose, get a list of changes; if we're running
 
135
        # forward then the delta is as compared to the previous
 
136
        # version, otherwise as compared to the *next* version to be
 
137
        # enumerated; in both cases must treat 0 specially as the
 
138
        # empty tree.
 
139
 
 
140
        rev = branch.get_revision(revision_id)
 
141
        delta = None
 
142
        show_one_log(revno, rev, delta, show_ids, to_file, show_timezone)
 
143
 
 
144
 
 
145
def junk():
110
146
    precursor = None
111
147
    if verbose:
112
148
        from tree import EmptyTree
113
149
        prev_tree = EmptyTree()
114
 
    for revno, revision_id in which_revs():
115
 
        print >>to_file,  '-' * 60
116
 
        print >>to_file,  'revno:', revno
117
 
        rev = branch.get_revision(revision_id)
118
 
        if show_ids:
119
 
            print >>to_file,  'revision-id:', revision_id
120
 
        print >>to_file,  'committer:', rev.committer
121
 
        print >>to_file,  'timestamp: %s' % (format_date(rev.timestamp, rev.timezone or 0,
122
 
                                             show_timezone))
123
 
 
124
 
        if revision_id != rev.revision_id:
125
 
            raise BzrCheckError("retrieved wrong revision: %r"
126
 
                                % (revision_id, rev.revision_id))
127
 
 
128
 
        print >>to_file,  'message:'
129
 
        if not rev.message:
130
 
            print >>to_file,  '  (no message)'
131
 
        else:
132
 
            for l in rev.message.split('\n'):
133
 
                print >>to_file,  '  ' + l
134
 
 
135
 
        # Don't show a list of changed files if we were asked about
136
 
        # one specific file.
137
 
 
138
 
        if verbose:
139
 
            this_tree = branch.revision_tree(revision_id)
140
 
            delta = compare_trees(prev_tree, this_tree, want_unchanged=False)
141
 
            delta.show(to_file, show_ids)
142
 
            prev_tree = this_tree
143
 
 
 
150
    for revno, revision_id in which_revs:
144
151
        precursor = revision_id
145
152
 
 
153
    if revision_id != rev.revision_id:
 
154
        raise BzrCheckError("retrieved wrong revision: %r"
 
155
                            % (revision_id, rev.revision_id))
 
156
 
 
157
    if verbose:
 
158
        this_tree = branch.revision_tree(revision_id)
 
159
        delta = compare_trees(prev_tree, this_tree, want_unchanged=False)
 
160
        prev_tree = this_tree
 
161
    else:
 
162
        delta = None    
 
163
 
 
164
 
 
165
 
 
166
def show_one_log(revno, rev, delta, show_ids, to_file, show_timezone):
 
167
    from osutils import format_date
 
168
    
 
169
    print >>to_file,  '-' * 60
 
170
    print >>to_file,  'revno:', revno
 
171
    if show_ids:
 
172
        print >>to_file,  'revision-id:', rev.revision_id
 
173
    print >>to_file,  'committer:', rev.committer
 
174
    print >>to_file,  'timestamp: %s' % (format_date(rev.timestamp, rev.timezone or 0,
 
175
                                         show_timezone))
 
176
 
 
177
    print >>to_file,  'message:'
 
178
    if not rev.message:
 
179
        print >>to_file,  '  (no message)'
 
180
    else:
 
181
        for l in rev.message.split('\n'):
 
182
            print >>to_file,  '  ' + l
 
183
 
 
184
    if delta != None:
 
185
        delta.show(to_file, show_ids)