17
17
"""Display what revisions are missing in 'other' from 'this' and vice versa."""
22
import bzrlib.revision as _mod_revision
25
def iter_log_revisions(revisions, revision_source, verbose):
26
last_tree = revision_source.revision_tree(_mod_revision.NULL_REVISION)
29
# We need the following for backward compatibilty (hopefully
30
# this will be deprecated soon :-/) -- vila 080911
35
revno, rev_id, merge_depth = rev
25
def iter_log_revisions(revisions, revision_source, verbose, rev_tag_dict=None):
26
if rev_tag_dict is None:
28
for revno, rev_id, merge_depth in revisions:
36
29
rev = revision_source.get_revision(rev_id)
38
31
delta = revision_source.get_revision_delta(rev_id)
41
yield log.LogRevision(rev, revno, merge_depth, delta=delta)
34
yield log.LogRevision(rev, revno, merge_depth, delta=delta,
35
tags=rev_tag_dict.get(rev_id))
44
38
def find_unmerged(local_branch, remote_branch, restrict='all',
45
include_merges=False, backward=False,
39
include_merged=None, backward=False,
46
40
local_revid_range=None, remote_revid_range=None):
47
41
"""Find revisions from each side that have not been merged.
53
47
unique revisions from both sides. If 'local', we will return None
54
48
for the remote revisions, similarly if 'remote' we will return None for
55
49
the local revisions.
56
:param include_merges: Show mainline revisions only if False,
50
:param include_merged: Show mainline revisions only if False,
57
51
all revisions otherwise.
58
52
:param backward: Show oldest versions first when True, newest versions
65
59
:return: A list of [(revno, revision_id)] for the mainline revisions on
68
local_branch.lock_read()
70
remote_branch.lock_read()
72
return _find_unmerged(
73
local_branch, remote_branch, restrict=restrict,
74
include_merges=include_merges, backward=backward,
75
local_revid_range=local_revid_range,
76
remote_revid_range=remote_revid_range)
78
remote_branch.unlock()
62
if include_merged is None:
63
include_merged = False
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)
83
72
def _enumerate_mainline(ancestry, graph, tip_revno, tip, backward=True):
89
78
:param tip: The tip of mainline
90
79
:param backward: Show oldest versions first when True, newest versions
92
:return: [(revno, revision_id)] for all revisions in ancestry that
81
:return: [(revno, revision_id, 0)] for all revisions in ancestry that
93
82
are left-hand parents from tip, or None if ancestry is None.
95
84
if ancestry is None:
97
if not ancestry: #Empty ancestry, no need to do any work
86
if not ancestry: # Empty ancestry, no need to do any work
100
89
# Optionally, we could make 1 call to graph.get_parent_map with all
108
97
parent_map = graph.get_parent_map([cur])
109
98
parents = parent_map.get(cur)
111
break # Ghost, we are done
112
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:
116
107
mainline.reverse()
156
147
if revid_range is None or revs is None:
158
149
return [rev for rev in revs
159
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])]
162
153
def _find_unmerged(local_branch, remote_branch, restrict,
163
include_merges, backward,
154
include_merged, backward,
164
155
local_revid_range=None, remote_revid_range=None):
165
156
"""See find_unmerged.
167
158
The branches should already be locked before entering.
169
local_revno, local_revision_id = local_branch.last_revision_info()
170
remote_revno, remote_revision_id = remote_branch.last_revision_info()
171
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:
172
172
# A simple shortcut when the tips are at the same point
174
174
graph = local_branch.repository.get_graph(remote_branch.repository)
186
186
' "remote": %r' % (restrict,))
187
187
local_extra, remote_extra = graph.find_difference(local_revision_id,
188
188
remote_revision_id)
190
190
locals = _enumerate_with_merges(local_branch, local_extra,
191
191
graph, local_revno,
192
192
local_revision_id, backward)
200
200
local_revision_id, backward)
201
201
remotes = _enumerate_mainline(remote_extra, graph, remote_revno,
202
202
remote_revision_id, backward)
203
return _filter_revs(graph, locals, local_revid_range), _filter_revs(graph,
204
remotes, remote_revid_range)
203
return _filter_revs(graph, locals, local_revid_range), _filter_revs(
204
graph, remotes, remote_revid_range)
207
207
def sorted_revisions(revisions, history_map):
208
revisions = [(history_map[r],r) for r in revisions]
208
revisions = sorted([(history_map[r], r) for r in revisions])