~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/status.py

  • Committer: Robert Collins
  • Date: 2007-07-04 08:08:13 UTC
  • mfrom: (2572 +trunk)
  • mto: This revision was merged to the branch mainline in revision 2587.
  • Revision ID: robertc@robertcollins.net-20070704080813-wzebx0r88fvwj5rq
Merge bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2007 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
16
16
 
17
17
import sys
18
18
 
 
19
from bzrlib import (
 
20
    delta as _mod_delta,
 
21
    tree,
 
22
    )
19
23
from bzrlib.diff import _raise_if_nonexistent
20
24
import bzrlib.errors as errors
21
25
from bzrlib.log import line_log
23
27
from bzrlib.symbol_versioning import (deprecated_function,
24
28
        zero_eight,
25
29
        )
 
30
from bzrlib.trace import warning
26
31
 
27
32
# TODO: when showing single-line logs, truncate to the width of the terminal
28
33
# if known, but only if really going to the terminal (not into a file)
75
80
                     show_ids=False,
76
81
                     to_file=None,
77
82
                     show_pending=True,
78
 
                     revision=None):
 
83
                     revision=None,
 
84
                     short=False,
 
85
                     versioned=False):
79
86
    """Display summary of changes.
80
87
 
81
88
    By default this compares the working tree to a previous revision. 
100
107
        If not None it must be a RevisionSpec list.
101
108
        If one revision show compared it with working tree.
102
109
        If two revisions show status between first and second.
 
110
    :param short: If True, gives short SVN-style status lines.
 
111
    :param versioned: If True, only shows versioned files.
103
112
    """
104
113
    if show_unchanged is not None:
105
114
        warn("show_status_trees with show_unchanged has been deprecated "
112
121
    try:
113
122
        new_is_working_tree = True
114
123
        if revision is None:
 
124
            if wt.last_revision() != wt.branch.last_revision():
 
125
                warning("working tree is out of date, run 'bzr update'")
115
126
            new = wt
116
127
            old = new.basis_tree()
117
128
        elif len(revision) > 0:
129
140
                    raise errors.BzrCommandError(str(e))
130
141
            else:
131
142
                new = wt
132
 
        _raise_if_nonexistent(specific_files, old, new)
133
 
        delta = new.changes_from(old, want_unchanged=show_unchanged,
134
 
                              specific_files=specific_files)
135
 
        delta.show(to_file,
136
 
                   show_ids=show_ids,
137
 
                   show_unchanged=show_unchanged)
138
 
 
139
 
        list_paths('unknown', new.unknowns(), specific_files, to_file)
140
 
        conflict_title = False
141
 
        # show the new conflicts only for now. XXX: get them from the delta.
142
 
        for conflict in new.conflicts():
143
 
            if conflict_title is False:
144
 
                print >> to_file, "conflicts:"
145
 
                conflict_title = True
146
 
            print >> to_file, "  %s" % conflict
147
 
        if new_is_working_tree and show_pending:
148
 
            show_pending_merges(new, to_file)
 
143
        old.lock_read()
 
144
        new.lock_read()
 
145
        try:
 
146
            _raise_if_nonexistent(specific_files, old, new)
 
147
            want_unversioned = not versioned
 
148
            if short:
 
149
                changes = new._iter_changes(old, show_unchanged, specific_files,
 
150
                    require_versioned=False, want_unversioned=want_unversioned)
 
151
                reporter = _mod_delta._ChangeReporter(output_file=to_file,
 
152
                    unversioned_filter=new.is_ignored)
 
153
                _mod_delta.report_changes(changes, reporter)
 
154
            else:
 
155
                delta = new.changes_from(old, want_unchanged=show_unchanged,
 
156
                                      specific_files=specific_files,
 
157
                                      want_unversioned=want_unversioned)
 
158
                # filter out unknown files. We may want a tree method for
 
159
                # this
 
160
                delta.unversioned = [unversioned for unversioned in
 
161
                    delta.unversioned if not new.is_ignored(unversioned[0])]
 
162
                delta.show(to_file,
 
163
                           show_ids=show_ids,
 
164
                           show_unchanged=show_unchanged,
 
165
                           short_status=False)
 
166
            conflict_title = False
 
167
            # show the new conflicts only for now. XXX: get them from the delta.
 
168
            for conflict in new.conflicts():
 
169
                if not short and conflict_title is False:
 
170
                    print >> to_file, "conflicts:"
 
171
                    conflict_title = True
 
172
                if short:
 
173
                    prefix = 'C  '
 
174
                else:
 
175
                    prefix = ' '
 
176
                print >> to_file, "%s %s" % (prefix, conflict)
 
177
            if new_is_working_tree and show_pending:
 
178
                show_pending_merges(new, to_file, short)
 
179
        finally:
 
180
            old.unlock()
 
181
            new.unlock()
149
182
    finally:
150
183
        wt.unlock()
151
184
 
152
 
def show_pending_merges(new, to_file):
 
185
def show_pending_merges(new, to_file, short=False):
153
186
    """Write out a display of pending merges in a working tree."""
154
187
    parents = new.get_parent_ids()
155
188
    if len(parents) < 2:
157
190
    pending = parents[1:]
158
191
    branch = new.branch
159
192
    last_revision = parents[0]
160
 
    print >>to_file, 'pending merges:'
 
193
    if not short:
 
194
        print >>to_file, 'pending merges:'
161
195
    if last_revision is not None:
162
196
        try:
163
 
            ignore = set(branch.repository.get_ancestry(last_revision))
 
197
            ignore = set(branch.repository.get_ancestry(last_revision,
 
198
                                                        topo_sorted=False))
164
199
        except errors.NoSuchRevision:
165
200
            # the last revision is a ghost : assume everything is new 
166
201
            # except for it
175
210
            from bzrlib.osutils import terminal_width
176
211
            width = terminal_width()
177
212
            m_revision = branch.repository.get_revision(merge)
178
 
            print >> to_file, ' ', line_log(m_revision, width - 3)
 
213
            if short:
 
214
                prefix = 'P  '
 
215
            else:
 
216
                prefix = ' '
 
217
            print >> to_file, prefix, line_log(m_revision, width - 4)
179
218
            inner_merges = branch.repository.get_ancestry(merge)
180
219
            assert inner_merges[0] is None
181
220
            inner_merges.pop(0)
184
223
                if mmerge in ignore:
185
224
                    continue
186
225
                mm_revision = branch.repository.get_revision(mmerge)
187
 
                print >> to_file, '   ', line_log(mm_revision, width - 5)
 
226
                if short:
 
227
                    prefix = 'P.  '
 
228
                else:
 
229
                    prefix = '   '
 
230
                print >> to_file, prefix, line_log(mm_revision, width - 5)
188
231
                ignore.add(mmerge)
189
232
        except errors.NoSuchRevision:
190
 
            print >> to_file, ' ', merge
191
 
        
192
 
def list_paths(header, paths, specific_files, to_file):
193
 
    done_header = False
194
 
    for path in paths:
195
 
        if specific_files and not is_inside_any(specific_files, path):
196
 
            continue
197
 
        if not done_header:
198
 
            print >>to_file, '%s:' % header
199
 
            done_header = True
200
 
        print >>to_file, ' ', path
 
233
            if short:
 
234
                prefix = 'P  '
 
235
            else:
 
236
                prefix = ' '
 
237
            print >> to_file, prefix, merge