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