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