~bzr-pqm/bzr/bzr.dev

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