~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 06:13:18 UTC
  • mfrom: (unknown (missing))
  • Revision ID: mbp@sourcefrog.net-20050711061318-80557a9f045b1f38
- merge john's revision-naming code

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
 
22
from bzrlib.trace import mutter, note, log_error, warning
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
 
    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'             -> ?
 
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']
69
96
    """
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)
 
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)
86
119
    return revs
87
120
 
88
121
 
334
367
    def run(self):
335
368
        print find_branch('.').revno()
336
369
 
 
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
 
337
392
    
338
393
class cmd_add(Command):
339
394
    """Add specified files or directories.
401
456
        if revision == None:
402
457
            inv = b.read_working_inventory()
403
458
        else:
404
 
            inv = b.get_revision_inventory(b.lookup_revision(revision))
 
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]))
405
463
 
406
464
        for path, entry in inv.entries():
407
465
            if show_ids:
529
587
        from meta_store import CachedStore
530
588
        import tempfile
531
589
        cache_root = tempfile.mkdtemp()
 
590
 
 
591
        if revision is not None:
 
592
            if len(revision) > 1:
 
593
                raise BzrCommandError('bzr branch --revision takes exactly 1 revision value')
532
594
        try:
533
595
            try:
534
596
                br_from = find_cached_branch(from_location, cache_root)
555
617
                    raise
556
618
            br_to = Branch(to_location, init=True)
557
619
 
 
620
            revno = br_to.lookup_revision(revision[0])
558
621
            try:
559
 
                br_to.update_revisions(br_from, stop_revision=revision)
 
622
                br_to.update_revisions(br_from, stop_revision=revno)
560
623
            except NoSuchRevision:
561
624
                rmtree(to_location)
562
625
                msg = "The branch %s has no revision %d." % (from_location,
563
 
                                                             revision)
 
626
                                                             revno)
564
627
                raise BzrCommandError(msg)
565
628
            merge((to_location, -1), (to_location, 0), this_dir=to_location,
566
629
                  check_clean=False, ignore_zero=True)
735
798
                file_list = None
736
799
        else:
737
800
            b = find_branch('.')
 
801
 
 
802
        # TODO: Make show_diff support taking 2 arguments
 
803
        base_rev = None
 
804
        if revision is not None:
 
805
            if len(revision) != 1:
 
806
                raise BzrCommandError('bzr diff --revision takes exactly one revision identifier')
 
807
            base_rev = revision[0]
738
808
    
739
 
        show_diff(b, revision, specific_files=file_list,
 
809
        show_diff(b, base_rev, specific_files=file_list,
740
810
                  external_diff_options=diff_options)
741
811
 
742
812
 
847
917
            b = find_branch('.')
848
918
            file_id = None
849
919
 
850
 
        if revision == None:
851
 
            revision = [None, None]
852
 
        elif isinstance(revision, int):
853
 
            revision = [revision, revision]
 
920
        if revision is None:
 
921
            rev1 = None
 
922
            rev2 = None
 
923
        elif len(revision) == 1:
 
924
            rev1 = rev2 = b.get_revision_info(revision[0])[0]
 
925
        elif len(revision) == 2:
 
926
            rev1 = b.get_revision_info(revision[0])[0]
 
927
            rev2 = b.get_revision_info(revision[1])[0]
854
928
        else:
855
 
            # pair of revisions?
856
 
            pass
857
 
            
858
 
        assert len(revision) == 2
 
929
            raise BzrCommandError('bzr log --revision takes one or two values.')
 
930
 
 
931
        if rev1 == 0:
 
932
            rev1 = None
 
933
        if rev2 == 0:
 
934
            rev2 = None
859
935
 
860
936
        mutter('encoding log as %r' % bzrlib.user_encoding)
861
937
 
877
953
                 file_id,
878
954
                 verbose=verbose,
879
955
                 direction=direction,
880
 
                 start_revision=revision[0],
881
 
                 end_revision=revision[1])
 
956
                 start_revision=rev1,
 
957
                 end_revision=rev2)
882
958
 
883
959
 
884
960
 
1040
1116
    def run(self, dest, revision=None, format=None, root=None):
1041
1117
        import os.path
1042
1118
        b = find_branch('.')
1043
 
        if revision == None:
1044
 
            rh = b.revision_history()[-1]
 
1119
        if revision is None:
 
1120
            rev_id = b.last_patch()
1045
1121
        else:
1046
 
            rh = b.lookup_revision(int(revision))
1047
 
        t = b.revision_tree(rh)
 
1122
            if len(revision) != 1:
 
1123
                raise BzrError('bzr export --revision takes exactly 1 argument')
 
1124
            revno, rev_id = b.get_revision_info(revision[0])
 
1125
        t = b.revision_tree(rev_id)
1048
1126
        root, ext = os.path.splitext(dest)
1049
1127
        if not format:
1050
1128
            if ext in (".tar",):
1067
1145
    def run(self, filename, revision=None):
1068
1146
        if revision == None:
1069
1147
            raise BzrCommandError("bzr cat requires a revision number")
 
1148
        elif len(revision) != 1:
 
1149
            raise BzrCommandError("bzr cat --revision takes exactly one number")
1070
1150
        b = find_branch('.')
1071
 
        b.print_file(b.relpath(filename), int(revision))
 
1151
        b.print_file(b.relpath(filename), revision[0])
1072
1152
 
1073
1153
 
1074
1154
class cmd_local_time_offset(Command):
1222
1302
    ['..', -1]
1223
1303
    >>> parse_spec("../f/@35")
1224
1304
    ['../f', 35]
 
1305
    >>> parse_spec('./@revid:john@arbash-meinel.com-20050711044610-3ca0327c6a222f67')
 
1306
    ['.', 'revid:john@arbash-meinel.com-20050711044610-3ca0327c6a222f67']
1225
1307
    """
1226
1308
    if spec is None:
1227
1309
        return [None, None]
1231
1313
        if parsed[1] == "":
1232
1314
            parsed[1] = -1
1233
1315
        else:
1234
 
            parsed[1] = int(parsed[1])
1235
 
            assert parsed[1] >=0
 
1316
            try:
 
1317
                parsed[1] = int(parsed[1])
 
1318
            except ValueError:
 
1319
                pass # We can allow stuff like ./@revid:blahblahblah
 
1320
            else:
 
1321
                assert parsed[1] >=0
1236
1322
    else:
1237
1323
        parsed = [spec, None]
1238
1324
    return parsed
1296
1382
    """
1297
1383
    takes_options = ['revision']
1298
1384
 
1299
 
    def run(self, revision=-1):
 
1385
    def run(self, revision=None):
1300
1386
        from bzrlib.merge import merge
1301
 
        merge(('.', revision), parse_spec('.'),
 
1387
        if revision is None:
 
1388
            revision = -1
 
1389
        elif len(revision) != 1:
 
1390
            raise BzrCommandError('bzr merge-revert --revision takes exactly 1 argument')
 
1391
        merge(('.', revision[0]), parse_spec('.'),
1302
1392
              check_clean=False,
1303
1393
              ignore_zero=True)
1304
1394
 
1387
1477
    >>> parse_args('commit --message=biter'.split())
1388
1478
    (['commit'], {'message': u'biter'})
1389
1479
    >>> parse_args('log -r 500'.split())
1390
 
    (['log'], {'revision': 500})
1391
 
    >>> parse_args('log -r500:600'.split())
 
1480
    (['log'], {'revision': [500]})
 
1481
    >>> parse_args('log -r500..600'.split())
1392
1482
    (['log'], {'revision': [500, 600]})
1393
 
    >>> parse_args('log -vr500:600'.split())
 
1483
    >>> parse_args('log -vr500..600'.split())
1394
1484
    (['log'], {'verbose': True, 'revision': [500, 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
 
1485
    >>> parse_args('log -rv500..600'.split()) #the r takes an argument
 
1486
    (['log'], {'revision': ['v500', 600]})
1399
1487
    """
1400
1488
    args = []
1401
1489
    opts = {}