87
90
If showing the status of a working tree, extra information is included
88
91
about unknown files, conflicts, and pending merges.
91
If set, includes unchanged 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
93
:param show_unchanged: Deprecated parameter. If set, includes unchanged
95
:param specific_files: If set, a list of filenames whose status should be
96
shown. It is an error to give a filename that is not in the working
96
97
tree, or in the working inventory or in the basis inventory.
99
If set, includes each file's id.
102
If set, write to this file (default stdout.)
105
If set, write pending merges.
108
If None the compare latest revision with working tree
98
:param show_ids: If set, includes each file's id.
99
:param to_file: If set, write to this file (default stdout.)
100
:param show_pending: If set, write pending merges.
101
:param revision: If None the compare latest revision with working tree
102
If not None it must be a RevisionSpec list.
109
103
If one revision show compared it with working tree.
110
104
If two revisions show status between first and second.
105
:param short: If True, gives short SVN-style status lines
107
if show_unchanged is not None:
108
warn("show_status_trees with show_unchanged has been deprecated "
109
"since bzrlib 0.9", DeprecationWarning, stacklevel=2)
113
112
to_file = sys.stdout
117
116
new_is_working_tree = True
118
117
if revision is None:
118
if wt.last_revision() != wt.branch.last_revision():
119
warning("working tree is out of date, run 'bzr update'")
120
121
old = new.basis_tree()
121
122
elif len(revision) > 0:
123
124
rev_id = revision[0].in_history(wt.branch).rev_id
124
125
old = wt.branch.repository.revision_tree(rev_id)
125
except NoSuchRevision, e:
126
raise BzrCommandError(str(e))
126
except errors.NoSuchRevision, e:
127
raise errors.BzrCommandError(str(e))
127
128
if (len(revision) > 1) and (revision[1].spec is not None):
129
130
rev_id = revision[1].in_history(wt.branch).rev_id
130
131
new = wt.branch.repository.revision_tree(rev_id)
131
132
new_is_working_tree = False
132
except NoSuchRevision, e:
133
raise BzrCommandError(str(e))
133
except errors.NoSuchRevision, e:
134
raise errors.BzrCommandError(str(e))
136
137
_raise_if_nonexistent(specific_files, old, new)
137
delta = compare_trees(old, new, want_unchanged=show_unchanged,
138
delta = new.changes_from(old, want_unchanged=show_unchanged,
138
139
specific_files=specific_files)
139
140
delta.show(to_file,
140
141
show_ids=show_ids,
141
show_unchanged=show_unchanged)
143
if new_is_working_tree:
144
list_paths('unknown', new.unknowns(), specific_files, to_file)
145
conflict_title = False
146
for conflict in wt.conflicts():
147
if conflict_title is False:
148
print >> to_file, "conflicts:"
149
conflict_title = True
150
print >> to_file, " %s" % conflict
142
show_unchanged=show_unchanged,
144
short_status_letter = '?'
146
short_status_letter = ''
147
list_paths('unknown', new.unknowns(), specific_files, to_file,
149
conflict_title = False
150
# show the new conflicts only for now. XXX: get them from the delta.
151
for conflict in new.conflicts():
152
if not short and conflict_title is False:
153
print >> to_file, "conflicts:"
154
conflict_title = True
159
print >> to_file, "%s %s" % (prefix, conflict)
151
160
if new_is_working_tree and show_pending:
152
show_pending_merges(new, to_file)
161
show_pending_merges(new, to_file, short)
156
def show_pending_merges(new, to_file):
165
def show_pending_merges(new, to_file, short=False):
157
166
"""Write out a display of pending merges in a working tree."""
158
pending = new.pending_merges()
167
parents = new.get_parent_ids()
170
pending = parents[1:]
159
171
branch = new.branch
160
if len(pending) == 0:
162
print >>to_file, 'pending merges:'
163
last_revision = branch.last_revision()
172
last_revision = parents[0]
174
print >>to_file, 'pending merges:'
164
175
if last_revision is not None:
165
ignore = set(branch.repository.get_ancestry(last_revision))
177
ignore = set(branch.repository.get_ancestry(last_revision))
178
except errors.NoSuchRevision:
179
# the last revision is a ghost : assume everything is new
181
ignore = set([None, last_revision])
167
183
ignore = set([None])
168
for merge in new.pending_merges():
184
# TODO: this could be improved using merge_sorted - we'd get the same
185
# output rather than one level of indent.
186
for merge in pending:
169
187
ignore.add(merge)
189
from bzrlib.osutils import terminal_width
190
width = terminal_width()
171
191
m_revision = branch.repository.get_revision(merge)
172
print >> to_file, ' ', line_log(m_revision, 77)
196
print >> to_file, prefix, line_log(m_revision, width - 4)
173
197
inner_merges = branch.repository.get_ancestry(merge)
174
assert inner_merges[0] == None
198
assert inner_merges[0] is None
175
199
inner_merges.pop(0)
176
200
inner_merges.reverse()
177
201
for mmerge in inner_merges:
178
202
if mmerge in ignore:
180
204
mm_revision = branch.repository.get_revision(mmerge)
181
print >> to_file, ' ', line_log(mm_revision, 75)
209
print >> to_file, prefix, line_log(mm_revision, width - 5)
182
210
ignore.add(mmerge)
183
except NoSuchRevision:
184
print >> to_file, ' ', merge
211
except errors.NoSuchRevision:
216
print >> to_file, prefix, merge
186
def list_paths(header, paths, specific_files, to_file):
218
def list_paths(header, paths, specific_files, to_file, short_status_letter=''):
187
219
done_header = False
188
220
for path in paths:
189
221
if specific_files and not is_inside_any(specific_files, path):
223
if not short_status_letter and not done_header:
192
224
print >>to_file, '%s:' % header
193
225
done_header = True
194
print >>to_file, ' ', path
226
print >>to_file, '%s %s' % (short_status_letter, path)