17
17
"""Display what revisions are missing in 'other' from 'this' and vice versa."""
19
from __future__ import absolute_import
27
def iter_log_revisions(revisions, revision_source, verbose, rev_tag_dict=None):
28
if rev_tag_dict is None:
30
for revno, rev_id, merge_depth in revisions:
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
31
36
rev = revision_source.get_revision(rev_id)
33
38
delta = revision_source.get_revision_delta(rev_id)
36
yield log.LogRevision(rev, revno, merge_depth, delta=delta,
37
tags=rev_tag_dict.get(rev_id))
41
yield log.LogRevision(rev, revno, merge_depth, delta=delta)
40
44
def find_unmerged(local_branch, remote_branch, restrict='all',
41
include_merged=None, backward=False,
45
include_merges=False, backward=False,
42
46
local_revid_range=None, remote_revid_range=None):
43
47
"""Find revisions from each side that have not been merged.
49
53
unique revisions from both sides. If 'local', we will return None
50
54
for the remote revisions, similarly if 'remote' we will return None for
51
55
the local revisions.
52
:param include_merged: Show mainline revisions only if False,
56
:param include_merges: Show mainline revisions only if False,
53
57
all revisions otherwise.
54
58
:param backward: Show oldest versions first when True, newest versions
61
65
:return: A list of [(revno, revision_id)] for the mainline revisions on
64
if include_merged is None:
65
include_merged = False
66
68
local_branch.lock_read()
68
70
remote_branch.lock_read()
70
72
return _find_unmerged(
71
73
local_branch, remote_branch, restrict=restrict,
72
include_merged=include_merged, backward=backward,
74
include_merges=include_merges, backward=backward,
73
75
local_revid_range=local_revid_range,
74
76
remote_revid_range=remote_revid_range)
87
89
:param tip: The tip of mainline
88
90
:param backward: Show oldest versions first when True, newest versions
90
:return: [(revno, revision_id, 0)] for all revisions in ancestry that
92
:return: [(revno, revision_id)] for all revisions in ancestry that
91
93
are left-hand parents from tip, or None if ancestry is None.
93
95
if ancestry is None:
95
if not ancestry: # Empty ancestry, no need to do any work
97
if not ancestry: #Empty ancestry, no need to do any work
98
100
# Optionally, we could make 1 call to graph.get_parent_map with all
106
108
parent_map = graph.get_parent_map([cur])
107
109
parents = parent_map.get(cur)
109
break # Ghost, we are done
111
(str(cur_revno) if cur_revno is not None else None, cur, 0))
111
break # Ghost, we are done
112
mainline.append((str(cur_revno), cur))
113
if cur_revno is not None:
116
116
mainline.reverse()
156
156
if revid_range is None or revs is None:
158
158
return [rev for rev in revs
159
if graph.is_between(rev[1], revid_range[0], revid_range[1])]
159
if graph.is_between(rev[1], revid_range[0], revid_range[1])]
162
162
def _find_unmerged(local_branch, remote_branch, restrict,
163
include_merged, backward,
163
include_merges, backward,
164
164
local_revid_range=None, remote_revid_range=None):
165
165
"""See find_unmerged.
167
167
The branches should already be locked before entering.
170
local_revno, local_revision_id = local_branch.last_revision_info()
171
except (errors.UnsupportedOperation, errors.GhostRevisionsHaveNoRevno):
173
local_revision_id = local_branch.last_revision()
175
remote_revno, remote_revision_id = remote_branch.last_revision_info()
176
except (errors.UnsupportedOperation, errors.GhostRevisionsHaveNoRevno):
177
remote_revision_id = remote_branch.last_revision()
180
if local_revision_id == remote_revision_id:
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:
181
172
# A simple shortcut when the tips are at the same point
183
174
graph = local_branch.repository.get_graph(remote_branch.repository)
195
186
' "remote": %r' % (restrict,))
196
187
local_extra, remote_extra = graph.find_difference(local_revision_id,
197
188
remote_revision_id)
199
190
locals = _enumerate_with_merges(local_branch, local_extra,
200
191
graph, local_revno,
201
192
local_revision_id, backward)
209
200
local_revision_id, backward)
210
201
remotes = _enumerate_mainline(remote_extra, graph, remote_revno,
211
202
remote_revision_id, backward)
212
return _filter_revs(graph, locals, local_revid_range), _filter_revs(
213
graph, remotes, remote_revid_range)
203
return _filter_revs(graph, locals, local_revid_range), _filter_revs(graph,
204
remotes, remote_revid_range)
216
207
def sorted_revisions(revisions, history_map):
217
revisions = sorted([(history_map[r], r) for r in revisions])
208
revisions = [(history_map[r],r) for r in revisions]