/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
5557.1.15 by John Arbash Meinel
Merge bzr.dev 5597 to resolve NEWS, aka bzr-2.3.txt
1
# Copyright (C) 2006-2009, 2011 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
1534.1.29 by Robert Collins
Add a test environment for InterRepository objects, and remove the fetch corner case tests from test_repository.
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
1534.1.29 by Robert Collins
Add a test environment for InterRepository objects, and remove the fetch corner case tests from test_repository.
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
1534.1.29 by Robert Collins
Add a test environment for InterRepository objects, and remove the fetch corner case tests from test_repository.
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
1534.1.29 by Robert Collins
Add a test environment for InterRepository objects, and remove the fetch corner case tests from test_repository.
16
17
"""Tests for InterRepository implementastions."""
18
1711.7.18 by John Arbash Meinel
Old repository formats didn't support double locking on win32, don't raise errors
19
import sys
1534.1.29 by Robert Collins
Add a test environment for InterRepository objects, and remove the fetch corner case tests from test_repository.
20
1534.1.31 by Robert Collins
Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo.
21
import bzrlib
1534.1.29 by Robert Collins
Add a test environment for InterRepository objects, and remove the fetch corner case tests from test_repository.
22
import bzrlib.errors as errors
3302.5.3 by Vincent Ladeuil
Fix another test bug revealed when run alone.
23
import bzrlib.gpg
1731.1.1 by Aaron Bentley
Make root entry an InventoryDirectory, make EmptyTree really empty
24
from bzrlib.inventory import Inventory
5582.4.3 by Jelmer Vernooij
remove more unused imports, avoid relying on a specific set of working tree formats that support references.
25
from bzrlib.revision import NULL_REVISION
2814.1.1 by Robert Collins
* Pushing, pulling and branching branches with subtree references was not
26
from bzrlib.tests import (
27
    TestNotApplicable,
28
    TestSkipped,
29
    )
4523.1.3 by Martin Pool
Rename to per_interrepository
30
from bzrlib.tests.per_interrepository import (
3380.1.4 by Aaron Bentley
Split interrepository fetch tests into their own file
31
    TestCaseWithInterRepository,
32
    )
1534.1.29 by Robert Collins
Add a test environment for InterRepository objects, and remove the fetch corner case tests from test_repository.
33
34
1711.7.18 by John Arbash Meinel
Old repository formats didn't support double locking on win32, don't raise errors
35
def check_old_format_lock_error(repository_format):
36
    """Potentially ignore LockError on old formats.
37
38
    On win32, with the old OS locks, we get a failure of double-lock when
39
    we open a object in 2 objects and try to lock both.
40
41
    On new formats, LockError would be invalid, but for old formats
42
    this was not supported on Win32.
43
    """
44
    if sys.platform != 'win32':
45
        raise
46
47
    description = repository_format.get_format_description()
48
    if description in ("Repository format 4",
49
                       "Weave repository format 5",
50
                       "Weave repository format 6"):
1711.7.30 by John Arbash Meinel
Switch to using TestSkipped for old win32 problems
51
        # jam 20060701
52
        # win32 OS locks are not re-entrant. So one process cannot
53
        # open the same repository twice and lock them both.
54
        raise TestSkipped('%s on win32 cannot open the same'
55
                          ' repository twice in different objects'
56
                          % description)
1711.7.18 by John Arbash Meinel
Old repository formats didn't support double locking on win32, don't raise errors
57
    raise
58
59
2240.1.3 by Alexander Belchenko
win32: skip tests that try to use funky chars in fileid in Weave-based repositories
60
def check_repo_format_for_funky_id_on_win32(repo):
5582.9.1 by Jelmer Vernooij
Add flag for 'supports_funky_characters'.
61
    if not repo._format.supports_funky_characters and sys.platform == 'win32':
62
        raise TestSkipped("funky chars not allowed on this platform in repository"
63
                          " %s" % repo.__class__.__name__)
2240.1.3 by Alexander Belchenko
win32: skip tests that try to use funky chars in fileid in Weave-based repositories
64
65
1534.1.29 by Robert Collins
Add a test environment for InterRepository objects, and remove the fetch corner case tests from test_repository.
66
class TestInterRepository(TestCaseWithInterRepository):
67
1534.1.30 by Robert Collins
Test that we get the right optimiser back in the InterRepository tests.
68
    def test_interrepository_get_returns_correct_optimiser(self):
69
        # we assume the optimising code paths are triggered
70
        # by the type of the repo not the transport - at this point.
71
        # we may need to update this test if this changes.
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
72
        #
73
        # XXX: This code tests that we get an InterRepository when we try to
74
        # convert between the two repositories that it wants to be tested with
75
        # -- but that's not necessarily correct.  So for now this is disabled.
76
        # mbp 20070206
77
        ## source_repo = self.make_repository("source")
78
        ## target_repo = self.make_to_repository("target")
79
        ## interrepo = repository.InterRepository.get(source_repo, target_repo)
80
        ## self.assertEqual(self.interrepo_class, interrepo.__class__)
81
        pass
1534.1.30 by Robert Collins
Test that we get the right optimiser back in the InterRepository tests.
82
1843.2.1 by Aaron Bentley
Add failing tests for funky ids
83
1534.1.34 by Robert Collins
Move missing_revision_ids from Repository to InterRepository, and eliminate the now unused Repository._compatible_formats method.
84
class TestCaseWithComplexRepository(TestCaseWithInterRepository):
85
86
    def setUp(self):
87
        super(TestCaseWithComplexRepository, self).setUp()
88
        tree_a = self.make_branch_and_tree('a')
89
        self.bzrdir = tree_a.branch.bzrdir
90
        # add a corrupt inventory 'orphan'
2592.3.91 by Robert Collins
Incrementally closing in on a correct fetch for packs.
91
        tree_a.branch.repository.lock_write()
92
        tree_a.branch.repository.start_write_group()
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
93
        inv_file = tree_a.branch.repository.inventories
94
        inv_file.add_lines(('orphan',), [], [])
2592.3.91 by Robert Collins
Incrementally closing in on a correct fetch for packs.
95
        tree_a.branch.repository.commit_write_group()
96
        tree_a.branch.repository.unlock()
1534.1.34 by Robert Collins
Move missing_revision_ids from Repository to InterRepository, and eliminate the now unused Repository._compatible_formats method.
97
        # add a real revision 'rev1'
98
        tree_a.commit('rev1', rev_id='rev1', allow_pointless=True)
99
        # add a real revision 'rev2' based on rev1
100
        tree_a.commit('rev2', rev_id='rev2', allow_pointless=True)
1556.1.4 by Robert Collins
Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.
101
        # and sign 'rev2'
2592.3.96 by Robert Collins
Merge index improvements (includes bzr.dev).
102
        tree_a.branch.repository.lock_write()
103
        tree_a.branch.repository.start_write_group()
5582.9.1 by Jelmer Vernooij
Add flag for 'supports_funky_characters'.
104
        tree_a.branch.repository.sign_revision('rev2',
105
            bzrlib.gpg.LoopbackGPGStrategy(None))
2592.3.96 by Robert Collins
Merge index improvements (includes bzr.dev).
106
        tree_a.branch.repository.commit_write_group()
107
        tree_a.branch.repository.unlock()
1534.1.34 by Robert Collins
Move missing_revision_ids from Repository to InterRepository, and eliminate the now unused Repository._compatible_formats method.
108
3184.1.8 by Robert Collins
* ``InterRepository.missing_revision_ids`` is now deprecated in favour of
109
    def test_search_missing_revision_ids(self):
1534.1.34 by Robert Collins
Move missing_revision_ids from Repository to InterRepository, and eliminate the now unused Repository._compatible_formats method.
110
        # revision ids in repository A but not B are returned, fake ones
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
111
        # are stripped. (fake meaning no revision object, but an inventory
2592.3.146 by Robert Collins
Typo.
112
        # as some formats keyed off inventory data in the past.)
1534.1.34 by Robert Collins
Move missing_revision_ids from Repository to InterRepository, and eliminate the now unused Repository._compatible_formats method.
113
        # make a repository to compare against that claims to have rev1
114
        repo_b = self.make_to_repository('rev1_only')
115
        repo_a = self.bzrdir.open_repository()
116
        repo_b.fetch(repo_a, 'rev1')
117
        # check the test will be valid
118
        self.assertFalse(repo_b.has_revision('rev2'))
3184.1.8 by Robert Collins
* ``InterRepository.missing_revision_ids`` is now deprecated in favour of
119
        result = repo_b.search_missing_revision_ids(repo_a)
120
        self.assertEqual(set(['rev2']), result.get_keys())
4152.1.2 by Robert Collins
Add streaming from a stacked branch when the sort order is compatible with doing so.
121
        self.assertEqual(('search', set(['rev2']), set(['rev1']), 1),
122
            result.get_recipe())
1534.1.34 by Robert Collins
Move missing_revision_ids from Repository to InterRepository, and eliminate the now unused Repository._compatible_formats method.
123
3184.1.8 by Robert Collins
* ``InterRepository.missing_revision_ids`` is now deprecated in favour of
124
    def test_search_missing_revision_ids_absent_requested_raises(self):
3010.1.5 by Robert Collins
Test that missing_revision_ids handles the case of the source not having the requested revision correctly with and without find_ghosts.
125
        # Asking for missing revisions with a tip that is itself absent in the
126
        # source raises NoSuchRevision.
127
        repo_b = self.make_to_repository('target')
128
        repo_a = self.bzrdir.open_repository()
129
        # No pizza revisions anywhere
130
        self.assertFalse(repo_a.has_revision('pizza'))
131
        self.assertFalse(repo_b.has_revision('pizza'))
132
        # Asking specifically for an absent revision errors.
3380.1.4 by Aaron Bentley
Split interrepository fetch tests into their own file
133
        self.assertRaises(errors.NoSuchRevision,
5539.2.10 by Andrew Bennetts
s/NotInOtherForRev/NotInOtherForRevs/, and allow passing multiple revision_ids to search_missing_revision_ids.
134
            repo_b.search_missing_revision_ids, repo_a, revision_ids=['pizza'],
3380.1.4 by Aaron Bentley
Split interrepository fetch tests into their own file
135
            find_ghosts=True)
136
        self.assertRaises(errors.NoSuchRevision,
5539.2.10 by Andrew Bennetts
s/NotInOtherForRev/NotInOtherForRevs/, and allow passing multiple revision_ids to search_missing_revision_ids.
137
            repo_b.search_missing_revision_ids, repo_a, revision_ids=['pizza'],
138
            find_ghosts=False)
139
        self.callDeprecated(
140
            ['search_missing_revision_ids(revision_id=...) was deprecated in '
5536.3.4 by Andrew Bennetts
Update an occurrence of '2.3' that should be '2.4'.
141
             '2.4.  Use revision_ids=[...] instead.'],
5539.2.10 by Andrew Bennetts
s/NotInOtherForRev/NotInOtherForRevs/, and allow passing multiple revision_ids to search_missing_revision_ids.
142
            self.assertRaises, errors.NoSuchRevision,
3380.1.4 by Aaron Bentley
Split interrepository fetch tests into their own file
143
            repo_b.search_missing_revision_ids, repo_a, revision_id='pizza',
144
            find_ghosts=False)
3010.1.5 by Robert Collins
Test that missing_revision_ids handles the case of the source not having the requested revision correctly with and without find_ghosts.
145
3184.1.8 by Robert Collins
* ``InterRepository.missing_revision_ids`` is now deprecated in favour of
146
    def test_search_missing_revision_ids_revision_limited(self):
1534.1.34 by Robert Collins
Move missing_revision_ids from Repository to InterRepository, and eliminate the now unused Repository._compatible_formats method.
147
        # revision ids in repository A that are not referenced by the
148
        # requested revision are not returned.
149
        # make a repository to compare against that is empty
150
        repo_b = self.make_to_repository('empty')
151
        repo_a = self.bzrdir.open_repository()
5539.2.10 by Andrew Bennetts
s/NotInOtherForRev/NotInOtherForRevs/, and allow passing multiple revision_ids to search_missing_revision_ids.
152
        result = repo_b.search_missing_revision_ids(
153
            repo_a, revision_ids=['rev1'])
3184.1.8 by Robert Collins
* ``InterRepository.missing_revision_ids`` is now deprecated in favour of
154
        self.assertEqual(set(['rev1']), result.get_keys())
4152.1.2 by Robert Collins
Add streaming from a stacked branch when the sort order is compatible with doing so.
155
        self.assertEqual(('search', set(['rev1']), set([NULL_REVISION]), 1),
3184.1.8 by Robert Collins
* ``InterRepository.missing_revision_ids`` is now deprecated in favour of
156
            result.get_recipe())
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
157
2592.3.91 by Robert Collins
Incrementally closing in on a correct fetch for packs.
158
    def test_fetch_fetches_signatures_too(self):
1556.1.4 by Robert Collins
Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.
159
        from_repo = self.bzrdir.open_repository()
1563.2.31 by Robert Collins
Convert Knit repositories to use knits.
160
        from_signature = from_repo.get_signature_text('rev2')
1556.1.4 by Robert Collins
Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.
161
        to_repo = self.make_to_repository('target')
162
        to_repo.fetch(from_repo)
1563.2.31 by Robert Collins
Convert Knit repositories to use knits.
163
        to_signature = to_repo.get_signature_text('rev2')
1556.1.4 by Robert Collins
Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same.
164
        self.assertEqual(from_signature, to_signature)
165
1570.1.14 by Robert Collins
Enforce repository consistency during 'fetch' operations.
166
167
class TestCaseWithGhosts(TestCaseWithInterRepository):
168
2949.1.2 by Robert Collins
* Fetch with pack repositories will no longer read the entire history graph.
169
    def test_fetch_all_fixes_up_ghost(self):
170
        # we want two repositories at this point:
1570.1.14 by Robert Collins
Enforce repository consistency during 'fetch' operations.
171
        # one with a revision that is a ghost in the other
172
        # repository.
2949.1.2 by Robert Collins
* Fetch with pack repositories will no longer read the entire history graph.
173
        # 'ghost' is present in has_ghost, 'ghost' is absent in 'missing_ghost'.
174
        # 'references' is present in both repositories, and 'tip' is present
175
        # just in has_ghost.
176
        # has_ghost       missing_ghost
177
        #------------------------------
178
        # 'ghost'             -
179
        # 'references'    'references'
180
        # 'tip'               -
181
        # In this test we fetch 'tip' which should not fetch 'ghost'
182
        has_ghost = self.make_repository('has_ghost')
183
        missing_ghost = self.make_repository('missing_ghost')
184
        if [True, True] != [repo._format.supports_ghosts for repo in
185
            (has_ghost, missing_ghost)]:
186
            raise TestNotApplicable("Need ghost support.")
187
188
        def add_commit(repo, revision_id, parent_ids):
189
            repo.lock_write()
190
            repo.start_write_group()
191
            inv = Inventory(revision_id=revision_id)
192
            inv.root.revision = revision_id
193
            root_id = inv.root.file_id
194
            sha1 = repo.add_inventory(revision_id, inv, parent_ids)
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
195
            repo.texts.add_lines((root_id, revision_id), [], [])
2949.1.2 by Robert Collins
* Fetch with pack repositories will no longer read the entire history graph.
196
            rev = bzrlib.revision.Revision(timestamp=0,
197
                                           timezone=None,
198
                                           committer="Foo Bar <foo@example.com>",
199
                                           message="Message",
200
                                           inventory_sha1=sha1,
201
                                           revision_id=revision_id)
202
            rev.parent_ids = parent_ids
203
            repo.add_revision(revision_id, rev)
204
            repo.commit_write_group()
205
            repo.unlock()
206
        add_commit(has_ghost, 'ghost', [])
207
        add_commit(has_ghost, 'references', ['ghost'])
208
        add_commit(missing_ghost, 'references', ['ghost'])
209
        add_commit(has_ghost, 'tip', ['references'])
210
        missing_ghost.fetch(has_ghost, 'tip', find_ghosts=True)
211
        # missing ghost now has tip and ghost.
212
        rev = missing_ghost.get_revision('tip')
213
        inv = missing_ghost.get_inventory('tip')
214
        rev = missing_ghost.get_revision('ghost')
215
        inv = missing_ghost.get_inventory('ghost')
1570.1.14 by Robert Collins
Enforce repository consistency during 'fetch' operations.
216
        # rev must not be corrupt now
2949.1.2 by Robert Collins
* Fetch with pack repositories will no longer read the entire history graph.
217
        self.assertEqual([None, 'ghost', 'references', 'tip'],
218
            missing_ghost.get_ancestry('tip'))