~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

  • Committer: Robert Collins
  • Date: 2005-10-02 23:48:11 UTC
  • mto: This revision was merged to the branch mainline in revision 1397.
  • Revision ID: robertc@robertcollins.net-20051002234811-4d9de53b6b5feb2e
reenable test of fetching a branch with ghosts

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
import bzrlib
22
22
import bzrlib.trace
23
23
from bzrlib.trace import mutter, note, log_error, warning
24
 
from bzrlib.errors import BzrError, BzrCheckError, BzrCommandError
25
 
from bzrlib.branch import find_branch
 
24
from bzrlib.errors import BzrError, BzrCheckError, BzrCommandError, NotBranchError
 
25
from bzrlib.branch import Branch
26
26
from bzrlib import BZRDIR
27
27
from bzrlib.commands import Command
28
28
 
62
62
    directory is shown.  Otherwise, only the status of the specified
63
63
    files or directories is reported.  If a directory is given, status
64
64
    is reported for everything inside that directory.
 
65
 
 
66
    If a revision argument is given, the status is calculated against
 
67
    that revision, or between two revisions if two are provided.
65
68
    """
66
69
    # XXX: FIXME: bzr status should accept a -r option to show changes
67
70
    # relative to a revision, or between revisions
70
73
    takes_options = ['all', 'show-ids']
71
74
    aliases = ['st', 'stat']
72
75
    
73
 
    def run(self, all=False, show_ids=False, file_list=None):
 
76
    def run(self, all=False, show_ids=False, file_list=None, revision=None):
74
77
        if file_list:
75
 
            b = find_branch(file_list[0])
 
78
            b = Branch.open_containing(file_list[0])
76
79
            file_list = [b.relpath(x) for x in file_list]
77
80
            # special case: only one path was given and it's the root
78
81
            # of the branch
79
82
            if file_list == ['']:
80
83
                file_list = None
81
84
        else:
82
 
            b = find_branch('.')
 
85
            b = Branch.open_containing('.')
83
86
            
84
87
        from bzrlib.status import show_status
85
88
        show_status(b, show_unchanged=all, show_ids=show_ids,
86
 
                    specific_files=file_list)
 
89
                    specific_files=file_list, revision=revision)
87
90
 
88
91
 
89
92
class cmd_cat_revision(Command):
90
 
    """Write out metadata for a revision."""
 
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
    """
91
98
 
92
99
    hidden = True
93
 
    takes_args = ['revision_id']
 
100
    takes_args = ['revision_id?']
 
101
    takes_options = ['revision']
94
102
    
95
 
    def run(self, revision_id):
96
 
        b = find_branch('.')
97
 
        sys.stdout.write(b.get_revision_xml_file(revision_id).read())
 
103
    def run(self, revision_id=None, revision=None):
 
104
        from bzrlib.revisionspec import RevisionSpec
98
105
 
 
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
    
99
120
 
100
121
class cmd_revno(Command):
101
122
    """Show current revision number.
102
123
 
103
124
    This is equal to the number of revisions on this branch."""
104
125
    def run(self):
105
 
        print find_branch('.').revno()
 
126
        print Branch.open_containing('.').revno()
106
127
 
107
128
 
108
129
class cmd_revision_info(Command):
111
132
    hidden = True
112
133
    takes_args = ['revision_info*']
113
134
    takes_options = ['revision']
114
 
    def run(self, revision=None, revision_info_list=None):
115
 
        from bzrlib.branch import find_branch
 
135
    def run(self, revision=None, revision_info_list=[]):
 
136
        from bzrlib.revisionspec import RevisionSpec
116
137
 
117
138
        revs = []
118
139
        if revision is not None:
119
140
            revs.extend(revision)
120
141
        if revision_info_list is not None:
121
 
            revs.extend(revision_info_list)
 
142
            for rev in revision_info_list:
 
143
                revs.append(RevisionSpec(rev))
122
144
        if len(revs) == 0:
123
145
            raise BzrCommandError('You must supply a revision identifier')
124
146
 
125
 
        b = find_branch('.')
 
147
        b = Branch.open_containing('.')
126
148
 
127
149
        for rev in revs:
128
 
            print '%4d %s' % b.get_revision_info(rev)
 
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)
129
155
 
130
156
    
131
157
class cmd_add(Command):
174
200
        for d in dir_list:
175
201
            os.mkdir(d)
176
202
            if not b:
177
 
                b = find_branch(d)
 
203
                b = Branch.open_containing(d)
178
204
            b.add([d])
179
205
            print 'added', d
180
206
 
185
211
    hidden = True
186
212
    
187
213
    def run(self, filename):
188
 
        print find_branch(filename).relpath(filename)
 
214
        print Branch.open_containing(filename).relpath(filename)
189
215
 
190
216
 
191
217
 
194
220
    takes_options = ['revision', 'show-ids']
195
221
    
196
222
    def run(self, revision=None, show_ids=False):
197
 
        b = find_branch('.')
198
 
        if revision == None:
 
223
        b = Branch.open_containing('.')
 
224
        if revision is None:
199
225
            inv = b.read_working_inventory()
200
226
        else:
201
227
            if len(revision) > 1:
202
228
                raise BzrCommandError('bzr inventory --revision takes'
203
229
                    ' exactly one revision identifier')
204
 
            inv = b.get_revision_inventory(b.lookup_revision(revision[0]))
 
230
            inv = b.get_revision_inventory(revision[0].in_history(b).rev_id)
205
231
 
206
232
        for path, entry in inv.entries():
207
233
            if show_ids:
220
246
    """
221
247
    takes_args = ['source$', 'dest']
222
248
    def run(self, source_list, dest):
223
 
        b = find_branch('.')
 
249
        b = Branch.open_containing('.')
224
250
 
225
251
        # TODO: glob expansion on windows?
226
252
        b.move([b.relpath(s) for s in source_list], b.relpath(dest))
243
269
    takes_args = ['from_name', 'to_name']
244
270
    
245
271
    def run(self, from_name, to_name):
246
 
        b = find_branch('.')
 
272
        b = Branch.open_containing('.')
247
273
        b.rename_one(b.relpath(from_name), b.relpath(to_name))
248
274
 
249
275
 
265
291
    def run(self, names_list):
266
292
        if len(names_list) < 2:
267
293
            raise BzrCommandError("missing file argument")
268
 
        b = find_branch(names_list[0])
 
294
        b = Branch.open_containing(names_list[0])
269
295
 
270
296
        rel_names = [b.relpath(x) for x in names_list]
271
297
        
305
331
        from shutil import rmtree
306
332
        import errno
307
333
        
308
 
        br_to = find_branch('.')
 
334
        br_to = Branch.open_containing('.')
309
335
        stored_loc = br_to.get_parent()
310
336
        if location is None:
311
337
            if stored_loc is None:
314
340
                print "Using last location: %s" % stored_loc
315
341
                location = stored_loc
316
342
        cache_root = tempfile.mkdtemp()
317
 
        from bzrlib.branch import DivergedBranches
318
 
        br_from = find_branch(location)
 
343
        from bzrlib.errors import DivergedBranches
 
344
        br_from = Branch.open_containing(location)
319
345
        location = br_from.base
320
346
        old_revno = br_to.revno()
321
347
        try:
322
 
            from branch import find_cached_branch, DivergedBranches
323
 
            br_from = find_cached_branch(location, cache_root)
 
348
            from bzrlib.errors import DivergedBranches
 
349
            br_from = Branch.open(location)
 
350
            br_from.setup_caching(cache_root)
324
351
            location = br_from.base
325
352
            old_revno = br_to.revno()
326
353
            try:
345
372
 
346
373
    To retrieve the branch as of a particular revision, supply the --revision
347
374
    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.
348
379
    """
349
380
    takes_args = ['from_location', 'to_location?']
350
 
    takes_options = ['revision']
 
381
    takes_options = ['revision', 'basis']
351
382
    aliases = ['get', 'clone']
352
383
 
353
 
    def run(self, from_location, to_location=None, revision=None):
354
 
        from bzrlib.branch import copy_branch, find_cached_branch
 
384
    def run(self, from_location, to_location=None, revision=None, basis=None):
 
385
        from bzrlib.clone import copy_branch
355
386
        import tempfile
356
387
        import errno
357
388
        from shutil import rmtree
363
394
                raise BzrCommandError(
364
395
                    'bzr branch --revision takes exactly 1 revision value')
365
396
            try:
366
 
                br_from = find_cached_branch(from_location, cache_root)
 
397
                br_from = Branch.open(from_location)
367
398
            except OSError, e:
368
399
                if e.errno == errno.ENOENT:
369
400
                    raise BzrCommandError('Source location "%s" does not'
370
401
                                          ' exist.' % to_location)
371
402
                else:
372
403
                    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
373
413
            if to_location is None:
374
414
                to_location = os.path.basename(from_location.rstrip("/\\"))
375
415
            try:
384
424
                else:
385
425
                    raise
386
426
            try:
387
 
                copy_branch(br_from, to_location, revision[0])
 
427
                copy_branch(br_from, to_location, revision_id, basis_branch)
388
428
            except bzrlib.errors.NoSuchRevision:
389
429
                rmtree(to_location)
390
430
                msg = "The branch %s has no revision %d." % (from_location, revision[0])
391
431
                raise BzrCommandError(msg)
 
432
            except bzrlib.errors.UnlistableBranch:
 
433
                msg = "The branch %s cannot be used as a --basis"
392
434
        finally:
393
435
            rmtree(cache_root)
394
436
 
403
445
    takes_args = ['dir?']
404
446
 
405
447
    def run(self, dir='.'):
406
 
        b = find_branch(dir)
 
448
        b = Branch.open_containing(dir)
407
449
        old_inv = b.basis_tree().inventory
408
450
        new_inv = b.read_working_inventory()
409
451
 
420
462
    def run(self, branch=None):
421
463
        import info
422
464
 
423
 
        b = find_branch(branch)
 
465
        b = Branch.open_containing(branch)
424
466
        info.show_info(b)
425
467
 
426
468
 
434
476
    takes_options = ['verbose']
435
477
    
436
478
    def run(self, file_list, verbose=False):
437
 
        b = find_branch(file_list[0])
 
479
        b = Branch.open_containing(file_list[0])
438
480
        b.remove([b.relpath(f) for f in file_list], verbose=verbose)
439
481
 
440
482
 
448
490
    hidden = True
449
491
    takes_args = ['filename']
450
492
    def run(self, filename):
451
 
        b = find_branch(filename)
 
493
        b = Branch.open_containing(filename)
452
494
        i = b.inventory.path2id(b.relpath(filename))
453
495
        if i == None:
454
496
            raise BzrError("%r is not a versioned file" % filename)
464
506
    hidden = True
465
507
    takes_args = ['filename']
466
508
    def run(self, filename):
467
 
        b = find_branch(filename)
 
509
        b = Branch.open_containing(filename)
468
510
        inv = b.inventory
469
511
        fid = inv.path2id(b.relpath(filename))
470
512
        if fid == None:
477
519
    """Display list of revision ids on this branch."""
478
520
    hidden = True
479
521
    def run(self):
480
 
        for patchid in find_branch('.').revision_history():
 
522
        for patchid in Branch.open_containing('.').revision_history():
481
523
            print patchid
482
524
 
483
525
 
 
526
class cmd_ancestry(Command):
 
527
    """List all revisions merged into this branch."""
 
528
    hidden = True
 
529
    def run(self):
 
530
        b = find_branch('.')
 
531
        for revision_id in b.get_ancestry(b.last_revision()):
 
532
            print revision_id
 
533
 
 
534
 
484
535
class cmd_directories(Command):
485
536
    """Display list of versioned directories in this branch."""
486
537
    def run(self):
487
 
        for name, ie in find_branch('.').read_working_inventory().directories():
 
538
        for name, ie in Branch.open_containing('.').read_working_inventory().directories():
488
539
            if name == '':
489
540
                print '.'
490
541
            else:
505
556
        bzr commit -m 'imported project'
506
557
    """
507
558
    def run(self):
508
 
        from bzrlib.branch import Branch
509
 
        Branch('.', init=True)
 
559
        Branch.initialize('.')
510
560
 
511
561
 
512
562
class cmd_diff(Command):
544
594
        from bzrlib.diff import show_diff
545
595
 
546
596
        if file_list:
547
 
            b = find_branch(file_list[0])
 
597
            b = Branch.open_containing(file_list[0])
548
598
            file_list = [b.relpath(f) for f in file_list]
549
599
            if file_list == ['']:
550
600
                # just pointing to top-of-tree
551
601
                file_list = None
552
602
        else:
553
 
            b = find_branch('.')
 
603
            b = Branch.open_containing('.')
554
604
 
555
605
        if revision is not None:
556
606
            if len(revision) == 1:
575
625
    TODO: Show files deleted since a previous revision, or between two revisions.
576
626
    """
577
627
    def run(self, show_ids=False):
578
 
        b = find_branch('.')
 
628
        b = Branch.open_containing('.')
579
629
        old = b.basis_tree()
580
630
        new = b.working_tree()
581
631
 
598
648
    def run(self):
599
649
        from bzrlib.delta import compare_trees
600
650
 
601
 
        b = find_branch('.')
 
651
        b = Branch.open_containing('.')
602
652
        td = compare_trees(b.basis_tree(), b.working_tree())
603
653
 
604
654
        for path, id, kind in td.modified:
610
660
    """List files added in working tree."""
611
661
    hidden = True
612
662
    def run(self):
613
 
        b = find_branch('.')
 
663
        b = Branch.open_containing('.')
614
664
        wt = b.working_tree()
615
665
        basis_inv = b.basis_tree().inventory
616
666
        inv = wt.inventory
632
682
    takes_args = ['filename?']
633
683
    def run(self, filename=None):
634
684
        """Print the branch root."""
635
 
        b = find_branch(filename)
 
685
        b = Branch.open_containing(filename)
636
686
        print b.base
637
687
 
638
688
 
668
718
        direction = (forward and 'forward') or 'reverse'
669
719
        
670
720
        if filename:
671
 
            b = find_branch(filename)
 
721
            b = Branch.open_containing(filename)
672
722
            fp = b.relpath(filename)
673
723
            if fp:
674
724
                file_id = b.read_working_inventory().path2id(fp)
675
725
            else:
676
726
                file_id = None  # points to branch root
677
727
        else:
678
 
            b = find_branch('.')
 
728
            b = Branch.open_containing('.')
679
729
            file_id = None
680
730
 
681
731
        if revision is None:
682
732
            rev1 = None
683
733
            rev2 = None
684
734
        elif len(revision) == 1:
685
 
            rev1 = rev2 = b.get_revision_info(revision[0])[0]
 
735
            rev1 = rev2 = revision[0].in_history(b).revno
686
736
        elif len(revision) == 2:
687
 
            rev1 = b.get_revision_info(revision[0])[0]
688
 
            rev2 = b.get_revision_info(revision[1])[0]
 
737
            rev1 = revision[0].in_history(b).revno
 
738
            rev2 = revision[1].in_history(b).revno
689
739
        else:
690
740
            raise BzrCommandError('bzr log --revision takes one or two values.')
691
741
 
727
777
    hidden = True
728
778
    takes_args = ["filename"]
729
779
    def run(self, filename):
730
 
        b = find_branch(filename)
 
780
        b = Branch.open_containing(filename)
731
781
        inv = b.read_working_inventory()
732
782
        file_id = inv.path2id(b.relpath(filename))
733
783
        for revno, revision_id, what in bzrlib.log.find_touching_revisions(b, file_id):
741
791
    """
742
792
    hidden = True
743
793
    def run(self, revision=None, verbose=False):
744
 
        b = find_branch('.')
 
794
        b = Branch.open_containing('.')
745
795
        if revision == None:
746
796
            tree = b.working_tree()
747
797
        else:
748
 
            tree = b.revision_tree(b.lookup_revision(revision))
 
798
            tree = b.revision_tree(revision.in_history(b).rev_id)
749
799
 
750
800
        for fp, fc, kind, fid in tree.list_files():
751
801
            if verbose:
766
816
    """List unknown files."""
767
817
    def run(self):
768
818
        from bzrlib.osutils import quotefn
769
 
        for f in find_branch('.').unknowns():
 
819
        for f in Branch.open_containing('.').unknowns():
770
820
            print quotefn(f)
771
821
 
772
822
 
794
844
        from bzrlib.atomicfile import AtomicFile
795
845
        import os.path
796
846
 
797
 
        b = find_branch('.')
 
847
        b = Branch.open_containing('.')
798
848
        ifn = b.abspath('.bzrignore')
799
849
 
800
850
        if os.path.exists(ifn):
834
884
 
835
885
    See also: bzr ignore"""
836
886
    def run(self):
837
 
        tree = find_branch('.').working_tree()
 
887
        tree = Branch.open_containing('.').working_tree()
838
888
        for path, file_class, kind, file_id in tree.list_files():
839
889
            if file_class != 'I':
840
890
                continue
858
908
        except ValueError:
859
909
            raise BzrCommandError("not a valid revision-number: %r" % revno)
860
910
 
861
 
        print find_branch('.').lookup_revision(revno)
 
911
        print Branch.open_containing('.').get_rev_id(revno)
862
912
 
863
913
 
864
914
class cmd_export(Command):
877
927
    takes_options = ['revision', 'format', 'root']
878
928
    def run(self, dest, revision=None, format=None, root=None):
879
929
        import os.path
880
 
        b = find_branch('.')
 
930
        b = Branch.open_containing('.')
881
931
        if revision is None:
882
 
            rev_id = b.last_patch()
 
932
            rev_id = b.last_revision()
883
933
        else:
884
934
            if len(revision) != 1:
885
935
                raise BzrError('bzr export --revision takes exactly 1 argument')
886
 
            revno, rev_id = b.get_revision_info(revision[0])
 
936
            rev_id = revision[0].in_history(b).rev_id
887
937
        t = b.revision_tree(rev_id)
888
 
        root, ext = os.path.splitext(dest)
 
938
        arg_root, ext = os.path.splitext(os.path.basename(dest))
 
939
        if ext in ('.gz', '.bz2'):
 
940
            new_root, new_ext = os.path.splitext(arg_root)
 
941
            if new_ext == '.tar':
 
942
                arg_root = new_root
 
943
                ext = new_ext + ext
 
944
        if root is None:
 
945
            root = arg_root
889
946
        if not format:
890
947
            if ext in (".tar",):
891
948
                format = "tar"
892
 
            elif ext in (".gz", ".tgz"):
 
949
            elif ext in (".tar.gz", ".tgz"):
893
950
                format = "tgz"
894
 
            elif ext in (".bz2", ".tbz2"):
 
951
            elif ext in (".tar.bz2", ".tbz2"):
895
952
                format = "tbz2"
896
953
            else:
897
954
                format = "dir"
905
962
    takes_args = ['filename']
906
963
 
907
964
    def run(self, filename, revision=None):
908
 
        if revision == None:
 
965
        if revision is None:
909
966
            raise BzrCommandError("bzr cat requires a revision number")
910
967
        elif len(revision) != 1:
911
968
            raise BzrCommandError("bzr cat --revision takes exactly one number")
912
 
        b = find_branch('.')
913
 
        b.print_file(b.relpath(filename), revision[0])
 
969
        b = Branch.open_containing('.')
 
970
        b.print_file(b.relpath(filename), revision[0].in_history(b).revno)
914
971
 
915
972
 
916
973
class cmd_local_time_offset(Command):
943
1000
    aliases = ['ci', 'checkin']
944
1001
 
945
1002
    # TODO: Give better message for -s, --summary, used by tla people
 
1003
 
 
1004
    # XXX: verbose currently does nothing
946
1005
    
947
1006
    def run(self, message=None, file=None, verbose=True, selected_list=None,
948
1007
            unchanged=False):
951
1010
        from bzrlib.status import show_status
952
1011
        from cStringIO import StringIO
953
1012
 
954
 
        b = find_branch('.')
 
1013
        b = Branch.open_containing('.')
955
1014
        if selected_list:
956
1015
            selected_list = [b.relpath(s) for s in selected_list]
957
1016
            
972
1031
            message = codecs.open(file, 'rt', bzrlib.user_encoding).read()
973
1032
 
974
1033
        try:
975
 
            b.commit(message, verbose=verbose,
 
1034
            b.commit(message,
976
1035
                     specific_files=selected_list,
977
1036
                     allow_pointless=unchanged)
978
1037
        except PointlessCommit:
993
1052
    def run(self, dir='.'):
994
1053
        from bzrlib.check import check
995
1054
 
996
 
        check(find_branch(dir))
 
1055
        check(Branch.open_containing(dir))
997
1056
 
998
1057
 
999
1058
class cmd_scan_cache(Command):
1021
1080
 
1022
1081
    The check command or bzr developers may sometimes advise you to run
1023
1082
    this command.
 
1083
 
 
1084
    This version of this command upgrades from the full-text storage
 
1085
    used by bzr 0.0.8 and earlier to the weave format (v5).
1024
1086
    """
1025
1087
    takes_args = ['dir?']
1026
1088
 
1027
1089
    def run(self, dir='.'):
1028
1090
        from bzrlib.upgrade import upgrade
1029
 
        upgrade(find_branch(dir))
1030
 
 
 
1091
        upgrade(dir)
1031
1092
 
1032
1093
 
1033
1094
class cmd_whoami(Command):
1036
1097
    
1037
1098
    def run(self, email=False):
1038
1099
        try:
1039
 
            b = bzrlib.branch.find_branch('.')
1040
 
        except:
 
1100
            b = bzrlib.branch.Branch.open_containing('.')
 
1101
        except NotBranchError:
1041
1102
            b = None
1042
1103
        
1043
1104
        if email:
1108
1169
    def run(self, branch, other):
1109
1170
        from bzrlib.revision import common_ancestor, MultipleRevisionSources
1110
1171
        
1111
 
        branch1 = find_branch(branch)
1112
 
        branch2 = find_branch(other)
 
1172
        branch1 = Branch.open_containing(branch)
 
1173
        branch2 = Branch.open_containing(other)
1113
1174
 
1114
1175
        history_1 = branch1.revision_history()
1115
1176
        history_2 = branch2.revision_history()
1116
1177
 
1117
 
        last1 = branch1.last_patch()
1118
 
        last2 = branch2.last_patch()
 
1178
        last1 = branch1.last_revision()
 
1179
        last2 = branch2.last_revision()
1119
1180
 
1120
1181
        source = MultipleRevisionSources(branch1, branch2)
1121
1182
        
1178
1239
            other = [branch, -1]
1179
1240
        else:
1180
1241
            if len(revision) == 1:
1181
 
                other = [branch, revision[0]]
1182
1242
                base = [None, None]
 
1243
                other = [branch, revision[0].in_history(branch).revno]
1183
1244
            else:
1184
1245
                assert len(revision) == 2
1185
1246
                if None in revision:
1186
1247
                    raise BzrCommandError(
1187
1248
                        "Merge doesn't permit that revision specifier.")
1188
 
                base = [branch, revision[0]]
1189
 
                other = [branch, revision[1]]
 
1249
                b = Branch.open(branch)
 
1250
 
 
1251
                base = [branch, revision[0].in_history(b).revno]
 
1252
                other = [branch, revision[1].in_history(b).revno]
1190
1253
 
1191
1254
        try:
1192
1255
            merge(other, base, check_clean=(not force), merge_type=merge_type)
1213
1276
 
1214
1277
    def run(self, revision=None, no_backup=False, file_list=None):
1215
1278
        from bzrlib.merge import merge
1216
 
        from bzrlib.branch import Branch
1217
1279
        from bzrlib.commands import parse_spec
1218
1280
 
1219
1281
        if file_list is not None:
1220
1282
            if len(file_list) == 0:
1221
1283
                raise BzrCommandError("No files specified")
1222
1284
        if revision is None:
1223
 
            revision = [-1]
 
1285
            revno = -1
1224
1286
        elif len(revision) != 1:
1225
1287
            raise BzrCommandError('bzr revert --revision takes exactly 1 argument')
1226
 
        merge(('.', revision[0]), parse_spec('.'),
 
1288
        else:
 
1289
            b = Branch.open_containing('.')
 
1290
            revno = revision[0].in_history(b).revno
 
1291
        merge(('.', revno), parse_spec('.'),
1227
1292
              check_clean=False,
1228
1293
              ignore_zero=True,
1229
1294
              backup_files=not no_backup,
1230
1295
              file_list=file_list)
1231
1296
        if not file_list:
1232
 
            Branch('.').set_pending_merges([])
 
1297
            Branch.open_containing('.').set_pending_merges([])
1233
1298
 
1234
1299
 
1235
1300
class cmd_assert_fail(Command):
1267
1332
        shellcomplete.shellcomplete(context)
1268
1333
 
1269
1334
 
 
1335
class cmd_fetch(Command):
 
1336
    """Copy in history from another branch but don't merge it.
 
1337
 
 
1338
    This is an internal method used for pull and merge."""
 
1339
    hidden = True
 
1340
    takes_args = ['from_branch', 'to_branch']
 
1341
    def run(self, from_branch, to_branch):
 
1342
        from bzrlib.fetch import Fetcher
 
1343
        from bzrlib.branch import Branch
 
1344
        from_b = Branch(from_branch)
 
1345
        to_b = Branch(to_branch)
 
1346
        Fetcher(to_b, from_b)
 
1347
        
 
1348
 
 
1349
 
1270
1350
class cmd_missing(Command):
1271
1351
    """What is missing in this branch relative to other branch.
1272
1352
    """
 
1353
    # TODO: rewrite this in terms of ancestry so that it shows only
 
1354
    # unmerged things
 
1355
    
1273
1356
    takes_args = ['remote?']
1274
1357
    aliases = ['mis', 'miss']
1275
1358
    # We don't have to add quiet to the list, because 
1283
1366
        if verbose and quiet:
1284
1367
            raise BzrCommandError('Cannot pass both quiet and verbose')
1285
1368
 
1286
 
        b = find_branch('.')
 
1369
        b = Branch.open_containing('.')
1287
1370
        parent = b.get_parent()
1288
1371
        if remote is None:
1289
1372
            if parent is None:
1293
1376
                    print "Using last location: %s" % parent
1294
1377
                remote = parent
1295
1378
        elif parent is None:
1296
 
            # We only update parent if it did not exist, missing should not change the parent
 
1379
            # We only update parent if it did not exist, missing
 
1380
            # should not change the parent
1297
1381
            b.set_parent(remote)
1298
 
        br_remote = find_branch(remote)
1299
 
 
 
1382
        br_remote = Branch.open_containing(remote)
1300
1383
        return show_missing(b, br_remote, verbose=verbose, quiet=quiet)
1301
1384
 
1302
1385
 
1303
 
 
1304
1386
class cmd_plugins(Command):
1305
1387
    """List plugins"""
1306
1388
    hidden = True