/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/missing.py

  • Committer: Martin Pool
  • Date: 2005-09-06 02:26:28 UTC
  • Revision ID: mbp@sourcefrog.net-20050906022628-66d65f0feb4a9e80
- implement version 5 xml storage, and tests

  This stores files identified by the version that introduced the 
  text, and the version that introduced the name.  Entry kinds are
  given by the xml tag not an explicit kind field.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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