~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commands.py

  • Committer: Martin Pool
  • Date: 2005-03-15 05:19:54 UTC
  • Revision ID: mbp@sourcefrog.net-20050315051954-e4bdd6dfd26f8ecf
witty comment

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
 
115
113
## TODO: Perhaps make UUIDs predictable in test mode to make it easier
116
114
## to compare output?
117
115
 
118
 
 
119
 
 
120
 
 
121
 
######################################################################
122
 
# 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
 
123
131
 
124
132
 
125
133
def cmd_status(all=False):
141
149
    Branch('.').get_revision(revision_id).write_xml(sys.stdout)
142
150
 
143
151
 
144
 
def cmd_get_inventory(inventory_id):
145
 
    """Return inventory in XML by hash"""
146
 
    Branch('.').get_inventory(inventory_hash).write_xml(sys.stdout)
147
 
 
148
 
 
149
 
def cmd_get_revision_inventory(revision_id):
150
 
    """Output inventory for a revision."""
151
 
    b = Branch('.')
152
 
    b.get_revision_inventory(revision_id).write_xml(sys.stdout)
153
 
 
154
 
 
155
152
def cmd_get_file_text(text_id):
156
153
    """Get contents of a file by hash."""
157
154
    sf = Branch('.').text_store[text_id]
194
191
def cmd_info():
195
192
    b = Branch('.')
196
193
    print 'branch format:', b.controlfile('branch-format', 'r').readline().rstrip('\n')
197
 
    print 'revision number:', b.revno()
198
 
    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
    
199
243
 
200
244
 
201
245
def cmd_remove(file_list, verbose=False):
324
368
 
325
369
 
326
370
 
327
 
def cmd_log():
 
371
def cmd_log(timezone='original'):
328
372
    """Show log of this branch.
329
373
 
330
374
    :todo: Options for utc; to show ids; to limit range; etc.
331
375
    """
332
 
    Branch('.').write_log()
 
376
    Branch('.').write_log(show_timezone=timezone)
333
377
 
334
378
 
335
379
def cmd_ls(revision=None, verbose=False):
496
540
    'message':                unicode,
497
541
    'revision':               int,
498
542
    'show-ids':               None,
 
543
    'timezone':               str,
499
544
    'verbose':                None,
500
545
    'version':                None,
501
546
    }
513
558
    'commit':                 ['message', 'verbose'],
514
559
    'diff':                   ['revision'],
515
560
    'inventory':              ['revision'],
 
561
    'log':                    ['show-ids', 'timezone'],
516
562
    'ls':                     ['revision', 'verbose'],
 
563
    'remove':                 ['verbose'],
517
564
    'status':                 ['all'],
518
 
    'log':                    ['show-ids'],
519
 
    'remove':                 ['verbose'],
520
565
    }
521
566
 
522
567
 
546
591
    lookup table, something about the available options, what optargs
547
592
    they take, and which commands will accept them.
548
593
 
549
 
    >>> parse_args('bzr --help'.split())
 
594
    >>> parse_args('--help'.split())
550
595
    ([], {'help': True})
551
 
    >>> parse_args('bzr --version'.split())
 
596
    >>> parse_args('--version'.split())
552
597
    ([], {'version': True})
553
 
    >>> parse_args('bzr status --all'.split())
 
598
    >>> parse_args('status --all'.split())
554
599
    (['status'], {'all': True})
 
600
    >>> parse_args('commit --message=biter'.split())
 
601
    (['commit'], {'message': u'biter'})
555
602
    """
556
603
    args = []
557
604
    opts = {}
558
605
 
559
606
    # TODO: Maybe handle '--' to end options?
560
607
 
561
 
    it = iter(argv[1:])
562
 
    while it:
563
 
        a = it.next()
 
608
    while argv:
 
609
        a = argv.pop(0)
564
610
        if a[0] == '-':
 
611
            optarg = None
565
612
            if a[1] == '-':
566
613
                mutter("  got option %r" % a)
567
 
                optname = a[2:]
 
614
                if '=' in a:
 
615
                    optname, optarg = a[2:].split('=', 1)
 
616
                else:
 
617
                    optname = a[2:]
568
618
                if optname not in OPTIONS:
569
619
                    bailout('unknown long option %r' % a)
570
620
            else:
576
626
            if optname in opts:
577
627
                # XXX: Do we ever want to support this, e.g. for -r?
578
628
                bailout('repeated option %r' % a)
 
629
                
579
630
            optargfn = OPTIONS[optname]
580
631
            if optargfn:
581
 
                if not it:
582
 
                    bailout('option %r needs an argument' % a)
583
 
                opts[optname] = optargfn(it.next())
 
632
                if optarg == None:
 
633
                    if not argv:
 
634
                        bailout('option %r needs an argument' % a)
 
635
                    else:
 
636
                        optarg = argv.pop(0)
 
637
                opts[optname] = optargfn(optarg)
584
638
                mutter("    option argument %r" % opts[optname])
585
639
            else:
586
 
                # takes no option argument
 
640
                if optarg != None:
 
641
                    bailout('option %r takes no argument' % optname)
587
642
                opts[optname] = True
588
 
        elif a[:1] == '-':
589
 
            bailout('unknown short option %r' % a)
590
643
        else:
591
644
            args.append(a)
592
645
 
611
664
    argdict = {}
612
665
    # TODO: Need a way to express 'cp SRC... DEST', where it matches
613
666
    # all but one.
 
667
 
614
668
    for ap in argform:
615
669
        argname = ap[:-1]
616
670
        if ap[-1] == '?':
648
702
    logging and error handling.
649
703
    """
650
704
    try:
651
 
        args, opts = parse_args(argv)
 
705
        args, opts = parse_args(argv[1:])
652
706
        if 'help' in opts:
653
707
            # TODO: pass down other arguments in case they asked for
654
708
            # help on a command name?
692
746
    ## than just a backtrace.
693
747
 
694
748
    try:
 
749
        # TODO: Lift into separate function in trace.py
 
750
        # TODO: Also show contents of /etc/lsb-release, if it can be parsed.
 
751
        #       Perhaps that should eventually go into the platform library?
 
752
        # TODO: If the file doesn't exist, add a note describing it.
695
753
        t = bzrlib.trace._tracefile
696
754
        t.write('-' * 60 + '\n')
697
755
        t.write('bzr invoked at %s\n' % format_date(time.time()))
698
 
        t.write('  by %s on %s\n' % (bzrlib.osutils.username(), socket.gethostname()))
 
756
        t.write('  by %s on %s\n' % (bzrlib.osutils.username(), socket.getfqdn()))
699
757
        t.write('  arguments: %r\n' % argv)
700
758
 
701
759
        starttime = os.times()[4]