~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

  • Committer: Kent Gibson
  • Date: 2007-03-11 13:44:18 UTC
  • mfrom: (2334 +trunk)
  • mto: This revision was merged to the branch mainline in revision 2350.
  • Revision ID: warthog618@gmail.com-20070311134418-nu57arul94zawbj4
merge bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
"""builtin bzr commands"""
18
18
 
19
19
import os
 
20
from StringIO import StringIO
20
21
 
21
22
from bzrlib.lazy_import import lazy_import
22
23
lazy_import(globals(), """
23
24
import codecs
24
25
import errno
 
26
import smtplib
25
27
import sys
26
28
import tempfile
 
29
import time
27
30
 
28
31
import bzrlib
29
32
from bzrlib import (
37
40
    ignores,
38
41
    log,
39
42
    merge as _mod_merge,
 
43
    merge_directive,
40
44
    osutils,
 
45
    registry,
41
46
    repository,
42
47
    symbol_versioning,
43
48
    transport,
611
616
        old_rh = branch_to.revision_history()
612
617
        if tree_to is not None:
613
618
            result = tree_to.pull(branch_from, overwrite, rev_id,
614
 
                delta.ChangeReporter(unversioned_filter=tree_to.is_ignored))
 
619
                delta._ChangeReporter(unversioned_filter=tree_to.is_ignored))
615
620
        else:
616
621
            result = branch_to.pull(branch_from, overwrite, rev_id)
617
622
 
1337
1342
            Difference between the working tree and revision 1
1338
1343
        bzr diff -r1..2
1339
1344
            Difference between revision 2 and revision 1
1340
 
        bzr diff --diff-prefix old/:new/
 
1345
        bzr diff --prefix old/:new/
1341
1346
            Same as 'bzr diff' but prefix paths with old/ and new/
1342
1347
        bzr diff bzr.mine bzr.dev
1343
1348
            Show the differences between the two working trees
1360
1365
        Option('prefix', type=str,
1361
1366
               short_name='p',
1362
1367
               help='Set prefixes to added to old and new filenames, as '
1363
 
                    'two values separated by a colon.'),
 
1368
                    'two values separated by a colon. (eg "old/:new/")'),
1364
1369
        ]
1365
1370
    aliases = ['di', 'dif']
1366
1371
    encoding_type = 'exact'
1380
1385
        elif ':' in prefix:
1381
1386
            old_label, new_label = prefix.split(":")
1382
1387
        else:
1383
 
            raise BzrCommandError(
1384
 
                "--prefix expects two values separated by a colon")
 
1388
            raise errors.BzrCommandError(
 
1389
                '--prefix expects two values separated by a colon'
 
1390
                ' (eg "old/:new/")')
1385
1391
 
1386
1392
        if revision and len(revision) > 2:
1387
1393
            raise errors.BzrCommandError('bzr diff --revision takes exactly'
1388
1394
                                         ' one or two revision specifiers')
1389
 
        
 
1395
 
1390
1396
        try:
1391
1397
            tree1, file_list = internal_tree_files(file_list)
1392
1398
            tree2 = None
2499
2505
        #      Either the merge helper code should be updated to take a tree,
2500
2506
        #      (What about tree.merge_from_branch?)
2501
2507
        tree = WorkingTree.open_containing(directory)[0]
2502
 
        change_reporter = delta.ChangeReporter(
 
2508
        change_reporter = delta._ChangeReporter(
2503
2509
            unversioned_filter=tree.is_ignored)
2504
2510
 
2505
2511
        if branch is not None:
3292
3298
 
3293
3299
 
3294
3300
 
 
3301
class cmd_merge_directive(Command):
 
3302
    """Generate a merge directive for auto-merge tools.
 
3303
 
 
3304
    A directive requests a merge to be performed, and also provides all the
 
3305
    information necessary to do so.  This means it must either include a
 
3306
    revision bundle, or the location of a branch containing the desired
 
3307
    revision.
 
3308
 
 
3309
    A submit branch (the location to merge into) must be supplied the first
 
3310
    time the command is issued.  After it has been supplied once, it will
 
3311
    be remembered as the default.
 
3312
 
 
3313
    A public branch is optional if a revision bundle is supplied, but required
 
3314
    if --diff or --plain is specified.  It will be remembered as the default
 
3315
    after the first use.
 
3316
    """
 
3317
 
 
3318
    takes_args = ['submit_branch?', 'public_branch?']
 
3319
 
 
3320
    takes_options = [
 
3321
        RegistryOption.from_kwargs('patch-type',
 
3322
            'The type of patch to include in the directive',
 
3323
            title='Patch type', value_switches=True, enum_switch=False,
 
3324
            bundle='Bazaar revision bundle (default)',
 
3325
            diff='Normal unified diff',
 
3326
            plain='No patch, just directive'),
 
3327
        Option('sign', help='GPG-sign the directive'), 'revision',
 
3328
        Option('mail-to', type=str,
 
3329
            help='Instead of printing the directive, email to this address'),
 
3330
        Option('message', type=str, short_name='m',
 
3331
            help='Message to use when committing this merge')
 
3332
        ]
 
3333
 
 
3334
    def run(self, submit_branch=None, public_branch=None, patch_type='bundle',
 
3335
            sign=False, revision=None, mail_to=None, message=None):
 
3336
        if patch_type == 'plain':
 
3337
            patch_type = None
 
3338
        branch = Branch.open('.')
 
3339
        stored_submit_branch = branch.get_submit_branch()
 
3340
        if submit_branch is None:
 
3341
            submit_branch = stored_submit_branch
 
3342
        else:
 
3343
            if stored_submit_branch is None:
 
3344
                branch.set_submit_branch(submit_branch)
 
3345
        if submit_branch is None:
 
3346
            submit_branch = branch.get_parent()
 
3347
        if submit_branch is None:
 
3348
            raise errors.BzrCommandError('No submit branch specified or known')
 
3349
 
 
3350
        stored_public_branch = branch.get_public_branch()
 
3351
        if public_branch is None:
 
3352
            public_branch = stored_public_branch
 
3353
        elif stored_public_branch is None:
 
3354
            branch.set_public_branch(public_branch)
 
3355
        if patch_type != "bundle" and public_branch is None:
 
3356
            raise errors.BzrCommandError('No public branch specified or'
 
3357
                                         ' known')
 
3358
        if revision is not None:
 
3359
            if len(revision) != 1:
 
3360
                raise errors.BzrCommandError('bzr merge-directive takes '
 
3361
                    'exactly one revision identifier')
 
3362
            else:
 
3363
                revision_id = revision[0].in_history(branch).rev_id
 
3364
        else:
 
3365
            revision_id = branch.last_revision()
 
3366
        directive = merge_directive.MergeDirective.from_objects(
 
3367
            branch.repository, revision_id, time.time(),
 
3368
            osutils.local_time_offset(), submit_branch,
 
3369
            public_branch=public_branch, patch_type=patch_type,
 
3370
            message=message)
 
3371
        if mail_to is None:
 
3372
            if sign:
 
3373
                self.outf.write(directive.to_signed(branch))
 
3374
            else:
 
3375
                self.outf.writelines(directive.to_lines())
 
3376
        else:
 
3377
            message = directive.to_email(mail_to, branch, sign)
 
3378
            s = smtplib.SMTP()
 
3379
            server = branch.get_config().get_user_option('smtp_server')
 
3380
            if not server:
 
3381
                server = 'localhost'
 
3382
            s.connect()
 
3383
            s.sendmail(message['From'], message['To'], message.as_string())
 
3384
 
 
3385
 
3295
3386
class cmd_tag(Command):
3296
3387
    """Create a tag naming a revision.
3297
3388