~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/foreign.py

  • Committer: Robert J. Tanner
  • Date: 2009-06-10 03:56:49 UTC
  • mfrom: (4423 +trunk)
  • mto: This revision was merged to the branch mainline in revision 4425.
  • Revision ID: tanner@real-time.com-20090610035649-7rfx4cls4550zc3c
Merge 1.15.1 back to trunk

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 Branch
 
21
from bzrlib.branch import (
 
22
    Branch,
 
23
    InterBranch,
 
24
    )
22
25
from bzrlib.commands import Command, Option
23
26
from bzrlib.repository import Repository
24
27
from bzrlib.revision import Revision
116
119
        self.mapping = mapping
117
120
 
118
121
 
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
 
 
138
122
class ForeignVcs(object):
139
123
    """A foreign version control system."""
140
124
 
176
160
        :param revid: The bzr revision id
177
161
        :return: tuple with foreign revid and vcs mapping
178
162
        """
179
 
        if not "-" in revid:
 
163
        if not ":" in revid or not "-" in revid:
180
164
            raise errors.InvalidRevisionId(revid, None)
181
165
        try:
182
166
            foreign_vcs = self.get(revid.split("-")[0])
253
237
        self.mapping = mapping
254
238
        super(ForeignBranch, self).__init__()
255
239
 
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
 
 
272
240
 
273
241
def update_workingtree_fileids(wt, target_tree):
274
242
    """Update the file ids in a working tree based on another tree.
295
263
 
296
264
 
297
265
class cmd_dpush(Command):
298
 
    """Push diffs into a foreign version control system without any 
299
 
    Bazaar-specific metadata.
 
266
    """Push into a different VCS without any custom bzr metadata.
300
267
 
301
 
    This will afterwards rebase the local Bazaar branch on the remote
 
268
    This will afterwards rebase the local branch on the remote
302
269
    branch unless the --no-rebase option is used, in which case 
303
 
    the two branches will be out of sync. 
 
270
    the two branches will be out of sync after the push. 
304
271
    """
305
272
    hidden = True
306
273
    takes_args = ['location?']
340
307
 
341
308
        bzrdir = BzrDir.open(location)
342
309
        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)
347
310
        target_branch.lock_write()
348
311
        try:
349
 
            revid_map = dpull(source_branch)
 
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))
350
318
            # We successfully created the target, remember it
351
319
            if source_branch.get_push_location() is None or remember:
352
320
                source_branch.set_push_location(target_branch.base)
362
330
                        update_workingtree_fileids(source_wt, target)
363
331
                    finally:
364
332
                        source_wt.unlock()
 
333
            push_result.report(self.outf)
365
334
        finally:
366
335
            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)