~bzr-pqm/bzr/bzr.dev

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