/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

  • Committer: Andrew Bennetts
  • Date: 2008-10-01 05:40:45 UTC
  • mfrom: (3753 +trunk)
  • mto: This revision was merged to the branch mainline in revision 3756.
  • Revision ID: andrew.bennetts@canonical.com-20081001054045-z50qc0d3p9qsc5im
Merge from bzr.dev; resolve osutils.py conflict by reverting my sha import hackery.

Show diffs side-by-side

added added

removed removed

Lines of Context:
66
66
                                     (e.path, file_list[0]))
67
67
 
68
68
 
 
69
def _get_one_revision_tree(command_name, revisions, branch=None, tree=None):
 
70
    if branch is None:
 
71
        branch = tree.branch
 
72
    if revisions is None:
 
73
        if tree is not None:
 
74
            rev_tree = tree.basis_tree()
 
75
        else:
 
76
            rev_tree = branch.basis_tree()
 
77
    else:
 
78
        if len(revisions) != 1:
 
79
            raise errors.BzrCommandError(
 
80
                'bzr %s --revision takes exactly one revision identifier' % (
 
81
                    command_name,))
 
82
        rev_tree = revisions[0].as_tree(branch)
 
83
    return rev_tree
 
84
 
 
85
 
69
86
# XXX: Bad function name; should possibly also be a class method of
70
87
# WorkingTree rather than a function.
71
88
def internal_tree_files(file_list, default_branch=u'.'):
249
266
    To re-create the working tree, use "bzr checkout".
250
267
    """
251
268
    _see_also = ['checkout', 'working-trees']
252
 
 
253
269
    takes_args = ['location?']
 
270
    takes_options = [
 
271
        Option('force',
 
272
               help='Remove the working tree even if it has '
 
273
                    'uncommitted changes.'),
 
274
        ]
254
275
 
255
 
    def run(self, location='.'):
 
276
    def run(self, location='.', force=False):
256
277
        d = bzrdir.BzrDir.open(location)
257
278
        
258
279
        try:
262
283
        except errors.NotLocalUrl:
263
284
            raise errors.BzrCommandError("You cannot remove the working tree of a "
264
285
                                         "remote path")
265
 
        
 
286
        if not force:
 
287
            changes = working.changes_from(working.basis_tree())
 
288
            if changes.has_changed():
 
289
                raise errors.UncommittedChanges(working)
 
290
 
266
291
        working_path = working.bzrdir.root_transport.base
267
292
        branch_path = working.branch.bzrdir.root_transport.base
268
293
        if working_path != branch_path:
481
506
                    raise errors.BzrCommandError(
482
507
                        'bzr inventory --revision takes exactly one revision'
483
508
                        ' identifier')
484
 
                revision_id = revision[0].as_revision_id(work_tree.branch)
485
 
                tree = work_tree.branch.repository.revision_tree(revision_id)
 
509
                tree = revision[0].as_tree(work_tree.branch)
486
510
 
487
511
                extra_trees = [work_tree]
488
512
                tree.lock_read()
836
860
            help='Create a stacked branch referring to the source branch. '
837
861
                'The new branch will depend on the availability of the source '
838
862
                'branch for all operations.'),
 
863
        Option('standalone',
 
864
               help='Do not use a shared repository, even if available.'),
839
865
        ]
840
866
    aliases = ['get', 'clone']
841
867
 
842
868
    def run(self, from_location, to_location=None, revision=None,
843
 
            hardlink=False, stacked=False):
 
869
            hardlink=False, stacked=False, standalone=False):
844
870
        from bzrlib.tag import _merge_tags_if_possible
845
871
        if revision is None:
846
872
            revision = [None]
875
901
                dir = br_from.bzrdir.sprout(to_transport.base, revision_id,
876
902
                                            possible_transports=[to_transport],
877
903
                                            accelerator_tree=accelerator_tree,
878
 
                                            hardlink=hardlink, stacked=stacked)
 
904
                                            hardlink=hardlink, stacked=stacked,
 
905
                                            force_new_repo=standalone)
879
906
                branch = dir.open_branch()
880
907
            except errors.NoSuchRevision:
881
908
                to_transport.delete_tree('.')
1311
1338
            _create_prefix(to_transport)
1312
1339
 
1313
1340
        try:
1314
 
            existing_bzrdir = bzrdir.BzrDir.open_from_transport(to_transport)
 
1341
            a_bzrdir = bzrdir.BzrDir.open_from_transport(to_transport)
1315
1342
        except errors.NotBranchError:
1316
1343
            # really a NotBzrDir error...
1317
1344
            create_branch = bzrdir.BzrDir.create_branch_convenience
1318
1345
            branch = create_branch(to_transport.base, format=format,
1319
1346
                                   possible_transports=[to_transport])
 
1347
            a_bzrdir = branch.bzrdir
1320
1348
        else:
1321
1349
            from bzrlib.transport.local import LocalTransport
1322
 
            if existing_bzrdir.has_branch():
 
1350
            if a_bzrdir.has_branch():
1323
1351
                if (isinstance(to_transport, LocalTransport)
1324
 
                    and not existing_bzrdir.has_workingtree()):
 
1352
                    and not a_bzrdir.has_workingtree()):
1325
1353
                        raise errors.BranchExistsWithoutWorkingTree(location)
1326
1354
                raise errors.AlreadyBranchError(location)
1327
 
            else:
1328
 
                branch = existing_bzrdir.create_branch()
1329
 
                existing_bzrdir.create_workingtree()
 
1355
            branch = a_bzrdir.create_branch()
 
1356
            a_bzrdir.create_workingtree()
1330
1357
        if append_revisions_only:
1331
1358
            try:
1332
1359
                branch.set_append_revisions_only(True)
1335
1362
                    ' to append-revisions-only.  Try --experimental-branch6')
1336
1363
        if not is_quiet():
1337
1364
            from bzrlib.info import show_bzrdir_info
1338
 
            show_bzrdir_info(bzrdir.BzrDir.open_containing_from_transport(
1339
 
                to_transport)[0], verbose=0, outfile=self.outf)
 
1365
            show_bzrdir_info(a_bzrdir, verbose=0, outfile=self.outf)
1340
1366
 
1341
1367
 
1342
1368
class cmd_init_repository(Command):
1390
1416
        repo.set_make_working_trees(not no_trees)
1391
1417
        if not is_quiet():
1392
1418
            from bzrlib.info import show_bzrdir_info
1393
 
            show_bzrdir_info(bzrdir.BzrDir.open_containing_from_transport(
1394
 
                to_transport)[0], verbose=0, outfile=self.outf)
 
1419
            show_bzrdir_info(repo.bzrdir, verbose=0, outfile=self.outf)
1395
1420
 
1396
1421
 
1397
1422
class cmd_diff(Command):
1663
1688
                   help='Show files changed in each revision.'),
1664
1689
            'show-ids',
1665
1690
            'revision',
 
1691
            Option('change',
 
1692
                   type=bzrlib.option._parse_revision_str,
 
1693
                   short_name='c',
 
1694
                   help='Show just the specified revision.'
 
1695
                   ' See also "help revisionspec".'),
1666
1696
            'log-format',
1667
1697
            Option('message',
1668
1698
                   short_name='m',
1683
1713
            show_ids=False,
1684
1714
            forward=False,
1685
1715
            revision=None,
 
1716
            change=None,
1686
1717
            log_format=None,
1687
1718
            message=None,
1688
1719
            limit=None):
1689
1720
        from bzrlib.log import show_log
1690
1721
        direction = (forward and 'forward') or 'reverse'
1691
 
        
 
1722
 
 
1723
        if change is not None:
 
1724
            if len(change) > 1:
 
1725
                raise errors.RangeInChangeOption()
 
1726
            if revision is not None:
 
1727
                raise errors.BzrCommandError(
 
1728
                    '--revision and --change are mutually exclusive')
 
1729
            else:
 
1730
                revision = change
 
1731
 
1692
1732
        # log everything
1693
1733
        file_id = None
1694
1734
        if location:
1840
1880
            relpath = u''
1841
1881
        elif relpath:
1842
1882
            relpath += '/'
1843
 
        if revision is not None:
1844
 
            tree = branch.repository.revision_tree(
1845
 
                revision[0].as_revision_id(branch))
1846
 
        elif tree is None:
1847
 
            tree = branch.basis_tree()
 
1883
        if revision is not None or tree is None:
 
1884
            tree = _get_one_revision_tree('ls', revision, branch=branch)
1848
1885
 
1849
1886
        tree.lock_read()
1850
1887
        try:
2068
2105
            subdir = None
2069
2106
        else:
2070
2107
            b, subdir = Branch.open_containing(branch_or_subdir)
2071
 
            
2072
 
        if revision is None:
2073
 
            # should be tree.last_revision  FIXME
2074
 
            rev_id = b.last_revision()
2075
 
        else:
2076
 
            if len(revision) != 1:
2077
 
                raise errors.BzrCommandError('bzr export --revision takes exactly 1 argument')
2078
 
            rev_id = revision[0].as_revision_id(b)
2079
 
        t = b.repository.revision_tree(rev_id)
 
2108
            tree = None
 
2109
 
 
2110
        rev_tree = _get_one_revision_tree('export', revision, branch=b, tree=tree)
2080
2111
        try:
2081
 
            export(t, dest, format, root, subdir)
 
2112
            export(rev_tree, dest, format, root, subdir)
2082
2113
        except errors.NoSuchExportFormat, e:
2083
2114
            raise errors.BzrCommandError('Unsupported export format: %s' % e.format)
2084
2115
 
2117
2148
    def _run(self, tree, b, relpath, filename, revision, name_from_revision):
2118
2149
        if tree is None:
2119
2150
            tree = b.basis_tree()
2120
 
        if revision is None:
2121
 
            revision_id = b.last_revision()
2122
 
        else:
2123
 
            revision_id = revision[0].as_revision_id(b)
 
2151
        rev_tree = _get_one_revision_tree('cat', revision, branch=b)
2124
2152
 
2125
2153
        cur_file_id = tree.path2id(relpath)
2126
 
        rev_tree = b.repository.revision_tree(revision_id)
2127
2154
        old_file_id = rev_tree.path2id(relpath)
2128
 
        
 
2155
 
2129
2156
        if name_from_revision:
2130
2157
            if old_file_id is None:
2131
 
                raise errors.BzrCommandError("%r is not present in revision %s"
2132
 
                                                % (filename, revision_id))
 
2158
                raise errors.BzrCommandError(
 
2159
                    "%r is not present in revision %s" % (
 
2160
                        filename, rev_tree.get_revision_id()))
2133
2161
            else:
2134
2162
                content = rev_tree.get_file_text(old_file_id)
2135
2163
        elif cur_file_id is not None:
2137
2165
        elif old_file_id is not None:
2138
2166
            content = rev_tree.get_file_text(old_file_id)
2139
2167
        else:
2140
 
            raise errors.BzrCommandError("%r is not present in revision %s" %
2141
 
                                         (filename, revision_id))
 
2168
            raise errors.BzrCommandError(
 
2169
                "%r is not present in revision %s" % (
 
2170
                    filename, rev_tree.get_revision_id()))
2142
2171
        self.outf.write(content)
2143
2172
 
2144
2173
 
3232
3261
    def run(self, revision=None, no_backup=False, file_list=None,
3233
3262
            forget_merges=None):
3234
3263
        tree, file_list = tree_files(file_list)
3235
 
        if forget_merges:
3236
 
            tree.set_parent_ids(tree.get_parent_ids()[:1])
3237
 
        else:
3238
 
            self._revert_tree_to_revision(tree, revision, file_list, no_backup)
 
3264
        tree.lock_write()
 
3265
        try:
 
3266
            if forget_merges:
 
3267
                tree.set_parent_ids(tree.get_parent_ids()[:1])
 
3268
            else:
 
3269
                self._revert_tree_to_revision(tree, revision, file_list, no_backup)
 
3270
        finally:
 
3271
            tree.unlock()
3239
3272
 
3240
3273
    @staticmethod
3241
3274
    def _revert_tree_to_revision(tree, revision, file_list, no_backup):
3242
 
        if revision is None:
3243
 
            rev_id = tree.last_revision()
3244
 
        elif len(revision) != 1:
3245
 
            raise errors.BzrCommandError('bzr revert --revision takes exactly 1 argument')
3246
 
        else:
3247
 
            rev_id = revision[0].as_revision_id(tree.branch)
 
3275
        rev_tree = _get_one_revision_tree('revert', revision, tree=tree)
3248
3276
        pb = ui.ui_factory.nested_progress_bar()
3249
3277
        try:
3250
 
            tree.revert(file_list,
3251
 
                        tree.branch.repository.revision_tree(rev_id),
3252
 
                        not no_backup, pb, report_changes=True)
 
3278
            tree.revert(file_list, rev_tree, not no_backup, pb,
 
3279
                report_changes=True)
3253
3280
        finally:
3254
3281
            pb.finished()
3255
3282
 
3316
3343
            Option('other', 'Same as --theirs-only.'),
3317
3344
            'log-format',
3318
3345
            'show-ids',
3319
 
            'verbose'
 
3346
            'verbose',
 
3347
            Option('include-merges', 'Show merged revisions.'),
3320
3348
            ]
3321
3349
    encoding_type = 'replace'
3322
3350
 
3323
3351
    @display_command
3324
3352
    def run(self, other_branch=None, reverse=False, mine_only=False,
3325
 
            theirs_only=False, log_format=None, long=False, short=False, line=False, 
3326
 
            show_ids=False, verbose=False, this=False, other=False):
 
3353
            theirs_only=False,
 
3354
            log_format=None, long=False, short=False, line=False,
 
3355
            show_ids=False, verbose=False, this=False, other=False,
 
3356
            include_merges=False):
3327
3357
        from bzrlib.missing import find_unmerged, iter_log_revisions
3328
3358
 
3329
3359
        if this:
3359
3389
            remote_branch.lock_read()
3360
3390
            try:
3361
3391
                local_extra, remote_extra = find_unmerged(
3362
 
                    local_branch, remote_branch, restrict)
 
3392
                    local_branch, remote_branch, restrict,
 
3393
                    backward=not reverse,
 
3394
                    include_merges=include_merges)
3363
3395
 
3364
3396
                if log_format is None:
3365
3397
                    registry = log.log_formatter_registry
3367
3399
                lf = log_format(to_file=self.outf,
3368
3400
                                show_ids=show_ids,
3369
3401
                                show_timezone='original')
3370
 
                if reverse is False:
3371
 
                    if local_extra is not None:
3372
 
                        local_extra.reverse()
3373
 
                    if remote_extra is not None:
3374
 
                        remote_extra.reverse()
3375
3402
 
3376
3403
                status_code = 0
3377
3404
                if local_extra and not theirs_only:
3542
3569
    @display_command
3543
3570
    def run(self, filename, all=False, long=False, revision=None,
3544
3571
            show_ids=False):
3545
 
        from bzrlib.annotate import annotate_file
 
3572
        from bzrlib.annotate import annotate_file, annotate_file_tree
3546
3573
        wt, branch, relpath = \
3547
3574
            bzrdir.BzrDir.open_containing_tree_or_branch(filename)
3548
3575
        if wt is not None:
3550
3577
        else:
3551
3578
            branch.lock_read()
3552
3579
        try:
3553
 
            if revision is None:
3554
 
                revision_id = branch.last_revision()
3555
 
            elif len(revision) != 1:
3556
 
                raise errors.BzrCommandError('bzr annotate --revision takes exactly 1 argument')
3557
 
            else:
3558
 
                revision_id = revision[0].as_revision_id(branch)
3559
 
            tree = branch.repository.revision_tree(revision_id)
 
3580
            tree = _get_one_revision_tree('annotate', revision, branch=branch)
3560
3581
            if wt is not None:
3561
3582
                file_id = wt.path2id(relpath)
3562
3583
            else:
3564
3585
            if file_id is None:
3565
3586
                raise errors.NotVersionedError(filename)
3566
3587
            file_version = tree.inventory[file_id].revision
3567
 
            annotate_file(branch, file_version, file_id, long, all, self.outf,
3568
 
                          show_ids=show_ids)
 
3588
            if wt is not None and revision is None:
 
3589
                # If there is a tree and we're not annotating historical
 
3590
                # versions, annotate the working tree's content.
 
3591
                annotate_file_tree(wt, file_id, self.outf, long, all,
 
3592
                    show_ids=show_ids)
 
3593
            else:
 
3594
                annotate_file(branch, file_version, file_id, long, all, self.outf,
 
3595
                              show_ids=show_ids)
3569
3596
        finally:
3570
3597
            if wt is not None:
3571
3598
                wt.unlock()
4559
4586
        try:
4560
4587
            to_branch = Branch.open(to_location)
4561
4588
        except errors.NotBranchError:
 
4589
            this_branch = control_dir.open_branch()
 
4590
            # This may be a heavy checkout, where we want the master branch
 
4591
            this_url = this_branch.get_bound_location()
 
4592
            # If not, use a local sibling
 
4593
            if this_url is None:
 
4594
                this_url = this_branch.base
4562
4595
            to_branch = Branch.open(
4563
 
                control_dir.open_branch().base + '../' + to_location)
 
4596
                urlutils.join(this_url, '..', to_location))
4564
4597
        switch.switch(control_dir, to_branch, force)
4565
4598
        note('Switched to branch: %s',
4566
4599
            urlutils.unescape_for_display(to_branch.base, 'utf-8'))