~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

  • Committer: Martin Pool
  • Date: 2005-09-01 02:34:38 UTC
  • Revision ID: mbp@sourcefrog.net-20050901023437-bf791a0ef5edae8d
- old docs: clarify that this is not mainly descended from arch anymore

Show diffs side-by-side

added added

removed removed

Lines of Context:
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 is specified, the changes since that revision are shown.
65
67
    """
66
 
    # XXX: FIXME: bzr status should accept a -r option to show changes
67
 
    # relative to a revision, or between revisions
68
 
 
69
68
    takes_args = ['file*']
70
 
    takes_options = ['all', 'show-ids']
 
69
    takes_options = ['all', 'show-ids', 'revision']
71
70
    aliases = ['st', 'stat']
72
71
    
73
72
    def run(self, all=False, show_ids=False, file_list=None):
93
92
    takes_args = ['revision_id']
94
93
    
95
94
    def run(self, revision_id):
96
 
        b = find_branch('.')
97
 
        sys.stdout.write(b.get_revision_xml_file(revision_id).read())
 
95
        from bzrlib.xml import pack_xml
 
96
        pack_xml(find_branch('.').get_revision(revision_id), sys.stdout)
98
97
 
99
98
 
100
99
class cmd_revno(Command):
104
103
    def run(self):
105
104
        print find_branch('.').revno()
106
105
 
107
 
 
108
106
class cmd_revision_info(Command):
109
107
    """Show revision number and revision id for a given revision identifier.
110
108
    """
146
144
    Therefore simply saying 'bzr add' will version all files that
147
145
    are currently unknown.
148
146
 
149
 
    Adding a file whose parent directory is not versioned will
150
 
    implicitly add the parent, and so on up to the root. This means
151
 
    you should never need to explictly add a directory, they'll just
152
 
    get added when you add a file in the directory.
 
147
    TODO: Perhaps adding a file whose directly is not versioned should
 
148
    recursively add that parent, rather than giving an error?
153
149
    """
154
150
    takes_args = ['file*']
155
151
    takes_options = ['verbose', 'no-recurse']
156
152
    
157
153
    def run(self, file_list, verbose=False, no_recurse=False):
158
 
        # verbose currently has no effect
159
 
        from bzrlib.add import smart_add, add_reporter_print
160
 
        smart_add(file_list, not no_recurse, add_reporter_print)
 
154
        from bzrlib.add import smart_add, _PrintAddCallback
 
155
        smart_add(file_list, verbose, not no_recurse,
 
156
                  callback=_PrintAddCallback)
161
157
 
162
158
 
163
159
 
277
273
            if len(names_list) != 2:
278
274
                raise BzrCommandError('to mv multiple files the destination '
279
275
                                      'must be a versioned directory')
280
 
            b.rename_one(rel_names[0], rel_names[1])
281
 
            print "%s => %s" % (rel_names[0], rel_names[1])
 
276
            for pair in b.move(rel_names[0], rel_names[1]):
 
277
                print "%s => %s" % pair
282
278
            
283
279
    
284
280
 
304
300
        import tempfile
305
301
        from shutil import rmtree
306
302
        import errno
 
303
        from bzrlib.branch import pull_loc
307
304
        
308
305
        br_to = find_branch('.')
309
 
        stored_loc = br_to.get_parent()
 
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
310
312
        if location is None:
311
313
            if stored_loc is None:
312
314
                raise BzrCommandError("No pull location known or specified.")
316
318
        cache_root = tempfile.mkdtemp()
317
319
        from bzrlib.branch import DivergedBranches
318
320
        br_from = find_branch(location)
319
 
        location = br_from.base
 
321
        location = pull_loc(br_from)
320
322
        old_revno = br_to.revno()
321
323
        try:
322
324
            from branch import find_cached_branch, DivergedBranches
323
325
            br_from = find_cached_branch(location, cache_root)
324
 
            location = br_from.base
 
326
            location = pull_loc(br_from)
325
327
            old_revno = br_to.revno()
326
328
            try:
327
329
                br_to.update_revisions(br_from)
331
333
                
332
334
            merge(('.', -1), ('.', old_revno), check_clean=False)
333
335
            if location != stored_loc:
334
 
                br_to.set_parent(location)
 
336
                br_to.controlfile("x-pull", "wb").write(location + "\n")
335
337
        finally:
336
338
            rmtree(cache_root)
337
339
 
533
535
    examples:
534
536
        bzr diff
535
537
        bzr diff -r1
536
 
        bzr diff -r1..2
 
538
        bzr diff -r1:2
537
539
    """
538
540
    
539
541
    takes_args = ['file*']
633
635
    def run(self, filename=None):
634
636
        """Print the branch root."""
635
637
        b = find_branch(filename)
636
 
        print b.base
 
638
        print getattr(b, 'base', None) or getattr(b, 'baseurl')
637
639
 
638
640
 
639
641
class cmd_log(Command):
947
949
    def run(self, message=None, file=None, verbose=True, selected_list=None,
948
950
            unchanged=False):
949
951
        from bzrlib.errors import PointlessCommit
950
 
        from bzrlib.msgeditor import edit_commit_message
951
 
        from bzrlib.status import show_status
952
 
        from cStringIO import StringIO
 
952
        from bzrlib.osutils import get_text_message
953
953
 
954
 
        b = find_branch('.')
955
 
        if selected_list:
956
 
            selected_list = [b.relpath(s) for s in selected_list]
957
 
            
 
954
        ## Warning: shadows builtin file()
958
955
        if not message and not file:
959
 
            catcher = StringIO()
960
 
            show_status(b, specific_files=selected_list,
961
 
                        to_file=catcher)
962
 
            message = edit_commit_message(catcher.getvalue())
 
956
            # FIXME: Ugly; change status code to send to a provided function?
 
957
            
 
958
            import cStringIO
 
959
            stdout = sys.stdout
 
960
            catcher = cStringIO.StringIO()
 
961
            sys.stdout = catcher
 
962
            cmd_status({"file_list":selected_list}, {})
 
963
            info = catcher.getvalue()
 
964
            sys.stdout = stdout
 
965
            message = get_text_message(info)
963
966
            
964
967
            if message is None:
965
 
                raise BzrCommandError("please specify a commit message"
966
 
                                      " with either --message or --file")
 
968
                raise BzrCommandError("please specify a commit message",
 
969
                                      ["use either --message or --file"])
967
970
        elif message and file:
968
971
            raise BzrCommandError("please specify either --message or --file")
969
972
        
971
974
            import codecs
972
975
            message = codecs.open(file, 'rt', bzrlib.user_encoding).read()
973
976
 
 
977
        b = find_branch('.')
 
978
        if selected_list:
 
979
            selected_list = [b.relpath(s) for s in selected_list]
 
980
            
974
981
        try:
975
982
            b.commit(message, verbose=verbose,
976
983
                     specific_files=selected_list,
987
994
 
988
995
    This command checks various invariants about the branch storage to
989
996
    detect data corruption or bzr bugs.
 
997
 
 
998
    If given the --update flag, it will update some optional fields
 
999
    to help ensure data consistency.
990
1000
    """
991
1001
    takes_args = ['dir?']
992
1002
 
1139
1149
class cmd_merge(Command):
1140
1150
    """Perform a three-way merge.
1141
1151
    
1142
 
    The branch is the branch you will merge from.  By default, it will
1143
 
    merge the latest revision.  If you specify a revision, that
1144
 
    revision will be merged.  If you specify two revisions, the first
1145
 
    will be used as a BASE, and the second one as OTHER.  Revision
1146
 
    numbers are always relative to the specified branch.
1147
 
 
1148
 
    By default bzr will try to merge in all new work from the other
1149
 
    branch, automatically determining an appropriate base.  If this
1150
 
    fails, you may need to give an explicit base.
 
1152
    The branch is the branch you will merge from.  By default, it will merge
 
1153
    the latest revision.  If you specify a revision, that revision will be
 
1154
    merged.  If you specify two revisions, the first will be used as a BASE, 
 
1155
    and the second one as OTHER.  Revision numbers are always relative to the
 
1156
    specified branch.
1151
1157
    
1152
1158
    Examples:
1153
1159
 
1175
1181
 
1176
1182
        if revision is None or len(revision) < 1:
1177
1183
            base = [None, None]
1178
 
            other = [branch, -1]
 
1184
            other = (branch, -1)
1179
1185
        else:
1180
1186
            if len(revision) == 1:
1181
 
                other = [branch, revision[0]]
1182
 
                base = [None, None]
 
1187
                other = (branch, revision[0])
 
1188
                base = (None, None)
1183
1189
            else:
1184
1190
                assert len(revision) == 2
1185
1191
                if None in revision:
1186
1192
                    raise BzrCommandError(
1187
1193
                        "Merge doesn't permit that revision specifier.")
1188
 
                base = [branch, revision[0]]
1189
 
                other = [branch, revision[1]]
1190
 
 
1191
 
        try:
1192
 
            merge(other, base, check_clean=(not force), merge_type=merge_type)
1193
 
        except bzrlib.errors.AmbiguousBase, e:
1194
 
            m = ("sorry, bzr can't determine the right merge base yet\n"
1195
 
                 "candidates are:\n  "
1196
 
                 + "\n  ".join(e.bases)
1197
 
                 + "\n"
1198
 
                 "please specify an explicit base with -r,\n"
1199
 
                 "and (if you want) report this to the bzr developers\n")
1200
 
            log_error(m)
 
1194
                base = (branch, revision[0])
 
1195
                other = (branch, revision[1])
 
1196
            
 
1197
        merge(other, base, check_clean=(not force), merge_type=merge_type)
1201
1198
 
1202
1199
 
1203
1200
class cmd_revert(Command):
1293
1290
                    print "Using last location: %s" % parent
1294
1291
                remote = parent
1295
1292
        elif parent is None:
1296
 
            # We only update parent if it did not exist, missing should not change the parent
1297
 
            b.set_parent(remote)
 
1293
            # We only update x-pull if it did not exist, missing should not change the parent
 
1294
            b.controlfile('x-pull', 'wb').write(remote + '\n')
1298
1295
        br_remote = find_branch(remote)
1299
1296
 
1300
1297
        return show_missing(b, br_remote, verbose=verbose, quiet=quiet)