/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
2697.2.2 by Martin Pool
deprecate Branch.append_revision
1
# Copyright (C) 2005, 2007 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
1115 by Martin Pool
- split fetch tests into a separate file
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
#
1115 by Martin Pool
- split fetch tests into a separate file
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
#
1115 by Martin Pool
- split fetch tests into a separate file
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
1238 by Martin Pool
- remove a lot of dead code from fetch
16
1185.1.41 by Robert Collins
massive patch from Alexander Belchenko - many PEP8 fixes, removes unused function uuid
17
import os
2004.1.22 by v.ladeuil+lp at free
Implements Range header handling for GET requests. Fix a test.
18
import re
1238 by Martin Pool
- remove a lot of dead code from fetch
19
import sys
20
2697.2.2 by Martin Pool
deprecate Branch.append_revision
21
import bzrlib
2323.8.2 by Aaron Bentley
Give a nicer error on fetch when repos are in incompatible formats
22
from bzrlib import (
23
    bzrdir,
24
    errors,
1551.15.70 by Aaron Bentley
Avoid using builtins.merge
25
    merge,
2323.8.2 by Aaron Bentley
Give a nicer error on fetch when repos are in incompatible formats
26
    repository,
27
    )
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
28
from bzrlib.branch import Branch
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
29
from bzrlib.bzrdir import BzrDir
2241.1.5 by Martin Pool
Move KnitFormat2 into repofmt
30
from bzrlib.repofmt import knitrepo
2697.2.2 by Martin Pool
deprecate Branch.append_revision
31
from bzrlib.symbol_versioning import (
32
    zero_ninetyone,
33
    )
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
34
from bzrlib.tests import TestCaseWithTransport
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
35
from bzrlib.tests.HTTPTestUtil import TestCaseWithWebserver
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
36
from bzrlib.tests.test_revision import make_branches
37
from bzrlib.trace import mutter
1551.8.42 by Aaron Bentley
Ensure that fetch properly updates inventory root knit
38
from bzrlib.upgrade import Convert
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
39
from bzrlib.workingtree import WorkingTree
1185.1.41 by Robert Collins
massive patch from Alexander Belchenko - many PEP8 fixes, removes unused function uuid
40
1115 by Martin Pool
- split fetch tests into a separate file
41
1238 by Martin Pool
- remove a lot of dead code from fetch
42
def has_revision(branch, revision_id):
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
43
    return branch.repository.has_revision(revision_id)
1534.4.5 by Robert Collins
Turn branch format.open into a factory.
44
1393 by Robert Collins
reenable remotebranch tests
45
def fetch_steps(self, br_a, br_b, writable_a):
46
    """A foreign test method for testing fetch locally and remotely."""
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
47
     
48
    # TODO RBC 20060201 make this a repository test.
49
    repo_b = br_b.repository
50
    self.assertFalse(repo_b.has_revision(br_a.revision_history()[3]))
51
    self.assertTrue(repo_b.has_revision(br_a.revision_history()[2]))
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
52
    self.assertEquals(len(br_b.revision_history()), 7)
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.
53
    self.assertEquals(br_b.fetch(br_a, br_a.revision_history()[2])[0], 0)
54
    # branch.fetch is not supposed to alter the revision history
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
55
    self.assertEquals(len(br_b.revision_history()), 7)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
56
    self.assertFalse(repo_b.has_revision(br_a.revision_history()[3]))
1393 by Robert Collins
reenable remotebranch tests
57
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
58
    # fetching the next revision up in sample data copies one revision
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.
59
    self.assertEquals(br_b.fetch(br_a, br_a.revision_history()[3])[0], 1)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
60
    self.assertTrue(repo_b.has_revision(br_a.revision_history()[3]))
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
61
    self.assertFalse(has_revision(br_a, br_b.revision_history()[6]))
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
62
    self.assertTrue(br_a.repository.has_revision(br_b.revision_history()[5]))
1393 by Robert Collins
reenable remotebranch tests
63
1092.2.28 by Robert Collins
reenable test of fetching a branch with ghosts
64
    # When a non-branch ancestor is missing, it should be unlisted...
1415 by Robert Collins
remove the ancestry weave file
65
    # as its not reference from the inventory weave.
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
66
    br_b4 = self.make_branch('br_4')
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.
67
    count, failures = br_b4.fetch(br_b)
1092.2.28 by Robert Collins
reenable test of fetching a branch with ghosts
68
    self.assertEqual(count, 7)
69
    self.assertEqual(failures, [])
1393 by Robert Collins
reenable remotebranch tests
70
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.
71
    self.assertEqual(writable_a.fetch(br_b)[0], 1)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
72
    self.assertTrue(has_revision(br_a, br_b.revision_history()[3]))
73
    self.assertTrue(has_revision(br_a, br_b.revision_history()[4]))
1393 by Robert Collins
reenable remotebranch tests
74
        
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
75
    br_b2 = self.make_branch('br_b2')
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.
76
    self.assertEquals(br_b2.fetch(br_b)[0], 7)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
77
    self.assertTrue(has_revision(br_b2, br_b.revision_history()[4]))
78
    self.assertTrue(has_revision(br_b2, br_a.revision_history()[2]))
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
79
    self.assertFalse(has_revision(br_b2, br_a.revision_history()[3]))
1393 by Robert Collins
reenable remotebranch tests
80
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
81
    br_a2 = self.make_branch('br_a2')
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.
82
    self.assertEquals(br_a2.fetch(br_a)[0], 9)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
83
    self.assertTrue(has_revision(br_a2, br_b.revision_history()[4]))
84
    self.assertTrue(has_revision(br_a2, br_a.revision_history()[3]))
85
    self.assertTrue(has_revision(br_a2, br_a.revision_history()[2]))
1393 by Robert Collins
reenable remotebranch tests
86
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
87
    br_a3 = self.make_branch('br_a3')
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
88
    # pulling a branch with no revisions grabs nothing, regardless of 
89
    # whats in the inventory.
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.
90
    self.assertEquals(br_a3.fetch(br_a2)[0], 0)
1393 by Robert Collins
reenable remotebranch tests
91
    for revno in range(4):
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
92
        self.assertFalse(
93
            br_a3.repository.has_revision(br_a.revision_history()[revno]))
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.
94
    self.assertEqual(br_a3.fetch(br_a2, br_a.revision_history()[2])[0], 3)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
95
    # pull the 3 revisions introduced by a@u-0-3
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.
96
    fetched = br_a3.fetch(br_a2, br_a.revision_history()[3])[0]
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
97
    self.assertEquals(fetched, 3, "fetched %d instead of 3" % fetched)
1393 by Robert Collins
reenable remotebranch tests
98
    # InstallFailed should be raised if the branch is missing the revision
99
    # that was requested.
2697.2.2 by Martin Pool
deprecate Branch.append_revision
100
    self.assertRaises(errors.InstallFailed, br_a3.fetch, br_a2, 'pizza')
101
102
    # We try to pull a revision 'a-b-c' from a branch whose repository doesn't
103
    # contain a-b-c; this should give InstallFailed.
2697.2.3 by Martin Pool
More append_revision cleanup; _synchronize_history optimization
104
    br_a2.set_last_revision_info(42, 'a-b-c')
2697.2.2 by Martin Pool
deprecate Branch.append_revision
105
    self.assertRaises(errors.InstallFailed, br_a3.fetch, br_a2)
1638.1.2 by Robert Collins
Change the basis-inventory file to not have the revision-id in the file name.
106
2230.3.9 by Aaron Bentley
Fix most fetch tests
107
    # TODO: ADHB 20070116 Perhaps set_last_revision shouldn't accept
108
    #       revisions which are not present?  In that case, this test
109
    #       must be rewritten.
2230.3.12 by Aaron Bentley
Clean up trailing whitespace
110
    #
2230.3.9 by Aaron Bentley
Fix most fetch tests
111
    #       RBC 20060403 the way to do this is to uncommit the revision from
112
    #       the repository after the commit
1638.1.2 by Robert Collins
Change the basis-inventory file to not have the revision-id in the file name.
113
1185.13.4 by Robert Collins
make reweave visible as a weave method, and quickly integrate into fetch
114
    #TODO: test that fetch correctly does reweaving when needed. RBC 20051008
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
115
    # Note that this means - updating the weave when ghosts are filled in to 
116
    # add the right parents.
117
1185.13.4 by Robert Collins
make reweave visible as a weave method, and quickly integrate into fetch
118
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
119
class TestFetch(TestCaseWithTransport):
1392 by Robert Collins
reinstate testfetch test case
120
121
    def test_fetch(self):
1115 by Martin Pool
- split fetch tests into a separate file
122
        #highest indices a: 5, b: 7
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
123
        br_a, br_b = make_branches(self)
1393 by Robert Collins
reenable remotebranch tests
124
        fetch_steps(self, br_a, br_b, br_a)
1404 by Robert Collins
only pull remote text weaves once per fetch operation
125
1558.4.11 by Aaron Bentley
Allow merge against self, make fetching self a noop
126
    def test_fetch_self(self):
127
        wt = self.make_branch_and_tree('br')
128
        self.assertEqual(wt.branch.fetch(wt.branch), (0, []))
129
1551.8.42 by Aaron Bentley
Ensure that fetch properly updates inventory root knit
130
    def test_fetch_root_knit(self):
1551.8.43 by Aaron Bentley
Update from reviews
131
        """Ensure that knit2.fetch() updates the root knit
1551.8.42 by Aaron Bentley
Ensure that fetch properly updates inventory root knit
132
        
1551.8.43 by Aaron Bentley
Update from reviews
133
        This tests the case where the root has a new revision, but there are no
134
        corresponding filename, parent, contents or other changes.
1551.8.42 by Aaron Bentley
Ensure that fetch properly updates inventory root knit
135
        """
1551.8.43 by Aaron Bentley
Update from reviews
136
        knit1_format = bzrdir.BzrDirMetaFormat1()
2241.1.6 by Martin Pool
Move Knit repositories into the submodule bzrlib.repofmt.knitrepo and
137
        knit1_format.repository_format = knitrepo.RepositoryFormatKnit1()
1551.8.43 by Aaron Bentley
Update from reviews
138
        knit2_format = bzrdir.BzrDirMetaFormat1()
2255.2.211 by Robert Collins
Remove knit2 repository format- it has never been supported.
139
        knit2_format.repository_format = knitrepo.RepositoryFormatKnit3()
1551.8.43 by Aaron Bentley
Update from reviews
140
        # we start with a knit1 repository because that causes the
141
        # root revision to change for each commit, even though the content,
142
        # parent, name, and other attributes are unchanged.
143
        tree = self.make_branch_and_tree('tree', knit1_format)
1551.8.42 by Aaron Bentley
Ensure that fetch properly updates inventory root knit
144
        tree.set_root_id('tree-root')
145
        tree.commit('rev1', rev_id='rev1')
146
        tree.commit('rev2', rev_id='rev2')
1551.8.43 by Aaron Bentley
Update from reviews
147
148
        # Now we convert it to a knit2 repository so that it has a root knit
149
        Convert(tree.basedir, knit2_format)
1551.8.42 by Aaron Bentley
Ensure that fetch properly updates inventory root knit
150
        tree = WorkingTree.open(tree.basedir)
1551.8.43 by Aaron Bentley
Update from reviews
151
        branch = self.make_branch('branch', format=knit2_format)
1551.8.42 by Aaron Bentley
Ensure that fetch properly updates inventory root knit
152
        branch.pull(tree.branch, stop_revision='rev1')
153
        repo = branch.repository
1551.8.43 by Aaron Bentley
Update from reviews
154
        root_knit = repo.weave_store.get_weave('tree-root',
1551.8.42 by Aaron Bentley
Ensure that fetch properly updates inventory root knit
155
                                                repo.get_transaction())
1551.8.43 by Aaron Bentley
Update from reviews
156
        # Make sure fetch retrieved only what we requested
157
        self.assertTrue('rev1' in root_knit)
158
        self.assertTrue('rev2' not in root_knit)
1551.8.42 by Aaron Bentley
Ensure that fetch properly updates inventory root knit
159
        branch.pull(tree.branch)
1551.8.43 by Aaron Bentley
Update from reviews
160
        root_knit = repo.weave_store.get_weave('tree-root',
1551.8.42 by Aaron Bentley
Ensure that fetch properly updates inventory root knit
161
                                                repo.get_transaction())
1551.8.43 by Aaron Bentley
Update from reviews
162
        # Make sure that the next revision in the root knit was retrieved,
163
        # even though the text, name, parent_id, etc., were unchanged.
164
        self.assertTrue('rev2' in root_knit)
1551.8.42 by Aaron Bentley
Ensure that fetch properly updates inventory root knit
165
2323.8.2 by Aaron Bentley
Give a nicer error on fetch when repos are in incompatible formats
166
    def test_fetch_incompatible(self):
167
        knit_tree = self.make_branch_and_tree('knit', format='knit')
168
        knit3_tree = self.make_branch_and_tree('knit3',
169
            format='dirstate-with-subtree')
170
        knit3_tree.commit('blah')
171
        self.assertRaises(errors.IncompatibleRepositories,
172
                          knit_tree.branch.fetch, knit3_tree.branch)
173
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
174
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
175
class TestMergeFetch(TestCaseWithTransport):
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
176
177
    def test_merge_fetches_unrelated(self):
178
        """Merge brings across history from unrelated source"""
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
179
        wt1 = self.make_branch_and_tree('br1')
180
        br1 = wt1.branch
181
        wt1.commit(message='rev 1-1', rev_id='1-1')
182
        wt1.commit(message='rev 1-2', rev_id='1-2')
183
        wt2 = self.make_branch_and_tree('br2')
184
        br2 = wt2.branch
185
        wt2.commit(message='rev 2-1', rev_id='2-1')
1551.15.70 by Aaron Bentley
Avoid using builtins.merge
186
        wt2.merge_from_branch(br1, from_revision='null:')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
187
        self._check_revs_present(br2)
188
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
189
    def test_merge_fetches(self):
190
        """Merge brings across history from source"""
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
191
        wt1 = self.make_branch_and_tree('br1')
192
        br1 = wt1.branch
193
        wt1.commit(message='rev 1-1', rev_id='1-1')
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
194
        dir_2 = br1.bzrdir.sprout('br2')
195
        br2 = dir_2.open_branch()
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
196
        wt1.commit(message='rev 1-2', rev_id='1-2')
1551.15.70 by Aaron Bentley
Avoid using builtins.merge
197
        wt2 = dir_2.open_workingtree()
198
        wt2.commit(message='rev 2-1', rev_id='2-1')
199
        wt2.merge_from_branch(br1)
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
200
        self._check_revs_present(br2)
201
202
    def _check_revs_present(self, br2):
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
203
        for rev_id in '1-1', '1-2', '2-1':
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
204
            self.assertTrue(br2.repository.has_revision(rev_id))
205
            rev = br2.repository.get_revision(rev_id)
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
206
            self.assertEqual(rev.revision_id, rev_id)
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
207
            self.assertTrue(br2.repository.get_inventory(rev_id))
1185.16.94 by mbp at sourcefrog
New test that merge fetches revisions from source
208
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
209
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
210
class TestMergeFileHistory(TestCaseWithTransport):
211
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
212
    def setUp(self):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
213
        super(TestMergeFileHistory, self).setUp()
214
        wt1 = self.make_branch_and_tree('br1')
215
        br1 = wt1.branch
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
216
        self.build_tree_contents([('br1/file', 'original contents\n')])
1534.4.28 by Robert Collins
first cut at merge from integration.
217
        wt1.add('file', 'this-file-id')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
218
        wt1.commit(message='rev 1-1', rev_id='1-1')
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
219
        dir_2 = br1.bzrdir.sprout('br2')
220
        br2 = dir_2.open_branch()
221
        wt2 = dir_2.open_workingtree()
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
222
        self.build_tree_contents([('br1/file', 'original from 1\n')])
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
223
        wt1.commit(message='rev 1-2', rev_id='1-2')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
224
        self.build_tree_contents([('br1/file', 'agreement\n')])
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
225
        wt1.commit(message='rev 1-3', rev_id='1-3')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
226
        self.build_tree_contents([('br2/file', 'contents in 2\n')])
1534.4.28 by Robert Collins
first cut at merge from integration.
227
        wt2.commit(message='rev 2-1', rev_id='2-1')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
228
        self.build_tree_contents([('br2/file', 'agreement\n')])
1534.4.28 by Robert Collins
first cut at merge from integration.
229
        wt2.commit(message='rev 2-2', rev_id='2-2')
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
230
231
    def test_merge_fetches_file_history(self):
232
        """Merge brings across file histories"""
233
        br2 = Branch.open('br2')
1551.15.70 by Aaron Bentley
Avoid using builtins.merge
234
        br1 = Branch.open('br1')
235
        wt2 = WorkingTree.open('br2').merge_from_branch(br1)
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
236
        for rev_id, text in [('1-2', 'original from 1\n'),
237
                             ('1-3', 'agreement\n'),
238
                             ('2-1', 'contents in 2\n'),
239
                             ('2-2', 'agreement\n')]:
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
240
            self.assertEqualDiff(
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
241
                br2.repository.revision_tree(
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
242
                    rev_id).get_file_text('this-file-id'), text)
1185.16.96 by mbp at sourcefrog
More merge/fetch tests
243
244
1404 by Robert Collins
only pull remote text weaves once per fetch operation
245
class TestHttpFetch(TestCaseWithWebserver):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
246
    # FIXME RBC 20060124 this really isn't web specific, perhaps an
247
    # instrumented readonly transport? Can we do an instrumented
248
    # adapter and use self.get_readonly_url ?
1404 by Robert Collins
only pull remote text weaves once per fetch operation
249
250
    def test_fetch(self):
251
        #highest indices a: 5, b: 7
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
252
        br_a, br_b = make_branches(self)
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
253
        br_rem_a = Branch.open(self.get_readonly_url('branch1'))
1404 by Robert Collins
only pull remote text weaves once per fetch operation
254
        fetch_steps(self, br_rem_a, br_b, br_a)
255
1540.3.15 by Martin Pool
[merge] large merge to sync with bzr.dev
256
    def _count_log_matches(self, target, logs):
257
        """Count the number of times the target file pattern was fetched in an http log"""
2004.1.22 by v.ladeuil+lp at free
Implements Range header handling for GET requests. Fix a test.
258
        get_succeeds_re = re.compile(
259
            '.*"GET .*%s HTTP/1.1" 20[06] - "-" "bzr/%s' %
260
            (     target,                    bzrlib.__version__))
1540.3.15 by Martin Pool
[merge] large merge to sync with bzr.dev
261
        c = 0
262
        for line in logs:
2004.1.22 by v.ladeuil+lp at free
Implements Range header handling for GET requests. Fix a test.
263
            if get_succeeds_re.match(line):
1540.3.15 by Martin Pool
[merge] large merge to sync with bzr.dev
264
                c += 1
265
        return c
266
1404 by Robert Collins
only pull remote text weaves once per fetch operation
267
    def test_weaves_are_retrieved_once(self):
268
        self.build_tree(("source/", "source/file", "target/"))
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
269
        wt = self.make_branch_and_tree('source')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
270
        branch = wt.branch
271
        wt.add(["file"], ["id"])
272
        wt.commit("added file")
1404 by Robert Collins
only pull remote text weaves once per fetch operation
273
        print >>open("source/file", 'w'), "blah"
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
274
        wt.commit("changed file")
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
275
        target = BzrDir.create_branch_and_repo("target/")
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
276
        source = Branch.open(self.get_readonly_url("source/"))
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.
277
        self.assertEqual(target.fetch(source), (2, []))
1430 by Robert Collins
touchup the prefixed-store patch
278
        # this is the path to the literal file. As format changes 
279
        # occur it needs to be updated. FIXME: ask the store for the
280
        # path.
1540.3.15 by Martin Pool
[merge] large merge to sync with bzr.dev
281
        self.log("web server logs are:")
282
        http_logs = self.get_readonly_server().logs
283
        self.log('\n'.join(http_logs))
1666.1.6 by Robert Collins
Make knit the default format.
284
        # unfortunately this log entry is branch format specific. We could 
285
        # factor out the 'what files does this format use' to a method on the 
286
        # repository, which would let us to this generically. RBC 20060419
287
        self.assertEqual(1, self._count_log_matches('/ce/id.kndx', http_logs))
288
        self.assertEqual(1, self._count_log_matches('/ce/id.knit', http_logs))
289
        self.assertEqual(1, self._count_log_matches('inventory.kndx', http_logs))
1417.1.12 by Robert Collins
cache revision history during read transactions
290
        # this r-h check test will prevent regressions, but it currently already 
291
        # passes, before the patch to cache-rh is applied :[
2230.3.10 by Aaron Bentley
Genericised test_fetch to handle branch 6 retrieval patterns
292
        self.assertTrue(1 >= self._count_log_matches('revision-history',
293
                                                     http_logs))
294
        self.assertTrue(1 >= self._count_log_matches('last-revision',
295
                                                     http_logs))
1530.1.18 by Robert Collins
unbreak test_fetch
296
        # FIXME naughty poking in there.
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
297
        self.get_readonly_server().logs = []
1417.1.13 by Robert Collins
do not download remote ancestry.weave if the target revision we are stopping at is in our local store
298
        # check there is nothing more to fetch
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
299
        source = Branch.open(self.get_readonly_url("source/"))
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.
300
        self.assertEqual(target.fetch(source), (0, []))
1540.3.15 by Martin Pool
[merge] large merge to sync with bzr.dev
301
        # should make just two requests
302
        http_logs = self.get_readonly_server().logs
303
        self.log("web server logs are:")
304
        self.log('\n'.join(http_logs))
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
305
        self.assertEqual(1, self._count_log_matches('branch-format', http_logs))
306
        self.assertEqual(1, self._count_log_matches('branch/format', http_logs))
307
        self.assertEqual(1, self._count_log_matches('repository/format', http_logs))
2230.3.11 by Aaron Bentley
Fix line endings
308
        self.assertTrue(1 >= self._count_log_matches('revision-history',
309
                                                     http_logs))
310
        self.assertTrue(1 >= self._count_log_matches('last-revision',
311
                                                     http_logs))
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
312
        self.assertEqual(4, len(http_logs))