~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commands.py

  • Committer: Martin Pool
  • Date: 2005-08-24 08:59:32 UTC
  • Revision ID: mbp@sourcefrog.net-20050824085932-c61f1f1f1c930e13
- Add a simple UIFactory 

  The idea of this is to let a client of bzrlib set some 
  policy about how output is displayed.

  In this revision all that's done is that progress bars
  are constructed by a policy established by the application
  rather than being randomly constructed in the library 
  or passed down the calls.  This avoids progress bars
  popping up while running the test suite and cleans up
  some code.

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
 
710
717
                    msg = "The branch %s has no revision %d." % (from_location,
711
718
                                                                 revno)
712
719
                    raise BzrCommandError(msg)
713
 
            
 
720
 
714
721
            merge((to_location, -1), (to_location, 0), this_dir=to_location,
715
722
                  check_clean=False, ignore_zero=True)
716
723
            from_location = pull_loc(br_from)
1337
1344
 
1338
1345
    def run(self, dir='.'):
1339
1346
        from bzrlib.check import check
 
1347
 
1340
1348
        check(find_branch(dir))
1341
1349
 
1342
1350
 
1343
 
 
1344
1351
class cmd_scan_cache(Command):
1345
1352
    hidden = True
1346
1353
    def run(self):
1381
1388
    takes_options = ['email']
1382
1389
    
1383
1390
    def run(self, email=False):
 
1391
        try:
 
1392
            b = bzrlib.branch.find_branch('.')
 
1393
        except:
 
1394
            b = None
 
1395
        
1384
1396
        if email:
1385
 
            print bzrlib.osutils.user_email()
 
1397
            print bzrlib.osutils.user_email(b)
1386
1398
        else:
1387
 
            print bzrlib.osutils.username()
 
1399
            print bzrlib.osutils.username(b)
1388
1400
 
1389
1401
 
1390
1402
class cmd_selftest(Command):
1392
1404
    hidden = True
1393
1405
    takes_options = ['verbose']
1394
1406
    def run(self, verbose=False):
 
1407
        import bzrlib.ui
1395
1408
        from bzrlib.selftest import selftest
1396
 
        return int(not selftest(verbose=verbose))
 
1409
 
 
1410
        # we don't want progress meters from the tests to go to the
 
1411
        # real output.
 
1412
 
 
1413
        save_ui = bzrlib.ui.ui_factory
 
1414
        try:
 
1415
            bzrlib.ui.ui_factory = bzrlib.ui.SilentUIFactory()
 
1416
            return int(not selftest(verbose=verbose))
 
1417
        finally:
 
1418
            bzrlib.ui.ui_factory = save_ui
1397
1419
 
1398
1420
 
1399
1421
class cmd_version(Command):
1455
1477
 
1456
1478
 
1457
1479
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
 
 
 
1480
    """Perform a three-way merge.
 
1481
    
 
1482
    The branch is the branch you will merge from.  By default, it will merge
 
1483
    the latest revision.  If you specify a revision, that revision will be
 
1484
    merged.  If you specify two revisions, the first will be used as a BASE, 
 
1485
    and the second one as OTHER.  Revision numbers are always relative to the
 
1486
    specified branch.
 
1487
    
 
1488
    Examples:
 
1489
 
 
1490
    To merge the latest revision from bzr.dev
 
1491
    bzr merge ../bzr.dev
 
1492
 
 
1493
    To merge changes up to and including revision 82 from bzr.dev
 
1494
    bzr merge -r 82 ../bzr.dev
 
1495
 
 
1496
    To merge the changes introduced by 82, without previous changes:
 
1497
    bzr merge -r 81..82 ../bzr.dev
 
1498
    
1476
1499
    merge refuses to run if there are any uncommitted changes, unless
1477
1500
    --force is given.
1478
1501
    """
1479
 
    takes_args = ['other_spec', 'base_spec?']
1480
 
    takes_options = ['force', 'merge-type']
 
1502
    takes_args = ['branch?']
 
1503
    takes_options = ['revision', 'force', 'merge-type']
1481
1504
 
1482
 
    def run(self, other_spec, base_spec=None, force=False, merge_type=None):
 
1505
    def run(self, branch='.', revision=None, force=False, 
 
1506
            merge_type=None):
1483
1507
        from bzrlib.merge import merge
1484
1508
        from bzrlib.merge_core import ApplyMerge3
1485
1509
        if merge_type is None:
1486
1510
            merge_type = ApplyMerge3
1487
 
        merge(parse_spec(other_spec), parse_spec(base_spec),
1488
 
              check_clean=(not force), merge_type=merge_type)
 
1511
 
 
1512
        if revision is None or len(revision) < 1:
 
1513
            base = (None, None)
 
1514
            other = (branch, -1)
 
1515
        else:
 
1516
            if len(revision) == 1:
 
1517
                other = (branch, revision[0])
 
1518
                base = (None, None)
 
1519
            else:
 
1520
                assert len(revision) == 2
 
1521
                if None in revision:
 
1522
                    raise BzrCommandError(
 
1523
                        "Merge doesn't permit that revision specifier.")
 
1524
                base = (branch, revision[0])
 
1525
                other = (branch, revision[1])
 
1526
            
 
1527
        merge(other, base, check_clean=(not force), merge_type=merge_type)
1489
1528
 
1490
1529
 
1491
1530
class cmd_revert(Command):
1534
1573
        help.help(topic)
1535
1574
 
1536
1575
 
 
1576
class cmd_shell_complete(Command):
 
1577
    """Show appropriate completions for context.
 
1578
 
 
1579
    For a list of all available commands, say 'bzr shell-complete'."""
 
1580
    takes_args = ['context?']
 
1581
    aliases = ['s-c']
 
1582
    hidden = True
 
1583
    
 
1584
    def run(self, context=None):
 
1585
        import shellcomplete
 
1586
        shellcomplete.shellcomplete(context)
1537
1587
 
1538
1588
 
1539
1589
class cmd_missing(Command):
1570
1620
        return show_missing(b, br_remote, verbose=verbose, quiet=quiet)
1571
1621
 
1572
1622
 
 
1623
 
1573
1624
class cmd_plugins(Command):
1574
1625
    """List plugins"""
1575
1626
    hidden = True
1833
1884
        return 0
1834
1885
    
1835
1886
    if not args:
1836
 
        print >>sys.stderr, "please try 'bzr help' for help"
1837
 
        return 1
 
1887
        from bzrlib.help import help
 
1888
        help(None)
 
1889
        return 0
1838
1890
    
1839
1891
    cmd = str(args.pop(0))
1840
1892
 
1883
1935
    import traceback
1884
1936
    
1885
1937
    log_error('bzr: ' + summary)
1886
 
    bzrlib.trace.log_exception()
1887
 
 
1888
 
    if os.environ.get('BZR_DEBUG'):
1889
 
        traceback.print_exc()
1890
1938
 
1891
1939
    if not quiet:
1892
1940
        sys.stderr.write('\n')
1899
1947
 
1900
1948
 
1901
1949
def main(argv):
 
1950
    import bzrlib.ui
1902
1951
    
1903
1952
    bzrlib.trace.open_tracefile(argv)
1904
1953
 
 
1954
    bzrlib.ui.ui_factory = bzrlib.ui.TextUIFactory()
 
1955
 
1905
1956
    try:
1906
1957
        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()
 
1958
            return run_bzr(argv[1:])
 
1959
        finally:
 
1960
            # do this here inside the exception wrappers to catch EPIPE
 
1961
            sys.stdout.flush()
 
1962
    except BzrCommandError, e:
 
1963
        # command line syntax error, etc
 
1964
        log_error(str(e))
 
1965
        return 1
 
1966
    except BzrError, e:
 
1967
        bzrlib.trace.log_exception()
 
1968
        return 1
 
1969
    except AssertionError, e:
 
1970
        bzrlib.trace.log_exception('assertion failed: ' + str(e))
 
1971
        return 3
 
1972
    except KeyboardInterrupt, e:
 
1973
        bzrlib.trace.note('interrupted')
 
1974
        return 2
 
1975
    except Exception, e:
 
1976
        import errno
 
1977
        if (isinstance(e, IOError) 
 
1978
            and hasattr(e, 'errno')
 
1979
            and e.errno == errno.EPIPE):
 
1980
            bzrlib.trace.note('broken pipe')
 
1981
            return 2
 
1982
        else:
 
1983
            bzrlib.trace.log_exception('terminated by exception')
 
1984
            return 2
1943
1985
 
1944
1986
 
1945
1987
if __name__ == '__main__':