~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

  • Committer: Martin Pool
  • Date: 2005-09-22 13:32:02 UTC
  • Revision ID: mbp@sourcefrog.net-20050922133202-347cfd35d2941dd5
- simple weave-based annotate code (not complete)

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
import bzrlib.trace
23
23
from bzrlib.trace import mutter, note, log_error, warning
24
24
from bzrlib.errors import BzrError, BzrCheckError, BzrCommandError, NotBranchError
25
 
from bzrlib.branch import Branch
 
25
from bzrlib.branch import find_branch
26
26
from bzrlib import BZRDIR
27
27
from bzrlib.commands import Command
28
28
 
63
63
    files or directories is reported.  If a directory is given, status
64
64
    is reported for everything inside that directory.
65
65
 
66
 
    If a revision argument is given, the status is calculated against
67
 
    that revision, or between two revisions if two are provided.
 
66
    If a revision is specified, the changes since that revision are shown.
68
67
    """
69
 
    # XXX: FIXME: bzr status should accept a -r option to show changes
70
 
    # relative to a revision, or between revisions
71
 
 
72
68
    takes_args = ['file*']
73
69
    takes_options = ['all', 'show-ids', 'revision']
74
70
    aliases = ['st', 'stat']
75
71
    
76
 
    def run(self, all=False, show_ids=False, file_list=None, revision=None):
 
72
    def run(self, all=False, show_ids=False, file_list=None):
77
73
        if file_list:
78
 
            b = Branch.open_containing(file_list[0])
 
74
            b = find_branch(file_list[0])
79
75
            file_list = [b.relpath(x) for x in file_list]
80
76
            # special case: only one path was given and it's the root
81
77
            # of the branch
82
78
            if file_list == ['']:
83
79
                file_list = None
84
80
        else:
85
 
            b = Branch.open_containing('.')
 
81
            b = find_branch('.')
86
82
            
87
83
        from bzrlib.status import show_status
88
84
        show_status(b, show_unchanged=all, show_ids=show_ids,
89
 
                    specific_files=file_list, revision=revision)
 
85
                    specific_files=file_list)
90
86
 
91
87
 
92
88
class cmd_cat_revision(Command):
93
 
    """Write out metadata for a revision.
94
 
    
95
 
    The revision to print can either be specified by a specific
96
 
    revision identifier, or you can use --revision.
97
 
    """
 
89
    """Write out metadata for a revision."""
98
90
 
99
91
    hidden = True
100
 
    takes_args = ['revision_id?']
101
 
    takes_options = ['revision']
 
92
    takes_args = ['revision_id']
102
93
    
103
 
    def run(self, revision_id=None, revision=None):
104
 
        from bzrlib.revisionspec import RevisionSpec
 
94
    def run(self, revision_id):
 
95
        b = find_branch('.')
 
96
        sys.stdout.write(b.get_revision_xml_file(revision_id).read())
105
97
 
106
 
        if revision_id is not None and revision is not None:
107
 
            raise BzrCommandError('You can only supply one of revision_id or --revision')
108
 
        if revision_id is None and revision is None:
109
 
            raise BzrCommandError('You must supply either --revision or a revision_id')
110
 
        b = Branch.open_containing('.')
111
 
        if revision_id is not None:
112
 
            sys.stdout.write(b.get_revision_xml_file(revision_id).read())
113
 
        elif revision is not None:
114
 
            for rev in revision:
115
 
                if rev is None:
116
 
                    raise BzrCommandError('You cannot specify a NULL revision.')
117
 
                revno, rev_id = rev.in_history(b)
118
 
                sys.stdout.write(b.get_revision_xml_file(rev_id).read())
119
 
    
120
98
 
121
99
class cmd_revno(Command):
122
100
    """Show current revision number.
123
101
 
124
102
    This is equal to the number of revisions on this branch."""
125
103
    def run(self):
126
 
        print Branch.open_containing('.').revno()
 
104
        print find_branch('.').revno()
127
105
 
128
106
 
129
107
class cmd_revision_info(Command):
132
110
    hidden = True
133
111
    takes_args = ['revision_info*']
134
112
    takes_options = ['revision']
135
 
    def run(self, revision=None, revision_info_list=[]):
136
 
        from bzrlib.revisionspec import RevisionSpec
 
113
    def run(self, revision=None, revision_info_list=None):
 
114
        from bzrlib.branch import find_branch
137
115
 
138
116
        revs = []
139
117
        if revision is not None:
140
118
            revs.extend(revision)
141
119
        if revision_info_list is not None:
142
 
            for rev in revision_info_list:
143
 
                revs.append(RevisionSpec(rev))
 
120
            revs.extend(revision_info_list)
144
121
        if len(revs) == 0:
145
122
            raise BzrCommandError('You must supply a revision identifier')
146
123
 
147
 
        b = Branch.open_containing('.')
 
124
        b = find_branch('.')
148
125
 
149
126
        for rev in revs:
150
 
            revinfo = rev.in_history(b)
151
 
            if revinfo.revno is None:
152
 
                print '     %s' % revinfo.rev_id
153
 
            else:
154
 
                print '%4d %s' % (revinfo.revno, revinfo.rev_id)
 
127
            print '%4d %s' % b.get_revision_info(rev)
155
128
 
156
129
    
157
130
class cmd_add(Command):
172
145
    Therefore simply saying 'bzr add' will version all files that
173
146
    are currently unknown.
174
147
 
175
 
    Adding a file whose parent directory is not versioned will
176
 
    implicitly add the parent, and so on up to the root. This means
177
 
    you should never need to explictly add a directory, they'll just
178
 
    get added when you add a file in the directory.
 
148
    TODO: Perhaps adding a file whose directly is not versioned should
 
149
    recursively add that parent, rather than giving an error?
179
150
    """
180
151
    takes_args = ['file*']
181
152
    takes_options = ['verbose', 'no-recurse']
200
171
        for d in dir_list:
201
172
            os.mkdir(d)
202
173
            if not b:
203
 
                b = Branch.open_containing(d)
 
174
                b = find_branch(d)
204
175
            b.add([d])
205
176
            print 'added', d
206
177
 
211
182
    hidden = True
212
183
    
213
184
    def run(self, filename):
214
 
        print Branch.open_containing(filename).relpath(filename)
 
185
        print find_branch(filename).relpath(filename)
215
186
 
216
187
 
217
188
 
220
191
    takes_options = ['revision', 'show-ids']
221
192
    
222
193
    def run(self, revision=None, show_ids=False):
223
 
        b = Branch.open_containing('.')
224
 
        if revision is None:
 
194
        b = find_branch('.')
 
195
        if revision == None:
225
196
            inv = b.read_working_inventory()
226
197
        else:
227
198
            if len(revision) > 1:
228
199
                raise BzrCommandError('bzr inventory --revision takes'
229
200
                    ' exactly one revision identifier')
230
 
            inv = b.get_revision_inventory(revision[0].in_history(b).rev_id)
 
201
            inv = b.get_revision_inventory(b.lookup_revision(revision[0]))
231
202
 
232
203
        for path, entry in inv.entries():
233
204
            if show_ids:
246
217
    """
247
218
    takes_args = ['source$', 'dest']
248
219
    def run(self, source_list, dest):
249
 
        b = Branch.open_containing('.')
 
220
        b = find_branch('.')
250
221
 
251
222
        # TODO: glob expansion on windows?
252
223
        b.move([b.relpath(s) for s in source_list], b.relpath(dest))
269
240
    takes_args = ['from_name', 'to_name']
270
241
    
271
242
    def run(self, from_name, to_name):
272
 
        b = Branch.open_containing('.')
 
243
        b = find_branch('.')
273
244
        b.rename_one(b.relpath(from_name), b.relpath(to_name))
274
245
 
275
246
 
291
262
    def run(self, names_list):
292
263
        if len(names_list) < 2:
293
264
            raise BzrCommandError("missing file argument")
294
 
        b = Branch.open_containing(names_list[0])
 
265
        b = find_branch(names_list[0])
295
266
 
296
267
        rel_names = [b.relpath(x) for x in names_list]
297
268
        
303
274
            if len(names_list) != 2:
304
275
                raise BzrCommandError('to mv multiple files the destination '
305
276
                                      'must be a versioned directory')
306
 
            b.rename_one(rel_names[0], rel_names[1])
307
 
            print "%s => %s" % (rel_names[0], rel_names[1])
 
277
            for pair in b.move(rel_names[0], rel_names[1]):
 
278
                print "%s => %s" % pair
308
279
            
309
280
    
310
281
 
330
301
        import tempfile
331
302
        from shutil import rmtree
332
303
        import errno
 
304
        from bzrlib.branch import pull_loc
333
305
        
334
 
        br_to = Branch.open_containing('.')
335
 
        stored_loc = br_to.get_parent()
 
306
        br_to = find_branch('.')
 
307
        stored_loc = None
 
308
        try:
 
309
            stored_loc = br_to.controlfile("x-pull", "rb").read().rstrip('\n')
 
310
        except IOError, e:
 
311
            if e.errno != errno.ENOENT:
 
312
                raise
336
313
        if location is None:
337
314
            if stored_loc is None:
338
315
                raise BzrCommandError("No pull location known or specified.")
340
317
                print "Using last location: %s" % stored_loc
341
318
                location = stored_loc
342
319
        cache_root = tempfile.mkdtemp()
343
 
        from bzrlib.errors import DivergedBranches
344
 
        br_from = Branch.open_containing(location)
345
 
        location = br_from.base
 
320
        from bzrlib.branch import DivergedBranches
 
321
        br_from = find_branch(location)
 
322
        location = pull_loc(br_from)
346
323
        old_revno = br_to.revno()
347
324
        try:
348
 
            from bzrlib.errors import DivergedBranches
349
 
            br_from = Branch.open(location)
350
 
            br_from.setup_caching(cache_root)
351
 
            location = br_from.base
 
325
            from branch import find_cached_branch, DivergedBranches
 
326
            br_from = find_cached_branch(location, cache_root)
 
327
            location = pull_loc(br_from)
352
328
            old_revno = br_to.revno()
353
329
            try:
354
330
                br_to.update_revisions(br_from)
358
334
                
359
335
            merge(('.', -1), ('.', old_revno), check_clean=False)
360
336
            if location != stored_loc:
361
 
                br_to.set_parent(location)
 
337
                br_to.controlfile("x-pull", "wb").write(location + "\n")
362
338
        finally:
363
339
            rmtree(cache_root)
364
340
 
372
348
 
373
349
    To retrieve the branch as of a particular revision, supply the --revision
374
350
    parameter, as in "branch foo/bar -r 5".
375
 
 
376
 
    --basis is to speed up branching from remote branches.  When specified, it
377
 
    copies all the file-contents, inventory and revision data from the basis
378
 
    branch before copying anything from the remote branch.
379
351
    """
380
352
    takes_args = ['from_location', 'to_location?']
381
 
    takes_options = ['revision', 'basis']
 
353
    takes_options = ['revision']
382
354
    aliases = ['get', 'clone']
383
355
 
384
 
    def run(self, from_location, to_location=None, revision=None, basis=None):
385
 
        from bzrlib.branch import copy_branch
 
356
    def run(self, from_location, to_location=None, revision=None):
 
357
        from bzrlib.branch import copy_branch, find_cached_branch
386
358
        import tempfile
387
359
        import errno
388
360
        from shutil import rmtree
394
366
                raise BzrCommandError(
395
367
                    'bzr branch --revision takes exactly 1 revision value')
396
368
            try:
397
 
                br_from = Branch.open(from_location)
 
369
                br_from = find_cached_branch(from_location, cache_root)
398
370
            except OSError, e:
399
371
                if e.errno == errno.ENOENT:
400
372
                    raise BzrCommandError('Source location "%s" does not'
401
373
                                          ' exist.' % to_location)
402
374
                else:
403
375
                    raise
404
 
            br_from.setup_caching(cache_root)
405
 
            if basis is not None:
406
 
                basis_branch = Branch.open_containing(basis)
407
 
            else:
408
 
                basis_branch = None
409
 
            if len(revision) == 1 and revision[0] is not None:
410
 
                revision_id = revision[0].in_history(br_from)[1]
411
 
            else:
412
 
                revision_id = None
413
376
            if to_location is None:
414
377
                to_location = os.path.basename(from_location.rstrip("/\\"))
415
378
            try:
424
387
                else:
425
388
                    raise
426
389
            try:
427
 
                copy_branch(br_from, to_location, revision_id, basis_branch)
 
390
                copy_branch(br_from, to_location, revision[0])
428
391
            except bzrlib.errors.NoSuchRevision:
429
392
                rmtree(to_location)
430
393
                msg = "The branch %s has no revision %d." % (from_location, revision[0])
431
394
                raise BzrCommandError(msg)
432
 
            except bzrlib.errors.UnlistableBranch:
433
 
                msg = "The branch %s cannot be used as a --basis"
434
395
        finally:
435
396
            rmtree(cache_root)
436
397
 
445
406
    takes_args = ['dir?']
446
407
 
447
408
    def run(self, dir='.'):
448
 
        b = Branch.open_containing(dir)
 
409
        b = find_branch(dir)
449
410
        old_inv = b.basis_tree().inventory
450
411
        new_inv = b.read_working_inventory()
451
412
 
462
423
    def run(self, branch=None):
463
424
        import info
464
425
 
465
 
        b = Branch.open_containing(branch)
 
426
        b = find_branch(branch)
466
427
        info.show_info(b)
467
428
 
468
429
 
476
437
    takes_options = ['verbose']
477
438
    
478
439
    def run(self, file_list, verbose=False):
479
 
        b = Branch.open_containing(file_list[0])
 
440
        b = find_branch(file_list[0])
480
441
        b.remove([b.relpath(f) for f in file_list], verbose=verbose)
481
442
 
482
443
 
490
451
    hidden = True
491
452
    takes_args = ['filename']
492
453
    def run(self, filename):
493
 
        b = Branch.open_containing(filename)
 
454
        b = find_branch(filename)
494
455
        i = b.inventory.path2id(b.relpath(filename))
495
456
        if i == None:
496
457
            raise BzrError("%r is not a versioned file" % filename)
506
467
    hidden = True
507
468
    takes_args = ['filename']
508
469
    def run(self, filename):
509
 
        b = Branch.open_containing(filename)
 
470
        b = find_branch(filename)
510
471
        inv = b.inventory
511
472
        fid = inv.path2id(b.relpath(filename))
512
473
        if fid == None:
519
480
    """Display list of revision ids on this branch."""
520
481
    hidden = True
521
482
    def run(self):
522
 
        for patchid in Branch.open_containing('.').revision_history():
 
483
        for patchid in find_branch('.').revision_history():
523
484
            print patchid
524
485
 
525
486
 
535
496
class cmd_directories(Command):
536
497
    """Display list of versioned directories in this branch."""
537
498
    def run(self):
538
 
        for name, ie in Branch.open_containing('.').read_working_inventory().directories():
 
499
        for name, ie in find_branch('.').read_working_inventory().directories():
539
500
            if name == '':
540
501
                print '.'
541
502
            else:
557
518
    """
558
519
    def run(self):
559
520
        from bzrlib.branch import Branch
560
 
        Branch.initialize('.')
 
521
        Branch('.', init=True)
561
522
 
562
523
 
563
524
class cmd_diff(Command):
584
545
    examples:
585
546
        bzr diff
586
547
        bzr diff -r1
587
 
        bzr diff -r1..2
 
548
        bzr diff -r1:2
588
549
    """
589
550
    
590
551
    takes_args = ['file*']
595
556
        from bzrlib.diff import show_diff
596
557
 
597
558
        if file_list:
598
 
            b = Branch.open_containing(file_list[0])
 
559
            b = find_branch(file_list[0])
599
560
            file_list = [b.relpath(f) for f in file_list]
600
561
            if file_list == ['']:
601
562
                # just pointing to top-of-tree
602
563
                file_list = None
603
564
        else:
604
 
            b = Branch.open_containing('.')
 
565
            b = find_branch('.')
605
566
 
606
567
        if revision is not None:
607
568
            if len(revision) == 1:
626
587
    TODO: Show files deleted since a previous revision, or between two revisions.
627
588
    """
628
589
    def run(self, show_ids=False):
629
 
        b = Branch.open_containing('.')
 
590
        b = find_branch('.')
630
591
        old = b.basis_tree()
631
592
        new = b.working_tree()
632
593
 
649
610
    def run(self):
650
611
        from bzrlib.delta import compare_trees
651
612
 
652
 
        b = Branch.open_containing('.')
 
613
        b = find_branch('.')
653
614
        td = compare_trees(b.basis_tree(), b.working_tree())
654
615
 
655
616
        for path, id, kind in td.modified:
661
622
    """List files added in working tree."""
662
623
    hidden = True
663
624
    def run(self):
664
 
        b = Branch.open_containing('.')
 
625
        b = find_branch('.')
665
626
        wt = b.working_tree()
666
627
        basis_inv = b.basis_tree().inventory
667
628
        inv = wt.inventory
683
644
    takes_args = ['filename?']
684
645
    def run(self, filename=None):
685
646
        """Print the branch root."""
686
 
        b = Branch.open_containing(filename)
687
 
        print b.base
 
647
        b = find_branch(filename)
 
648
        print getattr(b, 'base', None) or getattr(b, 'baseurl')
688
649
 
689
650
 
690
651
class cmd_log(Command):
719
680
        direction = (forward and 'forward') or 'reverse'
720
681
        
721
682
        if filename:
722
 
            b = Branch.open_containing(filename)
 
683
            b = find_branch(filename)
723
684
            fp = b.relpath(filename)
724
685
            if fp:
725
686
                file_id = b.read_working_inventory().path2id(fp)
726
687
            else:
727
688
                file_id = None  # points to branch root
728
689
        else:
729
 
            b = Branch.open_containing('.')
 
690
            b = find_branch('.')
730
691
            file_id = None
731
692
 
732
693
        if revision is None:
733
694
            rev1 = None
734
695
            rev2 = None
735
696
        elif len(revision) == 1:
736
 
            rev1 = rev2 = revision[0].in_history(b).revno
 
697
            rev1 = rev2 = b.get_revision_info(revision[0])[0]
737
698
        elif len(revision) == 2:
738
 
            rev1 = revision[0].in_history(b).revno
739
 
            rev2 = revision[1].in_history(b).revno
 
699
            rev1 = b.get_revision_info(revision[0])[0]
 
700
            rev2 = b.get_revision_info(revision[1])[0]
740
701
        else:
741
702
            raise BzrCommandError('bzr log --revision takes one or two values.')
742
703
 
778
739
    hidden = True
779
740
    takes_args = ["filename"]
780
741
    def run(self, filename):
781
 
        b = Branch.open_containing(filename)
 
742
        b = find_branch(filename)
782
743
        inv = b.read_working_inventory()
783
744
        file_id = inv.path2id(b.relpath(filename))
784
745
        for revno, revision_id, what in bzrlib.log.find_touching_revisions(b, file_id):
792
753
    """
793
754
    hidden = True
794
755
    def run(self, revision=None, verbose=False):
795
 
        b = Branch.open_containing('.')
 
756
        b = find_branch('.')
796
757
        if revision == None:
797
758
            tree = b.working_tree()
798
759
        else:
799
 
            tree = b.revision_tree(revision.in_history(b).rev_id)
 
760
            tree = b.revision_tree(b.lookup_revision(revision))
800
761
 
801
762
        for fp, fc, kind, fid in tree.list_files():
802
763
            if verbose:
817
778
    """List unknown files."""
818
779
    def run(self):
819
780
        from bzrlib.osutils import quotefn
820
 
        for f in Branch.open_containing('.').unknowns():
 
781
        for f in find_branch('.').unknowns():
821
782
            print quotefn(f)
822
783
 
823
784
 
845
806
        from bzrlib.atomicfile import AtomicFile
846
807
        import os.path
847
808
 
848
 
        b = Branch.open_containing('.')
 
809
        b = find_branch('.')
849
810
        ifn = b.abspath('.bzrignore')
850
811
 
851
812
        if os.path.exists(ifn):
885
846
 
886
847
    See also: bzr ignore"""
887
848
    def run(self):
888
 
        tree = Branch.open_containing('.').working_tree()
 
849
        tree = find_branch('.').working_tree()
889
850
        for path, file_class, kind, file_id in tree.list_files():
890
851
            if file_class != 'I':
891
852
                continue
909
870
        except ValueError:
910
871
            raise BzrCommandError("not a valid revision-number: %r" % revno)
911
872
 
912
 
        print Branch.open_containing('.').get_rev_id(revno)
 
873
        print find_branch('.').lookup_revision(revno)
913
874
 
914
875
 
915
876
class cmd_export(Command):
928
889
    takes_options = ['revision', 'format', 'root']
929
890
    def run(self, dest, revision=None, format=None, root=None):
930
891
        import os.path
931
 
        b = Branch.open_containing('.')
 
892
        b = find_branch('.')
932
893
        if revision is None:
933
894
            rev_id = b.last_revision()
934
895
        else:
935
896
            if len(revision) != 1:
936
897
                raise BzrError('bzr export --revision takes exactly 1 argument')
937
 
            rev_id = revision[0].in_history(b).rev_id
 
898
            revno, rev_id = b.get_revision_info(revision[0])
938
899
        t = b.revision_tree(rev_id)
939
900
        root, ext = os.path.splitext(dest)
940
901
        if not format:
956
917
    takes_args = ['filename']
957
918
 
958
919
    def run(self, filename, revision=None):
959
 
        if revision is None:
 
920
        if revision == None:
960
921
            raise BzrCommandError("bzr cat requires a revision number")
961
922
        elif len(revision) != 1:
962
923
            raise BzrCommandError("bzr cat --revision takes exactly one number")
963
 
        b = Branch.open_containing('.')
964
 
        b.print_file(b.relpath(filename), revision[0].in_history(b).revno)
 
924
        b = find_branch('.')
 
925
        b.print_file(b.relpath(filename), revision[0])
965
926
 
966
927
 
967
928
class cmd_local_time_offset(Command):
1004
965
        from bzrlib.status import show_status
1005
966
        from cStringIO import StringIO
1006
967
 
1007
 
        b = Branch.open_containing('.')
 
968
        b = find_branch('.')
1008
969
        if selected_list:
1009
970
            selected_list = [b.relpath(s) for s in selected_list]
1010
971
            
1040
1001
 
1041
1002
    This command checks various invariants about the branch storage to
1042
1003
    detect data corruption or bzr bugs.
 
1004
 
 
1005
    If given the --update flag, it will update some optional fields
 
1006
    to help ensure data consistency.
1043
1007
    """
1044
1008
    takes_args = ['dir?']
1045
1009
 
1046
1010
    def run(self, dir='.'):
1047
1011
        from bzrlib.check import check
1048
1012
 
1049
 
        check(Branch.open_containing(dir))
 
1013
        check(find_branch(dir))
1050
1014
 
1051
1015
 
1052
1016
class cmd_scan_cache(Command):
1085
1049
        upgrade(dir)
1086
1050
 
1087
1051
 
 
1052
 
1088
1053
class cmd_whoami(Command):
1089
1054
    """Show bzr user id."""
1090
1055
    takes_options = ['email']
1091
1056
    
1092
1057
    def run(self, email=False):
1093
1058
        try:
1094
 
            b = bzrlib.branch.Branch.open_containing('.')
 
1059
            b = bzrlib.branch.find_branch('.')
1095
1060
        except NotBranchError:
1096
1061
            b = None
1097
1062
        
1163
1128
    def run(self, branch, other):
1164
1129
        from bzrlib.revision import common_ancestor, MultipleRevisionSources
1165
1130
        
1166
 
        branch1 = Branch.open_containing(branch)
1167
 
        branch2 = Branch.open_containing(other)
 
1131
        branch1 = find_branch(branch)
 
1132
        branch2 = find_branch(other)
1168
1133
 
1169
1134
        history_1 = branch1.revision_history()
1170
1135
        history_2 = branch2.revision_history()
1233
1198
            other = [branch, -1]
1234
1199
        else:
1235
1200
            if len(revision) == 1:
 
1201
                other = [branch, revision[0]]
1236
1202
                base = [None, None]
1237
 
                other = [branch, revision[0].in_history(branch).revno]
1238
1203
            else:
1239
1204
                assert len(revision) == 2
1240
1205
                if None in revision:
1241
1206
                    raise BzrCommandError(
1242
1207
                        "Merge doesn't permit that revision specifier.")
1243
 
                from bzrlib.branch import Branch
1244
 
                b = Branch.open(branch)
1245
 
 
1246
 
                base = [branch, revision[0].in_history(b).revno]
1247
 
                other = [branch, revision[1].in_history(b).revno]
 
1208
                base = [branch, revision[0]]
 
1209
                other = [branch, revision[1]]
1248
1210
 
1249
1211
        try:
1250
1212
            merge(other, base, check_clean=(not force), merge_type=merge_type)
1278
1240
            if len(file_list) == 0:
1279
1241
                raise BzrCommandError("No files specified")
1280
1242
        if revision is None:
1281
 
            revno = -1
 
1243
            revision = [-1]
1282
1244
        elif len(revision) != 1:
1283
1245
            raise BzrCommandError('bzr revert --revision takes exactly 1 argument')
1284
 
        else:
1285
 
            b = Branch.open_containing('.')
1286
 
            revno = revision[0].in_history(b).revno
1287
 
        merge(('.', revno), parse_spec('.'),
 
1246
        merge(('.', revision[0]), parse_spec('.'),
1288
1247
              check_clean=False,
1289
1248
              ignore_zero=True,
1290
1249
              backup_files=not no_backup,
1291
1250
              file_list=file_list)
1292
1251
        if not file_list:
1293
 
            Branch.open_containing('.').set_pending_merges([])
 
1252
            Branch('.').set_pending_merges([])
1294
1253
 
1295
1254
 
1296
1255
class cmd_assert_fail(Command):
1362
1321
        if verbose and quiet:
1363
1322
            raise BzrCommandError('Cannot pass both quiet and verbose')
1364
1323
 
1365
 
        b = Branch.open_containing('.')
 
1324
        b = find_branch('.')
1366
1325
        parent = b.get_parent()
1367
1326
        if remote is None:
1368
1327
            if parent is None:
1372
1331
                    print "Using last location: %s" % parent
1373
1332
                remote = parent
1374
1333
        elif parent is None:
1375
 
            # We only update parent if it did not exist, missing
1376
 
            # should not change the parent
1377
 
            b.set_parent(remote)
1378
 
        br_remote = Branch.open_containing(remote)
 
1334
            # We only update x-pull if it did not exist, missing should not change the parent
 
1335
            b.controlfile('x-pull', 'wb').write(remote + '\n')
 
1336
        br_remote = find_branch(remote)
1379
1337
 
1380
1338
        return show_missing(b, br_remote, verbose=verbose, quiet=quiet)
1381
1339