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