19
from bzrlib.delta import compare_trees
20
from bzrlib.errors import NoSuchRevision
19
from bzrlib.diff import _raise_if_nonexistent
20
import bzrlib.errors as errors
21
21
from bzrlib.log import line_log
22
22
from bzrlib.osutils import is_inside_any
23
from bzrlib.symbol_versioning import *
23
from bzrlib.symbol_versioning import (deprecated_function,
25
27
# TODO: when showing single-line logs, truncate to the width of the terminal
26
28
# if known, but only if really going to the terminal (not into a file)
29
31
@deprecated_function(zero_eight)
30
def show_status(branch, show_unchanged=False,
32
def show_status(branch, show_unchanged=None,
31
33
specific_files=None,
68
70
specific_files, show_ids, to_file, show_pending, revision)
71
def show_tree_status(wt, show_unchanged=False,
73
def show_tree_status(wt, show_unchanged=None,
72
74
specific_files=None,
83
85
The result is written out as Unicode and to_file should be able
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
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.
103
101
If one revision show compared it with working tree.
104
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)
107
109
to_file = sys.stdout
117
119
rev_id = revision[0].in_history(wt.branch).rev_id
118
120
old = wt.branch.repository.revision_tree(rev_id)
119
except NoSuchRevision, e:
120
raise BzrCommandError(str(e))
121
except errors.NoSuchRevision, e:
122
raise errors.BzrCommandError(str(e))
121
123
if (len(revision) > 1) and (revision[1].spec is not None):
123
125
rev_id = revision[1].in_history(wt.branch).rev_id
124
126
new = wt.branch.repository.revision_tree(rev_id)
125
127
new_is_working_tree = False
126
except NoSuchRevision, e:
127
raise BzrCommandError(str(e))
128
except errors.NoSuchRevision, e:
129
raise errors.BzrCommandError(str(e))
131
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,
132
134
specific_files=specific_files)
133
135
delta.show(to_file,
134
136
show_ids=show_ids,
135
137
show_unchanged=show_unchanged)
137
if new_is_working_tree:
138
list_paths('unknown', new.unknowns(), specific_files, to_file)
139
conflict_title = False
140
for conflict in wt.conflicts():
141
if conflict_title is False:
142
print >> to_file, "conflicts:"
143
conflict_title = True
144
print >> to_file, " %s" % conflict
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
145
147
if new_is_working_tree and show_pending:
146
148
show_pending_merges(new, to_file)
150
152
def show_pending_merges(new, to_file):
151
153
"""Write out a display of pending merges in a working tree."""
152
pending = new.pending_merges()
154
parents = new.get_parent_ids()
157
pending = parents[1:]
153
158
branch = new.branch
154
if len(pending) == 0:
159
last_revision = parents[0]
156
160
print >>to_file, 'pending merges:'
157
last_revision = branch.last_revision()
158
161
if last_revision is not None:
159
ignore = set(branch.repository.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])
162
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:
163
173
ignore.add(merge)
175
from bzrlib.osutils import terminal_width
176
width = terminal_width()
165
177
m_revision = branch.repository.get_revision(merge)
166
print >> to_file, ' ', line_log(m_revision, 77)
178
print >> to_file, ' ', line_log(m_revision, width - 3)
167
179
inner_merges = branch.repository.get_ancestry(merge)
180
assert inner_merges[0] is None
168
182
inner_merges.reverse()
169
183
for mmerge in inner_merges:
170
184
if mmerge in ignore:
172
186
mm_revision = branch.repository.get_revision(mmerge)
173
print >> to_file, ' ', line_log(mm_revision, 75)
187
print >> to_file, ' ', line_log(mm_revision, width - 5)
174
188
ignore.add(mmerge)
175
except NoSuchRevision:
176
print >> to_file, ' ', merge
189
except errors.NoSuchRevision:
190
print >> to_file, ' ', merge
178
192
def list_paths(header, paths, specific_files, to_file):
179
193
done_header = False