/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: John Arbash Meinel
  • Date: 2006-08-18 22:17:03 UTC
  • mto: This revision was merged to the branch mainline in revision 1989.
  • Revision ID: john@arbash-meinel.com-20060818221703-958786fafe340fd9
2 changes to knits. Delay creating the .knit or .kndx file until we have actually tried to write data. Because of this, we must allow the Knit to create the prefix directories

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
"""Display what revisions are missing in 'other' from 'this' and vice versa."""
 
2
 
 
3
import bzrlib.ui as ui
 
4
 
 
5
 
 
6
def iter_log_data(revisions, revision_source, verbose):
 
7
    last_tree = revision_source.revision_tree(None)
 
8
    last_rev_id = None
 
9
    for revno, rev_id in revisions:
 
10
        rev = revision_source.get_revision(rev_id)
 
11
        if verbose:
 
12
            remote_tree = revision_source.revision_tree(rev_id)
 
13
            parent_rev_id = rev.parent_ids[0]
 
14
            if last_rev_id == parent_rev_id:
 
15
                parent_tree = last_tree
 
16
            else:
 
17
                parent_tree = revision_source.revision_tree(parent_rev_id)
 
18
            revision_tree = revision_source.revision_tree(rev_id)
 
19
            last_rev_id = rev_id
 
20
            last_tree = revision_tree
 
21
            delta = parent_tree.changes_from(revision_tree)
 
22
        else:
 
23
            delta = None
 
24
        yield revno, rev, delta
 
25
 
 
26
 
 
27
def find_unmerged(local_branch, remote_branch):
 
28
    progress = ui.ui_factory.nested_progress_bar()
 
29
    local_branch.lock_read()
 
30
    try:
 
31
        remote_branch.lock_read()
 
32
        try:
 
33
            local_rev_history, local_rev_history_map = \
 
34
                _get_history(local_branch, progress, "local", 0)
 
35
            remote_rev_history, remote_rev_history_map = \
 
36
                _get_history(remote_branch, progress, "remote", 1)
 
37
            result = _shortcut(local_rev_history, remote_rev_history)
 
38
            if result is not None:
 
39
                local_extra, remote_extra = result
 
40
                local_extra = sorted_revisions(local_extra, 
 
41
                                               local_rev_history_map)
 
42
                remote_extra = sorted_revisions(remote_extra, 
 
43
                                                remote_rev_history_map)
 
44
                return local_extra, remote_extra
 
45
 
 
46
            local_ancestry = _get_ancestry(local_branch.repository, progress, 
 
47
                                           "local", 2, local_rev_history)
 
48
            remote_ancestry = _get_ancestry(remote_branch.repository, progress,
 
49
                                            "remote", 3, remote_rev_history)
 
50
            progress.update('pondering', 4, 5)
 
51
            extras = local_ancestry.symmetric_difference(remote_ancestry) 
 
52
            local_extra = extras.intersection(set(local_rev_history))
 
53
            remote_extra = extras.intersection(set(remote_rev_history))
 
54
            local_extra = sorted_revisions(local_extra, local_rev_history_map)
 
55
            remote_extra = sorted_revisions(remote_extra, 
 
56
                                            remote_rev_history_map)
 
57
                    
 
58
        finally:
 
59
            remote_branch.unlock()
 
60
    finally:
 
61
        local_branch.unlock()
 
62
        progress.finished()
 
63
    return (local_extra, remote_extra)
 
64
 
 
65
def _shortcut(local_rev_history, remote_rev_history):
 
66
    local_history = set(local_rev_history)
 
67
    remote_history = set(remote_rev_history)
 
68
    if len(local_rev_history) == 0:
 
69
        return set(), remote_history
 
70
    elif len(remote_rev_history) == 0:
 
71
        return local_history, set()
 
72
    elif local_rev_history[-1] in remote_history:
 
73
        return set(), _after(remote_rev_history, local_rev_history)
 
74
    elif remote_rev_history[-1] in local_history:
 
75
        return _after(local_rev_history, remote_rev_history), set()
 
76
    else:
 
77
        return None
 
78
 
 
79
def _after(larger_history, smaller_history):
 
80
    return set(larger_history[larger_history.index(smaller_history[-1])+1:])
 
81
 
 
82
def _get_history(branch, progress, label, step):
 
83
    progress.update('%s history' % label, step, 5)
 
84
    rev_history = branch.revision_history()
 
85
    rev_history_map = dict(
 
86
        [(rev, rev_history.index(rev) + 1)
 
87
         for rev in rev_history])
 
88
    return rev_history, rev_history_map
 
89
 
 
90
def _get_ancestry(repository, progress, label, step, rev_history):
 
91
    progress.update('%s ancestry' % label, step, 5)
 
92
    if len(rev_history) > 0:
 
93
        ancestry = set(repository.get_ancestry(rev_history[-1]))
 
94
    else:
 
95
        ancestry = set()
 
96
    return ancestry
 
97
    
 
98
 
 
99
def sorted_revisions(revisions, history_map):
 
100
    revisions = [(history_map[r],r) for r in revisions]
 
101
    revisions.sort()
 
102
    return revisions