~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
1534.5.9 by Robert Collins
Advise users running upgrade on a checkout to also run it on the branch.
19
import bzrlib.ui as ui
1534.5.15 by Robert Collins
Review fixups
20
21
1185.54.19 by Aaron Bentley
All tests pass
22
def iter_log_data(revisions, revision_source, verbose):
1852.5.1 by Robert Collins
Deprecate EmptyTree in favour of using Repository.revision_tree.
23
    last_tree = revision_source.revision_tree(None)
1185.54.19 by Aaron Bentley
All tests pass
24
    last_rev_id = None
25
    for revno, rev_id in revisions:
26
        rev = revision_source.get_revision(rev_id)
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
27
        if verbose:
1185.67.1 by Aaron Bentley
Merged the mainline
28
            remote_tree = revision_source.revision_tree(rev_id)
1185.35.30 by Aaron Bentley
Fixed missing --verbose
29
            parent_rev_id = rev.parent_ids[0]
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
30
            if last_rev_id == parent_rev_id:
31
                parent_tree = last_tree
32
            else:
1185.54.19 by Aaron Bentley
All tests pass
33
                parent_tree = revision_source.revision_tree(parent_rev_id)
34
            revision_tree = revision_source.revision_tree(rev_id)
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
35
            last_rev_id = rev_id
36
            last_tree = revision_tree
2204.1.1 by John Arbash Meinel
'bzr missing -v' was showing adds as deletes.
37
            delta = revision_tree.changes_from(parent_tree)
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
38
        else:
39
            delta = None
1185.54.19 by Aaron Bentley
All tests pass
40
        yield revno, rev, delta
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
41
1185.54.7 by Aaron Bentley
More refactoring, handled branches with no commits
42
1185.54.3 by Aaron Bentley
Factored out find_unmerged
43
def find_unmerged(local_branch, remote_branch):
1594.1.3 by Robert Collins
Fixup pb usage to use nested_progress_bar.
44
    progress = ui.ui_factory.nested_progress_bar()
1185.54.3 by Aaron Bentley
Factored out find_unmerged
45
    local_branch.lock_read()
46
    try:
47
        remote_branch.lock_read()
48
        try:
1185.54.9 by Aaron Bentley
Added revision-history shortcuts
49
            local_rev_history, local_rev_history_map = \
50
                _get_history(local_branch, progress, "local", 0)
51
            remote_rev_history, remote_rev_history_map = \
52
                _get_history(remote_branch, progress, "remote", 1)
53
            result = _shortcut(local_rev_history, remote_rev_history)
54
            if result is not None:
55
                local_extra, remote_extra = result
56
                local_extra = sorted_revisions(local_extra, 
57
                                               local_rev_history_map)
58
                remote_extra = sorted_revisions(remote_extra, 
59
                                                remote_rev_history_map)
60
                return local_extra, remote_extra
61
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
62
            local_ancestry = _get_ancestry(local_branch.repository, progress, 
1185.67.1 by Aaron Bentley
Merged the mainline
63
                                           "local", 2, local_rev_history)
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
64
            remote_ancestry = _get_ancestry(remote_branch.repository, progress,
1185.67.1 by Aaron Bentley
Merged the mainline
65
                                            "remote", 3, remote_rev_history)
1185.54.3 by Aaron Bentley
Factored out find_unmerged
66
            progress.update('pondering', 4, 5)
1185.54.6 by Aaron Bentley
Used more set operations
67
            extras = local_ancestry.symmetric_difference(remote_ancestry) 
68
            local_extra = extras.intersection(set(local_rev_history))
69
            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
70
            local_extra = sorted_revisions(local_extra, local_rev_history_map)
71
            remote_extra = sorted_revisions(remote_extra, 
72
                                            remote_rev_history_map)
1185.54.3 by Aaron Bentley
Factored out find_unmerged
73
                    
74
        finally:
75
            remote_branch.unlock()
76
    finally:
77
        local_branch.unlock()
1594.1.3 by Robert Collins
Fixup pb usage to use nested_progress_bar.
78
        progress.finished()
1185.54.4 by Aaron Bentley
Restructured find_unmerged, so it returns lists of (revno, revision) pairs
79
    return (local_extra, remote_extra)
80
1185.54.9 by Aaron Bentley
Added revision-history shortcuts
81
def _shortcut(local_rev_history, remote_rev_history):
82
    local_history = set(local_rev_history)
83
    remote_history = set(remote_rev_history)
84
    if len(local_rev_history) == 0:
85
        return set(), remote_history
86
    elif len(remote_rev_history) == 0:
87
        return local_history, set()
88
    elif local_rev_history[-1] in remote_history:
1185.54.10 by Aaron Bentley
Refactored shortcut
89
        return set(), _after(remote_rev_history, local_rev_history)
1185.54.9 by Aaron Bentley
Added revision-history shortcuts
90
    elif remote_rev_history[-1] in local_history:
1185.54.10 by Aaron Bentley
Refactored shortcut
91
        return _after(local_rev_history, remote_rev_history), set()
1185.54.9 by Aaron Bentley
Added revision-history shortcuts
92
    else:
93
        return None
94
1185.54.10 by Aaron Bentley
Refactored shortcut
95
def _after(larger_history, smaller_history):
96
    return set(larger_history[larger_history.index(smaller_history[-1])+1:])
1185.54.9 by Aaron Bentley
Added revision-history shortcuts
97
98
def _get_history(branch, progress, label, step):
99
    progress.update('%s history' % label, step, 5)
1185.54.7 by Aaron Bentley
More refactoring, handled branches with no commits
100
    rev_history = branch.revision_history()
101
    rev_history_map = dict(
1185.54.9 by Aaron Bentley
Added revision-history shortcuts
102
        [(rev, rev_history.index(rev) + 1)
1185.54.7 by Aaron Bentley
More refactoring, handled branches with no commits
103
         for rev in rev_history])
1185.54.9 by Aaron Bentley
Added revision-history shortcuts
104
    return rev_history, rev_history_map
105
1185.67.1 by Aaron Bentley
Merged the mainline
106
def _get_ancestry(repository, progress, label, step, rev_history):
1185.54.9 by Aaron Bentley
Added revision-history shortcuts
107
    progress.update('%s ancestry' % label, step, 5)
1185.54.7 by Aaron Bentley
More refactoring, handled branches with no commits
108
    if len(rev_history) > 0:
1185.67.1 by Aaron Bentley
Merged the mainline
109
        ancestry = set(repository.get_ancestry(rev_history[-1]))
1185.54.7 by Aaron Bentley
More refactoring, handled branches with no commits
110
    else:
111
        ancestry = set()
1185.54.9 by Aaron Bentley
Added revision-history shortcuts
112
    return ancestry
1185.54.7 by Aaron Bentley
More refactoring, handled branches with no commits
113
    
114
1185.54.4 by Aaron Bentley
Restructured find_unmerged, so it returns lists of (revno, revision) pairs
115
def sorted_revisions(revisions, history_map):
116
    revisions = [(history_map[r],r) for r in revisions]
117
    revisions.sort()
118
    return revisions