974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
1 |
#!/usr/bin/env python
|
2 |
"""\
|
|
3 |
A plugin for displaying what revisions are in 'other' but not in local.
|
|
4 |
"""
|
|
5 |
||
6 |
import bzrlib |
|
7 |
||
8 |
try: |
|
9 |
set
|
|
10 |
except NameError: |
|
11 |
from sets import Set as set |
|
12 |
||
13 |
||
14 |
def show_missing(br_local, br_remote, verbose=False, quiet=False): |
|
15 |
"""Show the revisions which exist in br_remote, that
|
|
16 |
do not exist in br_local.
|
|
17 |
"""
|
|
18 |
from bzrlib.log import show_one_log |
|
19 |
import sys |
|
20 |
local_history = br_local.revision_history() |
|
21 |
remote_history = br_remote.revision_history() |
|
22 |
if local_history == remote_history: |
|
23 |
if not quiet: |
|
24 |
print 'Trees are identical.' |
|
25 |
return 0 |
|
26 |
if local_history[:len(remote_history)] == remote_history: |
|
27 |
# Local is not missing anything from remote, so consider it
|
|
28 |
# up-to-date
|
|
29 |
if not quiet: |
|
30 |
print 'Local tree has all of remote revisions (remote is missing local)' |
|
31 |
return 0 |
|
32 |
if quiet: |
|
33 |
return 1 |
|
34 |
||
35 |
# Check for divergence
|
|
36 |
common_idx = min(len(local_history), len(remote_history)) - 1 |
|
37 |
if common_idx >= 0 and local_history[common_idx] != remote_history[common_idx]: |
|
38 |
print 'Trees have diverged' |
|
39 |
||
40 |
local_rev_set = set(local_history) |
|
41 |
||
42 |
# Find the last common revision between the two trees
|
|
43 |
revno = 0 |
|
44 |
for revno, (local_rev, remote_rev) in enumerate(zip(local_history, remote_history)): |
|
45 |
if local_rev != remote_rev: |
|
46 |
break
|
|
47 |
||
48 |
missing_remote = [] |
|
49 |
for rno, rev_id in enumerate(remote_history[revno:]): |
|
50 |
# This assumes that you can have a revision in the
|
|
51 |
# local history, which does not have the same ancestry
|
|
52 |
# as the remote ancestry.
|
|
53 |
# This may or may not be possible.
|
|
54 |
# In the future this should also checked for merged revisions.
|
|
55 |
if rev_id not in local_rev_set: |
|
56 |
missing_remote.append((rno+revno+1, rev_id)) |
|
57 |
||
58 |
print 'Missing %d revisions' % len(missing_remote) |
|
59 |
print
|
|
60 |
||
61 |
if verbose: |
|
62 |
from bzrlib.diff import compare_trees |
|
63 |
from bzrlib.tree import EmptyTree |
|
64 |
show_ids = True |
|
65 |
last_tree = EmptyTree |
|
66 |
last_rev_id = None |
|
67 |
else: |
|
68 |
show_ids = False |
|
69 |
for revno, rev_id in missing_remote: |
|
70 |
rev = br_remote.get_revision(rev_id) |
|
71 |
if verbose: |
|
72 |
parent_rev_id = rev.parents[0].revision_id |
|
73 |
if last_rev_id == parent_rev_id: |
|
74 |
parent_tree = last_tree |
|
75 |
else: |
|
76 |
parent_tree = br_remote.revision_tree(parent_rev_id) |
|
77 |
revision_tree = br_remote.revision_tree(rev_id) |
|
78 |
last_rev_id = rev_id |
|
79 |
last_tree = revision_tree |
|
80 |
delta = compare_trees(revision_tree, parent_tree) |
|
81 |
else: |
|
82 |
delta = None |
|
83 |
||
84 |
show_one_log(revno, rev, delta, verbose, sys.stdout, 'original') |
|
85 |
return 1 |
|
86 |