~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commands.py

  • Committer: Martin Pool
  • Date: 2005-07-11 05:46:55 UTC
  • Revision ID: mbp@sourcefrog.net-20050711054655-47ea25e1f75a8813
- ignore tmp dir

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
import sys, os
20
20
 
21
21
import bzrlib
22
 
from bzrlib.trace import mutter, note, log_error, warning
 
22
from bzrlib.trace import mutter, note, log_error
23
23
from bzrlib.errors import BzrError, BzrCheckError, BzrCommandError
24
24
from bzrlib.branch import find_branch
25
25
from bzrlib import BZRDIR
54
54
def _parse_revision_str(revstr):
55
55
    """This handles a revision string -> revno. 
56
56
 
57
 
    It supports integers directly, but everything else it
58
 
    defers for passing to Branch.get_revision_info()
59
 
 
60
 
    >>> _parse_revision_str('234')
61
 
    [234]
62
 
    >>> _parse_revision_str('234..567')
63
 
    [234, 567]
64
 
    >>> _parse_revision_str('..')
65
 
    [None, None]
66
 
    >>> _parse_revision_str('..234')
67
 
    [None, 234]
68
 
    >>> _parse_revision_str('234..')
69
 
    [234, None]
70
 
    >>> _parse_revision_str('234..456..789') # Maybe this should be an error
71
 
    [234, 456, 789]
72
 
    >>> _parse_revision_str('234....789') # Error?
73
 
    [234, None, 789]
74
 
    >>> _parse_revision_str('revid:test@other.com-234234')
75
 
    ['revid:test@other.com-234234']
76
 
    >>> _parse_revision_str('revid:test@other.com-234234..revid:test@other.com-234235')
77
 
    ['revid:test@other.com-234234', 'revid:test@other.com-234235']
78
 
    >>> _parse_revision_str('revid:test@other.com-234234..23')
79
 
    ['revid:test@other.com-234234', 23]
80
 
    >>> _parse_revision_str('date:2005-04-12')
81
 
    ['date:2005-04-12']
82
 
    >>> _parse_revision_str('date:2005-04-12 12:24:33')
83
 
    ['date:2005-04-12 12:24:33']
84
 
    >>> _parse_revision_str('date:2005-04-12T12:24:33')
85
 
    ['date:2005-04-12T12:24:33']
86
 
    >>> _parse_revision_str('date:2005-04-12,12:24:33')
87
 
    ['date:2005-04-12,12:24:33']
88
 
    >>> _parse_revision_str('-5..23')
89
 
    [-5, 23]
90
 
    >>> _parse_revision_str('-5')
91
 
    [-5]
92
 
    >>> _parse_revision_str('123a')
93
 
    ['123a']
94
 
    >>> _parse_revision_str('abc')
95
 
    ['abc']
 
57
    There are several possibilities:
 
58
 
 
59
        '234'       -> 234
 
60
        '234:345'   -> [234, 345]
 
61
        ':234'      -> [None, 234]
 
62
        '234:'      -> [234, None]
 
63
 
 
64
    In the future we will also support:
 
65
        'uuid:blah-blah-blah'   -> ?
 
66
        'hash:blahblahblah'     -> ?
 
67
        potentially:
 
68
        'tag:mytag'             -> ?
96
69
    """
97
 
    import re
98
 
    old_format_re = re.compile('\d*:\d*')
99
 
    m = old_format_re.match(revstr)
100
 
    if m:
101
 
        warning('Colon separator for revision numbers is deprecated.'
102
 
                ' Use .. instead')
103
 
        revs = []
104
 
        for rev in revstr.split(':'):
105
 
            if rev:
106
 
                revs.append(int(rev))
107
 
            else:
108
 
                revs.append(None)
109
 
        return revs
110
 
    revs = []
111
 
    for x in revstr.split('..'):
112
 
        if not x:
113
 
            revs.append(None)
114
 
        else:
115
 
            try:
116
 
                revs.append(int(x))
117
 
            except ValueError:
118
 
                revs.append(x)
 
70
    if revstr.find(':') != -1:
 
71
        revs = revstr.split(':')
 
72
        if len(revs) > 2:
 
73
            raise ValueError('More than 2 pieces not supported for --revision: %r' % revstr)
 
74
 
 
75
        if not revs[0]:
 
76
            revs[0] = None
 
77
        else:
 
78
            revs[0] = int(revs[0])
 
79
 
 
80
        if not revs[1]:
 
81
            revs[1] = None
 
82
        else:
 
83
            revs[1] = int(revs[1])
 
84
    else:
 
85
        revs = int(revstr)
119
86
    return revs
120
87
 
121
88
 
367
334
    def run(self):
368
335
        print find_branch('.').revno()
369
336
 
370
 
class cmd_revision_info(Command):
371
 
    """Show revision number and revision id for a given revision identifier.
372
 
    """
373
 
    hidden = True
374
 
    takes_args = ['revision_info*']
375
 
    takes_options = ['revision']
376
 
    def run(self, revision=None, revision_info_list=None):
377
 
        from bzrlib.branch import find_branch
378
 
 
379
 
        revs = []
380
 
        if revision is not None:
381
 
            revs.extend(revision)
382
 
        if revision_info_list is not None:
383
 
            revs.extend(revision_info_list)
384
 
        if len(revs) == 0:
385
 
            raise BzrCommandError('You must supply a revision identifier')
386
 
 
387
 
        b = find_branch('.')
388
 
 
389
 
        for rev in revs:
390
 
            print '%4d %s' % b.get_revision_info(rev)
391
 
 
392
337
    
393
338
class cmd_add(Command):
394
339
    """Add specified files or directories.
456
401
        if revision == None:
457
402
            inv = b.read_working_inventory()
458
403
        else:
459
 
            if len(revision) > 1:
460
 
                raise BzrCommandError('bzr inventory --revision takes'
461
 
                    ' exactly one revision identifier')
462
 
            inv = b.get_revision_inventory(b.lookup_revision(revision[0]))
 
404
            inv = b.get_revision_inventory(b.lookup_revision(revision))
463
405
 
464
406
        for path, entry in inv.entries():
465
407
            if show_ids:
587
529
        from meta_store import CachedStore
588
530
        import tempfile
589
531
        cache_root = tempfile.mkdtemp()
590
 
 
591
 
        if revision is None:
592
 
            revision = [None]
593
 
        else:
594
 
            if len(revision) > 1:
595
 
                raise BzrCommandError('bzr branch --revision takes exactly 1 revision value')
596
532
        try:
597
533
            try:
598
534
                br_from = find_cached_branch(from_location, cache_root)
619
555
                    raise
620
556
            br_to = Branch(to_location, init=True)
621
557
 
622
 
            br_to.set_root_id(br_from.get_root_id())
623
 
 
624
 
            if revision:
625
 
                if revision[0] is None:
626
 
                    revno = br_from.revno()
627
 
                else:
628
 
                    revno, rev_id = br_from.get_revision_info(revision[0])
629
 
                try:
630
 
                    br_to.update_revisions(br_from, stop_revision=revno)
631
 
                except NoSuchRevision:
632
 
                    rmtree(to_location)
633
 
                    msg = "The branch %s has no revision %d." % (from_location,
634
 
                                                                 revno)
635
 
                    raise BzrCommandError(msg)
636
 
            
 
558
            try:
 
559
                br_to.update_revisions(br_from, stop_revision=revision)
 
560
            except NoSuchRevision:
 
561
                rmtree(to_location)
 
562
                msg = "The branch %s has no revision %d." % (from_location,
 
563
                                                             revision)
 
564
                raise BzrCommandError(msg)
637
565
            merge((to_location, -1), (to_location, 0), this_dir=to_location,
638
566
                  check_clean=False, ignore_zero=True)
639
567
            from_location = pull_loc(br_from)
807
735
                file_list = None
808
736
        else:
809
737
            b = find_branch('.')
810
 
 
811
 
        # TODO: Make show_diff support taking 2 arguments
812
 
        base_rev = None
813
 
        if revision is not None:
814
 
            if len(revision) != 1:
815
 
                raise BzrCommandError('bzr diff --revision takes exactly one revision identifier')
816
 
            base_rev = revision[0]
817
738
    
818
 
        show_diff(b, base_rev, specific_files=file_list,
 
739
        show_diff(b, revision, specific_files=file_list,
819
740
                  external_diff_options=diff_options)
820
741
 
821
742
 
896
817
    -r revision requests a specific revision, -r :end or -r begin: are
897
818
    also valid.
898
819
 
899
 
    --message allows you to give a regular expression, which will be evaluated
900
 
    so that only matching entries will be displayed.
901
 
 
902
820
    TODO: Make --revision support uuid: and hash: [future tag:] notation.
903
821
  
904
822
    """
905
823
 
906
824
    takes_args = ['filename?']
907
 
    takes_options = ['forward', 'timezone', 'verbose', 'show-ids', 'revision','long', 'message']
 
825
    takes_options = ['forward', 'timezone', 'verbose', 'show-ids', 'revision','long']
908
826
    
909
827
    def run(self, filename=None, timezone='original',
910
828
            verbose=False,
911
829
            show_ids=False,
912
830
            forward=False,
913
831
            revision=None,
914
 
            message=None,
915
832
            long=False):
916
833
        from bzrlib.branch import find_branch
917
834
        from bzrlib.log import log_formatter, show_log
930
847
            b = find_branch('.')
931
848
            file_id = None
932
849
 
933
 
        if revision is None:
934
 
            rev1 = None
935
 
            rev2 = None
936
 
        elif len(revision) == 1:
937
 
            rev1 = rev2 = b.get_revision_info(revision[0])[0]
938
 
        elif len(revision) == 2:
939
 
            rev1 = b.get_revision_info(revision[0])[0]
940
 
            rev2 = b.get_revision_info(revision[1])[0]
 
850
        if revision == None:
 
851
            revision = [None, None]
 
852
        elif isinstance(revision, int):
 
853
            revision = [revision, revision]
941
854
        else:
942
 
            raise BzrCommandError('bzr log --revision takes one or two values.')
943
 
 
944
 
        if rev1 == 0:
945
 
            rev1 = None
946
 
        if rev2 == 0:
947
 
            rev2 = None
 
855
            # pair of revisions?
 
856
            pass
 
857
            
 
858
        assert len(revision) == 2
948
859
 
949
860
        mutter('encoding log as %r' % bzrlib.user_encoding)
950
861
 
966
877
                 file_id,
967
878
                 verbose=verbose,
968
879
                 direction=direction,
969
 
                 start_revision=rev1,
970
 
                 end_revision=rev2,
971
 
                 search=message)
 
880
                 start_revision=revision[0],
 
881
                 end_revision=revision[1])
972
882
 
973
883
 
974
884
 
1130
1040
    def run(self, dest, revision=None, format=None, root=None):
1131
1041
        import os.path
1132
1042
        b = find_branch('.')
1133
 
        if revision is None:
1134
 
            rev_id = b.last_patch()
 
1043
        if revision == None:
 
1044
            rh = b.revision_history()[-1]
1135
1045
        else:
1136
 
            if len(revision) != 1:
1137
 
                raise BzrError('bzr export --revision takes exactly 1 argument')
1138
 
            revno, rev_id = b.get_revision_info(revision[0])
1139
 
        t = b.revision_tree(rev_id)
 
1046
            rh = b.lookup_revision(int(revision))
 
1047
        t = b.revision_tree(rh)
1140
1048
        root, ext = os.path.splitext(dest)
1141
1049
        if not format:
1142
1050
            if ext in (".tar",):
1159
1067
    def run(self, filename, revision=None):
1160
1068
        if revision == None:
1161
1069
            raise BzrCommandError("bzr cat requires a revision number")
1162
 
        elif len(revision) != 1:
1163
 
            raise BzrCommandError("bzr cat --revision takes exactly one number")
1164
1070
        b = find_branch('.')
1165
 
        b.print_file(b.relpath(filename), revision[0])
 
1071
        b.print_file(b.relpath(filename), int(revision))
1166
1072
 
1167
1073
 
1168
1074
class cmd_local_time_offset(Command):
1316
1222
    ['..', -1]
1317
1223
    >>> parse_spec("../f/@35")
1318
1224
    ['../f', 35]
1319
 
    >>> parse_spec('./@revid:john@arbash-meinel.com-20050711044610-3ca0327c6a222f67')
1320
 
    ['.', 'revid:john@arbash-meinel.com-20050711044610-3ca0327c6a222f67']
1321
1225
    """
1322
1226
    if spec is None:
1323
1227
        return [None, None]
1327
1231
        if parsed[1] == "":
1328
1232
            parsed[1] = -1
1329
1233
        else:
1330
 
            try:
1331
 
                parsed[1] = int(parsed[1])
1332
 
            except ValueError:
1333
 
                pass # We can allow stuff like ./@revid:blahblahblah
1334
 
            else:
1335
 
                assert parsed[1] >=0
 
1234
            parsed[1] = int(parsed[1])
 
1235
            assert parsed[1] >=0
1336
1236
    else:
1337
1237
        parsed = [spec, None]
1338
1238
    return parsed
1396
1296
    """
1397
1297
    takes_options = ['revision']
1398
1298
 
1399
 
    def run(self, revision=None):
 
1299
    def run(self, revision=-1):
1400
1300
        from bzrlib.merge import merge
1401
 
        if revision is None:
1402
 
            revision = [-1]
1403
 
        elif len(revision) != 1:
1404
 
            raise BzrCommandError('bzr merge-revert --revision takes exactly 1 argument')
1405
 
        merge(('.', revision[0]), parse_spec('.'),
 
1301
        merge(('.', revision), parse_spec('.'),
1406
1302
              check_clean=False,
1407
1303
              ignore_zero=True)
1408
1304
 
1433
1329
    hidden = True
1434
1330
    def run(self):
1435
1331
        import bzrlib.plugin
1436
 
        from inspect import getdoc
1437
1332
        from pprint import pprint
1438
 
        for plugin in bzrlib.plugin.all_plugins:
1439
 
            print plugin.__path__[0]
1440
 
            d = getdoc(plugin)
1441
 
            if d:
1442
 
                print '\t', d.split('\n')[0]
1443
 
 
1444
 
        #pprint(bzrlib.plugin.all_plugins)
 
1333
        pprint(bzrlib.plugin.all_plugins)
1445
1334
 
1446
1335
 
1447
1336
 
1498
1387
    >>> parse_args('commit --message=biter'.split())
1499
1388
    (['commit'], {'message': u'biter'})
1500
1389
    >>> parse_args('log -r 500'.split())
1501
 
    (['log'], {'revision': [500]})
1502
 
    >>> parse_args('log -r500..600'.split())
 
1390
    (['log'], {'revision': 500})
 
1391
    >>> parse_args('log -r500:600'.split())
1503
1392
    (['log'], {'revision': [500, 600]})
1504
 
    >>> parse_args('log -vr500..600'.split())
 
1393
    >>> parse_args('log -vr500:600'.split())
1505
1394
    (['log'], {'verbose': True, 'revision': [500, 600]})
1506
 
    >>> parse_args('log -rv500..600'.split()) #the r takes an argument
1507
 
    (['log'], {'revision': ['v500', 600]})
 
1395
    >>> parse_args('log -rv500:600'.split()) #the r takes an argument
 
1396
    Traceback (most recent call last):
 
1397
    ...
 
1398
    ValueError: invalid literal for int(): v500
1508
1399
    """
1509
1400
    args = []
1510
1401
    opts = {}