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