17
17
"""Display what revisions are missing in 'other' from 'this' and vice versa."""
19
from __future__ import absolute_import
25
import bzrlib.revision as _mod_revision
28
25
def iter_log_revisions(revisions, revision_source, verbose, rev_tag_dict=None):
29
last_tree = revision_source.revision_tree(_mod_revision.NULL_REVISION)
32
26
if rev_tag_dict is None:
35
# We need the following for backward compatibilty (hopefully
36
# this will be deprecated soon :-/) -- vila 080911
41
revno, rev_id, merge_depth = rev
28
for revno, rev_id, merge_depth in revisions:
42
29
rev = revision_source.get_revision(rev_id)
44
31
delta = revision_source.get_revision_delta(rev_id)
51
38
def find_unmerged(local_branch, remote_branch, restrict='all',
52
39
include_merged=None, backward=False,
53
local_revid_range=None, remote_revid_range=None,
54
include_merges=symbol_versioning.DEPRECATED_PARAMETER):
40
local_revid_range=None, remote_revid_range=None):
55
41
"""Find revisions from each side that have not been merged.
57
43
:param local_branch: Compare the history of local_branch
69
55
revisions (lower bound, upper bound)
70
56
:param remote_revid_range: Revision-id range for filtering remote_branch
71
57
revisions (lower bound, upper bound)
72
:param include_merges: Deprecated historical alias for include_merged
74
59
:return: A list of [(revno, revision_id)] for the mainline revisions on
77
if symbol_versioning.deprecated_passed(include_merges):
78
symbol_versioning.warn(
79
'include_merges was deprecated in 2.5.'
80
' Use include_merged instead.',
81
DeprecationWarning, stacklevel=2)
82
if include_merged is None:
83
include_merged = include_merges
84
62
if include_merged is None:
85
63
include_merged = False
86
local_branch.lock_read()
88
remote_branch.lock_read()
90
return _find_unmerged(
91
local_branch, remote_branch, restrict=restrict,
92
include_merged=include_merged, backward=backward,
93
local_revid_range=local_revid_range,
94
remote_revid_range=remote_revid_range)
96
remote_branch.unlock()
64
with local_branch.lock_read(), remote_branch.lock_read():
65
return _find_unmerged(
66
local_branch, remote_branch, restrict=restrict,
67
include_merged=include_merged, backward=backward,
68
local_revid_range=local_revid_range,
69
remote_revid_range=remote_revid_range)
101
72
def _enumerate_mainline(ancestry, graph, tip_revno, tip, backward=True):
107
78
:param tip: The tip of mainline
108
79
:param backward: Show oldest versions first when True, newest versions
110
:return: [(revno, revision_id)] for all revisions in ancestry that
81
:return: [(revno, revision_id, 0)] for all revisions in ancestry that
111
82
are left-hand parents from tip, or None if ancestry is None.
113
84
if ancestry is None:
115
if not ancestry: #Empty ancestry, no need to do any work
86
if not ancestry: # Empty ancestry, no need to do any work
118
89
# Optionally, we could make 1 call to graph.get_parent_map with all
126
97
parent_map = graph.get_parent_map([cur])
127
98
parents = parent_map.get(cur)
129
break # Ghost, we are done
130
mainline.append((str(cur_revno), cur))
100
break # Ghost, we are done
102
(str(cur_revno) if cur_revno is not None else None, cur, 0))
104
if cur_revno is not None:
134
107
mainline.reverse()
174
147
if revid_range is None or revs is None:
176
149
return [rev for rev in revs
177
if graph.is_between(rev[1], revid_range[0], revid_range[1])]
150
if graph.is_between(rev[1], revid_range[0], revid_range[1])]
180
153
def _find_unmerged(local_branch, remote_branch, restrict,
185
158
The branches should already be locked before entering.
187
local_revno, local_revision_id = local_branch.last_revision_info()
188
remote_revno, remote_revision_id = remote_branch.last_revision_info()
189
if local_revno == remote_revno and local_revision_id == remote_revision_id:
161
local_revno, local_revision_id = local_branch.last_revision_info()
162
except (errors.UnsupportedOperation, errors.GhostRevisionsHaveNoRevno):
164
local_revision_id = local_branch.last_revision()
166
remote_revno, remote_revision_id = remote_branch.last_revision_info()
167
except (errors.UnsupportedOperation, errors.GhostRevisionsHaveNoRevno):
168
remote_revision_id = remote_branch.last_revision()
171
if local_revision_id == remote_revision_id:
190
172
# A simple shortcut when the tips are at the same point
192
174
graph = local_branch.repository.get_graph(remote_branch.repository)
218
200
local_revision_id, backward)
219
201
remotes = _enumerate_mainline(remote_extra, graph, remote_revno,
220
202
remote_revision_id, backward)
221
return _filter_revs(graph, locals, local_revid_range), _filter_revs(graph,
222
remotes, remote_revid_range)
203
return _filter_revs(graph, locals, local_revid_range), _filter_revs(
204
graph, remotes, remote_revid_range)
225
207
def sorted_revisions(revisions, history_map):
226
revisions = [(history_map[r],r) for r in revisions]
208
revisions = sorted([(history_map[r], r) for r in revisions])