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