~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

  • Committer: Martin Pool
  • Date: 2005-10-04 06:44:50 UTC
  • mto: (1185.13.3)
  • mto: This revision was merged to the branch mainline in revision 1403.
  • Revision ID: mbp@sourcefrog.net-20051004064450-6437da8f84d41517
- add test that upgrade completes successfully

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
 
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 is specified, the changes since that revision are shown.
 
66
    If a revision argument is given, the status is calculated against
 
67
    that revision, or between two revisions if two are provided.
67
68
    """
 
69
    # XXX: FIXME: bzr status should accept a -r option to show changes
 
70
    # relative to a revision, or between revisions
 
71
 
68
72
    takes_args = ['file*']
69
 
    takes_options = ['all', 'show-ids', 'revision']
 
73
    takes_options = ['all', 'show-ids']
70
74
    aliases = ['st', 'stat']
71
75
    
72
 
    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):
73
77
        if file_list:
74
 
            b = find_branch(file_list[0])
 
78
            b = Branch.open_containing(file_list[0])
75
79
            file_list = [b.relpath(x) for x in file_list]
76
80
            # special case: only one path was given and it's the root
77
81
            # of the branch
78
82
            if file_list == ['']:
79
83
                file_list = None
80
84
        else:
81
 
            b = find_branch('.')
 
85
            b = Branch.open_containing('.')
82
86
            
83
87
        from bzrlib.status import show_status
84
88
        show_status(b, show_unchanged=all, show_ids=show_ids,
85
 
                    specific_files=file_list)
 
89
                    specific_files=file_list, revision=revision)
86
90
 
87
91
 
88
92
class cmd_cat_revision(Command):
89
 
    """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
    """
90
98
 
91
99
    hidden = True
92
 
    takes_args = ['revision_id']
 
100
    takes_args = ['revision_id?']
 
101
    takes_options = ['revision']
93
102
    
94
 
    def run(self, revision_id):
95
 
        b = find_branch('.')
96
 
        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
97
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
    
98
120
 
99
121
class cmd_revno(Command):
100
122
    """Show current revision number.
101
123
 
102
124
    This is equal to the number of revisions on this branch."""
103
125
    def run(self):
104
 
        print find_branch('.').revno()
 
126
        print Branch.open_containing('.').revno()
105
127
 
106
128
 
107
129
class cmd_revision_info(Command):
110
132
    hidden = True
111
133
    takes_args = ['revision_info*']
112
134
    takes_options = ['revision']
113
 
    def run(self, revision=None, revision_info_list=None):
114
 
        from bzrlib.branch import find_branch
 
135
    def run(self, revision=None, revision_info_list=[]):
 
136
        from bzrlib.revisionspec import RevisionSpec
115
137
 
116
138
        revs = []
117
139
        if revision is not None:
118
140
            revs.extend(revision)
119
141
        if revision_info_list is not None:
120
 
            revs.extend(revision_info_list)
 
142
            for rev in revision_info_list:
 
143
                revs.append(RevisionSpec(rev))
121
144
        if len(revs) == 0:
122
145
            raise BzrCommandError('You must supply a revision identifier')
123
146
 
124
 
        b = find_branch('.')
 
147
        b = Branch.open_containing('.')
125
148
 
126
149
        for rev in revs:
127
 
            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)
128
155
 
129
156
    
130
157
class cmd_add(Command):
145
172
    Therefore simply saying 'bzr add' will version all files that
146
173
    are currently unknown.
147
174
 
148
 
    TODO: Perhaps adding a file whose directly is not versioned should
149
 
    recursively add that parent, rather than giving an error?
 
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.
150
179
    """
151
180
    takes_args = ['file*']
152
181
    takes_options = ['verbose', 'no-recurse']
171
200
        for d in dir_list:
172
201
            os.mkdir(d)
173
202
            if not b:
174
 
                b = find_branch(d)
 
203
                b = Branch.open_containing(d)
175
204
            b.add([d])
176
205
            print 'added', d
177
206
 
182
211
    hidden = True
183
212
    
184
213
    def run(self, filename):
185
 
        print find_branch(filename).relpath(filename)
 
214
        print Branch.open_containing(filename).relpath(filename)
186
215
 
187
216
 
188
217
 
191
220
    takes_options = ['revision', 'show-ids']
192
221
    
193
222
    def run(self, revision=None, show_ids=False):
194
 
        b = find_branch('.')
195
 
        if revision == None:
 
223
        b = Branch.open_containing('.')
 
224
        if revision is None:
196
225
            inv = b.read_working_inventory()
197
226
        else:
198
227
            if len(revision) > 1:
199
228
                raise BzrCommandError('bzr inventory --revision takes'
200
229
                    ' exactly one revision identifier')
201
 
            inv = b.get_revision_inventory(b.lookup_revision(revision[0]))
 
230
            inv = b.get_revision_inventory(revision[0].in_history(b).rev_id)
202
231
 
203
232
        for path, entry in inv.entries():
204
233
            if show_ids:
217
246
    """
218
247
    takes_args = ['source$', 'dest']
219
248
    def run(self, source_list, dest):
220
 
        b = find_branch('.')
 
249
        b = Branch.open_containing('.')
221
250
 
222
251
        # TODO: glob expansion on windows?
223
252
        b.move([b.relpath(s) for s in source_list], b.relpath(dest))
240
269
    takes_args = ['from_name', 'to_name']
241
270
    
242
271
    def run(self, from_name, to_name):
243
 
        b = find_branch('.')
 
272
        b = Branch.open_containing('.')
244
273
        b.rename_one(b.relpath(from_name), b.relpath(to_name))
245
274
 
246
275
 
262
291
    def run(self, names_list):
263
292
        if len(names_list) < 2:
264
293
            raise BzrCommandError("missing file argument")
265
 
        b = find_branch(names_list[0])
 
294
        b = Branch.open_containing(names_list[0])
266
295
 
267
296
        rel_names = [b.relpath(x) for x in names_list]
268
297
        
274
303
            if len(names_list) != 2:
275
304
                raise BzrCommandError('to mv multiple files the destination '
276
305
                                      'must be a versioned directory')
277
 
            for pair in b.move(rel_names[0], rel_names[1]):
278
 
                print "%s => %s" % pair
 
306
            b.rename_one(rel_names[0], rel_names[1])
 
307
            print "%s => %s" % (rel_names[0], rel_names[1])
279
308
            
280
309
    
281
310
 
301
330
        import tempfile
302
331
        from shutil import rmtree
303
332
        import errno
304
 
        from bzrlib.branch import pull_loc
305
333
        
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
 
334
        br_to = Branch.open_containing('.')
 
335
        stored_loc = br_to.get_parent()
313
336
        if location is None:
314
337
            if stored_loc is None:
315
338
                raise BzrCommandError("No pull location known or specified.")
317
340
                print "Using last location: %s" % stored_loc
318
341
                location = stored_loc
319
342
        cache_root = tempfile.mkdtemp()
320
 
        from bzrlib.branch import DivergedBranches
321
 
        br_from = find_branch(location)
322
 
        location = pull_loc(br_from)
 
343
        from bzrlib.errors import DivergedBranches
 
344
        br_from = Branch.open_containing(location)
 
345
        location = br_from.base
323
346
        old_revno = br_to.revno()
324
347
        try:
325
 
            from branch import find_cached_branch, DivergedBranches
326
 
            br_from = find_cached_branch(location, cache_root)
327
 
            location = pull_loc(br_from)
 
348
            from bzrlib.errors import DivergedBranches
 
349
            br_from = Branch.open(location)
 
350
            br_from.setup_caching(cache_root)
 
351
            location = br_from.base
328
352
            old_revno = br_to.revno()
329
353
            try:
330
354
                br_to.update_revisions(br_from)
334
358
                
335
359
            merge(('.', -1), ('.', old_revno), check_clean=False)
336
360
            if location != stored_loc:
337
 
                br_to.controlfile("x-pull", "wb").write(location + "\n")
 
361
                br_to.set_parent(location)
338
362
        finally:
339
363
            rmtree(cache_root)
340
364
 
348
372
 
349
373
    To retrieve the branch as of a particular revision, supply the --revision
350
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.
351
379
    """
352
380
    takes_args = ['from_location', 'to_location?']
353
 
    takes_options = ['revision']
 
381
    takes_options = ['revision', 'basis']
354
382
    aliases = ['get', 'clone']
355
383
 
356
 
    def run(self, from_location, to_location=None, revision=None):
357
 
        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
358
386
        import tempfile
359
387
        import errno
360
388
        from shutil import rmtree
366
394
                raise BzrCommandError(
367
395
                    'bzr branch --revision takes exactly 1 revision value')
368
396
            try:
369
 
                br_from = find_cached_branch(from_location, cache_root)
 
397
                br_from = Branch.open(from_location)
370
398
            except OSError, e:
371
399
                if e.errno == errno.ENOENT:
372
400
                    raise BzrCommandError('Source location "%s" does not'
373
401
                                          ' exist.' % to_location)
374
402
                else:
375
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
376
413
            if to_location is None:
377
414
                to_location = os.path.basename(from_location.rstrip("/\\"))
378
415
            try:
387
424
                else:
388
425
                    raise
389
426
            try:
390
 
                copy_branch(br_from, to_location, revision[0])
 
427
                copy_branch(br_from, to_location, revision_id, basis_branch)
391
428
            except bzrlib.errors.NoSuchRevision:
392
429
                rmtree(to_location)
393
430
                msg = "The branch %s has no revision %d." % (from_location, revision[0])
394
431
                raise BzrCommandError(msg)
 
432
            except bzrlib.errors.UnlistableBranch:
 
433
                msg = "The branch %s cannot be used as a --basis"
395
434
        finally:
396
435
            rmtree(cache_root)
397
436
 
406
445
    takes_args = ['dir?']
407
446
 
408
447
    def run(self, dir='.'):
409
 
        b = find_branch(dir)
 
448
        b = Branch.open_containing(dir)
410
449
        old_inv = b.basis_tree().inventory
411
450
        new_inv = b.read_working_inventory()
412
451
 
423
462
    def run(self, branch=None):
424
463
        import info
425
464
 
426
 
        b = find_branch(branch)
 
465
        b = Branch.open_containing(branch)
427
466
        info.show_info(b)
428
467
 
429
468
 
437
476
    takes_options = ['verbose']
438
477
    
439
478
    def run(self, file_list, verbose=False):
440
 
        b = find_branch(file_list[0])
 
479
        b = Branch.open_containing(file_list[0])
441
480
        b.remove([b.relpath(f) for f in file_list], verbose=verbose)
442
481
 
443
482
 
451
490
    hidden = True
452
491
    takes_args = ['filename']
453
492
    def run(self, filename):
454
 
        b = find_branch(filename)
 
493
        b = Branch.open_containing(filename)
455
494
        i = b.inventory.path2id(b.relpath(filename))
456
495
        if i == None:
457
496
            raise BzrError("%r is not a versioned file" % filename)
467
506
    hidden = True
468
507
    takes_args = ['filename']
469
508
    def run(self, filename):
470
 
        b = find_branch(filename)
 
509
        b = Branch.open_containing(filename)
471
510
        inv = b.inventory
472
511
        fid = inv.path2id(b.relpath(filename))
473
512
        if fid == None:
480
519
    """Display list of revision ids on this branch."""
481
520
    hidden = True
482
521
    def run(self):
483
 
        for patchid in find_branch('.').revision_history():
 
522
        for patchid in Branch.open_containing('.').revision_history():
484
523
            print patchid
485
524
 
486
525
 
489
528
    hidden = True
490
529
    def run(self):
491
530
        b = find_branch('.')
492
 
        for revision_id in b.get_ancestry(b.last_patch()):
 
531
        for revision_id in b.get_ancestry(b.last_revision()):
493
532
            print revision_id
494
533
 
495
534
 
496
535
class cmd_directories(Command):
497
536
    """Display list of versioned directories in this branch."""
498
537
    def run(self):
499
 
        for name, ie in find_branch('.').read_working_inventory().directories():
 
538
        for name, ie in Branch.open_containing('.').read_working_inventory().directories():
500
539
            if name == '':
501
540
                print '.'
502
541
            else:
517
556
        bzr commit -m 'imported project'
518
557
    """
519
558
    def run(self):
520
 
        from bzrlib.branch import Branch
521
 
        Branch('.', init=True)
 
559
        Branch.initialize('.')
522
560
 
523
561
 
524
562
class cmd_diff(Command):
545
583
    examples:
546
584
        bzr diff
547
585
        bzr diff -r1
548
 
        bzr diff -r1:2
 
586
        bzr diff -r1..2
549
587
    """
550
588
    
551
589
    takes_args = ['file*']
556
594
        from bzrlib.diff import show_diff
557
595
 
558
596
        if file_list:
559
 
            b = find_branch(file_list[0])
 
597
            b = Branch.open_containing(file_list[0])
560
598
            file_list = [b.relpath(f) for f in file_list]
561
599
            if file_list == ['']:
562
600
                # just pointing to top-of-tree
563
601
                file_list = None
564
602
        else:
565
 
            b = find_branch('.')
 
603
            b = Branch.open_containing('.')
566
604
 
567
605
        if revision is not None:
568
606
            if len(revision) == 1:
587
625
    TODO: Show files deleted since a previous revision, or between two revisions.
588
626
    """
589
627
    def run(self, show_ids=False):
590
 
        b = find_branch('.')
 
628
        b = Branch.open_containing('.')
591
629
        old = b.basis_tree()
592
630
        new = b.working_tree()
593
631
 
610
648
    def run(self):
611
649
        from bzrlib.delta import compare_trees
612
650
 
613
 
        b = find_branch('.')
 
651
        b = Branch.open_containing('.')
614
652
        td = compare_trees(b.basis_tree(), b.working_tree())
615
653
 
616
 
        for path, id, kind in td.modified:
 
654
        for path, id, kind, text_modified, meta_modified in td.modified:
617
655
            print path
618
656
 
619
657
 
622
660
    """List files added in working tree."""
623
661
    hidden = True
624
662
    def run(self):
625
 
        b = find_branch('.')
 
663
        b = Branch.open_containing('.')
626
664
        wt = b.working_tree()
627
665
        basis_inv = b.basis_tree().inventory
628
666
        inv = wt.inventory
644
682
    takes_args = ['filename?']
645
683
    def run(self, filename=None):
646
684
        """Print the branch root."""
647
 
        b = find_branch(filename)
648
 
        print getattr(b, 'base', None) or getattr(b, 'baseurl')
 
685
        b = Branch.open_containing(filename)
 
686
        print b.base
649
687
 
650
688
 
651
689
class cmd_log(Command):
680
718
        direction = (forward and 'forward') or 'reverse'
681
719
        
682
720
        if filename:
683
 
            b = find_branch(filename)
 
721
            b = Branch.open_containing(filename)
684
722
            fp = b.relpath(filename)
685
723
            if fp:
686
724
                file_id = b.read_working_inventory().path2id(fp)
687
725
            else:
688
726
                file_id = None  # points to branch root
689
727
        else:
690
 
            b = find_branch('.')
 
728
            b = Branch.open_containing('.')
691
729
            file_id = None
692
730
 
693
731
        if revision is None:
694
732
            rev1 = None
695
733
            rev2 = None
696
734
        elif len(revision) == 1:
697
 
            rev1 = rev2 = b.get_revision_info(revision[0])[0]
 
735
            rev1 = rev2 = revision[0].in_history(b).revno
698
736
        elif len(revision) == 2:
699
 
            rev1 = b.get_revision_info(revision[0])[0]
700
 
            rev2 = b.get_revision_info(revision[1])[0]
 
737
            rev1 = revision[0].in_history(b).revno
 
738
            rev2 = revision[1].in_history(b).revno
701
739
        else:
702
740
            raise BzrCommandError('bzr log --revision takes one or two values.')
703
741
 
739
777
    hidden = True
740
778
    takes_args = ["filename"]
741
779
    def run(self, filename):
742
 
        b = find_branch(filename)
 
780
        b = Branch.open_containing(filename)
743
781
        inv = b.read_working_inventory()
744
782
        file_id = inv.path2id(b.relpath(filename))
745
783
        for revno, revision_id, what in bzrlib.log.find_touching_revisions(b, file_id):
753
791
    """
754
792
    hidden = True
755
793
    def run(self, revision=None, verbose=False):
756
 
        b = find_branch('.')
 
794
        b = Branch.open_containing('.')
757
795
        if revision == None:
758
796
            tree = b.working_tree()
759
797
        else:
760
 
            tree = b.revision_tree(b.lookup_revision(revision))
761
 
 
762
 
        for fp, fc, kind, fid in tree.list_files():
 
798
            tree = b.revision_tree(revision.in_history(b).rev_id)
 
799
        for fp, fc, kind, fid, entry in tree.list_files():
763
800
            if verbose:
764
 
                if kind == 'directory':
765
 
                    kindch = '/'
766
 
                elif kind == 'file':
767
 
                    kindch = ''
768
 
                else:
769
 
                    kindch = '???'
770
 
 
 
801
                kindch = entry.kind_character()
771
802
                print '%-8s %s%s' % (fc, fp, kindch)
772
803
            else:
773
804
                print fp
778
809
    """List unknown files."""
779
810
    def run(self):
780
811
        from bzrlib.osutils import quotefn
781
 
        for f in find_branch('.').unknowns():
 
812
        for f in Branch.open_containing('.').unknowns():
782
813
            print quotefn(f)
783
814
 
784
815
 
806
837
        from bzrlib.atomicfile import AtomicFile
807
838
        import os.path
808
839
 
809
 
        b = find_branch('.')
 
840
        b = Branch.open_containing('.')
810
841
        ifn = b.abspath('.bzrignore')
811
842
 
812
843
        if os.path.exists(ifn):
846
877
 
847
878
    See also: bzr ignore"""
848
879
    def run(self):
849
 
        tree = find_branch('.').working_tree()
850
 
        for path, file_class, kind, file_id in tree.list_files():
 
880
        tree = Branch.open_containing('.').working_tree()
 
881
        for path, file_class, kind, file_id, entry in tree.list_files():
851
882
            if file_class != 'I':
852
883
                continue
853
884
            ## XXX: Slightly inefficient since this was already calculated
870
901
        except ValueError:
871
902
            raise BzrCommandError("not a valid revision-number: %r" % revno)
872
903
 
873
 
        print find_branch('.').lookup_revision(revno)
 
904
        print Branch.open_containing('.').get_rev_id(revno)
874
905
 
875
906
 
876
907
class cmd_export(Command):
889
920
    takes_options = ['revision', 'format', 'root']
890
921
    def run(self, dest, revision=None, format=None, root=None):
891
922
        import os.path
892
 
        b = find_branch('.')
 
923
        b = Branch.open_containing('.')
893
924
        if revision is None:
894
 
            rev_id = b.last_patch()
 
925
            rev_id = b.last_revision()
895
926
        else:
896
927
            if len(revision) != 1:
897
928
                raise BzrError('bzr export --revision takes exactly 1 argument')
898
 
            revno, rev_id = b.get_revision_info(revision[0])
 
929
            rev_id = revision[0].in_history(b).rev_id
899
930
        t = b.revision_tree(rev_id)
900
 
        root, ext = os.path.splitext(dest)
 
931
        arg_root, ext = os.path.splitext(os.path.basename(dest))
 
932
        if ext in ('.gz', '.bz2'):
 
933
            new_root, new_ext = os.path.splitext(arg_root)
 
934
            if new_ext == '.tar':
 
935
                arg_root = new_root
 
936
                ext = new_ext + ext
 
937
        if root is None:
 
938
            root = arg_root
901
939
        if not format:
902
940
            if ext in (".tar",):
903
941
                format = "tar"
904
 
            elif ext in (".gz", ".tgz"):
 
942
            elif ext in (".tar.gz", ".tgz"):
905
943
                format = "tgz"
906
 
            elif ext in (".bz2", ".tbz2"):
 
944
            elif ext in (".tar.bz2", ".tbz2"):
907
945
                format = "tbz2"
908
946
            else:
909
947
                format = "dir"
917
955
    takes_args = ['filename']
918
956
 
919
957
    def run(self, filename, revision=None):
920
 
        if revision == None:
 
958
        if revision is None:
921
959
            raise BzrCommandError("bzr cat requires a revision number")
922
960
        elif len(revision) != 1:
923
961
            raise BzrCommandError("bzr cat --revision takes exactly one number")
924
 
        b = find_branch('.')
925
 
        b.print_file(b.relpath(filename), revision[0])
 
962
        b = Branch.open_containing('.')
 
963
        b.print_file(b.relpath(filename), revision[0].in_history(b).revno)
926
964
 
927
965
 
928
966
class cmd_local_time_offset(Command):
965
1003
        from bzrlib.status import show_status
966
1004
        from cStringIO import StringIO
967
1005
 
968
 
        b = find_branch('.')
 
1006
        b = Branch.open_containing('.')
969
1007
        if selected_list:
970
1008
            selected_list = [b.relpath(s) for s in selected_list]
971
1009
            
1001
1039
 
1002
1040
    This command checks various invariants about the branch storage to
1003
1041
    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.
1007
1042
    """
1008
1043
    takes_args = ['dir?']
1009
1044
 
1010
1045
    def run(self, dir='.'):
1011
1046
        from bzrlib.check import check
1012
1047
 
1013
 
        check(find_branch(dir))
 
1048
        check(Branch.open_containing(dir))
1014
1049
 
1015
1050
 
1016
1051
class cmd_scan_cache(Command):
1038
1073
 
1039
1074
    The check command or bzr developers may sometimes advise you to run
1040
1075
    this command.
 
1076
 
 
1077
    This version of this command upgrades from the full-text storage
 
1078
    used by bzr 0.0.8 and earlier to the weave format (v5).
1041
1079
    """
1042
1080
    takes_args = ['dir?']
1043
1081
 
1044
1082
    def run(self, dir='.'):
1045
1083
        from bzrlib.upgrade import upgrade
1046
 
        upgrade(find_branch(dir))
1047
 
 
 
1084
        upgrade(dir)
1048
1085
 
1049
1086
 
1050
1087
class cmd_whoami(Command):
1053
1090
    
1054
1091
    def run(self, email=False):
1055
1092
        try:
1056
 
            b = bzrlib.branch.find_branch('.')
1057
 
        except:
 
1093
            b = bzrlib.branch.Branch.open_containing('.')
 
1094
        except NotBranchError:
1058
1095
            b = None
1059
1096
        
1060
1097
        if email:
1125
1162
    def run(self, branch, other):
1126
1163
        from bzrlib.revision import common_ancestor, MultipleRevisionSources
1127
1164
        
1128
 
        branch1 = find_branch(branch)
1129
 
        branch2 = find_branch(other)
 
1165
        branch1 = Branch.open_containing(branch)
 
1166
        branch2 = Branch.open_containing(other)
1130
1167
 
1131
1168
        history_1 = branch1.revision_history()
1132
1169
        history_2 = branch2.revision_history()
1133
1170
 
1134
 
        last1 = branch1.last_patch()
1135
 
        last2 = branch2.last_patch()
 
1171
        last1 = branch1.last_revision()
 
1172
        last2 = branch2.last_revision()
1136
1173
 
1137
1174
        source = MultipleRevisionSources(branch1, branch2)
1138
1175
        
1195
1232
            other = [branch, -1]
1196
1233
        else:
1197
1234
            if len(revision) == 1:
1198
 
                other = [branch, revision[0]]
1199
1235
                base = [None, None]
 
1236
                other = [branch, revision[0].in_history(branch).revno]
1200
1237
            else:
1201
1238
                assert len(revision) == 2
1202
1239
                if None in revision:
1203
1240
                    raise BzrCommandError(
1204
1241
                        "Merge doesn't permit that revision specifier.")
1205
 
                base = [branch, revision[0]]
1206
 
                other = [branch, revision[1]]
 
1242
                b = Branch.open(branch)
 
1243
 
 
1244
                base = [branch, revision[0].in_history(b).revno]
 
1245
                other = [branch, revision[1].in_history(b).revno]
1207
1246
 
1208
1247
        try:
1209
1248
            merge(other, base, check_clean=(not force), merge_type=merge_type)
1230
1269
 
1231
1270
    def run(self, revision=None, no_backup=False, file_list=None):
1232
1271
        from bzrlib.merge import merge
1233
 
        from bzrlib.branch import Branch
1234
1272
        from bzrlib.commands import parse_spec
1235
1273
 
1236
1274
        if file_list is not None:
1237
1275
            if len(file_list) == 0:
1238
1276
                raise BzrCommandError("No files specified")
1239
1277
        if revision is None:
1240
 
            revision = [-1]
 
1278
            revno = -1
1241
1279
        elif len(revision) != 1:
1242
1280
            raise BzrCommandError('bzr revert --revision takes exactly 1 argument')
1243
 
        merge(('.', revision[0]), parse_spec('.'),
 
1281
        else:
 
1282
            b = Branch.open_containing('.')
 
1283
            revno = revision[0].in_history(b).revno
 
1284
        merge(('.', revno), parse_spec('.'),
1244
1285
              check_clean=False,
1245
1286
              ignore_zero=True,
1246
1287
              backup_files=not no_backup,
1247
1288
              file_list=file_list)
1248
1289
        if not file_list:
1249
 
            Branch('.').set_pending_merges([])
 
1290
            Branch.open_containing('.').set_pending_merges([])
1250
1291
 
1251
1292
 
1252
1293
class cmd_assert_fail(Command):
1284
1325
        shellcomplete.shellcomplete(context)
1285
1326
 
1286
1327
 
 
1328
class cmd_fetch(Command):
 
1329
    """Copy in history from another branch but don't merge it.
 
1330
 
 
1331
    This is an internal method used for pull and merge."""
 
1332
    hidden = True
 
1333
    takes_args = ['from_branch', 'to_branch']
 
1334
    def run(self, from_branch, to_branch):
 
1335
        from bzrlib.fetch import Fetcher
 
1336
        from bzrlib.branch import Branch
 
1337
        from_b = Branch(from_branch)
 
1338
        to_b = Branch(to_branch)
 
1339
        Fetcher(to_b, from_b)
 
1340
        
 
1341
 
 
1342
 
1287
1343
class cmd_missing(Command):
1288
1344
    """What is missing in this branch relative to other branch.
1289
1345
    """
 
1346
    # TODO: rewrite this in terms of ancestry so that it shows only
 
1347
    # unmerged things
 
1348
    
1290
1349
    takes_args = ['remote?']
1291
1350
    aliases = ['mis', 'miss']
1292
1351
    # We don't have to add quiet to the list, because 
1300
1359
        if verbose and quiet:
1301
1360
            raise BzrCommandError('Cannot pass both quiet and verbose')
1302
1361
 
1303
 
        b = find_branch('.')
 
1362
        b = Branch.open_containing('.')
1304
1363
        parent = b.get_parent()
1305
1364
        if remote is None:
1306
1365
            if parent is None:
1310
1369
                    print "Using last location: %s" % parent
1311
1370
                remote = parent
1312
1371
        elif parent is None:
1313
 
            # We only update x-pull if it did not exist, missing should not change the parent
1314
 
            b.controlfile('x-pull', 'wb').write(remote + '\n')
1315
 
        br_remote = find_branch(remote)
1316
 
 
 
1372
            # We only update parent if it did not exist, missing
 
1373
            # should not change the parent
 
1374
            b.set_parent(remote)
 
1375
        br_remote = Branch.open_containing(remote)
1317
1376
        return show_missing(b, br_remote, verbose=verbose, quiet=quiet)
1318
1377
 
1319
1378
 
1320
 
 
1321
1379
class cmd_plugins(Command):
1322
1380
    """List plugins"""
1323
1381
    hidden = True