~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commands.py

  • Committer: Martin Pool
  • Date: 2005-08-26 02:31:37 UTC
  • Revision ID: mbp@sourcefrog.net-20050826023137-eb4b101cc92f9792
- ignore tags files

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
# TODO: probably should say which arguments are candidates for glob
21
21
# expansion on windows and do that at the command level.
22
22
 
 
23
# TODO: Help messages for options.
 
24
 
 
25
# TODO: Define arguments by objects, rather than just using names.
 
26
# Those objects can specify the expected type of the argument, which
 
27
# would help with validation and shell completion.
 
28
 
 
29
 
23
30
import sys
24
31
import os
25
32
 
26
33
import bzrlib
 
34
import bzrlib.trace
27
35
from bzrlib.trace import mutter, note, log_error, warning
28
36
from bzrlib.errors import BzrError, BzrCheckError, BzrCommandError
29
37
from bzrlib.branch import find_branch
710
718
                    msg = "The branch %s has no revision %d." % (from_location,
711
719
                                                                 revno)
712
720
                    raise BzrCommandError(msg)
713
 
            
 
721
 
714
722
            merge((to_location, -1), (to_location, 0), this_dir=to_location,
715
723
                  check_clean=False, ignore_zero=True)
716
724
            from_location = pull_loc(br_from)
1337
1345
 
1338
1346
    def run(self, dir='.'):
1339
1347
        from bzrlib.check import check
 
1348
 
1340
1349
        check(find_branch(dir))
1341
1350
 
1342
1351
 
1343
 
 
1344
1352
class cmd_scan_cache(Command):
1345
1353
    hidden = True
1346
1354
    def run(self):
1381
1389
    takes_options = ['email']
1382
1390
    
1383
1391
    def run(self, email=False):
 
1392
        try:
 
1393
            b = bzrlib.branch.find_branch('.')
 
1394
        except:
 
1395
            b = None
 
1396
        
1384
1397
        if email:
1385
 
            print bzrlib.osutils.user_email()
 
1398
            print bzrlib.osutils.user_email(b)
1386
1399
        else:
1387
 
            print bzrlib.osutils.username()
 
1400
            print bzrlib.osutils.username(b)
1388
1401
 
1389
1402
 
1390
1403
class cmd_selftest(Command):
1392
1405
    hidden = True
1393
1406
    takes_options = ['verbose']
1394
1407
    def run(self, verbose=False):
 
1408
        import bzrlib.ui
1395
1409
        from bzrlib.selftest import selftest
1396
 
        return int(not selftest(verbose=verbose))
 
1410
 
 
1411
        # we don't want progress meters from the tests to go to the
 
1412
        # real output; and we don't want log messages cluttering up
 
1413
        # the real logs.
 
1414
 
 
1415
        save_ui = bzrlib.ui.ui_factory
 
1416
        bzrlib.trace.info('running tests...')
 
1417
        bzrlib.trace.disable_default_logging()
 
1418
        try:
 
1419
            bzrlib.ui.ui_factory = bzrlib.ui.SilentUIFactory()
 
1420
            result = selftest(verbose=verbose)
 
1421
            if result:
 
1422
                bzrlib.trace.info('tests passed')
 
1423
            else:
 
1424
                bzrlib.trace.info('tests failed')
 
1425
            return int(not result)
 
1426
        finally:
 
1427
            bzrlib.trace.enable_default_logging()
 
1428
            bzrlib.ui.ui_factory = save_ui
1397
1429
 
1398
1430
 
1399
1431
class cmd_version(Command):
1454
1486
 
1455
1487
 
1456
1488
 
 
1489
class cmd_find_merge_base(Command):
 
1490
    """Find and print a base revision for merging two branches.
 
1491
 
 
1492
    TODO: Options to specify revisions on either side, as if
 
1493
          merging only part of the history.
 
1494
    """
 
1495
    takes_args = ['branch', 'other']
 
1496
    hidden = True
 
1497
    
 
1498
    def run(self, branch, other):
 
1499
        branch1 = find_branch(branch)
 
1500
        branch2 = find_branch(other)
 
1501
 
 
1502
        base_revno, base_revid = branch1.common_ancestor(branch2)
 
1503
 
 
1504
        if base_revno is None:
 
1505
            raise bzrlib.errors.UnrelatedBranches()
 
1506
 
 
1507
        print 'merge base is revision %s' % base_revid
 
1508
        print ' r%-6d in %s' % (base_revno, branch)
 
1509
 
 
1510
        other_revno = branch2.revision_id_to_revno(base_revid)
 
1511
        
 
1512
        print ' r%-6d in %s' % (other_revno, other)
 
1513
 
 
1514
 
 
1515
 
1457
1516
class cmd_merge(Command):
1458
 
    """Perform a three-way merge of trees.
1459
 
    
1460
 
    The SPEC parameters are working tree or revision specifiers.  Working trees
1461
 
    are specified using standard paths or urls.  No component of a directory
1462
 
    path may begin with '@'.
1463
 
    
1464
 
    Working tree examples: '.', '..', 'foo@', but NOT 'foo/@bar'
1465
 
 
1466
 
    Revisions are specified using a dirname/@revno pair, where dirname is the
1467
 
    branch directory and revno is the revision within that branch.  If no revno
1468
 
    is specified, the latest revision is used.
1469
 
 
1470
 
    Revision examples: './@127', 'foo/@', '../@1'
1471
 
 
1472
 
    The OTHER_SPEC parameter is required.  If the BASE_SPEC parameter is
1473
 
    not supplied, the common ancestor of OTHER_SPEC the current branch is used
1474
 
    as the BASE.
1475
 
 
 
1517
    """Perform a three-way merge.
 
1518
    
 
1519
    The branch is the branch you will merge from.  By default, it will merge
 
1520
    the latest revision.  If you specify a revision, that revision will be
 
1521
    merged.  If you specify two revisions, the first will be used as a BASE, 
 
1522
    and the second one as OTHER.  Revision numbers are always relative to the
 
1523
    specified branch.
 
1524
    
 
1525
    Examples:
 
1526
 
 
1527
    To merge the latest revision from bzr.dev
 
1528
    bzr merge ../bzr.dev
 
1529
 
 
1530
    To merge changes up to and including revision 82 from bzr.dev
 
1531
    bzr merge -r 82 ../bzr.dev
 
1532
 
 
1533
    To merge the changes introduced by 82, without previous changes:
 
1534
    bzr merge -r 81..82 ../bzr.dev
 
1535
    
1476
1536
    merge refuses to run if there are any uncommitted changes, unless
1477
1537
    --force is given.
1478
1538
    """
1479
 
    takes_args = ['other_spec', 'base_spec?']
1480
 
    takes_options = ['force', 'merge-type']
 
1539
    takes_args = ['branch?']
 
1540
    takes_options = ['revision', 'force', 'merge-type']
1481
1541
 
1482
 
    def run(self, other_spec, base_spec=None, force=False, merge_type=None):
 
1542
    def run(self, branch='.', revision=None, force=False, 
 
1543
            merge_type=None):
1483
1544
        from bzrlib.merge import merge
1484
1545
        from bzrlib.merge_core import ApplyMerge3
1485
1546
        if merge_type is None:
1486
1547
            merge_type = ApplyMerge3
1487
 
        merge(parse_spec(other_spec), parse_spec(base_spec),
1488
 
              check_clean=(not force), merge_type=merge_type)
 
1548
 
 
1549
        if revision is None or len(revision) < 1:
 
1550
            base = (None, None)
 
1551
            other = (branch, -1)
 
1552
        else:
 
1553
            if len(revision) == 1:
 
1554
                other = (branch, revision[0])
 
1555
                base = (None, None)
 
1556
            else:
 
1557
                assert len(revision) == 2
 
1558
                if None in revision:
 
1559
                    raise BzrCommandError(
 
1560
                        "Merge doesn't permit that revision specifier.")
 
1561
                base = (branch, revision[0])
 
1562
                other = (branch, revision[1])
 
1563
            
 
1564
        merge(other, base, check_clean=(not force), merge_type=merge_type)
1489
1565
 
1490
1566
 
1491
1567
class cmd_revert(Command):
1526
1602
    """Show help on a command or other topic.
1527
1603
 
1528
1604
    For a list of all available commands, say 'bzr help commands'."""
 
1605
    takes_options = ['long']
1529
1606
    takes_args = ['topic?']
1530
1607
    aliases = ['?']
1531
1608
    
1532
 
    def run(self, topic=None):
 
1609
    def run(self, topic=None, long=False):
1533
1610
        import help
 
1611
        if topic is None and long:
 
1612
            topic = "commands"
1534
1613
        help.help(topic)
1535
1614
 
1536
1615
 
 
1616
class cmd_shell_complete(Command):
 
1617
    """Show appropriate completions for context.
 
1618
 
 
1619
    For a list of all available commands, say 'bzr shell-complete'."""
 
1620
    takes_args = ['context?']
 
1621
    aliases = ['s-c']
 
1622
    hidden = True
 
1623
    
 
1624
    def run(self, context=None):
 
1625
        import shellcomplete
 
1626
        shellcomplete.shellcomplete(context)
1537
1627
 
1538
1628
 
1539
1629
class cmd_missing(Command):
1570
1660
        return show_missing(b, br_remote, verbose=verbose, quiet=quiet)
1571
1661
 
1572
1662
 
 
1663
 
1573
1664
class cmd_plugins(Command):
1574
1665
    """List plugins"""
1575
1666
    hidden = True
1833
1924
        return 0
1834
1925
    
1835
1926
    if not args:
1836
 
        print >>sys.stderr, "please try 'bzr help' for help"
1837
 
        return 1
 
1927
        from bzrlib.help import help
 
1928
        help(None)
 
1929
        return 0
1838
1930
    
1839
1931
    cmd = str(args.pop(0))
1840
1932
 
1879
1971
        return cmd_class(cmdopts, cmdargs).status 
1880
1972
 
1881
1973
 
1882
 
def _report_exception(summary, quiet=False):
1883
 
    import traceback
1884
 
    
1885
 
    log_error('bzr: ' + summary)
1886
 
    bzrlib.trace.log_exception()
1887
 
 
1888
 
    if os.environ.get('BZR_DEBUG'):
1889
 
        traceback.print_exc()
1890
 
 
1891
 
    if not quiet:
1892
 
        sys.stderr.write('\n')
1893
 
        tb = sys.exc_info()[2]
1894
 
        exinfo = traceback.extract_tb(tb)
1895
 
        if exinfo:
1896
 
            sys.stderr.write('  at %s:%d in %s()\n' % exinfo[-1][:3])
1897
 
        sys.stderr.write('  see ~/.bzr.log for debug information\n')
1898
 
 
1899
 
 
1900
 
 
1901
1974
def main(argv):
 
1975
    import bzrlib.ui
1902
1976
    
1903
 
    bzrlib.trace.open_tracefile(argv)
 
1977
    bzrlib.trace.log_startup(argv)
 
1978
 
 
1979
    bzrlib.ui.ui_factory = bzrlib.ui.TextUIFactory()
1904
1980
 
1905
1981
    try:
1906
1982
        try:
1907
 
            try:
1908
 
                return run_bzr(argv[1:])
1909
 
            finally:
1910
 
                # do this here inside the exception wrappers to catch EPIPE
1911
 
                sys.stdout.flush()
1912
 
        except BzrError, e:
1913
 
            quiet = isinstance(e, (BzrCommandError))
1914
 
            _report_exception('error: ' + str(e), quiet=quiet)
1915
 
            if len(e.args) > 1:
1916
 
                for h in e.args[1]:
1917
 
                    # some explanation or hints
1918
 
                    log_error('  ' + h)
1919
 
            return 1
1920
 
        except AssertionError, e:
1921
 
            msg = 'assertion failed'
1922
 
            if str(e):
1923
 
                msg += ': ' + str(e)
1924
 
            _report_exception(msg)
1925
 
            return 2
1926
 
        except KeyboardInterrupt, e:
1927
 
            _report_exception('interrupted', quiet=True)
1928
 
            return 2
1929
 
        except Exception, e:
1930
 
            import errno
1931
 
            quiet = False
1932
 
            if (isinstance(e, IOError) 
1933
 
                and hasattr(e, 'errno')
1934
 
                and e.errno == errno.EPIPE):
1935
 
                quiet = True
1936
 
                msg = 'broken pipe'
1937
 
            else:
1938
 
                msg = str(e).rstrip('\n')
1939
 
            _report_exception(msg, quiet)
1940
 
            return 2
1941
 
    finally:
1942
 
        bzrlib.trace.close_trace()
 
1983
            return run_bzr(argv[1:])
 
1984
        finally:
 
1985
            # do this here inside the exception wrappers to catch EPIPE
 
1986
            sys.stdout.flush()
 
1987
    except BzrCommandError, e:
 
1988
        # command line syntax error, etc
 
1989
        log_error(str(e))
 
1990
        return 1
 
1991
    except BzrError, e:
 
1992
        bzrlib.trace.log_exception()
 
1993
        return 1
 
1994
    except AssertionError, e:
 
1995
        bzrlib.trace.log_exception('assertion failed: ' + str(e))
 
1996
        return 3
 
1997
    except KeyboardInterrupt, e:
 
1998
        bzrlib.trace.note('interrupted')
 
1999
        return 2
 
2000
    except Exception, e:
 
2001
        import errno
 
2002
        if (isinstance(e, IOError) 
 
2003
            and hasattr(e, 'errno')
 
2004
            and e.errno == errno.EPIPE):
 
2005
            bzrlib.trace.note('broken pipe')
 
2006
            return 2
 
2007
        else:
 
2008
            bzrlib.trace.log_exception()
 
2009
            return 2
1943
2010
 
1944
2011
 
1945
2012
if __name__ == '__main__':