~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/status.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2006-10-04 08:13:07 UTC
  • mfrom: (2039.2.4 python25)
  • Revision ID: pqm@pqm.ubuntu.com-20061004081307-413acd85912dbab0
(mbp) let bzr+ssh:// work without paramiko

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006, 2007 Canonical Ltd
 
1
# Copyright (C) 2005, 2006 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
 
    )
23
19
from bzrlib.diff import _raise_if_nonexistent
24
20
import bzrlib.errors as errors
25
21
from bzrlib.log import line_log
27
23
from bzrlib.symbol_versioning import (deprecated_function,
28
24
        zero_eight,
29
25
        )
30
 
from bzrlib.trace import warning
31
26
 
32
27
# TODO: when showing single-line logs, truncate to the width of the terminal
33
28
# if known, but only if really going to the terminal (not into a file)
80
75
                     show_ids=False,
81
76
                     to_file=None,
82
77
                     show_pending=True,
83
 
                     revision=None,
84
 
                     short=False,
85
 
                     versioned=False):
 
78
                     revision=None):
86
79
    """Display summary of changes.
87
80
 
88
81
    By default this compares the working tree to a previous revision. 
107
100
        If not None it must be a RevisionSpec list.
108
101
        If one revision show compared it with working tree.
109
102
        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.
112
103
    """
113
104
    if show_unchanged is not None:
114
105
        warn("show_status_trees with show_unchanged has been deprecated "
121
112
    try:
122
113
        new_is_working_tree = True
123
114
        if revision is None:
124
 
            if wt.last_revision() != wt.branch.last_revision():
125
 
                warning("working tree is out of date, run 'bzr update'")
126
115
            new = wt
127
116
            old = new.basis_tree()
128
117
        elif len(revision) > 0:
140
129
                    raise errors.BzrCommandError(str(e))
141
130
            else:
142
131
                new = wt
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()
 
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)
182
149
    finally:
183
150
        wt.unlock()
184
151
 
185
 
def show_pending_merges(new, to_file, short=False):
 
152
def show_pending_merges(new, to_file):
186
153
    """Write out a display of pending merges in a working tree."""
187
154
    parents = new.get_parent_ids()
188
155
    if len(parents) < 2:
190
157
    pending = parents[1:]
191
158
    branch = new.branch
192
159
    last_revision = parents[0]
193
 
    if not short:
194
 
        print >>to_file, 'pending merges:'
 
160
    print >>to_file, 'pending merges:'
195
161
    if last_revision is not None:
196
162
        try:
197
163
            ignore = set(branch.repository.get_ancestry(last_revision))
209
175
            from bzrlib.osutils import terminal_width
210
176
            width = terminal_width()
211
177
            m_revision = branch.repository.get_revision(merge)
212
 
            if short:
213
 
                prefix = 'P  '
214
 
            else:
215
 
                prefix = ' '
216
 
            print >> to_file, prefix, line_log(m_revision, width - 4)
 
178
            print >> to_file, ' ', line_log(m_revision, width - 3)
217
179
            inner_merges = branch.repository.get_ancestry(merge)
218
180
            assert inner_merges[0] is None
219
181
            inner_merges.pop(0)
222
184
                if mmerge in ignore:
223
185
                    continue
224
186
                mm_revision = branch.repository.get_revision(mmerge)
225
 
                if short:
226
 
                    prefix = 'P.  '
227
 
                else:
228
 
                    prefix = '   '
229
 
                print >> to_file, prefix, line_log(mm_revision, width - 5)
 
187
                print >> to_file, '   ', line_log(mm_revision, width - 5)
230
188
                ignore.add(mmerge)
231
189
        except errors.NoSuchRevision:
232
 
            if short:
233
 
                prefix = 'P  '
234
 
            else:
235
 
                prefix = ' '
236
 
            print >> to_file, prefix, merge
 
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