~bzr-pqm/bzr/bzr.dev

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
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
1759.2.1 by Jelmer Vernooij
Fix some types (found using aspell).
17
"""Display what revisions are missing in 'other' from 'this' and vice versa."""
1534.5.15 by Robert Collins
Review fixups
18
2490.1.2 by John Arbash Meinel
Cleanup according to PEP8 and some other small whitespace fixes
19
from bzrlib import ui
20
from bzrlib.log import (
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.
21
    LogRevision,
22
    )
23
24
25
def iter_log_revisions(revisions, revision_source, verbose):
1852.5.1 by Robert Collins
Deprecate EmptyTree in favour of using Repository.revision_tree.
26
    last_tree = revision_source.revision_tree(None)
1185.54.19 by Aaron Bentley
All tests pass
27
    last_rev_id = None
28
    for revno, rev_id in revisions:
29
        rev = revision_source.get_revision(rev_id)
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
30
        if verbose:
1185.67.1 by Aaron Bentley
Merged the mainline
31
            remote_tree = revision_source.revision_tree(rev_id)
1185.35.30 by Aaron Bentley
Fixed missing --verbose
32
            parent_rev_id = rev.parent_ids[0]
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
33
            if last_rev_id == parent_rev_id:
34
                parent_tree = last_tree
35
            else:
1185.54.19 by Aaron Bentley
All tests pass
36
                parent_tree = revision_source.revision_tree(parent_rev_id)
37
            revision_tree = revision_source.revision_tree(rev_id)
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
38
            last_rev_id = rev_id
39
            last_tree = revision_tree
2204.1.1 by John Arbash Meinel
'bzr missing -v' was showing adds as deletes.
40
            delta = revision_tree.changes_from(parent_tree)
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
41
        else:
42
            delta = None
2490.1.2 by John Arbash Meinel
Cleanup according to PEP8 and some other small whitespace fixes
43
        yield LogRevision(rev, revno, delta=delta)
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
44
1185.54.7 by Aaron Bentley
More refactoring, handled branches with no commits
45
1185.54.3 by Aaron Bentley
Factored out find_unmerged
46
def find_unmerged(local_branch, remote_branch):
1594.1.3 by Robert Collins
Fixup pb usage to use nested_progress_bar.
47
    progress = ui.ui_factory.nested_progress_bar()
1185.54.3 by Aaron Bentley
Factored out find_unmerged
48
    local_branch.lock_read()
49
    try:
50
        remote_branch.lock_read()
51
        try:
3267.1.1 by Alexander Belchenko
Significantly reducing execution time and network traffic for trivial case of `bzr missing`
52
            # check for special case: both branches are equivalent
53
            if (local_branch.last_revision_info() ==
54
                remote_branch.last_revision_info()):
55
                return [], []
1185.54.9 by Aaron Bentley
Added revision-history shortcuts
56
            local_rev_history, local_rev_history_map = \
57
                _get_history(local_branch, progress, "local", 0)
58
            remote_rev_history, remote_rev_history_map = \
59
                _get_history(remote_branch, progress, "remote", 1)
60
            result = _shortcut(local_rev_history, remote_rev_history)
61
            if result is not None:
62
                local_extra, remote_extra = result
63
                local_extra = sorted_revisions(local_extra, 
64
                                               local_rev_history_map)
65
                remote_extra = sorted_revisions(remote_extra, 
66
                                                remote_rev_history_map)
67
                return local_extra, remote_extra
68
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
69
            local_ancestry = _get_ancestry(local_branch.repository, progress, 
1185.67.1 by Aaron Bentley
Merged the mainline
70
                                           "local", 2, local_rev_history)
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
71
            remote_ancestry = _get_ancestry(remote_branch.repository, progress,
1185.67.1 by Aaron Bentley
Merged the mainline
72
                                            "remote", 3, remote_rev_history)
1185.54.3 by Aaron Bentley
Factored out find_unmerged
73
            progress.update('pondering', 4, 5)
1185.54.6 by Aaron Bentley
Used more set operations
74
            extras = local_ancestry.symmetric_difference(remote_ancestry) 
75
            local_extra = extras.intersection(set(local_rev_history))
76
            remote_extra = extras.intersection(set(remote_rev_history))
1185.54.4 by Aaron Bentley
Restructured find_unmerged, so it returns lists of (revno, revision) pairs
77
            local_extra = sorted_revisions(local_extra, local_rev_history_map)
78
            remote_extra = sorted_revisions(remote_extra, 
79
                                            remote_rev_history_map)
1185.54.3 by Aaron Bentley
Factored out find_unmerged
80
                    
81
        finally:
82
            remote_branch.unlock()
83
    finally:
84
        local_branch.unlock()
1594.1.3 by Robert Collins
Fixup pb usage to use nested_progress_bar.
85
        progress.finished()
1185.54.4 by Aaron Bentley
Restructured find_unmerged, so it returns lists of (revno, revision) pairs
86
    return (local_extra, remote_extra)
87
1185.54.9 by Aaron Bentley
Added revision-history shortcuts
88
def _shortcut(local_rev_history, remote_rev_history):
89
    local_history = set(local_rev_history)
90
    remote_history = set(remote_rev_history)
91
    if len(local_rev_history) == 0:
92
        return set(), remote_history
93
    elif len(remote_rev_history) == 0:
94
        return local_history, set()
95
    elif local_rev_history[-1] in remote_history:
1185.54.10 by Aaron Bentley
Refactored shortcut
96
        return set(), _after(remote_rev_history, local_rev_history)
1185.54.9 by Aaron Bentley
Added revision-history shortcuts
97
    elif remote_rev_history[-1] in local_history:
1185.54.10 by Aaron Bentley
Refactored shortcut
98
        return _after(local_rev_history, remote_rev_history), set()
1185.54.9 by Aaron Bentley
Added revision-history shortcuts
99
    else:
100
        return None
101
1185.54.10 by Aaron Bentley
Refactored shortcut
102
def _after(larger_history, smaller_history):
103
    return set(larger_history[larger_history.index(smaller_history[-1])+1:])
1185.54.9 by Aaron Bentley
Added revision-history shortcuts
104
105
def _get_history(branch, progress, label, step):
106
    progress.update('%s history' % label, step, 5)
1185.54.7 by Aaron Bentley
More refactoring, handled branches with no commits
107
    rev_history = branch.revision_history()
108
    rev_history_map = dict(
1185.54.9 by Aaron Bentley
Added revision-history shortcuts
109
        [(rev, rev_history.index(rev) + 1)
1185.54.7 by Aaron Bentley
More refactoring, handled branches with no commits
110
         for rev in rev_history])
1185.54.9 by Aaron Bentley
Added revision-history shortcuts
111
    return rev_history, rev_history_map
112
1185.67.1 by Aaron Bentley
Merged the mainline
113
def _get_ancestry(repository, progress, label, step, rev_history):
1185.54.9 by Aaron Bentley
Added revision-history shortcuts
114
    progress.update('%s ancestry' % label, step, 5)
1185.54.7 by Aaron Bentley
More refactoring, handled branches with no commits
115
    if len(rev_history) > 0:
2490.2.33 by Aaron Bentley
Disable topological sorting of get_ancestry where sensible
116
        ancestry = set(repository.get_ancestry(rev_history[-1],
117
                       topo_sorted=False))
1185.54.7 by Aaron Bentley
More refactoring, handled branches with no commits
118
    else:
119
        ancestry = set()
1185.54.9 by Aaron Bentley
Added revision-history shortcuts
120
    return ancestry
1185.54.7 by Aaron Bentley
More refactoring, handled branches with no commits
121
    
122
1185.54.4 by Aaron Bentley
Restructured find_unmerged, so it returns lists of (revno, revision) pairs
123
def sorted_revisions(revisions, history_map):
124
    revisions = [(history_map[r],r) for r in revisions]
125
    revisions.sort()
126
    return revisions