2052.3.1
by John Arbash Meinel
Add tests to cleanup the copyright of all source files |
1 |
# Copyright (C) 2005, 2006 Canonical Ltd
|
2 |
#
|
|
3 |
# This program is free software; you can redistribute it and/or modify
|
|
4 |
# it under the terms of the GNU General Public License as published by
|
|
5 |
# the Free Software Foundation; either version 2 of the License, or
|
|
6 |
# (at your option) any later version.
|
|
7 |
#
|
|
8 |
# This program is distributed in the hope that it will be useful,
|
|
9 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
10 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
11 |
# GNU General Public License for more details.
|
|
12 |
#
|
|
13 |
# You should have received a copy of the GNU General Public License
|
|
14 |
# along with this program; if not, write to the Free Software
|
|
4183.7.1
by Sabin Iacob
update FSF mailing address |
15 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
2052.3.1
by John Arbash Meinel
Add tests to cleanup the copyright of all source files |
16 |
|
6379.6.7
by Jelmer Vernooij
Move importing from future until after doc string, otherwise the doc string will disappear. |
17 |
"""Display what revisions are missing in 'other' from 'this' and vice versa."""
|
18 |
||
6379.6.3
by Jelmer Vernooij
Use absolute_import. |
19 |
from __future__ import absolute_import |
20 |
||
3677.1.1
by Vincent Ladeuil
Begin fixing bug #233817. |
21 |
from bzrlib import ( |
22 |
log, |
|
6123.11.10
by Martin von Gagern
Print deprecation warnings for all uses of include_merges. |
23 |
symbol_versioning, |
2466.8.1
by Kent Gibson
Reworked LogFormatter API to simplify extending the attributes of the revision being logged. Added support for begin_log() and end_log() hooks in LogFormatters. |
24 |
)
|
3668.5.1
by Jelmer Vernooij
Use NULL_REVISION rather than None for Repository.revision_tree(). |
25 |
import bzrlib.revision as _mod_revision |
2466.8.1
by Kent Gibson
Reworked LogFormatter API to simplify extending the attributes of the revision being logged. Added support for begin_log() and end_log() hooks in LogFormatters. |
26 |
|
27 |
||
6519.2.2
by Neil Martinsen-Burrell
pass in tag dictionary instead of branch |
28 |
def iter_log_revisions(revisions, revision_source, verbose, rev_tag_dict=None): |
3668.5.1
by Jelmer Vernooij
Use NULL_REVISION rather than None for Repository.revision_tree(). |
29 |
last_tree = revision_source.revision_tree(_mod_revision.NULL_REVISION) |
1185.54.19
by Aaron Bentley
All tests pass |
30 |
last_rev_id = None |
6519.2.1
by Neil Martinsen-Burrell
Show tag names when using missing command |
31 |
|
6519.2.2
by Neil Martinsen-Burrell
pass in tag dictionary instead of branch |
32 |
if rev_tag_dict is None: |
6519.2.1
by Neil Martinsen-Burrell
Show tag names when using missing command |
33 |
rev_tag_dict = {} |
3677.1.5
by Vincent Ladeuil
Indent merge revisions correctly. |
34 |
for rev in revisions: |
35 |
# We need the following for backward compatibilty (hopefully
|
|
36 |
# this will be deprecated soon :-/) -- vila 080911
|
|
37 |
if len(rev) == 2: |
|
38 |
revno, rev_id = rev |
|
39 |
merge_depth = 0 |
|
40 |
else: |
|
41 |
revno, rev_id, merge_depth = rev |
|
1185.54.19
by Aaron Bentley
All tests pass |
42 |
rev = revision_source.get_revision(rev_id) |
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
43 |
if verbose: |
4007.1.1
by Jelmer Vernooij
Use Repository.get_revision_delta() in missing rather than doing the delta |
44 |
delta = revision_source.get_revision_delta(rev_id) |
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
45 |
else: |
46 |
delta = None |
|
6519.2.1
by Neil Martinsen-Burrell
Show tag names when using missing command |
47 |
yield log.LogRevision(rev, revno, merge_depth, delta=delta, |
48 |
tags=rev_tag_dict.get(rev_id)) |
|
3677.1.1
by Vincent Ladeuil
Begin fixing bug #233817. |
49 |
|
50 |
||
51 |
def find_unmerged(local_branch, remote_branch, restrict='all', |
|
6123.11.13
by Martin von Gagern
Rename --include-sidelines to --include-merged. |
52 |
include_merged=None, backward=False, |
6123.11.9
by Martin von Gagern
Rename argument to include_sidelines in bzrlib.missing api as well. |
53 |
local_revid_range=None, remote_revid_range=None, |
6123.11.10
by Martin von Gagern
Print deprecation warnings for all uses of include_merges. |
54 |
include_merges=symbol_versioning.DEPRECATED_PARAMETER): |
3427.3.6
by John Arbash Meinel
review feedback from Ian |
55 |
"""Find revisions from each side that have not been merged.
|
56 |
||
57 |
:param local_branch: Compare the history of local_branch
|
|
58 |
:param remote_branch: versus the history of remote_branch, and determine
|
|
59 |
mainline revisions which have not been merged.
|
|
60 |
:param restrict: ('all', 'local', 'remote') If 'all', we will return the
|
|
61 |
unique revisions from both sides. If 'local', we will return None
|
|
62 |
for the remote revisions, similarly if 'remote' we will return None for
|
|
63 |
the local revisions.
|
|
6123.11.13
by Martin von Gagern
Rename --include-sidelines to --include-merged. |
64 |
:param include_merged: Show mainline revisions only if False,
|
3677.1.1
by Vincent Ladeuil
Begin fixing bug #233817. |
65 |
all revisions otherwise.
|
3677.1.4
by Vincent Ladeuil
Replace 'reverse' by 'backward' when talking about revision order. |
66 |
:param backward: Show oldest versions first when True, newest versions
|
3921.3.6
by Marius Kruger
* fix some indentation anomalies in cmd_missing |
67 |
first when False.
|
68 |
:param local_revid_range: Revision-id range for filtering local_branch
|
|
69 |
revisions (lower bound, upper bound)
|
|
70 |
:param remote_revid_range: Revision-id range for filtering remote_branch
|
|
71 |
revisions (lower bound, upper bound)
|
|
6123.11.13
by Martin von Gagern
Rename --include-sidelines to --include-merged. |
72 |
:param include_merges: Deprecated historical alias for include_merged
|
3427.3.6
by John Arbash Meinel
review feedback from Ian |
73 |
|
74 |
:return: A list of [(revno, revision_id)] for the mainline revisions on
|
|
75 |
each side.
|
|
76 |
"""
|
|
6123.11.10
by Martin von Gagern
Print deprecation warnings for all uses of include_merges. |
77 |
if symbol_versioning.deprecated_passed(include_merges): |
78 |
symbol_versioning.warn( |
|
79 |
'include_merges was deprecated in 2.5.'
|
|
6123.11.13
by Martin von Gagern
Rename --include-sidelines to --include-merged. |
80 |
' Use include_merged instead.', |
6123.11.10
by Martin von Gagern
Print deprecation warnings for all uses of include_merges. |
81 |
DeprecationWarning, stacklevel=2) |
6123.11.13
by Martin von Gagern
Rename --include-sidelines to --include-merged. |
82 |
if include_merged is None: |
83 |
include_merged = include_merges |
|
84 |
if include_merged is None: |
|
85 |
include_merged = False |
|
1185.54.3
by Aaron Bentley
Factored out find_unmerged |
86 |
local_branch.lock_read() |
87 |
try: |
|
88 |
remote_branch.lock_read() |
|
89 |
try: |
|
3677.1.1
by Vincent Ladeuil
Begin fixing bug #233817. |
90 |
return _find_unmerged( |
91 |
local_branch, remote_branch, restrict=restrict, |
|
6123.11.13
by Martin von Gagern
Rename --include-sidelines to --include-merged. |
92 |
include_merged=include_merged, backward=backward, |
3921.3.4
by Marius Kruger
add support to filter on local and remote revisions |
93 |
local_revid_range=local_revid_range, |
3921.3.6
by Marius Kruger
* fix some indentation anomalies in cmd_missing |
94 |
remote_revid_range=remote_revid_range) |
1185.54.3
by Aaron Bentley
Factored out find_unmerged |
95 |
finally: |
96 |
remote_branch.unlock() |
|
97 |
finally: |
|
98 |
local_branch.unlock() |
|
1185.54.4
by Aaron Bentley
Restructured find_unmerged, so it returns lists of (revno, revision) pairs |
99 |
|
3427.3.1
by John Arbash Meinel
Add bzrlib.missing.find_unmerged_mainline_revisions |
100 |
|
3677.1.4
by Vincent Ladeuil
Replace 'reverse' by 'backward' when talking about revision order. |
101 |
def _enumerate_mainline(ancestry, graph, tip_revno, tip, backward=True): |
3427.3.1
by John Arbash Meinel
Add bzrlib.missing.find_unmerged_mainline_revisions |
102 |
"""Enumerate the mainline revisions for these revisions.
|
103 |
||
104 |
:param ancestry: A set of revisions that we care about
|
|
105 |
:param graph: A Graph which lets us find the parents for a revision
|
|
106 |
:param tip_revno: The revision number for the tip revision
|
|
3427.3.6
by John Arbash Meinel
review feedback from Ian |
107 |
:param tip: The tip of mainline
|
3677.1.4
by Vincent Ladeuil
Replace 'reverse' by 'backward' when talking about revision order. |
108 |
:param backward: Show oldest versions first when True, newest versions
|
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
109 |
first when False.
|
3427.3.1
by John Arbash Meinel
Add bzrlib.missing.find_unmerged_mainline_revisions |
110 |
:return: [(revno, revision_id)] for all revisions in ancestry that
|
3427.3.6
by John Arbash Meinel
review feedback from Ian |
111 |
are left-hand parents from tip, or None if ancestry is None.
|
3427.3.1
by John Arbash Meinel
Add bzrlib.missing.find_unmerged_mainline_revisions |
112 |
"""
|
113 |
if ancestry is None: |
|
114 |
return None |
|
115 |
if not ancestry: #Empty ancestry, no need to do any work |
|
116 |
return [] |
|
117 |
||
3427.3.2
by John Arbash Meinel
switch find_unmerged to use the new function |
118 |
# Optionally, we could make 1 call to graph.get_parent_map with all
|
3427.3.1
by John Arbash Meinel
Add bzrlib.missing.find_unmerged_mainline_revisions |
119 |
# ancestors. However that will often check many more parents than we
|
120 |
# actually need, and the Graph is likely to already have the parents cached
|
|
121 |
# anyway.
|
|
122 |
mainline = [] |
|
123 |
cur = tip |
|
124 |
cur_revno = tip_revno |
|
125 |
while cur in ancestry: |
|
126 |
parent_map = graph.get_parent_map([cur]) |
|
3427.3.2
by John Arbash Meinel
switch find_unmerged to use the new function |
127 |
parents = parent_map.get(cur) |
128 |
if not parents: |
|
3427.3.1
by John Arbash Meinel
Add bzrlib.missing.find_unmerged_mainline_revisions |
129 |
break # Ghost, we are done |
3677.1.1
by Vincent Ladeuil
Begin fixing bug #233817. |
130 |
mainline.append((str(cur_revno), cur)) |
3427.3.2
by John Arbash Meinel
switch find_unmerged to use the new function |
131 |
cur = parents[0] |
3427.3.1
by John Arbash Meinel
Add bzrlib.missing.find_unmerged_mainline_revisions |
132 |
cur_revno -= 1 |
3677.1.4
by Vincent Ladeuil
Replace 'reverse' by 'backward' when talking about revision order. |
133 |
if not backward: |
3677.1.1
by Vincent Ladeuil
Begin fixing bug #233817. |
134 |
mainline.reverse() |
3427.3.1
by John Arbash Meinel
Add bzrlib.missing.find_unmerged_mainline_revisions |
135 |
return mainline |
136 |
||
137 |
||
3677.1.3
by Vincent Ladeuil
Fix incorrect revnos based on jam's feedback. |
138 |
def _enumerate_with_merges(branch, ancestry, graph, tip_revno, tip, |
3677.1.4
by Vincent Ladeuil
Replace 'reverse' by 'backward' when talking about revision order. |
139 |
backward=True): |
3677.1.1
by Vincent Ladeuil
Begin fixing bug #233817. |
140 |
"""Enumerate the revisions for the ancestry.
|
141 |
||
3677.1.3
by Vincent Ladeuil
Fix incorrect revnos based on jam's feedback. |
142 |
:param branch: The branch we care about
|
3677.1.1
by Vincent Ladeuil
Begin fixing bug #233817. |
143 |
:param ancestry: A set of revisions that we care about
|
144 |
:param graph: A Graph which lets us find the parents for a revision
|
|
145 |
:param tip_revno: The revision number for the tip revision
|
|
146 |
:param tip: The tip of the ancsetry
|
|
3677.1.4
by Vincent Ladeuil
Replace 'reverse' by 'backward' when talking about revision order. |
147 |
:param backward: Show oldest versions first when True, newest versions
|
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
148 |
first when False.
|
3677.1.1
by Vincent Ladeuil
Begin fixing bug #233817. |
149 |
:return: [(revno, revision_id)] for all revisions in ancestry that
|
150 |
are parents from tip, or None if ancestry is None.
|
|
151 |
"""
|
|
152 |
if ancestry is None: |
|
153 |
return None |
|
154 |
if not ancestry: #Empty ancestry, no need to do any work |
|
155 |
return [] |
|
156 |
||
4593.5.31
by John Arbash Meinel
Fix bzrlib.missing to not directly load the graph, etc. |
157 |
merge_sorted_revisions = branch.iter_merge_sorted_revisions() |
3677.1.3
by Vincent Ladeuil
Fix incorrect revnos based on jam's feedback. |
158 |
# Now that we got the correct revnos, keep only the relevant
|
159 |
# revisions.
|
|
160 |
merge_sorted_revisions = [ |
|
4593.5.31
by John Arbash Meinel
Fix bzrlib.missing to not directly load the graph, etc. |
161 |
# log.reverse_by_depth expects seq_num to be present, but it is
|
162 |
# stripped by iter_merge_sorted_revisions()
|
|
163 |
(0, revid, n, d, e) for revid, n, d, e in merge_sorted_revisions |
|
3677.1.3
by Vincent Ladeuil
Fix incorrect revnos based on jam's feedback. |
164 |
if revid in ancestry] |
3677.1.4
by Vincent Ladeuil
Replace 'reverse' by 'backward' when talking about revision order. |
165 |
if not backward: |
3677.1.1
by Vincent Ladeuil
Begin fixing bug #233817. |
166 |
merge_sorted_revisions = log.reverse_by_depth(merge_sorted_revisions) |
167 |
revline = [] |
|
168 |
for seq, rev_id, merge_depth, revno, end_of_merge in merge_sorted_revisions: |
|
3677.1.5
by Vincent Ladeuil
Indent merge revisions correctly. |
169 |
revline.append(('.'.join(map(str, revno)), rev_id, merge_depth)) |
3677.1.1
by Vincent Ladeuil
Begin fixing bug #233817. |
170 |
return revline |
171 |
||
172 |
||
3921.3.7
by Marius Kruger
just filter the missing revisions once all have been calculated. |
173 |
def _filter_revs(graph, revs, revid_range): |
3921.3.8
by Marius Kruger
* _filter_revs can now handle None and len=3 revs |
174 |
if revid_range is None or revs is None: |
3921.3.7
by Marius Kruger
just filter the missing revisions once all have been calculated. |
175 |
return revs |
3921.3.8
by Marius Kruger
* _filter_revs can now handle None and len=3 revs |
176 |
return [rev for rev in revs |
177 |
if graph.is_between(rev[1], revid_range[0], revid_range[1])] |
|
3921.3.1
by Marius Kruger
* add support for specifying a revision range to missing.find_unmerged |
178 |
|
179 |
||
3677.1.1
by Vincent Ladeuil
Begin fixing bug #233817. |
180 |
def _find_unmerged(local_branch, remote_branch, restrict, |
6123.11.13
by Martin von Gagern
Rename --include-sidelines to --include-merged. |
181 |
include_merged, backward, |
3921.3.4
by Marius Kruger
add support to filter on local and remote revisions |
182 |
local_revid_range=None, remote_revid_range=None): |
3427.3.6
by John Arbash Meinel
review feedback from Ian |
183 |
"""See find_unmerged.
|
184 |
||
185 |
The branches should already be locked before entering.
|
|
3427.3.1
by John Arbash Meinel
Add bzrlib.missing.find_unmerged_mainline_revisions |
186 |
"""
|
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: |
|
190 |
# A simple shortcut when the tips are at the same point
|
|
191 |
return [], [] |
|
3677.1.1
by Vincent Ladeuil
Begin fixing bug #233817. |
192 |
graph = local_branch.repository.get_graph(remote_branch.repository) |
3427.3.1
by John Arbash Meinel
Add bzrlib.missing.find_unmerged_mainline_revisions |
193 |
if restrict == 'remote': |
194 |
local_extra = None |
|
3677.1.1
by Vincent Ladeuil
Begin fixing bug #233817. |
195 |
remote_extra = graph.find_unique_ancestors(remote_revision_id, |
196 |
[local_revision_id]) |
|
3427.3.1
by John Arbash Meinel
Add bzrlib.missing.find_unmerged_mainline_revisions |
197 |
elif restrict == 'local': |
198 |
remote_extra = None |
|
3677.1.1
by Vincent Ladeuil
Begin fixing bug #233817. |
199 |
local_extra = graph.find_unique_ancestors(local_revision_id, |
200 |
[remote_revision_id]) |
|
3427.3.1
by John Arbash Meinel
Add bzrlib.missing.find_unmerged_mainline_revisions |
201 |
else: |
202 |
if restrict != 'all': |
|
203 |
raise ValueError('param restrict not one of "all", "local",' |
|
204 |
' "remote": %r' % (restrict,)) |
|
3677.1.1
by Vincent Ladeuil
Begin fixing bug #233817. |
205 |
local_extra, remote_extra = graph.find_difference(local_revision_id, |
206 |
remote_revision_id) |
|
6123.11.13
by Martin von Gagern
Rename --include-sidelines to --include-merged. |
207 |
if include_merged: |
3677.1.3
by Vincent Ladeuil
Fix incorrect revnos based on jam's feedback. |
208 |
locals = _enumerate_with_merges(local_branch, local_extra, |
209 |
graph, local_revno, |
|
3677.1.4
by Vincent Ladeuil
Replace 'reverse' by 'backward' when talking about revision order. |
210 |
local_revision_id, backward) |
3677.1.3
by Vincent Ladeuil
Fix incorrect revnos based on jam's feedback. |
211 |
remotes = _enumerate_with_merges(remote_branch, remote_extra, |
212 |
graph, remote_revno, |
|
3677.1.4
by Vincent Ladeuil
Replace 'reverse' by 'backward' when talking about revision order. |
213 |
remote_revision_id, backward) |
3677.1.1
by Vincent Ladeuil
Begin fixing bug #233817. |
214 |
else: |
215 |
# Now that we have unique ancestors, compute just the mainline, and
|
|
216 |
# generate revnos for them.
|
|
217 |
locals = _enumerate_mainline(local_extra, graph, local_revno, |
|
3677.1.4
by Vincent Ladeuil
Replace 'reverse' by 'backward' when talking about revision order. |
218 |
local_revision_id, backward) |
3677.1.1
by Vincent Ladeuil
Begin fixing bug #233817. |
219 |
remotes = _enumerate_mainline(remote_extra, graph, remote_revno, |
3677.1.4
by Vincent Ladeuil
Replace 'reverse' by 'backward' when talking about revision order. |
220 |
remote_revision_id, backward) |
3921.3.7
by Marius Kruger
just filter the missing revisions once all have been calculated. |
221 |
return _filter_revs(graph, locals, local_revid_range), _filter_revs(graph, |
222 |
remotes, remote_revid_range) |
|
3427.3.1
by John Arbash Meinel
Add bzrlib.missing.find_unmerged_mainline_revisions |
223 |
|
224 |
||
1185.54.4
by Aaron Bentley
Restructured find_unmerged, so it returns lists of (revno, revision) pairs |
225 |
def sorted_revisions(revisions, history_map): |
226 |
revisions = [(history_map[r],r) for r in revisions] |
|
227 |
revisions.sort() |
|
228 |
return revisions |