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