~bzr-pqm/bzr/bzr.dev

4763.2.4 by John Arbash Meinel
merge bzr.2.1 in preparation for NEWS entry.
1
# Copyright (C) 2008, 2009, 2010 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
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
176
    def open(self, a_bzrdir, name=None, _found=False):
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)
183
            return DummyForeignVcsBranch(_format=self,
184
                              _control_files=control_files,
185
                              a_bzrdir=a_bzrdir,
186
                              _repository=a_bzrdir.find_repository())
187
        except errors.NoSuchFile:
188
            raise errors.NotBranchError(path=transport.base)
189
190
4721.2.4 by Vincent Ladeuil
More test cleanup.
191
class DummyForeignVcsDirFormat(bzrdir.BzrDirMetaFormat1):
3920.2.10 by Jelmer Vernooij
More work trying to implement a dummy version control system.
192
    """BzrDirFormat for the dummy foreign VCS."""
193
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
194
    @classmethod
5363.2.9 by Jelmer Vernooij
Fix some tests.
195
    def get_format_string(cls):
196
        return "A Dummy VCS Dir"
197
198
    @classmethod
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
199
    def get_format_description(cls):
200
        return "A Dummy VCS Dir"
201
202
    @classmethod
203
    def is_supported(cls):
204
        return True
205
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
206
    def get_branch_format(self):
207
        return DummyForeignVcsBranchFormat()
208
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
209
    def initialize_on_transport(self, transport):
210
        """Initialize a new bzrdir in the base directory of a Transport."""
211
        # Since we don't have a .bzr directory, inherit the
212
        # mode from the root directory
213
        temp_control = lockable_files.LockableFiles(transport,
214
                            '', lockable_files.TransportLock)
215
        temp_control._transport.mkdir('.dummy',
216
                                      # FIXME: RBC 20060121 don't peek under
217
                                      # the covers
218
                                      mode=temp_control._dir_mode)
219
        del temp_control
220
        bzrdir_transport = transport.clone('.dummy')
221
        # NB: no need to escape relative paths that are url safe.
222
        control_files = lockable_files.LockableFiles(bzrdir_transport,
223
            self._lock_file_name, self._lock_class)
224
        control_files.create_lock()
225
        return self.open(transport, _found=True)
226
227
    def _open(self, transport):
228
        return DummyForeignVcsDir(transport, self)
229
230
4721.2.4 by Vincent Ladeuil
More test cleanup.
231
class DummyForeignVcsDir(bzrdir.BzrDirMeta1):
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
232
233
    def __init__(self, _transport, _format):
234
        self._format = _format
235
        self.transport = _transport.clone('.dummy')
236
        self.root_transport = _transport
237
        self._mode_check_done = False
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
238
        self._control_files = lockable_files.LockableFiles(self.transport,
239
            "lock", lockable_files.TransportLock)
240
5051.3.6 by Jelmer Vernooij
Cope with API changes in BzrDir API.
241
    def open_branch(self, name=None, unsupported=False, ignore_fallbacks=True):
242
        if name is not None:
243
            raise errors.NoColocatedBranchSupport(self)
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
244
        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.
245
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
246
    def cloning_metadir(self, stacked=False):
247
        """Produce a metadir suitable for cloning with."""
4721.2.4 by Vincent Ladeuil
More test cleanup.
248
        return bzrdir.format_registry.make_bzrdir("default")
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
249
250
    def sprout(self, url, revision_id=None, force_new_repo=False,
251
               recurse='down', possible_transports=None,
252
               accelerator_tree=None, hardlink=False, stacked=False,
253
               source_branch=None):
254
        # dirstate doesn't cope with accelerator_trees well 
255
        # that have a different control dir
256
        return super(DummyForeignVcsDir, self).sprout(url=url, 
257
                revision_id=revision_id, force_new_repo=force_new_repo, 
258
                recurse=recurse, possible_transports=possible_transports, 
259
                hardlink=hardlink, stacked=stacked, source_branch=source_branch)
260
3920.2.10 by Jelmer Vernooij
More work trying to implement a dummy version control system.
261
4721.2.5 by Vincent Ladeuil
Some refactoring.
262
def register_dummy_foreign_for_test(testcase):
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
263
    controldir.ControlDirFormat.register_format(DummyForeignVcsDirFormat)
264
    testcase.addCleanup(controldir.ControlDirFormat.unregister_format,
4721.2.5 by Vincent Ladeuil
Some refactoring.
265
                        DummyForeignVcsDirFormat)
5363.2.6 by Jelmer Vernooij
Add ControlDirFormat.{un,}register_{server_,}prober.
266
    controldir.ControlDirFormat.register_prober(DummyForeignProber)
267
    testcase.addCleanup(controldir.ControlDirFormat.unregister_prober,
268
        DummyForeignProber)
4721.2.5 by Vincent Ladeuil
Some refactoring.
269
    # We need to register the optimiser to make the dummy appears really
270
    # different from a regular bzr repository.
271
    branch.InterBranch.register_optimiser(InterToDummyVcsBranch)
272
    testcase.addCleanup(branch.InterBranch.unregister_optimiser,
273
                        InterToDummyVcsBranch)
274
275
5363.2.5 by Jelmer Vernooij
Add dummy foreign prober.
276
class DummyForeignProber(controldir.Prober):
277
278
    @classmethod
279
    def probe_transport(klass, transport):
280
        """Return the .bzrdir style format present in a directory."""
281
        if not transport.has('.dummy'):
282
            raise errors.NotBranchError(path=transport.base)
283
        return DummyForeignVcsDirFormat()
284
285
4721.2.4 by Vincent Ladeuil
More test cleanup.
286
class ForeignVcsRegistryTests(tests.TestCase):
3920.2.10 by Jelmer Vernooij
More work trying to implement a dummy version control system.
287
    """Tests for the ForeignVcsRegistry class."""
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
288
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
289
    def test_parse_revision_id_no_dash(self):
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
290
        reg = foreign.ForeignVcsRegistry()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
291
        self.assertRaises(errors.InvalidRevisionId,
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
292
                          reg.parse_revision_id, "invalid")
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
293
294
    def test_parse_revision_id_unknown_mapping(self):
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
295
        reg = foreign.ForeignVcsRegistry()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
296
        self.assertRaises(errors.InvalidRevisionId,
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
297
                          reg.parse_revision_id, "unknown-foreignrevid")
298
299
    def test_parse_revision_id(self):
300
        reg = foreign.ForeignVcsRegistry()
3949.5.1 by Jelmer Vernooij
Move ForeignVcsMapping.show_foreign_revid to ForeignVcs.
301
        vcs = DummyForeignVcs()
302
        reg.register("dummy", vcs, "Dummy VCS")
303
        self.assertEquals((("some", "foreign", "revid"), DummyForeignVcsMapping(vcs)),
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
304
                          reg.parse_revision_id("dummy-v1:some-foreign-revid"))
305
306
4721.2.4 by Vincent Ladeuil
More test cleanup.
307
class ForeignRevisionTests(tests.TestCase):
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
308
    """Tests for the ForeignRevision class."""
309
310
    def test_create(self):
3949.5.1 by Jelmer Vernooij
Move ForeignVcsMapping.show_foreign_revid to ForeignVcs.
311
        mapp = DummyForeignVcsMapping(DummyForeignVcs())
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
312
        rev = foreign.ForeignRevision(("a", "foreign", "revid"),
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
313
                                      mapp, "roundtripped-revid")
314
        self.assertEquals("", rev.inventory_sha1)
315
        self.assertEquals(("a", "foreign", "revid"), rev.foreign_revid)
316
        self.assertEquals(mapp, rev.mapping)
317
318
4721.2.4 by Vincent Ladeuil
More test cleanup.
319
class WorkingTreeFileUpdateTests(tests.TestCaseWithTransport):
4285.3.2 by Jelmer Vernooij
Remove unused functions for updating the file ids of a tree.
320
    """Tests for update_workingtree_fileids()."""
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
321
4285.3.1 by Aaron Bentley
Implement dpush via sexy APIs
322
    def test_update_workingtree(self):
323
        wt = self.make_branch_and_tree('br1')
324
        self.build_tree_contents([('br1/bla', 'original contents\n')])
325
        wt.add('bla', 'bla-a')
326
        wt.commit('bla-a')
4606.2.1 by Robert Collins
Fix test_foreign for 2a as default.
327
        root_id = wt.get_root_id()
4285.3.1 by Aaron Bentley
Implement dpush via sexy APIs
328
        target = wt.bzrdir.sprout('br2').open_workingtree()
329
        target.unversion(['bla-a'])
330
        target.add('bla', 'bla-b')
331
        target.commit('bla-b')
332
        target_basis = target.basis_tree()
333
        target_basis.lock_read()
334
        self.addCleanup(target_basis.unlock)
335
        foreign.update_workingtree_fileids(wt, target_basis)
336
        wt.lock_read()
337
        try:
4599.4.36 by Robert Collins
Fix an overly sensitive test.
338
            self.assertEquals(set([root_id, "bla-b"]), set(wt.inventory))
4285.3.1 by Aaron Bentley
Implement dpush via sexy APIs
339
        finally:
340
            wt.unlock()
341
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
342
4721.2.4 by Vincent Ladeuil
More test cleanup.
343
class DummyForeignVcsTests(tests.TestCaseWithTransport):
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
344
    """Very basic test for DummyForeignVcs."""
345
346
    def setUp(self):
347
        super(DummyForeignVcsTests, self).setUp()
4721.2.5 by Vincent Ladeuil
Some refactoring.
348
        register_dummy_foreign_for_test(self)
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
349
350
    def test_create(self):
351
        """Test we can create dummies."""
352
        self.make_branch_and_tree("d", format=DummyForeignVcsDirFormat())
4721.2.4 by Vincent Ladeuil
More test cleanup.
353
        dir = bzrdir.BzrDir.open("d")
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
354
        self.assertEquals("A Dummy VCS Dir", dir._format.get_format_string())
355
        dir.open_repository()
356
        dir.open_branch()
357
        dir.open_workingtree()
358
359
    def test_sprout(self):
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
360
        """Test we can clone dummies and that the format is not preserved."""
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
361
        self.make_branch_and_tree("d", format=DummyForeignVcsDirFormat())
4721.2.4 by Vincent Ladeuil
More test cleanup.
362
        dir = bzrdir.BzrDir.open("d")
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
363
        newdir = dir.sprout("e")
4721.2.4 by Vincent Ladeuil
More test cleanup.
364
        self.assertNotEquals("A Dummy VCS Dir",
365
                             newdir._format.get_format_string())
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
366
4925.1.1 by Jelmer Vernooij
Print a proper error when attempting to push to a foreign VCS for which
367
    def test_push_not_supported(self):
368
        source_tree = self.make_branch_and_tree("source")
369
        target_tree = self.make_branch_and_tree("target", 
370
            format=DummyForeignVcsDirFormat())
371
        self.assertRaises(errors.NoRoundtrippingSupport, 
372
            source_tree.branch.push, target_tree.branch)
373
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
374
    def test_lossy_push_empty(self):
375
        source_tree = self.make_branch_and_tree("source")
376
        target_tree = self.make_branch_and_tree("target", 
377
            format=DummyForeignVcsDirFormat())
378
        pushresult = source_tree.branch.lossy_push(target_tree.branch)
4721.2.4 by Vincent Ladeuil
More test cleanup.
379
        self.assertEquals(revision.NULL_REVISION, pushresult.old_revid)
380
        self.assertEquals(revision.NULL_REVISION, pushresult.new_revid)
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
381
        self.assertEquals({}, pushresult.revidmap)
382
383
    def test_lossy_push_simple(self):
384
        source_tree = self.make_branch_and_tree("source")
385
        self.build_tree(['source/a', 'source/b'])
386
        source_tree.add(['a', 'b'])
387
        revid1 = source_tree.commit("msg")
388
        target_tree = self.make_branch_and_tree("target", 
389
            format=DummyForeignVcsDirFormat())
390
        target_tree.branch.lock_write()
391
        try:
392
            pushresult = source_tree.branch.lossy_push(target_tree.branch)
393
        finally:
394
            target_tree.branch.unlock()
4721.2.4 by Vincent Ladeuil
More test cleanup.
395
        self.assertEquals(revision.NULL_REVISION, pushresult.old_revid)
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
396
        self.assertEquals({revid1:target_tree.branch.last_revision()}, 
397
                           pushresult.revidmap)
398
        self.assertEquals(pushresult.revidmap[revid1], pushresult.new_revid)