~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/status.py

  • Committer: Robert Collins
  • Date: 2007-03-08 04:06:06 UTC
  • mfrom: (2323.1.1 integration)
  • mto: This revision was merged to the branch mainline in revision 2442.
  • Revision ID: robertc@robertcollins.net-20070308040606-84gsniv56huiyjt4
Merge bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 
17
17
import sys
18
18
 
19
 
from bzrlib.delta import compare_trees
 
19
from bzrlib import (
 
20
    delta as _mod_delta,
 
21
    tree,
 
22
    )
20
23
from bzrlib.diff import _raise_if_nonexistent
21
 
from bzrlib.errors import NoSuchRevision
 
24
import bzrlib.errors as errors
22
25
from bzrlib.log import line_log
23
26
from bzrlib.osutils import is_inside_any
24
 
from bzrlib.symbol_versioning import *
 
27
from bzrlib.symbol_versioning import (deprecated_function,
 
28
        zero_eight,
 
29
        )
 
30
from bzrlib.trace import warning
25
31
 
26
32
# TODO: when showing single-line logs, truncate to the width of the terminal
27
33
# if known, but only if really going to the terminal (not into a file)
28
34
 
29
35
 
30
36
@deprecated_function(zero_eight)
31
 
def show_status(branch, show_unchanged=False,
 
37
def show_status(branch, show_unchanged=None,
32
38
                specific_files=None,
33
39
                show_ids=False,
34
40
                to_file=None,
69
75
                     specific_files, show_ids, to_file, show_pending, revision)
70
76
 
71
77
 
72
 
def show_tree_status(wt, show_unchanged=False,
 
78
def show_tree_status(wt, show_unchanged=None,
73
79
                     specific_files=None,
74
80
                     show_ids=False,
75
81
                     to_file=None,
76
82
                     show_pending=True,
77
 
                     revision=None):
 
83
                     revision=None,
 
84
                     short=False):
78
85
    """Display summary of changes.
79
86
 
80
87
    By default this compares the working tree to a previous revision. 
87
94
    If showing the status of a working tree, extra information is included
88
95
    about unknown files, conflicts, and pending merges.
89
96
 
90
 
    show_unchanged
91
 
        If set, includes unchanged files.
92
 
 
93
 
    specific_files
94
 
        If set, a list of filenames whose status should be shown.
95
 
        It is an error to give a filename that is not in the working 
 
97
    :param show_unchanged: Deprecated parameter. If set, includes unchanged 
 
98
        files.
 
99
    :param specific_files: If set, a list of filenames whose status should be
 
100
        shown.  It is an error to give a filename that is not in the working 
96
101
        tree, or in the working inventory or in the basis inventory.
97
 
 
98
 
    show_ids
99
 
        If set, includes each file's id.
100
 
 
101
 
    to_file
102
 
        If set, write to this file (default stdout.)
103
 
 
104
 
    show_pending
105
 
        If set, write pending merges.
106
 
 
107
 
    revision
108
 
        If None the compare latest revision with working tree
 
102
    :param show_ids: If set, includes each file's id.
 
103
    :param to_file: If set, write to this file (default stdout.)
 
104
    :param show_pending: If set, write pending merges.
 
105
    :param revision: If None the compare latest revision with working tree
 
106
        If not None it must be a RevisionSpec list.
109
107
        If one revision show compared it with working tree.
110
108
        If two revisions show status between first and second.
 
109
    :param short: If True, gives short SVN-style status lines
111
110
    """
112
 
    if to_file == None:
 
111
    if show_unchanged is not None:
 
112
        warn("show_status_trees with show_unchanged has been deprecated "
 
113
             "since bzrlib 0.9", DeprecationWarning, stacklevel=2)
 
114
 
 
115
    if to_file is None:
113
116
        to_file = sys.stdout
114
117
    
115
118
    wt.lock_read()
116
119
    try:
117
120
        new_is_working_tree = True
118
121
        if revision is None:
 
122
            if wt.last_revision() != wt.branch.last_revision():
 
123
                warning("working tree is out of date, run 'bzr update'")
119
124
            new = wt
120
125
            old = new.basis_tree()
121
126
        elif len(revision) > 0:
122
127
            try:
123
128
                rev_id = revision[0].in_history(wt.branch).rev_id
124
129
                old = wt.branch.repository.revision_tree(rev_id)
125
 
            except NoSuchRevision, e:
126
 
                raise BzrCommandError(str(e))
 
130
            except errors.NoSuchRevision, e:
 
131
                raise errors.BzrCommandError(str(e))
127
132
            if (len(revision) > 1) and (revision[1].spec is not None):
128
133
                try:
129
134
                    rev_id = revision[1].in_history(wt.branch).rev_id
130
135
                    new = wt.branch.repository.revision_tree(rev_id)
131
136
                    new_is_working_tree = False
132
 
                except NoSuchRevision, e:
133
 
                    raise BzrCommandError(str(e))
 
137
                except errors.NoSuchRevision, e:
 
138
                    raise errors.BzrCommandError(str(e))
134
139
            else:
135
140
                new = wt
136
 
        _raise_if_nonexistent(specific_files, old, new)
137
 
        delta = compare_trees(old, new, want_unchanged=show_unchanged,
138
 
                              specific_files=specific_files)
139
 
        delta.show(to_file,
140
 
                   show_ids=show_ids,
141
 
                   show_unchanged=show_unchanged)
142
 
 
143
 
        if new_is_working_tree:
144
 
            list_paths('unknown', new.unknowns(), specific_files, to_file)
 
141
        old.lock_read()
 
142
        new.lock_read()
 
143
        try:
 
144
            _raise_if_nonexistent(specific_files, old, new)
 
145
            if short:
 
146
                changes = new._iter_changes(old, show_unchanged, specific_files,
 
147
                    require_versioned=False, want_unversioned=True)
 
148
                reporter = _mod_delta.ChangeReporter(output_file=to_file,
 
149
                    unversioned_filter=new.is_ignored)
 
150
                _mod_delta.report_changes(changes, reporter)
 
151
            else:
 
152
                delta = new.changes_from(old, want_unchanged=show_unchanged,
 
153
                                      specific_files=specific_files,
 
154
                                      want_unversioned=True)
 
155
                # filter out unknown files. We may want a tree method for
 
156
                # this
 
157
                delta.unversioned = [unversioned for unversioned in
 
158
                    delta.unversioned if not new.is_ignored(unversioned[0])]
 
159
                delta.show(to_file,
 
160
                           show_ids=show_ids,
 
161
                           show_unchanged=show_unchanged,
 
162
                           short_status=False)
145
163
            conflict_title = False
146
 
            for conflict in wt.conflicts():
147
 
                if conflict_title is False:
 
164
            # show the new conflicts only for now. XXX: get them from the delta.
 
165
            for conflict in new.conflicts():
 
166
                if not short and conflict_title is False:
148
167
                    print >> to_file, "conflicts:"
149
168
                    conflict_title = True
150
 
                print >> to_file, "  %s" % conflict
151
 
        if new_is_working_tree and show_pending:
152
 
            show_pending_merges(new, to_file)
 
169
                if short:
 
170
                    prefix = 'C  '
 
171
                else:
 
172
                    prefix = ' '
 
173
                print >> to_file, "%s %s" % (prefix, conflict)
 
174
            if new_is_working_tree and show_pending:
 
175
                show_pending_merges(new, to_file, short)
 
176
        finally:
 
177
            old.unlock()
 
178
            new.unlock()
153
179
    finally:
154
180
        wt.unlock()
155
181
 
156
 
def show_pending_merges(new, to_file):
 
182
def show_pending_merges(new, to_file, short=False):
157
183
    """Write out a display of pending merges in a working tree."""
158
 
    pending = new.pending_merges()
 
184
    parents = new.get_parent_ids()
 
185
    if len(parents) < 2:
 
186
        return
 
187
    pending = parents[1:]
159
188
    branch = new.branch
160
 
    if len(pending) == 0:
161
 
        return
162
 
    print >>to_file, 'pending merges:'
163
 
    last_revision = branch.last_revision()
 
189
    last_revision = parents[0]
 
190
    if not short:
 
191
        print >>to_file, 'pending merges:'
164
192
    if last_revision is not None:
165
 
        ignore = set(branch.repository.get_ancestry(last_revision))
 
193
        try:
 
194
            ignore = set(branch.repository.get_ancestry(last_revision))
 
195
        except errors.NoSuchRevision:
 
196
            # the last revision is a ghost : assume everything is new 
 
197
            # except for it
 
198
            ignore = set([None, last_revision])
166
199
    else:
167
200
        ignore = set([None])
168
 
    for merge in new.pending_merges():
 
201
    # TODO: this could be improved using merge_sorted - we'd get the same 
 
202
    # output rather than one level of indent.
 
203
    for merge in pending:
169
204
        ignore.add(merge)
170
205
        try:
 
206
            from bzrlib.osutils import terminal_width
 
207
            width = terminal_width()
171
208
            m_revision = branch.repository.get_revision(merge)
172
 
            print >> to_file, ' ', line_log(m_revision, 77)
 
209
            if short:
 
210
                prefix = 'P  '
 
211
            else:
 
212
                prefix = ' '
 
213
            print >> to_file, prefix, line_log(m_revision, width - 4)
173
214
            inner_merges = branch.repository.get_ancestry(merge)
174
 
            assert inner_merges[0] == None
 
215
            assert inner_merges[0] is None
175
216
            inner_merges.pop(0)
176
217
            inner_merges.reverse()
177
218
            for mmerge in inner_merges:
178
219
                if mmerge in ignore:
179
220
                    continue
180
221
                mm_revision = branch.repository.get_revision(mmerge)
181
 
                print >> to_file, '   ', line_log(mm_revision, 75)
 
222
                if short:
 
223
                    prefix = 'P.  '
 
224
                else:
 
225
                    prefix = '   '
 
226
                print >> to_file, prefix, line_log(mm_revision, width - 5)
182
227
                ignore.add(mmerge)
183
 
        except NoSuchRevision:
184
 
            print >> to_file, ' ', merge 
185
 
        
186
 
def list_paths(header, paths, specific_files, to_file):
187
 
    done_header = False
188
 
    for path in paths:
189
 
        if specific_files and not is_inside_any(specific_files, path):
190
 
            continue
191
 
        if not done_header:
192
 
            print >>to_file, '%s:' % header
193
 
            done_header = True
194
 
        print >>to_file, ' ', path
 
228
        except errors.NoSuchRevision:
 
229
            if short:
 
230
                prefix = 'P  '
 
231
            else:
 
232
                prefix = ' '
 
233
            print >> to_file, prefix, merge