~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 00:34:21 UTC
  • Revision ID: mbp@sourcefrog.net-20050824003421-33dd8e5c739cad2a
- send trace messages out through python logging module

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
 
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):
1455
1467
 
1456
1468
 
1457
1469
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
 
 
 
1470
    """Perform a three-way merge.
 
1471
    
 
1472
    The branch is the branch you will merge from.  By default, it will merge
 
1473
    the latest revision.  If you specify a revision, that revision will be
 
1474
    merged.  If you specify two revisions, the first will be used as a BASE, 
 
1475
    and the second one as OTHER.  Revision numbers are always relative to the
 
1476
    specified branch.
 
1477
    
 
1478
    Examples:
 
1479
 
 
1480
    To merge the latest revision from bzr.dev
 
1481
    bzr merge ../bzr.dev
 
1482
 
 
1483
    To merge changes up to and including revision 82 from bzr.dev
 
1484
    bzr merge -r 82 ../bzr.dev
 
1485
 
 
1486
    To merge the changes introduced by 82, without previous changes:
 
1487
    bzr merge -r 81..82 ../bzr.dev
 
1488
    
1476
1489
    merge refuses to run if there are any uncommitted changes, unless
1477
1490
    --force is given.
1478
1491
    """
1479
 
    takes_args = ['other_spec', 'base_spec?']
1480
 
    takes_options = ['force', 'merge-type']
 
1492
    takes_args = ['branch?']
 
1493
    takes_options = ['revision', 'force', 'merge-type']
1481
1494
 
1482
 
    def run(self, other_spec, base_spec=None, force=False, merge_type=None):
 
1495
    def run(self, branch='.', revision=None, force=False, 
 
1496
            merge_type=None):
1483
1497
        from bzrlib.merge import merge
1484
1498
        from bzrlib.merge_core import ApplyMerge3
1485
1499
        if merge_type is None:
1486
1500
            merge_type = ApplyMerge3
1487
 
        merge(parse_spec(other_spec), parse_spec(base_spec),
1488
 
              check_clean=(not force), merge_type=merge_type)
 
1501
 
 
1502
        if revision is None or len(revision) < 1:
 
1503
            base = (None, None)
 
1504
            other = (branch, -1)
 
1505
        else:
 
1506
            if len(revision) == 1:
 
1507
                other = (branch, revision[0])
 
1508
                base = (None, None)
 
1509
            else:
 
1510
                assert len(revision) == 2
 
1511
                if None in revision:
 
1512
                    raise BzrCommandError(
 
1513
                        "Merge doesn't permit that revision specifier.")
 
1514
                base = (branch, revision[0])
 
1515
                other = (branch, revision[1])
 
1516
            
 
1517
        merge(other, base, check_clean=(not force), merge_type=merge_type)
1489
1518
 
1490
1519
 
1491
1520
class cmd_revert(Command):
1534
1563
        help.help(topic)
1535
1564
 
1536
1565
 
 
1566
class cmd_shell_complete(Command):
 
1567
    """Show appropriate completions for context.
 
1568
 
 
1569
    For a list of all available commands, say 'bzr shell-complete'."""
 
1570
    takes_args = ['context?']
 
1571
    aliases = ['s-c']
 
1572
    hidden = True
 
1573
    
 
1574
    def run(self, context=None):
 
1575
        import shellcomplete
 
1576
        shellcomplete.shellcomplete(context)
1537
1577
 
1538
1578
 
1539
1579
class cmd_missing(Command):
1570
1610
        return show_missing(b, br_remote, verbose=verbose, quiet=quiet)
1571
1611
 
1572
1612
 
 
1613
 
1573
1614
class cmd_plugins(Command):
1574
1615
    """List plugins"""
1575
1616
    hidden = True
1883
1924
    import traceback
1884
1925
    
1885
1926
    log_error('bzr: ' + summary)
1886
 
    bzrlib.trace.log_exception()
1887
 
 
1888
 
    if os.environ.get('BZR_DEBUG'):
1889
 
        traceback.print_exc()
1890
1927
 
1891
1928
    if not quiet:
1892
1929
        sys.stderr.write('\n')
1899
1936
 
1900
1937
 
1901
1938
def main(argv):
1902
 
    
1903
1939
    bzrlib.trace.open_tracefile(argv)
1904
1940
 
1905
1941
    try:
1906
1942
        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()
 
1943
            return run_bzr(argv[1:])
 
1944
        finally:
 
1945
            # do this here inside the exception wrappers to catch EPIPE
 
1946
            sys.stdout.flush()
 
1947
    except BzrCommandError, e:
 
1948
        # command line syntax error, etc
 
1949
        log_error(str(e))
 
1950
        return 1
 
1951
    except BzrError, e:
 
1952
        bzrlib.trace.log_exception()
 
1953
        return 1
 
1954
    except AssertionError, e:
 
1955
        bzrlib.trace.log_exception('assertion failed: ' + str(e))
 
1956
        return 3
 
1957
    except KeyboardInterrupt, e:
 
1958
        bzrlib.trace.note('interrupted')
 
1959
        return 2
 
1960
    except Exception, e:
 
1961
        import errno
 
1962
        if (isinstance(e, IOError) 
 
1963
            and hasattr(e, 'errno')
 
1964
            and e.errno == errno.EPIPE):
 
1965
            bzrlib.trace.note('broken pipe')
 
1966
            return 2
 
1967
        else:
 
1968
            bzrlib.trace.log_exception('terminated by exception')
 
1969
            return 2
1943
1970
 
1944
1971
 
1945
1972
if __name__ == '__main__':