~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commands.py

  • Committer: Robert Collins
  • Date: 2005-10-10 00:05:25 UTC
  • Revision ID: robertc@robertcollins.net-20051010000525-cbfcc0ff413510c5
BUGFIX: disable symlink support tests when no symlink support is present on the system.

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
# Those objects can specify the expected type of the argument, which
25
25
# would help with validation and shell completion.
26
26
 
27
 
 
 
27
# TODO: "--profile=cum", to change sort order.  Is there any value in leaving
 
28
# the profile output behind so it can be interactively examined?
28
29
 
29
30
import sys
30
31
import os
34
35
import bzrlib
35
36
import bzrlib.trace
36
37
from bzrlib.trace import mutter, note, log_error, warning
37
 
from bzrlib.errors import BzrError, BzrCheckError, BzrCommandError
38
 
from bzrlib.branch import find_branch
 
38
from bzrlib.errors import BzrError, BzrCheckError, BzrCommandError, NotBranchError
 
39
from bzrlib.revisionspec import RevisionSpec
39
40
from bzrlib import BZRDIR
40
41
 
41
42
plugin_cmds = {}
69
70
def _parse_revision_str(revstr):
70
71
    """This handles a revision string -> revno.
71
72
 
72
 
    This always returns a list.  The list will have one element for 
73
 
 
74
 
    It supports integers directly, but everything else it
75
 
    defers for passing to Branch.get_revision_info()
 
73
    This always returns a list.  The list will have one element for
 
74
    each revision.
76
75
 
77
76
    >>> _parse_revision_str('234')
78
 
    [234]
 
77
    [<RevisionSpec_int 234>]
79
78
    >>> _parse_revision_str('234..567')
80
 
    [234, 567]
 
79
    [<RevisionSpec_int 234>, <RevisionSpec_int 567>]
81
80
    >>> _parse_revision_str('..')
82
 
    [None, None]
 
81
    [<RevisionSpec None>, <RevisionSpec None>]
83
82
    >>> _parse_revision_str('..234')
84
 
    [None, 234]
 
83
    [<RevisionSpec None>, <RevisionSpec_int 234>]
85
84
    >>> _parse_revision_str('234..')
86
 
    [234, None]
 
85
    [<RevisionSpec_int 234>, <RevisionSpec None>]
87
86
    >>> _parse_revision_str('234..456..789') # Maybe this should be an error
88
 
    [234, 456, 789]
 
87
    [<RevisionSpec_int 234>, <RevisionSpec_int 456>, <RevisionSpec_int 789>]
89
88
    >>> _parse_revision_str('234....789') # Error?
90
 
    [234, None, 789]
 
89
    [<RevisionSpec_int 234>, <RevisionSpec None>, <RevisionSpec_int 789>]
91
90
    >>> _parse_revision_str('revid:test@other.com-234234')
92
 
    ['revid:test@other.com-234234']
 
91
    [<RevisionSpec_revid revid:test@other.com-234234>]
93
92
    >>> _parse_revision_str('revid:test@other.com-234234..revid:test@other.com-234235')
94
 
    ['revid:test@other.com-234234', 'revid:test@other.com-234235']
 
93
    [<RevisionSpec_revid revid:test@other.com-234234>, <RevisionSpec_revid revid:test@other.com-234235>]
95
94
    >>> _parse_revision_str('revid:test@other.com-234234..23')
96
 
    ['revid:test@other.com-234234', 23]
 
95
    [<RevisionSpec_revid revid:test@other.com-234234>, <RevisionSpec_int 23>]
97
96
    >>> _parse_revision_str('date:2005-04-12')
98
 
    ['date:2005-04-12']
 
97
    [<RevisionSpec_date date:2005-04-12>]
99
98
    >>> _parse_revision_str('date:2005-04-12 12:24:33')
100
 
    ['date:2005-04-12 12:24:33']
 
99
    [<RevisionSpec_date date:2005-04-12 12:24:33>]
101
100
    >>> _parse_revision_str('date:2005-04-12T12:24:33')
102
 
    ['date:2005-04-12T12:24:33']
 
101
    [<RevisionSpec_date date:2005-04-12T12:24:33>]
103
102
    >>> _parse_revision_str('date:2005-04-12,12:24:33')
104
 
    ['date:2005-04-12,12:24:33']
 
103
    [<RevisionSpec_date date:2005-04-12,12:24:33>]
105
104
    >>> _parse_revision_str('-5..23')
106
 
    [-5, 23]
 
105
    [<RevisionSpec_int -5>, <RevisionSpec_int 23>]
107
106
    >>> _parse_revision_str('-5')
108
 
    [-5]
 
107
    [<RevisionSpec_int -5>]
109
108
    >>> _parse_revision_str('123a')
110
 
    ['123a']
 
109
    Traceback (most recent call last):
 
110
      ...
 
111
    BzrError: No namespace registered for string: '123a'
111
112
    >>> _parse_revision_str('abc')
112
 
    ['abc']
 
113
    Traceback (most recent call last):
 
114
      ...
 
115
    BzrError: No namespace registered for string: 'abc'
113
116
    """
114
117
    import re
115
118
    old_format_re = re.compile('\d*:\d*')
116
119
    m = old_format_re.match(revstr)
 
120
    revs = []
117
121
    if m:
118
122
        warning('Colon separator for revision numbers is deprecated.'
119
123
                ' Use .. instead')
120
 
        revs = []
121
124
        for rev in revstr.split(':'):
122
125
            if rev:
123
 
                revs.append(int(rev))
124
 
            else:
125
 
                revs.append(None)
126
 
        return revs
127
 
    revs = []
128
 
    for x in revstr.split('..'):
129
 
        if not x:
130
 
            revs.append(None)
131
 
        else:
132
 
            try:
133
 
                revs.append(int(x))
134
 
            except ValueError:
135
 
                revs.append(x)
 
126
                revs.append(RevisionSpec(int(rev)))
 
127
            else:
 
128
                revs.append(RevisionSpec(None))
 
129
    else:
 
130
        for x in revstr.split('..'):
 
131
            if not x:
 
132
                revs.append(RevisionSpec(None))
 
133
            else:
 
134
                revs.append(RevisionSpec(x))
136
135
    return revs
137
136
 
138
137
 
139
 
def get_merge_type(typestring):
140
 
    """Attempt to find the merge class/factory associated with a string."""
141
 
    from merge import merge_types
142
 
    try:
143
 
        return merge_types[typestring][0]
144
 
    except KeyError:
145
 
        templ = '%s%%7s: %%s' % (' '*12)
146
 
        lines = [templ % (f[0], f[1][1]) for f in merge_types.iteritems()]
147
 
        type_list = '\n'.join(lines)
148
 
        msg = "No known merge type %s. Supported types are:\n%s" %\
149
 
            (typestring, type_list)
150
 
        raise BzrCommandError(msg)
151
 
    
152
 
 
153
 
def get_merge_type(typestring):
154
 
    """Attempt to find the merge class/factory associated with a string."""
155
 
    from merge import merge_types
156
 
    try:
157
 
        return merge_types[typestring][0]
158
 
    except KeyError:
159
 
        templ = '%s%%7s: %%s' % (' '*12)
160
 
        lines = [templ % (f[0], f[1][1]) for f in merge_types.iteritems()]
161
 
        type_list = '\n'.join(lines)
162
 
        msg = "No known merge type %s. Supported types are:\n%s" %\
163
 
            (typestring, type_list)
164
 
        raise BzrCommandError(msg)
165
 
 
166
 
 
167
138
def _builtin_commands():
168
139
    import bzrlib.builtins
169
140
    r = {}
356
327
    return parsed
357
328
 
358
329
 
359
 
 
360
 
 
361
330
# list of all available options; the rhs can be either None for an
362
331
# option that takes no argument, or a constructor function that checks
363
332
# the type.
364
333
OPTIONS = {
365
334
    'all':                    None,
 
335
    'basis':                  str,
366
336
    'diff-options':           str,
367
337
    'help':                   None,
368
338
    'file':                   unicode,
384
354
    'long':                   None,
385
355
    'root':                   str,
386
356
    'no-backup':              None,
387
 
    'merge-type':             get_merge_type,
388
357
    'pattern':                str,
 
358
    'remember':               None,
389
359
    }
390
360
 
391
361
SHORT_OPTIONS = {
417
387
    >>> parse_args('commit --message=biter'.split())
418
388
    (['commit'], {'message': u'biter'})
419
389
    >>> parse_args('log -r 500'.split())
420
 
    (['log'], {'revision': [500]})
 
390
    (['log'], {'revision': [<RevisionSpec_int 500>]})
421
391
    >>> parse_args('log -r500..600'.split())
422
 
    (['log'], {'revision': [500, 600]})
 
392
    (['log'], {'revision': [<RevisionSpec_int 500>, <RevisionSpec_int 600>]})
423
393
    >>> parse_args('log -vr500..600'.split())
424
 
    (['log'], {'verbose': True, 'revision': [500, 600]})
425
 
    >>> parse_args('log -rv500..600'.split()) #the r takes an argument
426
 
    (['log'], {'revision': ['v500', 600]})
 
394
    (['log'], {'verbose': True, 'revision': [<RevisionSpec_int 500>, <RevisionSpec_int 600>]})
 
395
    >>> parse_args('log -rrevno:500..600'.split()) #the r takes an argument
 
396
    (['log'], {'revision': [<RevisionSpec_revno revno:500>, <RevisionSpec_int 600>]})
427
397
    """
428
398
    args = []
429
399
    opts = {}
550
520
def apply_profiled(the_callable, *args, **kwargs):
551
521
    import hotshot
552
522
    import tempfile
 
523
    import hotshot.stats
553
524
    pffileno, pfname = tempfile.mkstemp()
554
525
    try:
555
526
        prof = hotshot.Profile(pfname)
557
528
            ret = prof.runcall(the_callable, *args, **kwargs) or 0
558
529
        finally:
559
530
            prof.close()
560
 
 
561
 
        import hotshot.stats
562
531
        stats = hotshot.stats.load(pfname)
563
 
        #stats.strip_dirs()
564
 
        stats.sort_stats('time')
 
532
        stats.strip_dirs()
 
533
        stats.sort_stats('cum')   # 'time'
565
534
        ## XXX: Might like to write to stderr or the trace file instead but
566
535
        ## print_stats seems hardcoded to stdout
567
536
        stats.print_stats(20)
568
 
 
569
537
        return ret
570
538
    finally:
571
539
        os.close(pffileno)
596
564
    --profile
597
565
        Run under the Python profiler.
598
566
    """
 
567
    # Load all of the transport methods
 
568
    import bzrlib.transport.local, bzrlib.transport.http
599
569
    
600
570
    argv = [a.decode(bzrlib.user_encoding) for a in argv]
601
571
 
649
619
    bzrlib.trace.log_startup(argv)
650
620
    bzrlib.ui.ui_factory = bzrlib.ui.TextUIFactory()
651
621
 
 
622
    return run_bzr_catch_errors(argv[1:])
 
623
 
 
624
 
 
625
def run_bzr_catch_errors(argv):
652
626
    try:
653
627
        try:
654
 
            return run_bzr(argv[1:])
 
628
            return run_bzr(argv)
655
629
        finally:
656
630
            # do this here inside the exception wrappers to catch EPIPE
657
631
            sys.stdout.flush()
666
640
        bzrlib.trace.log_exception('assertion failed: ' + str(e))
667
641
        return 3
668
642
    except KeyboardInterrupt, e:
669
 
        bzrlib.trace.note('interrupted')
 
643
        bzrlib.trace.log_exception('interrupted')
670
644
        return 2
671
645
    except Exception, e:
672
646
        import errno
676
650
            bzrlib.trace.note('broken pipe')
677
651
            return 2
678
652
        else:
 
653
            ## import pdb
 
654
            ## pdb.pm()
679
655
            bzrlib.trace.log_exception()
680
656
            return 2
681
657
 
682
 
 
683
658
if __name__ == '__main__':
684
659
    sys.exit(main(sys.argv))