/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
3389.2.5 by John Arbash Meinel
Fix the line endings on test_check and test_reconcile
1
# Copyright (C) 2008 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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
3389.2.5 by John Arbash Meinel
Fix the line endings on test_check and test_reconcile
16
3389.2.6 by John Arbash Meinel
minor fix to test file comment
17
"""Tests for branch implementations - test check() functionality"""
3389.2.5 by John Arbash Meinel
Fix the line endings on test_check and test_reconcile
18
4332.3.3 by Robert Collins
Alter Branch.check to log errors rather than raising.
19
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
20
from ... import (
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
21
    errors,
22
    tests,
23
    ui,
24
)
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
25
from ...sixish import (
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
26
    BytesIO,
27
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
28
from . import TestCaseWithBranch
3389.2.5 by John Arbash Meinel
Fix the line endings on test_check and test_reconcile
29
30
31
class TestBranchCheck(TestCaseWithBranch):
32
33
    def test_check_detects_invalid_revhistory(self):
34
        # Different formats have different ways of handling invalid revision
35
        # histories, so the setup portion is customized
36
        tree = self.make_branch_and_tree('test')
37
        r1 = tree.commit('one')
38
        r2 = tree.commit('two')
39
        r3 = tree.commit('three')
40
        r4 = tree.commit('four')
41
        # create an alternate branch
42
        tree.set_parent_ids([r1])
43
        tree.branch.set_last_revision_info(1, r1)
44
        r2b = tree.commit('two-b')
45
46
        # now go back and merge the commit
47
        tree.set_parent_ids([r4, r2b])
48
        tree.branch.set_last_revision_info(4, r4)
49
50
        r5 = tree.commit('five')
51
        # Now, try to set an invalid history
6498.3.4 by Jelmer Vernooij
Remove more .set_revision_history / .revision_history references.
52
        if getattr(tree.branch, "_set_revision_history", None) is not None:
53
            tree.branch._set_revision_history([r1, r2b, r5])
54
        else:
3389.2.5 by John Arbash Meinel
Fix the line endings on test_check and test_reconcile
55
            tree.branch.set_last_revision_info(3, r5)
56
4332.3.7 by Robert Collins
Convert Branch.check to take a refs dict as well.
57
        tree.lock_read()
58
        self.addCleanup(tree.unlock)
59
        refs = self.make_refs(tree.branch)
60
        result = tree.branch.check(refs)
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
61
        ui.ui_factory = tests.TestUIFactory(stdout=BytesIO())
4332.3.3 by Robert Collins
Alter Branch.check to log errors rather than raising.
62
        result.report_results(True)
63
        self.assertContainsRe('revno does not match len',
64
            ui.ui_factory.stdout.getvalue())
3389.2.5 by John Arbash Meinel
Fix the line endings on test_check and test_reconcile
65
66
    def test_check_branch_report_results(self):
67
        """Checking a branch produces results which can be printed"""
68
        branch = self.make_branch('.')
4332.3.7 by Robert Collins
Convert Branch.check to take a refs dict as well.
69
        branch.lock_read()
70
        self.addCleanup(branch.unlock)
71
        result = branch.check(self.make_refs(branch))
3389.2.5 by John Arbash Meinel
Fix the line endings on test_check and test_reconcile
72
        # reports results through logging
73
        result.report_results(verbose=True)
74
        result.report_results(verbose=False)
75
4332.3.5 by Robert Collins
Add Branch._get_check_refs.
76
    def test__get_check_refs(self):
77
        tree = self.make_branch_and_tree('.')
78
        revid = tree.commit('foo')
79
        self.assertEqual(
6619.3.12 by Jelmer Vernooij
Use 2to3 set_literal fixer.
80
            {('revision-existence', revid), ('lefthand-distance', revid)},
4332.3.5 by Robert Collins
Add Branch._get_check_refs.
81
            set(tree.branch._get_check_refs()))
4332.3.7 by Robert Collins
Convert Branch.check to take a refs dict as well.
82
83
    def make_refs(self, branch):
84
        needed_refs = branch._get_check_refs()
85
        refs = {}
86
        distances = set()
87
        existences = set()
88
        for ref in needed_refs:
89
            kind, value = ref
90
            if kind == 'lefthand-distance':
91
                distances.add(value)
92
            elif kind == 'revision-existence':
93
                existences.add(value)
94
            else:
95
                raise AssertionError(
96
                    'unknown ref kind for ref %s' % ref)
97
        node_distances = branch.repository.get_graph().find_lefthand_distances(
98
            distances)
6656.1.1 by Martin
Apply 2to3 dict fixer and clean up resulting mess using view helpers
99
        for key, distance in node_distances.items():
4332.3.7 by Robert Collins
Convert Branch.check to take a refs dict as well.
100
            refs[('lefthand-distance', key)] = distance
101
            if key in existences and distance > 0:
102
                refs[('revision-existence', key)] = True
103
                existences.remove(key)
104
        parent_map = branch.repository.get_graph().get_parent_map(existences)
105
        for key in parent_map:
106
            refs[('revision-existence', key)] = True
107
            existences.remove(key)
108
        for key in existences:
109
            refs[('revision-existence', key)] = False
110
        return refs