71
60
If one revision show compared it with working tree.
72
61
If two revisions show status between first and second.
74
show_tree_status(branch.bzrdir.open_workingtree(), show_unchanged,
75
specific_files, show_ids, to_file, show_pending, revision)
78
def show_tree_status(wt, show_unchanged=None,
86
"""Display summary of changes.
88
By default this compares the working tree to a previous revision.
89
If the revision argument is given, summarizes changes between the
90
working tree and another, or between two revisions.
92
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.
108
If one revision show compared it with working tree.
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.
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
64
to_file = sys.stdout
122
68
new_is_working_tree = True
123
69
if revision is None:
124
if wt.last_revision() != wt.branch.last_revision():
125
warning("working tree is out of date, run 'bzr update'")
70
new = branch.bzrdir.open_workingtree()
127
71
old = new.basis_tree()
128
72
elif len(revision) > 0:
130
rev_id = revision[0].in_history(wt.branch).rev_id
131
old = wt.branch.repository.revision_tree(rev_id)
132
except errors.NoSuchRevision, e:
133
raise errors.BzrCommandError(str(e))
74
rev_id = revision[0].in_history(branch).rev_id
75
old = branch.repository.revision_tree(rev_id)
76
except NoSuchRevision, e:
77
raise BzrCommandError(str(e))
134
78
if (len(revision) > 1) and (revision[1].spec is not None):
136
rev_id = revision[1].in_history(wt.branch).rev_id
137
new = wt.branch.repository.revision_tree(rev_id)
80
rev_id = revision[1].in_history(branch).rev_id
81
new = branch.repository.revision_tree(rev_id)
138
82
new_is_working_tree = False
139
except errors.NoSuchRevision, e:
140
raise errors.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)
83
except NoSuchRevision, e:
84
raise BzrCommandError(str(e))
86
new = branch.bzrdir.open_workingtree()
88
delta = compare_trees(old, new, want_unchanged=show_unchanged,
89
specific_files=specific_files)
92
show_unchanged=show_unchanged)
94
if new_is_working_tree:
95
list_paths('unknown', new.unknowns(), specific_files, to_file)
96
list_paths('conflicts', new.iter_conflicts(), specific_files, to_file)
97
if new_is_working_tree and show_pending:
98
show_pending_merges(new, to_file)
185
def show_pending_merges(new, to_file, short=False):
102
def show_pending_merges(new, to_file):
186
103
"""Write out a display of pending merges in a working tree."""
187
parents = new.get_parent_ids()
104
pending = new.pending_merges()
106
if len(pending) == 0:
190
pending = parents[1:]
192
last_revision = parents[0]
194
print >>to_file, 'pending merges:'
108
print >>to_file, 'pending merges:'
109
last_revision = branch.last_revision()
195
110
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])
111
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:
114
for merge in new.pending_merges():
208
115
ignore.add(merge)
210
from bzrlib.osutils import terminal_width
211
width = terminal_width()
212
117
m_revision = branch.repository.get_revision(merge)
217
print >> to_file, prefix, line_log(m_revision, width - 4)
118
print >> to_file, ' ', line_log(m_revision, 77)
218
119
inner_merges = branch.repository.get_ancestry(merge)
219
assert inner_merges[0] is None
221
120
inner_merges.reverse()
222
121
for mmerge in inner_merges:
223
122
if mmerge in ignore:
225
124
mm_revision = branch.repository.get_revision(mmerge)
230
print >> to_file, prefix, line_log(mm_revision, width - 5)
125
print >> to_file, ' ', line_log(mm_revision, 75)
231
126
ignore.add(mmerge)
232
except errors.NoSuchRevision:
237
print >> to_file, prefix, merge
127
except NoSuchRevision:
128
print >> to_file, ' ', merge
130
def list_paths(header, paths, specific_files, to_file):
133
if specific_files and not is_inside_any(specific_files, path):
136
print >>to_file, '%s:' % header
138
print >>to_file, ' ', path