59
66
If one revision show compared it with working tree.
60
67
If two revisions show status between first and second.
69
show_tree_status(branch.bzrdir.open_workingtree(), show_unchanged,
70
specific_files, show_ids, to_file, show_pending, revision)
73
def show_tree_status(wt, show_unchanged=None,
79
"""Display summary of changes.
81
By default this compares the working tree to a previous revision.
82
If the revision argument is given, summarizes changes between the
83
working tree and another, or between two revisions.
85
The result is written out as Unicode and to_file should be able
88
If showing the status of a working tree, extra information is included
89
about unknown files, conflicts, and pending merges.
91
:param show_unchanged: Deprecated parameter. If set, includes unchanged
93
:param specific_files: If set, a list of filenames whose status should be
94
shown. It is an error to give a filename that is not in the working
95
tree, or in the working inventory or in the basis inventory.
96
:param show_ids: If set, includes each file's id.
97
:param to_file: If set, write to this file (default stdout.)
98
:param show_pending: If set, write pending merges.
99
:param revision: If None the compare latest revision with working tree
100
If not None it must be a RevisionSpec list.
101
If one revision show compared it with working tree.
102
If two revisions show status between first and second.
104
if show_unchanged is not None:
105
warn("show_status_trees with show_unchanged has been deprecated "
106
"since bzrlib 0.9", DeprecationWarning, stacklevel=2)
63
109
to_file = sys.stdout
67
113
new_is_working_tree = True
68
114
if revision is None:
69
old = branch.basis_tree()
70
new = branch.working_tree()
116
old = new.basis_tree()
71
117
elif len(revision) > 0:
73
rev_id = revision[0].in_history(branch).rev_id
74
old = branch.revision_tree(rev_id)
75
except NoSuchRevision, e:
76
raise BzrCommandError(str(e))
119
rev_id = revision[0].in_history(wt.branch).rev_id
120
old = wt.branch.repository.revision_tree(rev_id)
121
except errors.NoSuchRevision, e:
122
raise errors.BzrCommandError(str(e))
123
if (len(revision) > 1) and (revision[1].spec is not None):
79
rev_id = revision[1].in_history(branch).rev_id
80
new = branch.revision_tree(rev_id)
125
rev_id = revision[1].in_history(wt.branch).rev_id
126
new = wt.branch.repository.revision_tree(rev_id)
81
127
new_is_working_tree = False
82
except NoSuchRevision, e:
83
raise BzrCommandError(str(e))
128
except errors.NoSuchRevision, e:
129
raise errors.BzrCommandError(str(e))
85
new = branch.working_tree()
88
delta = compare_trees(old, new, want_unchanged=show_unchanged,
132
_raise_if_nonexistent(specific_files, old, new)
133
delta = new.changes_from(old, want_unchanged=show_unchanged,
89
134
specific_files=specific_files)
91
135
delta.show(to_file,
92
136
show_ids=show_ids,
93
137
show_unchanged=show_unchanged)
95
if new_is_working_tree:
96
list_paths('unknown', new.unknowns(), specific_files, to_file)
97
list_paths('conflicts', new.iter_conflicts(), specific_files, to_file)
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
98
147
if new_is_working_tree and show_pending:
99
148
show_pending_merges(new, to_file)
103
152
def show_pending_merges(new, to_file):
104
153
"""Write out a display of pending merges in a working tree."""
105
pending = new.pending_merges()
154
parents = new.get_parent_ids()
157
pending = parents[1:]
106
158
branch = new.branch
107
if len(pending) == 0:
159
last_revision = parents[0]
109
160
print >>to_file, 'pending merges:'
110
last_revision = branch.last_revision()
111
161
if last_revision is not None:
112
ignore = set(branch.get_ancestry(last_revision))
163
ignore = set(branch.repository.get_ancestry(last_revision))
164
except errors.NoSuchRevision:
165
# the last revision is a ghost : assume everything is new
167
ignore = set([None, last_revision])
115
for merge in new.pending_merges():
170
# TODO: this could be improved using merge_sorted - we'd get the same
171
# output rather than one level of indent.
172
for merge in pending:
116
173
ignore.add(merge)
118
m_revision = branch.get_revision(merge)
119
print >> to_file, ' ', line_log(m_revision, 77)
120
inner_merges = branch.get_ancestry(merge)
175
from bzrlib.osutils import terminal_width
176
width = terminal_width()
177
m_revision = branch.repository.get_revision(merge)
178
print >> to_file, ' ', line_log(m_revision, width - 3)
179
inner_merges = branch.repository.get_ancestry(merge)
180
assert inner_merges[0] is None
121
182
inner_merges.reverse()
122
183
for mmerge in inner_merges:
123
184
if mmerge in ignore:
125
mm_revision = branch.get_revision(mmerge)
126
print >> to_file, ' ', line_log(mm_revision, 75)
186
mm_revision = branch.repository.get_revision(mmerge)
187
print >> to_file, ' ', line_log(mm_revision, width - 5)
127
188
ignore.add(mmerge)
128
except NoSuchRevision:
129
print >> to_file, ' ', merge
189
except errors.NoSuchRevision:
190
print >> to_file, ' ', merge
131
192
def list_paths(header, paths, specific_files, to_file):
132
193
done_header = False