~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/foreign.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2009-05-13 17:16:28 UTC
  • mfrom: (4324.5.1 bzr.dev)
  • Revision ID: pqm@pqm.ubuntu.com-20090513171628-zmtijps3xl06nr9j
(Jelmer) Use utility function to check for control filename rather
        than assuming it is '.bzr'.

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
"""Foreign branch utilities."""
19
19
 
20
20
 
21
 
from bzrlib.branch import (
22
 
    Branch,
23
 
    InterBranch,
24
 
    )
 
21
from bzrlib.branch import Branch
25
22
from bzrlib.commands import Command, Option
26
23
from bzrlib.repository import Repository
27
24
from bzrlib.revision import Revision
119
116
        self.mapping = mapping
120
117
 
121
118
 
 
119
def show_foreign_properties(rev):
 
120
    """Custom log displayer for foreign revision identifiers.
 
121
 
 
122
    :param rev: Revision object.
 
123
    """
 
124
    # Revision comes directly from a foreign repository
 
125
    if isinstance(rev, ForeignRevision):
 
126
        return rev.mapping.vcs.show_foreign_revid(rev.foreign_revid)
 
127
 
 
128
    # Revision was once imported from a foreign repository
 
129
    try:
 
130
        foreign_revid, mapping = \
 
131
            foreign_vcs_registry.parse_revision_id(rev.revision_id)
 
132
    except errors.InvalidRevisionId:
 
133
        return {}
 
134
 
 
135
    return mapping.vcs.show_foreign_revid(foreign_revid)
 
136
 
 
137
 
122
138
class ForeignVcs(object):
123
139
    """A foreign version control system."""
124
140
 
160
176
        :param revid: The bzr revision id
161
177
        :return: tuple with foreign revid and vcs mapping
162
178
        """
163
 
        if not ":" in revid or not "-" in revid:
 
179
        if not "-" in revid:
164
180
            raise errors.InvalidRevisionId(revid, None)
165
181
        try:
166
182
            foreign_vcs = self.get(revid.split("-")[0])
237
253
        self.mapping = mapping
238
254
        super(ForeignBranch, self).__init__()
239
255
 
 
256
    def dpull(self, source, stop_revision=None):
 
257
        """Pull deltas from another branch.
 
258
 
 
259
        :note: This does not, like pull, retain the revision ids from 
 
260
            the source branch and will, rather than adding bzr-specific 
 
261
            metadata, push only those semantics of the revision that can be 
 
262
            natively represented by this branch' VCS.
 
263
 
 
264
        :param source: Source branch
 
265
        :param stop_revision: Revision to pull, defaults to last revision.
 
266
        :return: Dictionary mapping revision ids from the source branch 
 
267
            to new revision ids in the target branch, for each 
 
268
            revision that was pull.
 
269
        """
 
270
        raise NotImplementedError(self.dpull)
 
271
 
240
272
 
241
273
def update_workingtree_fileids(wt, target_tree):
242
274
    """Update the file ids in a working tree based on another tree.
263
295
 
264
296
 
265
297
class cmd_dpush(Command):
266
 
    """Push into a different VCS without any custom bzr metadata.
 
298
    """Push diffs into a foreign version control system without any 
 
299
    Bazaar-specific metadata.
267
300
 
268
 
    This will afterwards rebase the local branch on the remote
 
301
    This will afterwards rebase the local Bazaar branch on the remote
269
302
    branch unless the --no-rebase option is used, in which case 
270
 
    the two branches will be out of sync after the push. 
 
303
    the two branches will be out of sync. 
271
304
    """
272
305
    hidden = True
273
306
    takes_args = ['location?']
307
340
 
308
341
        bzrdir = BzrDir.open(location)
309
342
        target_branch = bzrdir.open_branch()
 
343
        dpull = getattr(target_branch, "dpull", None)
 
344
        if dpull is None:
 
345
            raise BzrCommandError("%r is not a foreign branch, use "
 
346
                                  "regular push." % target_branch)
310
347
        target_branch.lock_write()
311
348
        try:
312
 
            try:
313
 
                push_result = source_branch.lossy_push(target_branch)
314
 
            except errors.LossyPushToSameVCS:
315
 
                raise BzrCommandError("%r and %r are in the same VCS, lossy "
316
 
                    "push not necessary. Please use regular push." %
317
 
                    (source_branch, target_branch))
 
349
            revid_map = dpull(source_branch)
318
350
            # We successfully created the target, remember it
319
351
            if source_branch.get_push_location() is None or remember:
320
352
                source_branch.set_push_location(target_branch.base)
330
362
                        update_workingtree_fileids(source_wt, target)
331
363
                    finally:
332
364
                        source_wt.unlock()
333
 
            push_result.report(self.outf)
334
365
        finally:
335
366
            target_branch.unlock()
336
 
 
337
 
 
338
 
class InterToForeignBranch(InterBranch):
339
 
 
340
 
    def lossy_push(self, stop_revision=None):
341
 
        """Push deltas into another branch.
342
 
 
343
 
        :note: This does not, like push, retain the revision ids from 
344
 
            the source branch and will, rather than adding bzr-specific 
345
 
            metadata, push only those semantics of the revision that can be 
346
 
            natively represented by this branch' VCS.
347
 
 
348
 
        :param target: Target branch
349
 
        :param stop_revision: Revision to push, defaults to last revision.
350
 
        :return: BranchPushResult with an extra member revidmap: 
351
 
            A dictionary mapping revision ids from the target branch 
352
 
            to new revision ids in the target branch, for each 
353
 
            revision that was pushed.
354
 
        """
355
 
        raise NotImplementedError(self.lossy_push)