~bzr-pqm/bzr/bzr.dev

5557.1.7 by John Arbash Meinel
Merge in the bzr.dev 5582
1
# Copyright (C) 2008-2011 Canonical Ltd
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
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
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
16
17
18
"""Tests for foreign VCS utility code."""
19
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
20
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
21
from bzrlib import (
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
22
    branch,
4721.2.4 by Vincent Ladeuil
More test cleanup.
23
    bzrdir,
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
24
    controldir,
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
25
    errors,
26
    foreign,
27
    lockable_files,
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
28
    lockdir,
4721.2.4 by Vincent Ladeuil
More test cleanup.
29
    revision,
30
    tests,
3920.2.33 by Jelmer Vernooij
Use branch_builder to create revisions in testsuite.
31
    trace,
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
32
    )
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
33
3920.2.7 by Jelmer Vernooij
Add comments about dummy vcs.
34
# This is the dummy foreign revision control system, used 
35
# mainly here in the testsuite to test the foreign VCS infrastructure.
36
# It is basically standard Bazaar with some minor modifications to 
37
# make it "foreign". 
38
# 
39
# It has the following differences to "regular" Bazaar:
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
40
# - The control directory is named ".dummy", not ".bzr".
3920.2.7 by Jelmer Vernooij
Add comments about dummy vcs.
41
# - The revision ids are tuples, not strings.
3920.2.20 by Jelmer Vernooij
Fix dpush tests.
42
# - Doesn't support more than one parent natively
3920.2.7 by Jelmer Vernooij
Add comments about dummy vcs.
43
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
44
45
class DummyForeignVcsMapping(foreign.VcsMapping):
46
    """A simple mapping for the dummy Foreign VCS, for use with testing."""
47
48
    def __eq__(self, other):
49
        return type(self) == type(other)
50
51
    def revision_id_bzr_to_foreign(self, bzr_revid):
52
        return tuple(bzr_revid[len("dummy-v1:"):].split("-")), self
53
54
    def revision_id_foreign_to_bzr(self, foreign_revid):
55
        return "dummy-v1:%s-%s-%s" % foreign_revid
56
57
58
class DummyForeignVcsMappingRegistry(foreign.VcsMappingRegistry):
59
60
    def revision_id_bzr_to_foreign(self, revid):
61
        if not revid.startswith("dummy-"):
62
            raise errors.InvalidRevisionId(revid, None)
63
        mapping_version = revid[len("dummy-"):len("dummy-vx")]
64
        mapping = self.get(mapping_version)
65
        return mapping.revision_id_bzr_to_foreign(revid)
66
67
68
class DummyForeignVcs(foreign.ForeignVcs):
69
    """A dummy Foreign VCS, for use with testing.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
70
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
71
    It has revision ids that are a tuple with three strings.
72
    """
73
74
    def __init__(self):
75
        self.mapping_registry = DummyForeignVcsMappingRegistry()
4032.1.1 by John Arbash Meinel
Merge the removal of all trailing whitespace, and resolve conflicts.
76
        self.mapping_registry.register("v1", DummyForeignVcsMapping(self),
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
77
                                       "Version 1")
4747.2.1 by Jelmer Vernooij
Allow specifying an abbreviation for foreign vcs'es and an optional function to serialize foreign revision ids.
78
        self.abbreviation = "dummy"
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
79
3949.5.1 by Jelmer Vernooij
Move ForeignVcsMapping.show_foreign_revid to ForeignVcs.
80
    def show_foreign_revid(self, foreign_revid):
81
        return { "dummy ding": "%s/%s\\%s" % foreign_revid }
82
4747.2.1 by Jelmer Vernooij
Allow specifying an abbreviation for foreign vcs'es and an optional function to serialize foreign revision ids.
83
    def serialize_foreign_revid(self, foreign_revid):
84
        return "%s|%s|%s" % foreign_revid
85
3949.5.1 by Jelmer Vernooij
Move ForeignVcsMapping.show_foreign_revid to ForeignVcs.
86
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
87
class DummyForeignVcsBranch(branch.BzrBranch6,foreign.ForeignBranch):
88
    """A Dummy VCS Branch."""
89
90
    def __init__(self, _format, _control_files, a_bzrdir, *args, **kwargs):
91
        self._format = _format
92
        self._base = a_bzrdir.transport.base
3920.2.29 by Jelmer Vernooij
Fix dpush tests.
93
        self._ignore_fallbacks = False
5158.6.10 by Martin Pool
Update more code to use user_transport when it should
94
        self.bzrdir = a_bzrdir
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
95
        foreign.ForeignBranch.__init__(self, 
96
            DummyForeignVcsMapping(DummyForeignVcs()))
97
        branch.BzrBranch6.__init__(self, _format, _control_files, a_bzrdir, 
98
            *args, **kwargs)
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
99
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
100
4347.2.2 by Jelmer Vernooij
Rename dpush to lossy_push.
101
class InterToDummyVcsBranch(branch.GenericInterBranch,
102
                            foreign.InterToForeignBranch):
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
103
4347.2.2 by Jelmer Vernooij
Rename dpush to lossy_push.
104
    @staticmethod
105
    def is_compatible(source, target):
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
106
        return isinstance(target, DummyForeignVcsBranch)
107
4925.1.1 by Jelmer Vernooij
Print a proper error when attempting to push to a foreign VCS for which
108
    def push(self, overwrite=False, stop_revision=None):
109
        raise errors.NoRoundtrippingSupport(self.source, self.target)
110
4347.2.2 by Jelmer Vernooij
Rename dpush to lossy_push.
111
    def lossy_push(self, stop_revision=None):
4347.3.1 by Jelmer Vernooij
Return BranchPushResult instance from lossy_push() and make dpush print
112
        result = branch.BranchPushResult()
113
        result.source_branch = self.source
114
        result.target_branch = self.target
115
        result.old_revno, result.old_revid = self.target.last_revision_info()
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
116
        self.source.lock_read()
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
117
        try:
118
            # This just handles simple cases, but that's good enough for tests
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
119
            my_history = self.target.revision_history()
120
            their_history = self.source.revision_history()
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
121
            if their_history[:min(len(my_history), len(their_history))] != my_history:
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
122
                raise errors.DivergedBranches(self.target, self.source)
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
123
            todo = their_history[len(my_history):]
124
            revidmap = {}
125
            for revid in todo:
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
126
                rev = self.source.repository.get_revision(revid)
127
                tree = self.source.repository.revision_tree(revid)
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
128
                def get_file_with_stat(file_id, path=None):
129
                    return (tree.get_file(file_id), None)
130
                tree.get_file_with_stat = get_file_with_stat
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
131
                new_revid = self.target.mapping.revision_id_foreign_to_bzr(
132
                    (str(rev.timestamp), str(rev.timezone), 
133
                        str(self.target.revno())))
134
                parent_revno, parent_revid= self.target.last_revision_info()
4721.2.4 by Vincent Ladeuil
More test cleanup.
135
                if parent_revid == revision.NULL_REVISION:
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
136
                    parent_revids = []
137
                else:
138
                    parent_revids = [parent_revid]
139
                builder = self.target.get_commit_builder(parent_revids, 
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
140
                        self.target.get_config(), rev.timestamp,
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
141
                        rev.timezone, rev.committer, rev.properties,
142
                        new_revid)
143
                try:
144
                    for path, ie in tree.inventory.iter_entries():
145
                        new_ie = ie.copy()
146
                        new_ie.revision = None
147
                        builder.record_entry_contents(new_ie, 
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
148
                            [self.target.repository.revision_tree(parent_revid).inventory],
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
149
                            path, tree, 
150
                            (ie.kind, ie.text_size, ie.executable, ie.text_sha1))
151
                    builder.finish_inventory()
152
                except:
153
                    builder.abort()
154
                    raise
155
                revidmap[revid] = builder.commit(rev.message)
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
156
                self.target.set_last_revision_info(parent_revno+1, 
157
                    revidmap[revid])
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
158
                trace.mutter('lossily pushed revision %s -> %s', 
159
                    revid, revidmap[revid])
160
        finally:
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
161
            self.source.unlock()
4347.3.1 by Jelmer Vernooij
Return BranchPushResult instance from lossy_push() and make dpush print
162
        result.new_revno, result.new_revid = self.target.last_revision_info()
163
        result.revidmap = revidmap
164
        return result
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
165
166
167
class DummyForeignVcsBranchFormat(branch.BzrBranchFormat6):
168
169
    def get_format_string(self):
170
        return "Branch for Testing"
171
172
    def __init__(self):
173
        super(DummyForeignVcsBranchFormat, self).__init__()
174
        self._matchingbzrdir = DummyForeignVcsDirFormat()
175
5535.3.9 by Andrew Bennetts
Fix test failures.
176
    def open(self, a_bzrdir, name=None, _found=False, found_repository=None):
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
177
        if not _found:
178
            raise NotImplementedError
179
        try:
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
180
            transport = a_bzrdir.get_branch_transport(None, name=name)
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
181
            control_files = lockable_files.LockableFiles(transport, 'lock',
182
                                                         lockdir.LockDir)
5535.3.9 by Andrew Bennetts
Fix test failures.
183
            if found_repository is None:
184
                found_repository = a_bzrdir.find_repository()
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
185
            return DummyForeignVcsBranch(_format=self,
186
                              _control_files=control_files,
187
                              a_bzrdir=a_bzrdir,
5535.3.9 by Andrew Bennetts
Fix test failures.
188
                              _repository=found_repository)
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
189
        except errors.NoSuchFile:
190
            raise errors.NotBranchError(path=transport.base)
191
192
4721.2.4 by Vincent Ladeuil
More test cleanup.
193
class DummyForeignVcsDirFormat(bzrdir.BzrDirMetaFormat1):
3920.2.10 by Jelmer Vernooij
More work trying to implement a dummy version control system.
194
    """BzrDirFormat for the dummy foreign VCS."""
195
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
196
    @classmethod
5363.2.9 by Jelmer Vernooij
Fix some tests.
197
    def get_format_string(cls):
198
        return "A Dummy VCS Dir"
199
200
    @classmethod
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
201
    def get_format_description(cls):
202
        return "A Dummy VCS Dir"
203
204
    @classmethod
205
    def is_supported(cls):
206
        return True
207
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
208
    def get_branch_format(self):
209
        return DummyForeignVcsBranchFormat()
210
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
211
    def initialize_on_transport(self, transport):
212
        """Initialize a new bzrdir in the base directory of a Transport."""
213
        # Since we don't have a .bzr directory, inherit the
214
        # mode from the root directory
215
        temp_control = lockable_files.LockableFiles(transport,
216
                            '', lockable_files.TransportLock)
217
        temp_control._transport.mkdir('.dummy',
218
                                      # FIXME: RBC 20060121 don't peek under
219
                                      # the covers
220
                                      mode=temp_control._dir_mode)
221
        del temp_control
222
        bzrdir_transport = transport.clone('.dummy')
223
        # NB: no need to escape relative paths that are url safe.
224
        control_files = lockable_files.LockableFiles(bzrdir_transport,
225
            self._lock_file_name, self._lock_class)
226
        control_files.create_lock()
227
        return self.open(transport, _found=True)
228
229
    def _open(self, transport):
230
        return DummyForeignVcsDir(transport, self)
231
232
4721.2.4 by Vincent Ladeuil
More test cleanup.
233
class DummyForeignVcsDir(bzrdir.BzrDirMeta1):
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
234
235
    def __init__(self, _transport, _format):
236
        self._format = _format
237
        self.transport = _transport.clone('.dummy')
238
        self.root_transport = _transport
239
        self._mode_check_done = False
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
240
        self._control_files = lockable_files.LockableFiles(self.transport,
241
            "lock", lockable_files.TransportLock)
242
5051.3.6 by Jelmer Vernooij
Cope with API changes in BzrDir API.
243
    def open_branch(self, name=None, unsupported=False, ignore_fallbacks=True):
244
        if name is not None:
245
            raise errors.NoColocatedBranchSupport(self)
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
246
        return self._format.get_branch_format().open(self, _found=True)
3920.2.10 by Jelmer Vernooij
More work trying to implement a dummy version control system.
247
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
248
    def cloning_metadir(self, stacked=False):
249
        """Produce a metadir suitable for cloning with."""
4721.2.4 by Vincent Ladeuil
More test cleanup.
250
        return bzrdir.format_registry.make_bzrdir("default")
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
251
252
    def sprout(self, url, revision_id=None, force_new_repo=False,
253
               recurse='down', possible_transports=None,
254
               accelerator_tree=None, hardlink=False, stacked=False,
255
               source_branch=None):
256
        # dirstate doesn't cope with accelerator_trees well 
257
        # that have a different control dir
258
        return super(DummyForeignVcsDir, self).sprout(url=url, 
259
                revision_id=revision_id, force_new_repo=force_new_repo, 
260
                recurse=recurse, possible_transports=possible_transports, 
261
                hardlink=hardlink, stacked=stacked, source_branch=source_branch)
262
3920.2.10 by Jelmer Vernooij
More work trying to implement a dummy version control system.
263
4721.2.5 by Vincent Ladeuil
Some refactoring.
264
def register_dummy_foreign_for_test(testcase):
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
265
    controldir.ControlDirFormat.register_format(DummyForeignVcsDirFormat)
266
    testcase.addCleanup(controldir.ControlDirFormat.unregister_format,
4721.2.5 by Vincent Ladeuil
Some refactoring.
267
                        DummyForeignVcsDirFormat)
5363.2.6 by Jelmer Vernooij
Add ControlDirFormat.{un,}register_{server_,}prober.
268
    controldir.ControlDirFormat.register_prober(DummyForeignProber)
269
    testcase.addCleanup(controldir.ControlDirFormat.unregister_prober,
270
        DummyForeignProber)
4721.2.5 by Vincent Ladeuil
Some refactoring.
271
    # We need to register the optimiser to make the dummy appears really
272
    # different from a regular bzr repository.
273
    branch.InterBranch.register_optimiser(InterToDummyVcsBranch)
274
    testcase.addCleanup(branch.InterBranch.unregister_optimiser,
275
                        InterToDummyVcsBranch)
276
277
5363.2.5 by Jelmer Vernooij
Add dummy foreign prober.
278
class DummyForeignProber(controldir.Prober):
279
280
    @classmethod
281
    def probe_transport(klass, transport):
282
        """Return the .bzrdir style format present in a directory."""
283
        if not transport.has('.dummy'):
284
            raise errors.NotBranchError(path=transport.base)
285
        return DummyForeignVcsDirFormat()
286
287
4721.2.4 by Vincent Ladeuil
More test cleanup.
288
class ForeignVcsRegistryTests(tests.TestCase):
3920.2.10 by Jelmer Vernooij
More work trying to implement a dummy version control system.
289
    """Tests for the ForeignVcsRegistry class."""
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
290
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
291
    def test_parse_revision_id_no_dash(self):
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
292
        reg = foreign.ForeignVcsRegistry()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
293
        self.assertRaises(errors.InvalidRevisionId,
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
294
                          reg.parse_revision_id, "invalid")
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
295
296
    def test_parse_revision_id_unknown_mapping(self):
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
297
        reg = foreign.ForeignVcsRegistry()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
298
        self.assertRaises(errors.InvalidRevisionId,
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
299
                          reg.parse_revision_id, "unknown-foreignrevid")
300
301
    def test_parse_revision_id(self):
302
        reg = foreign.ForeignVcsRegistry()
3949.5.1 by Jelmer Vernooij
Move ForeignVcsMapping.show_foreign_revid to ForeignVcs.
303
        vcs = DummyForeignVcs()
304
        reg.register("dummy", vcs, "Dummy VCS")
305
        self.assertEquals((("some", "foreign", "revid"), DummyForeignVcsMapping(vcs)),
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
306
                          reg.parse_revision_id("dummy-v1:some-foreign-revid"))
307
308
4721.2.4 by Vincent Ladeuil
More test cleanup.
309
class ForeignRevisionTests(tests.TestCase):
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
310
    """Tests for the ForeignRevision class."""
311
312
    def test_create(self):
3949.5.1 by Jelmer Vernooij
Move ForeignVcsMapping.show_foreign_revid to ForeignVcs.
313
        mapp = DummyForeignVcsMapping(DummyForeignVcs())
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
314
        rev = foreign.ForeignRevision(("a", "foreign", "revid"),
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
315
                                      mapp, "roundtripped-revid")
316
        self.assertEquals("", rev.inventory_sha1)
317
        self.assertEquals(("a", "foreign", "revid"), rev.foreign_revid)
318
        self.assertEquals(mapp, rev.mapping)
319
320
4721.2.4 by Vincent Ladeuil
More test cleanup.
321
class WorkingTreeFileUpdateTests(tests.TestCaseWithTransport):
4285.3.2 by Jelmer Vernooij
Remove unused functions for updating the file ids of a tree.
322
    """Tests for update_workingtree_fileids()."""
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
323
4285.3.1 by Aaron Bentley
Implement dpush via sexy APIs
324
    def test_update_workingtree(self):
325
        wt = self.make_branch_and_tree('br1')
326
        self.build_tree_contents([('br1/bla', 'original contents\n')])
327
        wt.add('bla', 'bla-a')
328
        wt.commit('bla-a')
4606.2.1 by Robert Collins
Fix test_foreign for 2a as default.
329
        root_id = wt.get_root_id()
4285.3.1 by Aaron Bentley
Implement dpush via sexy APIs
330
        target = wt.bzrdir.sprout('br2').open_workingtree()
331
        target.unversion(['bla-a'])
332
        target.add('bla', 'bla-b')
333
        target.commit('bla-b')
334
        target_basis = target.basis_tree()
335
        target_basis.lock_read()
336
        self.addCleanup(target_basis.unlock)
337
        foreign.update_workingtree_fileids(wt, target_basis)
338
        wt.lock_read()
339
        try:
4599.4.36 by Robert Collins
Fix an overly sensitive test.
340
            self.assertEquals(set([root_id, "bla-b"]), set(wt.inventory))
4285.3.1 by Aaron Bentley
Implement dpush via sexy APIs
341
        finally:
342
            wt.unlock()
343
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
344
4721.2.4 by Vincent Ladeuil
More test cleanup.
345
class DummyForeignVcsTests(tests.TestCaseWithTransport):
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
346
    """Very basic test for DummyForeignVcs."""
347
348
    def setUp(self):
349
        super(DummyForeignVcsTests, self).setUp()
4721.2.5 by Vincent Ladeuil
Some refactoring.
350
        register_dummy_foreign_for_test(self)
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
351
352
    def test_create(self):
353
        """Test we can create dummies."""
354
        self.make_branch_and_tree("d", format=DummyForeignVcsDirFormat())
4721.2.4 by Vincent Ladeuil
More test cleanup.
355
        dir = bzrdir.BzrDir.open("d")
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
356
        self.assertEquals("A Dummy VCS Dir", dir._format.get_format_string())
357
        dir.open_repository()
358
        dir.open_branch()
359
        dir.open_workingtree()
360
361
    def test_sprout(self):
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
362
        """Test we can clone dummies and that the format is not preserved."""
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
363
        self.make_branch_and_tree("d", format=DummyForeignVcsDirFormat())
4721.2.4 by Vincent Ladeuil
More test cleanup.
364
        dir = bzrdir.BzrDir.open("d")
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
365
        newdir = dir.sprout("e")
4721.2.4 by Vincent Ladeuil
More test cleanup.
366
        self.assertNotEquals("A Dummy VCS Dir",
367
                             newdir._format.get_format_string())
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
368
4925.1.1 by Jelmer Vernooij
Print a proper error when attempting to push to a foreign VCS for which
369
    def test_push_not_supported(self):
370
        source_tree = self.make_branch_and_tree("source")
371
        target_tree = self.make_branch_and_tree("target", 
372
            format=DummyForeignVcsDirFormat())
373
        self.assertRaises(errors.NoRoundtrippingSupport, 
374
            source_tree.branch.push, target_tree.branch)
375
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
376
    def test_lossy_push_empty(self):
377
        source_tree = self.make_branch_and_tree("source")
378
        target_tree = self.make_branch_and_tree("target", 
379
            format=DummyForeignVcsDirFormat())
380
        pushresult = source_tree.branch.lossy_push(target_tree.branch)
4721.2.4 by Vincent Ladeuil
More test cleanup.
381
        self.assertEquals(revision.NULL_REVISION, pushresult.old_revid)
382
        self.assertEquals(revision.NULL_REVISION, pushresult.new_revid)
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
383
        self.assertEquals({}, pushresult.revidmap)
384
385
    def test_lossy_push_simple(self):
386
        source_tree = self.make_branch_and_tree("source")
387
        self.build_tree(['source/a', 'source/b'])
388
        source_tree.add(['a', 'b'])
389
        revid1 = source_tree.commit("msg")
390
        target_tree = self.make_branch_and_tree("target", 
391
            format=DummyForeignVcsDirFormat())
392
        target_tree.branch.lock_write()
393
        try:
394
            pushresult = source_tree.branch.lossy_push(target_tree.branch)
395
        finally:
396
            target_tree.branch.unlock()
4721.2.4 by Vincent Ladeuil
More test cleanup.
397
        self.assertEquals(revision.NULL_REVISION, pushresult.old_revid)
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
398
        self.assertEquals({revid1:target_tree.branch.last_revision()}, 
399
                           pushresult.revidmap)
400
        self.assertEquals(pushresult.revidmap[revid1], pushresult.new_revid)