17
17
"""Display what revisions are missing in 'other' from 'this' and vice versa."""
21
repository as _mod_repository,
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:
24
import bzrlib.revision as _mod_revision
27
def iter_log_revisions(revisions, revision_source, verbose):
28
last_tree = revision_source.revision_tree(_mod_revision.NULL_REVISION)
31
# We need the following for backward compatibilty (hopefully
32
# this will be deprecated soon :-/) -- vila 080911
37
revno, rev_id, merge_depth = rev
29
38
rev = revision_source.get_revision(rev_id)
31
40
delta = revision_source.get_revision_delta(rev_id)
34
yield log.LogRevision(rev, revno, merge_depth, delta=delta,
35
tags=rev_tag_dict.get(rev_id))
43
yield log.LogRevision(rev, revno, merge_depth, delta=delta)
38
46
def find_unmerged(local_branch, remote_branch, restrict='all',
39
include_merged=None, backward=False,
47
include_merges=False, backward=False,
40
48
local_revid_range=None, remote_revid_range=None):
41
49
"""Find revisions from each side that have not been merged.
47
55
unique revisions from both sides. If 'local', we will return None
48
56
for the remote revisions, similarly if 'remote' we will return None for
49
57
the local revisions.
50
:param include_merged: Show mainline revisions only if False,
58
:param include_merges: Show mainline revisions only if False,
51
59
all revisions otherwise.
52
60
:param backward: Show oldest versions first when True, newest versions
59
67
:return: A list of [(revno, revision_id)] for the mainline revisions on
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)
70
local_branch.lock_read()
72
remote_branch.lock_read()
74
return _find_unmerged(
75
local_branch, remote_branch, restrict=restrict,
76
include_merges=include_merges, backward=backward,
77
local_revid_range=local_revid_range,
78
remote_revid_range=remote_revid_range)
80
remote_branch.unlock()
72
85
def _enumerate_mainline(ancestry, graph, tip_revno, tip, backward=True):
78
91
:param tip: The tip of mainline
79
92
:param backward: Show oldest versions first when True, newest versions
81
:return: [(revno, revision_id, 0)] for all revisions in ancestry that
94
:return: [(revno, revision_id)] for all revisions in ancestry that
82
95
are left-hand parents from tip, or None if ancestry is None.
84
97
if ancestry is None:
86
if not ancestry: # Empty ancestry, no need to do any work
99
if not ancestry: #Empty ancestry, no need to do any work
89
102
# Optionally, we could make 1 call to graph.get_parent_map with all
97
110
parent_map = graph.get_parent_map([cur])
98
111
parents = parent_map.get(cur)
100
break # Ghost, we are done
102
(str(cur_revno) if cur_revno is not None else None, cur, 0))
113
break # Ghost, we are done
114
mainline.append((str(cur_revno), cur))
104
if cur_revno is not None:
107
118
mainline.reverse()
147
158
if revid_range is None or revs is None:
149
160
return [rev for rev in revs
150
if graph.is_between(rev[1], revid_range[0], revid_range[1])]
161
if graph.is_between(rev[1], revid_range[0], revid_range[1])]
153
164
def _find_unmerged(local_branch, remote_branch, restrict,
154
include_merged, backward,
165
include_merges, backward,
155
166
local_revid_range=None, remote_revid_range=None):
156
167
"""See find_unmerged.
158
169
The branches should already be locked before entering.
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:
171
local_revno, local_revision_id = local_branch.last_revision_info()
172
remote_revno, remote_revision_id = remote_branch.last_revision_info()
173
if local_revno == remote_revno and local_revision_id == remote_revision_id:
172
174
# A simple shortcut when the tips are at the same point
174
176
graph = local_branch.repository.get_graph(remote_branch.repository)
186
188
' "remote": %r' % (restrict,))
187
189
local_extra, remote_extra = graph.find_difference(local_revision_id,
188
190
remote_revision_id)
190
192
locals = _enumerate_with_merges(local_branch, local_extra,
191
193
graph, local_revno,
192
194
local_revision_id, backward)
200
202
local_revision_id, backward)
201
203
remotes = _enumerate_mainline(remote_extra, graph, remote_revno,
202
204
remote_revision_id, backward)
203
return _filter_revs(graph, locals, local_revid_range), _filter_revs(
204
graph, remotes, remote_revid_range)
205
return _filter_revs(graph, locals, local_revid_range), _filter_revs(graph,
206
remotes, remote_revid_range)
207
209
def sorted_revisions(revisions, history_map):
208
revisions = sorted([(history_map[r], r) for r in revisions])
210
revisions = [(history_map[r],r) for r in revisions]