~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commands.py

  • Committer: Martin Pool
  • Date: 2005-10-06 10:53:12 UTC
  • mto: (1185.13.3)
  • mto: This revision was merged to the branch mainline in revision 1418.
  • Revision ID: mbp@sourcefrog.net-20051006105312-06320dbb986e4bb3
- test that we cannot join weaves with different ancestry

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
 
 
28
 
# TODO: Help messages for options.
29
 
 
30
 
# TODO: Define arguments by objects, rather than just using names.
31
 
# Those objects can specify the expected type of the argument, which
32
 
# would help with validation and shell completion.
33
 
 
34
 
 
 
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?
35
29
 
36
30
import sys
37
31
import os
42
36
import bzrlib.trace
43
37
from bzrlib.trace import mutter, note, log_error, warning
44
38
from bzrlib.errors import BzrError, BzrCheckError, BzrCommandError, NotBranchError
45
 
from bzrlib.branch import find_branch
 
39
from bzrlib.revisionspec import RevisionSpec
46
40
from bzrlib import BZRDIR
47
41
 
48
42
plugin_cmds = {}
76
70
def _parse_revision_str(revstr):
77
71
    """This handles a revision string -> revno.
78
72
 
79
 
    This always returns a list.  The list will have one element for 
80
 
 
81
 
    It supports integers directly, but everything else it
82
 
    defers for passing to Branch.get_revision_info()
 
73
    This always returns a list.  The list will have one element for
 
74
    each revision.
83
75
 
84
76
    >>> _parse_revision_str('234')
85
 
    [234]
 
77
    [<RevisionSpec_int 234>]
86
78
    >>> _parse_revision_str('234..567')
87
 
    [234, 567]
 
79
    [<RevisionSpec_int 234>, <RevisionSpec_int 567>]
88
80
    >>> _parse_revision_str('..')
89
 
    [None, None]
 
81
    [<RevisionSpec None>, <RevisionSpec None>]
90
82
    >>> _parse_revision_str('..234')
91
 
    [None, 234]
 
83
    [<RevisionSpec None>, <RevisionSpec_int 234>]
92
84
    >>> _parse_revision_str('234..')
93
 
    [234, None]
 
85
    [<RevisionSpec_int 234>, <RevisionSpec None>]
94
86
    >>> _parse_revision_str('234..456..789') # Maybe this should be an error
95
 
    [234, 456, 789]
 
87
    [<RevisionSpec_int 234>, <RevisionSpec_int 456>, <RevisionSpec_int 789>]
96
88
    >>> _parse_revision_str('234....789') # Error?
97
 
    [234, None, 789]
 
89
    [<RevisionSpec_int 234>, <RevisionSpec None>, <RevisionSpec_int 789>]
98
90
    >>> _parse_revision_str('revid:test@other.com-234234')
99
 
    ['revid:test@other.com-234234']
 
91
    [<RevisionSpec_revid revid:test@other.com-234234>]
100
92
    >>> _parse_revision_str('revid:test@other.com-234234..revid:test@other.com-234235')
101
 
    ['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>]
102
94
    >>> _parse_revision_str('revid:test@other.com-234234..23')
103
 
    ['revid:test@other.com-234234', 23]
 
95
    [<RevisionSpec_revid revid:test@other.com-234234>, <RevisionSpec_int 23>]
104
96
    >>> _parse_revision_str('date:2005-04-12')
105
 
    ['date:2005-04-12']
 
97
    [<RevisionSpec_date date:2005-04-12>]
106
98
    >>> _parse_revision_str('date:2005-04-12 12:24:33')
107
 
    ['date:2005-04-12 12:24:33']
 
99
    [<RevisionSpec_date date:2005-04-12 12:24:33>]
108
100
    >>> _parse_revision_str('date:2005-04-12T12:24:33')
109
 
    ['date:2005-04-12T12:24:33']
 
101
    [<RevisionSpec_date date:2005-04-12T12:24:33>]
110
102
    >>> _parse_revision_str('date:2005-04-12,12:24:33')
111
 
    ['date:2005-04-12,12:24:33']
 
103
    [<RevisionSpec_date date:2005-04-12,12:24:33>]
112
104
    >>> _parse_revision_str('-5..23')
113
 
    [-5, 23]
 
105
    [<RevisionSpec_int -5>, <RevisionSpec_int 23>]
114
106
    >>> _parse_revision_str('-5')
115
 
    [-5]
 
107
    [<RevisionSpec_int -5>]
116
108
    >>> _parse_revision_str('123a')
117
 
    ['123a']
 
109
    Traceback (most recent call last):
 
110
      ...
 
111
    BzrError: No namespace registered for string: '123a'
118
112
    >>> _parse_revision_str('abc')
119
 
    ['abc']
 
113
    Traceback (most recent call last):
 
114
      ...
 
115
    BzrError: No namespace registered for string: 'abc'
120
116
    """
121
117
    import re
122
118
    old_format_re = re.compile('\d*:\d*')
123
119
    m = old_format_re.match(revstr)
 
120
    revs = []
124
121
    if m:
125
122
        warning('Colon separator for revision numbers is deprecated.'
126
123
                ' Use .. instead')
127
 
        revs = []
128
124
        for rev in revstr.split(':'):
129
125
            if rev:
130
 
                revs.append(int(rev))
131
 
            else:
132
 
                revs.append(None)
133
 
        return revs
134
 
    revs = []
135
 
    for x in revstr.split('..'):
136
 
        if not x:
137
 
            revs.append(None)
138
 
        else:
139
 
            try:
140
 
                revs.append(int(x))
141
 
            except ValueError:
142
 
                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))
143
135
    return revs
144
136
 
145
137
 
146
 
def get_merge_type(typestring):
147
 
    """Attempt to find the merge class/factory associated with a string."""
148
 
    from merge import merge_types
149
 
    try:
150
 
        return merge_types[typestring][0]
151
 
    except KeyError:
152
 
        templ = '%s%%7s: %%s' % (' '*12)
153
 
        lines = [templ % (f[0], f[1][1]) for f in merge_types.iteritems()]
154
 
        type_list = '\n'.join(lines)
155
 
        msg = "No known merge type %s. Supported types are:\n%s" %\
156
 
            (typestring, type_list)
157
 
        raise BzrCommandError(msg)
158
 
 
159
 
 
160
138
def _builtin_commands():
161
139
    import bzrlib.builtins
162
140
    r = {}
354
332
# the type.
355
333
OPTIONS = {
356
334
    'all':                    None,
 
335
    'basis':                  str,
357
336
    'diff-options':           str,
358
337
    'help':                   None,
359
338
    'file':                   unicode,
375
354
    'long':                   None,
376
355
    'root':                   str,
377
356
    'no-backup':              None,
378
 
    'merge-type':             get_merge_type,
379
357
    'pattern':                str,
380
358
    }
381
359
 
408
386
    >>> parse_args('commit --message=biter'.split())
409
387
    (['commit'], {'message': u'biter'})
410
388
    >>> parse_args('log -r 500'.split())
411
 
    (['log'], {'revision': [500]})
 
389
    (['log'], {'revision': [<RevisionSpec_int 500>]})
412
390
    >>> parse_args('log -r500..600'.split())
413
 
    (['log'], {'revision': [500, 600]})
 
391
    (['log'], {'revision': [<RevisionSpec_int 500>, <RevisionSpec_int 600>]})
414
392
    >>> parse_args('log -vr500..600'.split())
415
 
    (['log'], {'verbose': True, 'revision': [500, 600]})
416
 
    >>> parse_args('log -rv500..600'.split()) #the r takes an argument
417
 
    (['log'], {'revision': ['v500', 600]})
 
393
    (['log'], {'verbose': True, 'revision': [<RevisionSpec_int 500>, <RevisionSpec_int 600>]})
 
394
    >>> parse_args('log -rrevno:500..600'.split()) #the r takes an argument
 
395
    (['log'], {'revision': [<RevisionSpec_revno revno:500>, <RevisionSpec_int 600>]})
418
396
    """
419
397
    args = []
420
398
    opts = {}
541
519
def apply_profiled(the_callable, *args, **kwargs):
542
520
    import hotshot
543
521
    import tempfile
 
522
    import hotshot.stats
544
523
    pffileno, pfname = tempfile.mkstemp()
545
524
    try:
546
525
        prof = hotshot.Profile(pfname)
548
527
            ret = prof.runcall(the_callable, *args, **kwargs) or 0
549
528
        finally:
550
529
            prof.close()
551
 
 
552
 
        import hotshot.stats
553
530
        stats = hotshot.stats.load(pfname)
554
 
        #stats.strip_dirs()
555
 
        stats.sort_stats('time')
 
531
        stats.strip_dirs()
 
532
        stats.sort_stats('cum')   # 'time'
556
533
        ## XXX: Might like to write to stderr or the trace file instead but
557
534
        ## print_stats seems hardcoded to stdout
558
535
        stats.print_stats(20)
559
 
 
560
536
        return ret
561
537
    finally:
562
538
        os.close(pffileno)
587
563
    --profile
588
564
        Run under the Python profiler.
589
565
    """
 
566
    # Load all of the transport methods
 
567
    import bzrlib.transport.local, bzrlib.transport.http
590
568
    
591
569
    argv = [a.decode(bzrlib.user_encoding) for a in argv]
592
570
 
640
618
    bzrlib.trace.log_startup(argv)
641
619
    bzrlib.ui.ui_factory = bzrlib.ui.TextUIFactory()
642
620
 
 
621
    return run_bzr_catch_errors(argv[1:])
 
622
 
 
623
 
 
624
def run_bzr_catch_errors(argv):
643
625
    try:
644
626
        try:
645
 
            try:
646
 
                return run_bzr(argv[1:])
647
 
            finally:
648
 
                # do this here inside the exception wrappers to catch EPIPE
649
 
                sys.stdout.flush()
650
 
        #wrap common errors as CommandErrors.
651
 
        except (NotBranchError,), e:
652
 
            raise BzrCommandError(str(e))
 
627
            return run_bzr(argv)
 
628
        finally:
 
629
            # do this here inside the exception wrappers to catch EPIPE
 
630
            sys.stdout.flush()
653
631
    except BzrCommandError, e:
654
632
        # command line syntax error, etc
655
633
        log_error(str(e))
661
639
        bzrlib.trace.log_exception('assertion failed: ' + str(e))
662
640
        return 3
663
641
    except KeyboardInterrupt, e:
664
 
        bzrlib.trace.note('interrupted')
 
642
        bzrlib.trace.log_exception('interrupted')
665
643
        return 2
666
644
    except Exception, e:
667
645
        import errno
671
649
            bzrlib.trace.note('broken pipe')
672
650
            return 2
673
651
        else:
 
652
            ## import pdb
 
653
            ## pdb.pm()
674
654
            bzrlib.trace.log_exception()
675
655
            return 2
676
656
 
677
 
 
678
657
if __name__ == '__main__':
679
658
    sys.exit(main(sys.argv))