/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
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.6 by Jelmer Vernooij
Add ControlDirFormat.{un,}register_{server_,}prober.
265
    controldir.ControlDirFormat.register_prober(DummyForeignProber)
266
    testcase.addCleanup(controldir.ControlDirFormat.unregister_prober,
267
        DummyForeignProber)
4721.2.5 by Vincent Ladeuil
Some refactoring.
268
    # We need to register the optimiser to make the dummy appears really
269
    # different from a regular bzr repository.
270
    branch.InterBranch.register_optimiser(InterToDummyVcsBranch)
271
    testcase.addCleanup(branch.InterBranch.unregister_optimiser,
272
                        InterToDummyVcsBranch)
273
274
5363.2.5 by Jelmer Vernooij
Add dummy foreign prober.
275
class DummyForeignProber(controldir.Prober):
276
277
    @classmethod
278
    def probe_transport(klass, transport):
279
        """Return the .bzrdir style format present in a directory."""
280
        if not transport.has('.dummy'):
281
            raise errors.NotBranchError(path=transport.base)
282
        return DummyForeignVcsDirFormat()
283
5712.3.16 by Jelmer Vernooij
Fix bt.test_foreign.
284
    @classmethod
285
    def known_formats(cls):
286
        return set([DummyForeignVcsDirFormat()])
287
5363.2.5 by Jelmer Vernooij
Add dummy foreign prober.
288
4721.2.4 by Vincent Ladeuil
More test cleanup.
289
class ForeignVcsRegistryTests(tests.TestCase):
3920.2.10 by Jelmer Vernooij
More work trying to implement a dummy version control system.
290
    """Tests for the ForeignVcsRegistry class."""
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
291
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
292
    def test_parse_revision_id_no_dash(self):
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
293
        reg = foreign.ForeignVcsRegistry()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
294
        self.assertRaises(errors.InvalidRevisionId,
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
295
                          reg.parse_revision_id, "invalid")
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
296
297
    def test_parse_revision_id_unknown_mapping(self):
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
298
        reg = foreign.ForeignVcsRegistry()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
299
        self.assertRaises(errors.InvalidRevisionId,
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
300
                          reg.parse_revision_id, "unknown-foreignrevid")
301
302
    def test_parse_revision_id(self):
303
        reg = foreign.ForeignVcsRegistry()
3949.5.1 by Jelmer Vernooij
Move ForeignVcsMapping.show_foreign_revid to ForeignVcs.
304
        vcs = DummyForeignVcs()
305
        reg.register("dummy", vcs, "Dummy VCS")
306
        self.assertEquals((("some", "foreign", "revid"), DummyForeignVcsMapping(vcs)),
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
307
                          reg.parse_revision_id("dummy-v1:some-foreign-revid"))
308
309
4721.2.4 by Vincent Ladeuil
More test cleanup.
310
class ForeignRevisionTests(tests.TestCase):
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
311
    """Tests for the ForeignRevision class."""
312
313
    def test_create(self):
3949.5.1 by Jelmer Vernooij
Move ForeignVcsMapping.show_foreign_revid to ForeignVcs.
314
        mapp = DummyForeignVcsMapping(DummyForeignVcs())
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
315
        rev = foreign.ForeignRevision(("a", "foreign", "revid"),
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
316
                                      mapp, "roundtripped-revid")
317
        self.assertEquals("", rev.inventory_sha1)
318
        self.assertEquals(("a", "foreign", "revid"), rev.foreign_revid)
319
        self.assertEquals(mapp, rev.mapping)
320
321
4721.2.4 by Vincent Ladeuil
More test cleanup.
322
class WorkingTreeFileUpdateTests(tests.TestCaseWithTransport):
4285.3.2 by Jelmer Vernooij
Remove unused functions for updating the file ids of a tree.
323
    """Tests for update_workingtree_fileids()."""
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
324
4285.3.1 by Aaron Bentley
Implement dpush via sexy APIs
325
    def test_update_workingtree(self):
326
        wt = self.make_branch_and_tree('br1')
327
        self.build_tree_contents([('br1/bla', 'original contents\n')])
328
        wt.add('bla', 'bla-a')
329
        wt.commit('bla-a')
4606.2.1 by Robert Collins
Fix test_foreign for 2a as default.
330
        root_id = wt.get_root_id()
4285.3.1 by Aaron Bentley
Implement dpush via sexy APIs
331
        target = wt.bzrdir.sprout('br2').open_workingtree()
332
        target.unversion(['bla-a'])
333
        target.add('bla', 'bla-b')
334
        target.commit('bla-b')
335
        target_basis = target.basis_tree()
336
        target_basis.lock_read()
337
        self.addCleanup(target_basis.unlock)
338
        foreign.update_workingtree_fileids(wt, target_basis)
339
        wt.lock_read()
340
        try:
4599.4.36 by Robert Collins
Fix an overly sensitive test.
341
            self.assertEquals(set([root_id, "bla-b"]), set(wt.inventory))
4285.3.1 by Aaron Bentley
Implement dpush via sexy APIs
342
        finally:
343
            wt.unlock()
344
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
345
4721.2.4 by Vincent Ladeuil
More test cleanup.
346
class DummyForeignVcsTests(tests.TestCaseWithTransport):
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
347
    """Very basic test for DummyForeignVcs."""
348
349
    def setUp(self):
350
        super(DummyForeignVcsTests, self).setUp()
4721.2.5 by Vincent Ladeuil
Some refactoring.
351
        register_dummy_foreign_for_test(self)
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
352
353
    def test_create(self):
354
        """Test we can create dummies."""
355
        self.make_branch_and_tree("d", format=DummyForeignVcsDirFormat())
4721.2.4 by Vincent Ladeuil
More test cleanup.
356
        dir = bzrdir.BzrDir.open("d")
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
357
        self.assertEquals("A Dummy VCS Dir", dir._format.get_format_string())
358
        dir.open_repository()
359
        dir.open_branch()
360
        dir.open_workingtree()
361
362
    def test_sprout(self):
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
363
        """Test we can clone dummies and that the format is not preserved."""
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
364
        self.make_branch_and_tree("d", format=DummyForeignVcsDirFormat())
4721.2.4 by Vincent Ladeuil
More test cleanup.
365
        dir = bzrdir.BzrDir.open("d")
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
366
        newdir = dir.sprout("e")
4721.2.4 by Vincent Ladeuil
More test cleanup.
367
        self.assertNotEquals("A Dummy VCS Dir",
368
                             newdir._format.get_format_string())
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
369
4925.1.1 by Jelmer Vernooij
Print a proper error when attempting to push to a foreign VCS for which
370
    def test_push_not_supported(self):
371
        source_tree = self.make_branch_and_tree("source")
372
        target_tree = self.make_branch_and_tree("target", 
373
            format=DummyForeignVcsDirFormat())
374
        self.assertRaises(errors.NoRoundtrippingSupport, 
375
            source_tree.branch.push, target_tree.branch)
376
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
377
    def test_lossy_push_empty(self):
378
        source_tree = self.make_branch_and_tree("source")
379
        target_tree = self.make_branch_and_tree("target", 
380
            format=DummyForeignVcsDirFormat())
381
        pushresult = source_tree.branch.lossy_push(target_tree.branch)
4721.2.4 by Vincent Ladeuil
More test cleanup.
382
        self.assertEquals(revision.NULL_REVISION, pushresult.old_revid)
383
        self.assertEquals(revision.NULL_REVISION, pushresult.new_revid)
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
384
        self.assertEquals({}, pushresult.revidmap)
385
386
    def test_lossy_push_simple(self):
387
        source_tree = self.make_branch_and_tree("source")
388
        self.build_tree(['source/a', 'source/b'])
389
        source_tree.add(['a', 'b'])
390
        revid1 = source_tree.commit("msg")
391
        target_tree = self.make_branch_and_tree("target", 
392
            format=DummyForeignVcsDirFormat())
393
        target_tree.branch.lock_write()
394
        try:
395
            pushresult = source_tree.branch.lossy_push(target_tree.branch)
396
        finally:
397
            target_tree.branch.unlock()
4721.2.4 by Vincent Ladeuil
More test cleanup.
398
        self.assertEquals(revision.NULL_REVISION, pushresult.old_revid)
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
399
        self.assertEquals({revid1:target_tree.branch.last_revision()}, 
400
                           pushresult.revidmap)
401
        self.assertEquals(pushresult.revidmap[revid1], pushresult.new_revid)