92
83
The result is written out as Unicode and to_file should be able
95
If showing the status of a working tree, extra information is included
96
about unknown files, conflicts, and pending merges.
98
:param show_unchanged: Deprecated parameter. If set, includes unchanged
100
:param specific_files: If set, a list of filenames whose status should be
101
shown. It is an error to give a filename that is not in the working
102
tree, or in the working inventory or in the basis inventory.
103
:param show_ids: If set, includes each file's id.
104
:param to_file: If set, write to this file (default stdout.)
105
:param show_pending: If set, write pending merges.
106
:param revision: If None the compare latest revision with working tree
107
If not None it must be a RevisionSpec list.
87
If set, includes unchanged files.
90
If set, only show the status of files in this list.
93
If set, includes each file's id.
96
If set, write to this file (default stdout.)
99
If set, write pending merges.
102
If None the compare latest revision with working tree
108
103
If one revision show compared it with working tree.
109
104
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.
113
if show_unchanged is not None:
114
warn("show_status_trees with show_unchanged has been deprecated "
115
"since bzrlib 0.9", DeprecationWarning, stacklevel=2)
118
107
to_file = sys.stdout
122
111
new_is_working_tree = True
123
112
if revision is None:
124
if wt.last_revision() != wt.branch.last_revision():
125
warning("working tree is out of date, run 'bzr update'")
127
114
old = new.basis_tree()
128
115
elif len(revision) > 0:
130
117
rev_id = revision[0].in_history(wt.branch).rev_id
131
118
old = wt.branch.repository.revision_tree(rev_id)
132
except errors.NoSuchRevision, e:
133
raise errors.BzrCommandError(str(e))
119
except NoSuchRevision, e:
120
raise BzrCommandError(str(e))
134
121
if (len(revision) > 1) and (revision[1].spec is not None):
136
123
rev_id = revision[1].in_history(wt.branch).rev_id
137
124
new = wt.branch.repository.revision_tree(rev_id)
138
125
new_is_working_tree = False
139
except errors.NoSuchRevision, e:
140
raise errors.BzrCommandError(str(e))
126
except NoSuchRevision, e:
127
raise BzrCommandError(str(e))
146
_raise_if_nonexistent(specific_files, old, new)
147
want_unversioned = not versioned
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)
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
160
delta.unversioned = [unversioned for unversioned in
161
delta.unversioned if not new.is_ignored(unversioned[0])]
164
show_unchanged=show_unchanged,
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
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)
131
delta = compare_trees(old, new, want_unchanged=show_unchanged,
132
specific_files=specific_files)
135
show_unchanged=show_unchanged)
137
if new_is_working_tree:
138
list_paths('unknown', new.unknowns(), specific_files, to_file)
139
list_paths('conflicts', new.iter_conflicts(), specific_files, to_file)
140
if new_is_working_tree and show_pending:
141
show_pending_merges(new, to_file)
185
def show_pending_merges(new, to_file, short=False):
145
def show_pending_merges(new, to_file):
186
146
"""Write out a display of pending merges in a working tree."""
187
parents = new.get_parent_ids()
147
pending = new.pending_merges()
149
if len(pending) == 0:
190
pending = parents[1:]
192
last_revision = parents[0]
194
print >>to_file, 'pending merges:'
151
print >>to_file, 'pending merges:'
152
last_revision = branch.last_revision()
195
153
if last_revision is not None:
197
ignore = set(branch.repository.get_ancestry(last_revision,
199
except errors.NoSuchRevision:
200
# the last revision is a ghost : assume everything is new
202
ignore = set([None, last_revision])
154
ignore = set(branch.repository.get_ancestry(last_revision))
205
# TODO: this could be improved using merge_sorted - we'd get the same
206
# output rather than one level of indent.
207
for merge in pending:
157
for merge in new.pending_merges():
208
158
ignore.add(merge)
210
from bzrlib.osutils import terminal_width
211
width = terminal_width()
212
160
m_revision = branch.repository.get_revision(merge)
217
print >> to_file, prefix, line_log(m_revision, width - 4)
161
print >> to_file, ' ', line_log(m_revision, 77)
218
162
inner_merges = branch.repository.get_ancestry(merge)
219
assert inner_merges[0] is None
221
163
inner_merges.reverse()
222
164
for mmerge in inner_merges:
223
165
if mmerge in ignore:
225
167
mm_revision = branch.repository.get_revision(mmerge)
230
print >> to_file, prefix, line_log(mm_revision, width - 5)
168
print >> to_file, ' ', line_log(mm_revision, 75)
231
169
ignore.add(mmerge)
232
except errors.NoSuchRevision:
237
print >> to_file, prefix, merge
170
except NoSuchRevision:
171
print >> to_file, ' ', merge
173
def list_paths(header, paths, specific_files, to_file):
176
if specific_files and not is_inside_any(specific_files, path):
179
print >>to_file, '%s:' % header
181
print >>to_file, ' ', path