~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commands.py

  • Committer: mbp at sourcefrog
  • Date: 2005-03-21 22:29:49 UTC
  • Revision ID: mbp@sourcefrog.net-20050321222949-232c2093a6eadd80
fixup doctest for new module structure

Show diffs side-by-side

added added

removed removed

Lines of Context:
63
63
"""
64
64
 
65
65
# not currently working:
66
 
#  bzr check
67
 
#       Run internal consistency checks.
68
66
#  bzr info
69
67
#       Show some information about this branch.
70
68
 
83
81
from pprint import pprint
84
82
from stat import *
85
83
from glob import glob
86
 
from ElementTree import Element, ElementTree, SubElement
87
84
 
88
85
import bzrlib
89
86
from bzrlib.store import ImmutableStore
116
113
## TODO: Perhaps make UUIDs predictable in test mode to make it easier
117
114
## to compare output?
118
115
 
119
 
## TODO: Is ElementTree really all that much better for our purposes?
120
 
## Perhaps using the standard MiniDOM would be enough?
121
 
 
122
 
 
123
 
 
124
 
 
125
 
 
126
 
 
127
 
######################################################################
128
 
# check status
 
116
## TODO: Some kind of global code to generate the right Branch object
 
117
## to work on.  Almost, but not quite all, commands need one, and it
 
118
## can be taken either from their parameters or their working
 
119
## directory.
 
120
 
 
121
## TODO: rename command, needed soon: check destination doesn't exist
 
122
## either in working copy or tree; move working copy; update
 
123
## inventory; write out
 
124
 
 
125
## TODO: move command; check destination is a directory and will not
 
126
## clash; move it.
 
127
 
 
128
## TODO: command to show renames, one per line, as to->from
 
129
 
 
130
 
129
131
 
130
132
 
131
133
def cmd_status(all=False):
147
149
    Branch('.').get_revision(revision_id).write_xml(sys.stdout)
148
150
 
149
151
 
150
 
def cmd_get_inventory(inventory_id):
151
 
    """Return inventory in XML by hash"""
152
 
    Branch('.').get_inventory(inventory_hash).write_xml(sys.stdout)
153
 
 
154
 
 
155
 
def cmd_get_revision_inventory(revision_id):
156
 
    """Output inventory for a revision."""
157
 
    b = Branch('.')
158
 
    b.get_revision_inventory(revision_id).write_xml(sys.stdout)
159
 
 
160
 
 
161
152
def cmd_get_file_text(text_id):
162
153
    """Get contents of a file by hash."""
163
154
    sf = Branch('.').text_store[text_id]
200
191
def cmd_info():
201
192
    b = Branch('.')
202
193
    print 'branch format:', b.controlfile('branch-format', 'r').readline().rstrip('\n')
203
 
    print 'revision number:', b.revno()
204
 
    print 'number of versioned files:', len(b.read_working_inventory())
 
194
 
 
195
    def plural(n, base='', pl=None):
 
196
        if n == 1:
 
197
            return base
 
198
        elif pl is not None:
 
199
            return pl
 
200
        else:
 
201
            return 's'
 
202
 
 
203
    count_version_dirs = 0
 
204
 
 
205
    count_status = {'A': 0, 'D': 0, 'M': 0, 'R': 0, '?': 0, 'I': 0, '.': 0}
 
206
    for st_tup in bzrlib.diff_trees(b.basis_tree(), b.working_tree()):
 
207
        fs = st_tup[0]
 
208
        count_status[fs] += 1
 
209
        if fs not in ['I', '?'] and st_tup[4] == 'directory':
 
210
            count_version_dirs += 1
 
211
 
 
212
    print
 
213
    print 'in the working tree:'
 
214
    for name, fs in (('unchanged', '.'),
 
215
                     ('modified', 'M'), ('added', 'A'), ('removed', 'D'),
 
216
                     ('renamed', 'R'), ('unknown', '?'), ('ignored', 'I'),
 
217
                     ):
 
218
        print '  %5d %s' % (count_status[fs], name)
 
219
    print '  %5d versioned subdirector%s' % (count_version_dirs,
 
220
                                             plural(count_version_dirs, 'y', 'ies'))
 
221
 
 
222
    print
 
223
    print 'branch history:'
 
224
    history = b.revision_history()
 
225
    revno = len(history)
 
226
    print '  %5d revision%s' % (revno, plural(revno))
 
227
    committers = Set()
 
228
    for rev in history:
 
229
        committers.add(b.get_revision(rev).committer)
 
230
    print '  %5d committer%s' % (len(committers), plural(len(committers)))
 
231
    if revno > 0:
 
232
        firstrev = b.get_revision(history[0])
 
233
        age = int((time.time() - firstrev.timestamp) / 3600 / 24)
 
234
        print '  %5d day%s old' % (age, plural(age))
 
235
        print '  first revision: %s' % format_date(firstrev.timestamp,
 
236
                                                 firstrev.timezone)
 
237
 
 
238
        lastrev = b.get_revision(history[-1])
 
239
        print '  latest revision: %s' % format_date(lastrev.timestamp,
 
240
                                                    lastrev.timezone)
 
241
        
 
242
    
205
243
 
206
244
 
207
245
def cmd_remove(file_list, verbose=False):
330
368
 
331
369
 
332
370
 
333
 
def cmd_log():
 
371
def cmd_log(timezone='original'):
334
372
    """Show log of this branch.
335
373
 
336
374
    :todo: Options for utc; to show ids; to limit range; etc.
337
375
    """
338
 
    Branch('.').write_log()
 
376
    Branch('.').write_log(show_timezone=timezone)
339
377
 
340
378
 
341
379
def cmd_ls(revision=None, verbose=False):
400
438
 
401
439
 
402
440
 
 
441
def cmd_local_time_offset():
 
442
    print bzrlib.osutils.local_time_offset()
 
443
 
 
444
 
 
445
 
403
446
def cmd_commit(message, verbose=False):
404
447
    Branch('.').commit(message, verbose=verbose)
405
448
 
444
487
 
445
488
    ## TODO: --verbose option
446
489
    
447
 
    import bzr, doctest, bzrlib.store
 
490
    import doctest, bzrlib.store
448
491
    bzrlib.trace.verbose = False
449
 
    doctest.testmod(bzr)
450
492
    doctest.testmod(bzrlib.store)
451
493
    doctest.testmod(bzrlib.inventory)
452
494
    doctest.testmod(bzrlib.branch)
497
539
    'message':                unicode,
498
540
    'revision':               int,
499
541
    'show-ids':               None,
 
542
    'timezone':               str,
500
543
    'verbose':                None,
501
544
    'version':                None,
502
545
    }
514
557
    'commit':                 ['message', 'verbose'],
515
558
    'diff':                   ['revision'],
516
559
    'inventory':              ['revision'],
 
560
    'log':                    ['show-ids', 'timezone'],
517
561
    'ls':                     ['revision', 'verbose'],
 
562
    'remove':                 ['verbose'],
518
563
    'status':                 ['all'],
519
 
    'log':                    ['show-ids'],
520
 
    'remove':                 ['verbose'],
521
564
    }
522
565
 
523
566
 
547
590
    lookup table, something about the available options, what optargs
548
591
    they take, and which commands will accept them.
549
592
 
550
 
    >>> parse_args('bzr --help'.split())
 
593
    >>> parse_args('--help'.split())
551
594
    ([], {'help': True})
552
 
    >>> parse_args('bzr --version'.split())
 
595
    >>> parse_args('--version'.split())
553
596
    ([], {'version': True})
554
 
    >>> parse_args('bzr status --all'.split())
 
597
    >>> parse_args('status --all'.split())
555
598
    (['status'], {'all': True})
 
599
    >>> parse_args('commit --message=biter'.split())
 
600
    (['commit'], {'message': u'biter'})
556
601
    """
557
602
    args = []
558
603
    opts = {}
559
604
 
560
605
    # TODO: Maybe handle '--' to end options?
561
606
 
562
 
    it = iter(argv[1:])
563
 
    while it:
564
 
        a = it.next()
 
607
    while argv:
 
608
        a = argv.pop(0)
565
609
        if a[0] == '-':
 
610
            optarg = None
566
611
            if a[1] == '-':
567
612
                mutter("  got option %r" % a)
568
 
                optname = a[2:]
 
613
                if '=' in a:
 
614
                    optname, optarg = a[2:].split('=', 1)
 
615
                else:
 
616
                    optname = a[2:]
569
617
                if optname not in OPTIONS:
570
618
                    bailout('unknown long option %r' % a)
571
619
            else:
577
625
            if optname in opts:
578
626
                # XXX: Do we ever want to support this, e.g. for -r?
579
627
                bailout('repeated option %r' % a)
 
628
                
580
629
            optargfn = OPTIONS[optname]
581
630
            if optargfn:
582
 
                if not it:
583
 
                    bailout('option %r needs an argument' % a)
584
 
                opts[optname] = optargfn(it.next())
 
631
                if optarg == None:
 
632
                    if not argv:
 
633
                        bailout('option %r needs an argument' % a)
 
634
                    else:
 
635
                        optarg = argv.pop(0)
 
636
                opts[optname] = optargfn(optarg)
585
637
                mutter("    option argument %r" % opts[optname])
586
638
            else:
587
 
                # takes no option argument
 
639
                if optarg != None:
 
640
                    bailout('option %r takes no argument' % optname)
588
641
                opts[optname] = True
589
 
        elif a[:1] == '-':
590
 
            bailout('unknown short option %r' % a)
591
642
        else:
592
643
            args.append(a)
593
644
 
612
663
    argdict = {}
613
664
    # TODO: Need a way to express 'cp SRC... DEST', where it matches
614
665
    # all but one.
 
666
 
615
667
    for ap in argform:
616
668
        argname = ap[:-1]
617
669
        if ap[-1] == '?':
649
701
    logging and error handling.
650
702
    """
651
703
    try:
652
 
        args, opts = parse_args(argv)
 
704
        args, opts = parse_args(argv[1:])
653
705
        if 'help' in opts:
654
706
            # TODO: pass down other arguments in case they asked for
655
707
            # help on a command name?
693
745
    ## than just a backtrace.
694
746
 
695
747
    try:
 
748
        # TODO: Lift into separate function in trace.py
 
749
        # TODO: Also show contents of /etc/lsb-release, if it can be parsed.
 
750
        #       Perhaps that should eventually go into the platform library?
 
751
        # TODO: If the file doesn't exist, add a note describing it.
696
752
        t = bzrlib.trace._tracefile
697
753
        t.write('-' * 60 + '\n')
698
754
        t.write('bzr invoked at %s\n' % format_date(time.time()))
699
 
        t.write('  by %s on %s\n' % (bzrlib.osutils.username(), socket.gethostname()))
 
755
        t.write('  by %s on %s\n' % (bzrlib.osutils.username(), socket.getfqdn()))
700
756
        t.write('  arguments: %r\n' % argv)
701
757
 
702
758
        starttime = os.times()[4]