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