~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

  • Committer: Martin Pool
  • Date: 2005-09-30 00:58:02 UTC
  • mto: (1185.14.2)
  • mto: This revision was merged to the branch mainline in revision 1396.
  • Revision ID: mbp@sourcefrog.net-20050930005802-721cfc318e393817
- copy_branch creates destination if it doesn't exist

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
73
    takes_options = ['all', 'show-ids', 'revision']
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
 
        from bzrlib.xml import pack_xml
96
 
        pack_xml(find_branch('.').get_revision(revision_id), sys.stdout)
 
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()
 
127
 
105
128
 
106
129
class cmd_revision_info(Command):
107
130
    """Show revision number and revision id for a given revision identifier.
109
132
    hidden = True
110
133
    takes_args = ['revision_info*']
111
134
    takes_options = ['revision']
112
 
    def run(self, revision=None, revision_info_list=None):
113
 
        from bzrlib.branch import find_branch
 
135
    def run(self, revision=None, revision_info_list=[]):
 
136
        from bzrlib.revisionspec import RevisionSpec
114
137
 
115
138
        revs = []
116
139
        if revision is not None:
117
140
            revs.extend(revision)
118
141
        if revision_info_list is not None:
119
 
            revs.extend(revision_info_list)
 
142
            for rev in revision_info_list:
 
143
                revs.append(RevisionSpec(rev))
120
144
        if len(revs) == 0:
121
145
            raise BzrCommandError('You must supply a revision identifier')
122
146
 
123
 
        b = find_branch('.')
 
147
        b = Branch.open_containing('.')
124
148
 
125
149
        for rev in revs:
126
 
            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)
127
155
 
128
156
    
129
157
class cmd_add(Command):
144
172
    Therefore simply saying 'bzr add' will version all files that
145
173
    are currently unknown.
146
174
 
147
 
    TODO: Perhaps adding a file whose directly is not versioned should
148
 
    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.
149
179
    """
150
180
    takes_args = ['file*']
151
181
    takes_options = ['verbose', 'no-recurse']
170
200
        for d in dir_list:
171
201
            os.mkdir(d)
172
202
            if not b:
173
 
                b = find_branch(d)
 
203
                b = Branch.open_containing(d)
174
204
            b.add([d])
175
205
            print 'added', d
176
206
 
181
211
    hidden = True
182
212
    
183
213
    def run(self, filename):
184
 
        print find_branch(filename).relpath(filename)
 
214
        print Branch.open_containing(filename).relpath(filename)
185
215
 
186
216
 
187
217
 
190
220
    takes_options = ['revision', 'show-ids']
191
221
    
192
222
    def run(self, revision=None, show_ids=False):
193
 
        b = find_branch('.')
194
 
        if revision == None:
 
223
        b = Branch.open_containing('.')
 
224
        if revision is None:
195
225
            inv = b.read_working_inventory()
196
226
        else:
197
227
            if len(revision) > 1:
198
228
                raise BzrCommandError('bzr inventory --revision takes'
199
229
                    ' exactly one revision identifier')
200
 
            inv = b.get_revision_inventory(b.lookup_revision(revision[0]))
 
230
            inv = b.get_revision_inventory(revision[0].in_history(b).rev_id)
201
231
 
202
232
        for path, entry in inv.entries():
203
233
            if show_ids:
216
246
    """
217
247
    takes_args = ['source$', 'dest']
218
248
    def run(self, source_list, dest):
219
 
        b = find_branch('.')
 
249
        b = Branch.open_containing('.')
220
250
 
221
251
        # TODO: glob expansion on windows?
222
252
        b.move([b.relpath(s) for s in source_list], b.relpath(dest))
239
269
    takes_args = ['from_name', 'to_name']
240
270
    
241
271
    def run(self, from_name, to_name):
242
 
        b = find_branch('.')
 
272
        b = Branch.open_containing('.')
243
273
        b.rename_one(b.relpath(from_name), b.relpath(to_name))
244
274
 
245
275
 
261
291
    def run(self, names_list):
262
292
        if len(names_list) < 2:
263
293
            raise BzrCommandError("missing file argument")
264
 
        b = find_branch(names_list[0])
 
294
        b = Branch.open_containing(names_list[0])
265
295
 
266
296
        rel_names = [b.relpath(x) for x in names_list]
267
297
        
273
303
            if len(names_list) != 2:
274
304
                raise BzrCommandError('to mv multiple files the destination '
275
305
                                      'must be a versioned directory')
276
 
            for pair in b.move(rel_names[0], rel_names[1]):
277
 
                print "%s => %s" % pair
 
306
            b.rename_one(rel_names[0], rel_names[1])
 
307
            print "%s => %s" % (rel_names[0], rel_names[1])
278
308
            
279
309
    
280
310
 
300
330
        import tempfile
301
331
        from shutil import rmtree
302
332
        import errno
303
 
        from bzrlib.branch import pull_loc
304
333
        
305
 
        br_to = find_branch('.')
306
 
        stored_loc = None
307
 
        try:
308
 
            stored_loc = br_to.controlfile("x-pull", "rb").read().rstrip('\n')
309
 
        except IOError, e:
310
 
            if e.errno != errno.ENOENT:
311
 
                raise
 
334
        br_to = Branch.open_containing('.')
 
335
        stored_loc = br_to.get_parent()
312
336
        if location is None:
313
337
            if stored_loc is None:
314
338
                raise BzrCommandError("No pull location known or specified.")
316
340
                print "Using last location: %s" % stored_loc
317
341
                location = stored_loc
318
342
        cache_root = tempfile.mkdtemp()
319
 
        from bzrlib.branch import DivergedBranches
320
 
        br_from = find_branch(location)
321
 
        location = pull_loc(br_from)
 
343
        from bzrlib.errors import DivergedBranches
 
344
        br_from = Branch.open_containing(location)
 
345
        location = br_from.base
322
346
        old_revno = br_to.revno()
323
347
        try:
324
 
            from branch import find_cached_branch, DivergedBranches
325
 
            br_from = find_cached_branch(location, cache_root)
326
 
            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
327
352
            old_revno = br_to.revno()
328
353
            try:
329
354
                br_to.update_revisions(br_from)
333
358
                
334
359
            merge(('.', -1), ('.', old_revno), check_clean=False)
335
360
            if location != stored_loc:
336
 
                br_to.controlfile("x-pull", "wb").write(location + "\n")
 
361
                br_to.set_parent(location)
337
362
        finally:
338
363
            rmtree(cache_root)
339
364
 
347
372
 
348
373
    To retrieve the branch as of a particular revision, supply the --revision
349
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.
350
379
    """
351
380
    takes_args = ['from_location', 'to_location?']
352
 
    takes_options = ['revision']
 
381
    takes_options = ['revision', 'basis']
353
382
    aliases = ['get', 'clone']
354
383
 
355
 
    def run(self, from_location, to_location=None, revision=None):
356
 
        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
357
386
        import tempfile
358
387
        import errno
359
388
        from shutil import rmtree
365
394
                raise BzrCommandError(
366
395
                    'bzr branch --revision takes exactly 1 revision value')
367
396
            try:
368
 
                br_from = find_cached_branch(from_location, cache_root)
 
397
                br_from = Branch.open(from_location)
369
398
            except OSError, e:
370
399
                if e.errno == errno.ENOENT:
371
400
                    raise BzrCommandError('Source location "%s" does not'
372
401
                                          ' exist.' % to_location)
373
402
                else:
374
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
375
413
            if to_location is None:
376
414
                to_location = os.path.basename(from_location.rstrip("/\\"))
377
415
            try:
386
424
                else:
387
425
                    raise
388
426
            try:
389
 
                copy_branch(br_from, to_location, revision[0])
 
427
                copy_branch(br_from, to_location, revision_id, basis_branch)
390
428
            except bzrlib.errors.NoSuchRevision:
391
429
                rmtree(to_location)
392
430
                msg = "The branch %s has no revision %d." % (from_location, revision[0])
393
431
                raise BzrCommandError(msg)
 
432
            except bzrlib.errors.UnlistableBranch:
 
433
                msg = "The branch %s cannot be used as a --basis"
394
434
        finally:
395
435
            rmtree(cache_root)
396
436
 
405
445
    takes_args = ['dir?']
406
446
 
407
447
    def run(self, dir='.'):
408
 
        b = find_branch(dir)
 
448
        b = Branch.open_containing(dir)
409
449
        old_inv = b.basis_tree().inventory
410
450
        new_inv = b.read_working_inventory()
411
451
 
422
462
    def run(self, branch=None):
423
463
        import info
424
464
 
425
 
        b = find_branch(branch)
 
465
        b = Branch.open_containing(branch)
426
466
        info.show_info(b)
427
467
 
428
468
 
436
476
    takes_options = ['verbose']
437
477
    
438
478
    def run(self, file_list, verbose=False):
439
 
        b = find_branch(file_list[0])
 
479
        b = Branch.open_containing(file_list[0])
440
480
        b.remove([b.relpath(f) for f in file_list], verbose=verbose)
441
481
 
442
482
 
450
490
    hidden = True
451
491
    takes_args = ['filename']
452
492
    def run(self, filename):
453
 
        b = find_branch(filename)
 
493
        b = Branch.open_containing(filename)
454
494
        i = b.inventory.path2id(b.relpath(filename))
455
495
        if i == None:
456
496
            raise BzrError("%r is not a versioned file" % filename)
466
506
    hidden = True
467
507
    takes_args = ['filename']
468
508
    def run(self, filename):
469
 
        b = find_branch(filename)
 
509
        b = Branch.open_containing(filename)
470
510
        inv = b.inventory
471
511
        fid = inv.path2id(b.relpath(filename))
472
512
        if fid == None:
479
519
    """Display list of revision ids on this branch."""
480
520
    hidden = True
481
521
    def run(self):
482
 
        for patchid in find_branch('.').revision_history():
 
522
        for patchid in Branch.open_containing('.').revision_history():
483
523
            print patchid
484
524
 
485
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
 
486
535
class cmd_directories(Command):
487
536
    """Display list of versioned directories in this branch."""
488
537
    def run(self):
489
 
        for name, ie in find_branch('.').read_working_inventory().directories():
 
538
        for name, ie in Branch.open_containing('.').read_working_inventory().directories():
490
539
            if name == '':
491
540
                print '.'
492
541
            else:
508
557
    """
509
558
    def run(self):
510
559
        from bzrlib.branch import Branch
511
 
        Branch('.', init=True)
 
560
        Branch.initialize('.')
512
561
 
513
562
 
514
563
class cmd_diff(Command):
535
584
    examples:
536
585
        bzr diff
537
586
        bzr diff -r1
538
 
        bzr diff -r1:2
 
587
        bzr diff -r1..2
539
588
    """
540
589
    
541
590
    takes_args = ['file*']
546
595
        from bzrlib.diff import show_diff
547
596
 
548
597
        if file_list:
549
 
            b = find_branch(file_list[0])
 
598
            b = Branch.open_containing(file_list[0])
550
599
            file_list = [b.relpath(f) for f in file_list]
551
600
            if file_list == ['']:
552
601
                # just pointing to top-of-tree
553
602
                file_list = None
554
603
        else:
555
 
            b = find_branch('.')
 
604
            b = Branch.open_containing('.')
556
605
 
557
606
        if revision is not None:
558
607
            if len(revision) == 1:
577
626
    TODO: Show files deleted since a previous revision, or between two revisions.
578
627
    """
579
628
    def run(self, show_ids=False):
580
 
        b = find_branch('.')
 
629
        b = Branch.open_containing('.')
581
630
        old = b.basis_tree()
582
631
        new = b.working_tree()
583
632
 
600
649
    def run(self):
601
650
        from bzrlib.delta import compare_trees
602
651
 
603
 
        b = find_branch('.')
 
652
        b = Branch.open_containing('.')
604
653
        td = compare_trees(b.basis_tree(), b.working_tree())
605
654
 
606
655
        for path, id, kind in td.modified:
612
661
    """List files added in working tree."""
613
662
    hidden = True
614
663
    def run(self):
615
 
        b = find_branch('.')
 
664
        b = Branch.open_containing('.')
616
665
        wt = b.working_tree()
617
666
        basis_inv = b.basis_tree().inventory
618
667
        inv = wt.inventory
634
683
    takes_args = ['filename?']
635
684
    def run(self, filename=None):
636
685
        """Print the branch root."""
637
 
        b = find_branch(filename)
638
 
        print getattr(b, 'base', None) or getattr(b, 'baseurl')
 
686
        b = Branch.open_containing(filename)
 
687
        print b.base
639
688
 
640
689
 
641
690
class cmd_log(Command):
670
719
        direction = (forward and 'forward') or 'reverse'
671
720
        
672
721
        if filename:
673
 
            b = find_branch(filename)
 
722
            b = Branch.open_containing(filename)
674
723
            fp = b.relpath(filename)
675
724
            if fp:
676
725
                file_id = b.read_working_inventory().path2id(fp)
677
726
            else:
678
727
                file_id = None  # points to branch root
679
728
        else:
680
 
            b = find_branch('.')
 
729
            b = Branch.open_containing('.')
681
730
            file_id = None
682
731
 
683
732
        if revision is None:
684
733
            rev1 = None
685
734
            rev2 = None
686
735
        elif len(revision) == 1:
687
 
            rev1 = rev2 = b.get_revision_info(revision[0])[0]
 
736
            rev1 = rev2 = revision[0].in_history(b).revno
688
737
        elif len(revision) == 2:
689
 
            rev1 = b.get_revision_info(revision[0])[0]
690
 
            rev2 = b.get_revision_info(revision[1])[0]
 
738
            rev1 = revision[0].in_history(b).revno
 
739
            rev2 = revision[1].in_history(b).revno
691
740
        else:
692
741
            raise BzrCommandError('bzr log --revision takes one or two values.')
693
742
 
729
778
    hidden = True
730
779
    takes_args = ["filename"]
731
780
    def run(self, filename):
732
 
        b = find_branch(filename)
 
781
        b = Branch.open_containing(filename)
733
782
        inv = b.read_working_inventory()
734
783
        file_id = inv.path2id(b.relpath(filename))
735
784
        for revno, revision_id, what in bzrlib.log.find_touching_revisions(b, file_id):
743
792
    """
744
793
    hidden = True
745
794
    def run(self, revision=None, verbose=False):
746
 
        b = find_branch('.')
 
795
        b = Branch.open_containing('.')
747
796
        if revision == None:
748
797
            tree = b.working_tree()
749
798
        else:
750
 
            tree = b.revision_tree(b.lookup_revision(revision))
 
799
            tree = b.revision_tree(revision.in_history(b).rev_id)
751
800
 
752
801
        for fp, fc, kind, fid in tree.list_files():
753
802
            if verbose:
768
817
    """List unknown files."""
769
818
    def run(self):
770
819
        from bzrlib.osutils import quotefn
771
 
        for f in find_branch('.').unknowns():
 
820
        for f in Branch.open_containing('.').unknowns():
772
821
            print quotefn(f)
773
822
 
774
823
 
796
845
        from bzrlib.atomicfile import AtomicFile
797
846
        import os.path
798
847
 
799
 
        b = find_branch('.')
 
848
        b = Branch.open_containing('.')
800
849
        ifn = b.abspath('.bzrignore')
801
850
 
802
851
        if os.path.exists(ifn):
836
885
 
837
886
    See also: bzr ignore"""
838
887
    def run(self):
839
 
        tree = find_branch('.').working_tree()
 
888
        tree = Branch.open_containing('.').working_tree()
840
889
        for path, file_class, kind, file_id in tree.list_files():
841
890
            if file_class != 'I':
842
891
                continue
860
909
        except ValueError:
861
910
            raise BzrCommandError("not a valid revision-number: %r" % revno)
862
911
 
863
 
        print find_branch('.').lookup_revision(revno)
 
912
        print Branch.open_containing('.').get_rev_id(revno)
864
913
 
865
914
 
866
915
class cmd_export(Command):
879
928
    takes_options = ['revision', 'format', 'root']
880
929
    def run(self, dest, revision=None, format=None, root=None):
881
930
        import os.path
882
 
        b = find_branch('.')
 
931
        b = Branch.open_containing('.')
883
932
        if revision is None:
884
 
            rev_id = b.last_patch()
 
933
            rev_id = b.last_revision()
885
934
        else:
886
935
            if len(revision) != 1:
887
936
                raise BzrError('bzr export --revision takes exactly 1 argument')
888
 
            revno, rev_id = b.get_revision_info(revision[0])
 
937
            rev_id = revision[0].in_history(b).rev_id
889
938
        t = b.revision_tree(rev_id)
890
939
        root, ext = os.path.splitext(dest)
891
940
        if not format:
907
956
    takes_args = ['filename']
908
957
 
909
958
    def run(self, filename, revision=None):
910
 
        if revision == None:
 
959
        if revision is None:
911
960
            raise BzrCommandError("bzr cat requires a revision number")
912
961
        elif len(revision) != 1:
913
962
            raise BzrCommandError("bzr cat --revision takes exactly one number")
914
 
        b = find_branch('.')
915
 
        b.print_file(b.relpath(filename), revision[0])
 
963
        b = Branch.open_containing('.')
 
964
        b.print_file(b.relpath(filename), revision[0].in_history(b).revno)
916
965
 
917
966
 
918
967
class cmd_local_time_offset(Command):
945
994
    aliases = ['ci', 'checkin']
946
995
 
947
996
    # TODO: Give better message for -s, --summary, used by tla people
 
997
 
 
998
    # XXX: verbose currently does nothing
948
999
    
949
1000
    def run(self, message=None, file=None, verbose=True, selected_list=None,
950
1001
            unchanged=False):
953
1004
        from bzrlib.status import show_status
954
1005
        from cStringIO import StringIO
955
1006
 
956
 
        b = find_branch('.')
 
1007
        b = Branch.open_containing('.')
957
1008
        if selected_list:
958
1009
            selected_list = [b.relpath(s) for s in selected_list]
959
1010
            
974
1025
            message = codecs.open(file, 'rt', bzrlib.user_encoding).read()
975
1026
 
976
1027
        try:
977
 
            b.commit(message, verbose=verbose,
 
1028
            b.commit(message,
978
1029
                     specific_files=selected_list,
979
1030
                     allow_pointless=unchanged)
980
1031
        except PointlessCommit:
989
1040
 
990
1041
    This command checks various invariants about the branch storage to
991
1042
    detect data corruption or bzr bugs.
992
 
 
993
 
    If given the --update flag, it will update some optional fields
994
 
    to help ensure data consistency.
995
1043
    """
996
1044
    takes_args = ['dir?']
997
1045
 
998
1046
    def run(self, dir='.'):
999
1047
        from bzrlib.check import check
1000
1048
 
1001
 
        check(find_branch(dir))
 
1049
        check(Branch.open_containing(dir))
1002
1050
 
1003
1051
 
1004
1052
class cmd_scan_cache(Command):
1026
1074
 
1027
1075
    The check command or bzr developers may sometimes advise you to run
1028
1076
    this command.
 
1077
 
 
1078
    This version of this command upgrades from the full-text storage
 
1079
    used by bzr 0.0.8 and earlier to the weave format (v5).
1029
1080
    """
1030
1081
    takes_args = ['dir?']
1031
1082
 
1032
1083
    def run(self, dir='.'):
1033
1084
        from bzrlib.upgrade import upgrade
1034
 
        upgrade(find_branch(dir))
1035
 
 
 
1085
        upgrade(dir)
1036
1086
 
1037
1087
 
1038
1088
class cmd_whoami(Command):
1041
1091
    
1042
1092
    def run(self, email=False):
1043
1093
        try:
1044
 
            b = bzrlib.branch.find_branch('.')
1045
 
        except:
 
1094
            b = bzrlib.branch.Branch.open_containing('.')
 
1095
        except NotBranchError:
1046
1096
            b = None
1047
1097
        
1048
1098
        if email:
1113
1163
    def run(self, branch, other):
1114
1164
        from bzrlib.revision import common_ancestor, MultipleRevisionSources
1115
1165
        
1116
 
        branch1 = find_branch(branch)
1117
 
        branch2 = find_branch(other)
 
1166
        branch1 = Branch.open_containing(branch)
 
1167
        branch2 = Branch.open_containing(other)
1118
1168
 
1119
1169
        history_1 = branch1.revision_history()
1120
1170
        history_2 = branch2.revision_history()
1121
1171
 
1122
 
        last1 = branch1.last_patch()
1123
 
        last2 = branch2.last_patch()
 
1172
        last1 = branch1.last_revision()
 
1173
        last2 = branch2.last_revision()
1124
1174
 
1125
1175
        source = MultipleRevisionSources(branch1, branch2)
1126
1176
        
1183
1233
            other = [branch, -1]
1184
1234
        else:
1185
1235
            if len(revision) == 1:
1186
 
                other = [branch, revision[0]]
1187
1236
                base = [None, None]
 
1237
                other = [branch, revision[0].in_history(branch).revno]
1188
1238
            else:
1189
1239
                assert len(revision) == 2
1190
1240
                if None in revision:
1191
1241
                    raise BzrCommandError(
1192
1242
                        "Merge doesn't permit that revision specifier.")
1193
 
                base = [branch, revision[0]]
1194
 
                other = [branch, revision[1]]
 
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]
1195
1248
 
1196
1249
        try:
1197
1250
            merge(other, base, check_clean=(not force), merge_type=merge_type)
1225
1278
            if len(file_list) == 0:
1226
1279
                raise BzrCommandError("No files specified")
1227
1280
        if revision is None:
1228
 
            revision = [-1]
 
1281
            revno = -1
1229
1282
        elif len(revision) != 1:
1230
1283
            raise BzrCommandError('bzr revert --revision takes exactly 1 argument')
1231
 
        merge(('.', revision[0]), parse_spec('.'),
 
1284
        else:
 
1285
            b = Branch.open_containing('.')
 
1286
            revno = revision[0].in_history(b).revno
 
1287
        merge(('.', revno), parse_spec('.'),
1232
1288
              check_clean=False,
1233
1289
              ignore_zero=True,
1234
1290
              backup_files=not no_backup,
1235
1291
              file_list=file_list)
1236
1292
        if not file_list:
1237
 
            Branch('.').set_pending_merges([])
 
1293
            Branch.open_containing('.').set_pending_merges([])
1238
1294
 
1239
1295
 
1240
1296
class cmd_assert_fail(Command):
1272
1328
        shellcomplete.shellcomplete(context)
1273
1329
 
1274
1330
 
 
1331
class cmd_fetch(Command):
 
1332
    """Copy in history from another branch but don't merge it.
 
1333
 
 
1334
    This is an internal method used for pull and merge."""
 
1335
    hidden = True
 
1336
    takes_args = ['from_branch', 'to_branch']
 
1337
    def run(self, from_branch, to_branch):
 
1338
        from bzrlib.fetch import Fetcher
 
1339
        from bzrlib.branch import Branch
 
1340
        from_b = Branch(from_branch)
 
1341
        to_b = Branch(to_branch)
 
1342
        Fetcher(to_b, from_b)
 
1343
        
 
1344
 
 
1345
 
1275
1346
class cmd_missing(Command):
1276
1347
    """What is missing in this branch relative to other branch.
1277
1348
    """
 
1349
    # TODO: rewrite this in terms of ancestry so that it shows only
 
1350
    # unmerged things
 
1351
    
1278
1352
    takes_args = ['remote?']
1279
1353
    aliases = ['mis', 'miss']
1280
1354
    # We don't have to add quiet to the list, because 
1288
1362
        if verbose and quiet:
1289
1363
            raise BzrCommandError('Cannot pass both quiet and verbose')
1290
1364
 
1291
 
        b = find_branch('.')
 
1365
        b = Branch.open_containing('.')
1292
1366
        parent = b.get_parent()
1293
1367
        if remote is None:
1294
1368
            if parent is None:
1298
1372
                    print "Using last location: %s" % parent
1299
1373
                remote = parent
1300
1374
        elif parent is None:
1301
 
            # We only update x-pull if it did not exist, missing should not change the parent
1302
 
            b.controlfile('x-pull', 'wb').write(remote + '\n')
1303
 
        br_remote = find_branch(remote)
 
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)
1304
1379
 
1305
1380
        return show_missing(b, br_remote, verbose=verbose, quiet=quiet)
1306
1381