bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 
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  |