19
from bzrlib.delta import compare_trees
19
20
from bzrlib.diff import _raise_if_nonexistent
20
import bzrlib.errors as errors
21
from bzrlib.errors import NoSuchRevision
21
22
from bzrlib.log import line_log
22
23
from bzrlib.osutils import is_inside_any
23
from bzrlib.symbol_versioning import (deprecated_function,
24
from bzrlib.symbol_versioning import *
27
26
# TODO: when showing single-line logs, truncate to the width of the terminal
28
27
# if known, but only if really going to the terminal (not into a file)
31
30
@deprecated_function(zero_eight)
32
def show_status(branch, show_unchanged=None,
31
def show_status(branch, show_unchanged=False,
33
32
specific_files=None,
70
69
specific_files, show_ids, to_file, show_pending, revision)
73
def show_tree_status(wt, show_unchanged=None,
72
def show_tree_status(wt, show_unchanged=False,
74
73
specific_files=None,
88
87
If showing the status of a working tree, extra information is included
89
88
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
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
95
96
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.
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
101
109
If one revision show compared it with working tree.
102
110
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)
109
113
to_file = sys.stdout
119
123
rev_id = revision[0].in_history(wt.branch).rev_id
120
124
old = wt.branch.repository.revision_tree(rev_id)
121
except errors.NoSuchRevision, e:
122
raise errors.BzrCommandError(str(e))
125
except NoSuchRevision, e:
126
raise BzrCommandError(str(e))
123
127
if (len(revision) > 1) and (revision[1].spec is not None):
125
129
rev_id = revision[1].in_history(wt.branch).rev_id
126
130
new = wt.branch.repository.revision_tree(rev_id)
127
131
new_is_working_tree = False
128
except errors.NoSuchRevision, e:
129
raise errors.BzrCommandError(str(e))
132
except NoSuchRevision, e:
133
raise BzrCommandError(str(e))
132
136
_raise_if_nonexistent(specific_files, old, new)
133
delta = new.changes_from(old, want_unchanged=show_unchanged,
137
delta = compare_trees(old, new, want_unchanged=show_unchanged,
134
138
specific_files=specific_files)
135
139
delta.show(to_file,
136
140
show_ids=show_ids,
137
141
show_unchanged=show_unchanged)
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
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
147
151
if new_is_working_tree and show_pending:
148
152
show_pending_merges(new, to_file)
152
156
def show_pending_merges(new, to_file):
153
157
"""Write out a display of pending merges in a working tree."""
154
parents = new.get_parent_ids()
158
pending = new.pending_merges()
160
if len(pending) == 0:
157
pending = parents[1:]
159
last_revision = parents[0]
160
162
print >>to_file, 'pending merges:'
163
last_revision = branch.last_revision()
161
164
if last_revision is not None:
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])
165
ignore = set(branch.repository.get_ancestry(last_revision))
169
167
ignore = set([None])
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:
168
for merge in new.pending_merges():
173
169
ignore.add(merge)
175
from bzrlib.osutils import terminal_width
176
width = terminal_width()
177
171
m_revision = branch.repository.get_revision(merge)
178
print >> to_file, ' ', line_log(m_revision, width - 3)
172
print >> to_file, ' ', line_log(m_revision, 77)
179
173
inner_merges = branch.repository.get_ancestry(merge)
180
assert inner_merges[0] is None
174
assert inner_merges[0] == None
181
175
inner_merges.pop(0)
182
176
inner_merges.reverse()
183
177
for mmerge in inner_merges:
184
178
if mmerge in ignore:
186
180
mm_revision = branch.repository.get_revision(mmerge)
187
print >> to_file, ' ', line_log(mm_revision, width - 5)
181
print >> to_file, ' ', line_log(mm_revision, 75)
188
182
ignore.add(mmerge)
189
except errors.NoSuchRevision:
190
print >> to_file, ' ', merge
183
except NoSuchRevision:
184
print >> to_file, ' ', merge
192
186
def list_paths(header, paths, specific_files, to_file):
193
187
done_header = False