~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

[merge] win32

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
 
17
"""builtin bzr commands"""
 
18
 
17
19
# DO NOT change this to cStringIO - it results in control files 
18
20
# written as UCS4
19
21
# FIXIT! (Only deal with byte streams OR unicode at any one layer.)
20
22
# RBC 20051018
 
23
 
21
24
from StringIO import StringIO
22
25
import sys
23
26
import os
36
39
import bzrlib.trace
37
40
from bzrlib.trace import mutter, note, log_error, warning, is_quiet
38
41
from bzrlib.workingtree import WorkingTree
 
42
from bzrlib.log import show_one_log
39
43
 
40
44
 
41
45
def tree_files(file_list, default_branch=u'.'):
213
217
    implicitly add the parent, and so on up to the root. This means
214
218
    you should never need to explictly add a directory, they'll just
215
219
    get added when you add a file in the directory.
 
220
 
 
221
    --dry-run will show which files would be added, but not actually 
 
222
    add them.
216
223
    """
217
224
    takes_args = ['file*']
218
 
    takes_options = ['no-recurse']
219
 
    
220
 
    def run(self, file_list, no_recurse=False):
221
 
        from bzrlib.add import smart_add, add_reporter_print, add_reporter_null
222
 
        if is_quiet():
223
 
            reporter = add_reporter_null
 
225
    takes_options = ['no-recurse', 'dry-run']
 
226
 
 
227
    def run(self, file_list, no_recurse=False, dry_run=False):
 
228
        import bzrlib.add
 
229
 
 
230
        if dry_run:
 
231
            if is_quiet():
 
232
                # This is pointless, but I'd rather not raise an error
 
233
                action = bzrlib.add.add_action_null
 
234
            else:
 
235
                action = bzrlib.add.add_action_print
 
236
        elif is_quiet():
 
237
            action = bzrlib.add.add_action_add
224
238
        else:
225
 
            reporter = add_reporter_print
226
 
        smart_add(file_list, not no_recurse, reporter)
 
239
            action = bzrlib.add.add_action_add_and_print
 
240
 
 
241
        bzrlib.add.smart_add(file_list, not no_recurse, action)
227
242
 
228
243
 
229
244
class cmd_mkdir(Command):
868
883
                            help='show from oldest to newest'),
869
884
                     'timezone', 'verbose', 
870
885
                     'show-ids', 'revision',
871
 
                     Option('line', help='format with one line per revision'),
872
 
                     'long', 
 
886
                     'line', 'long', 
873
887
                     Option('message',
874
888
                            help='show revisions whose message matches this regexp',
875
889
                            type=str),
876
 
                     Option('short', help='use moderately short format'),
 
890
                     'short',
877
891
                     ]
878
892
    @display_command
879
893
    def run(self, filename=None, timezone='original',
937
951
        # in e.g. the default C locale.
938
952
        outf = codecs.getwriter(bzrlib.user_encoding)(sys.stdout, errors='replace')
939
953
 
940
 
        log_format = 'long'
941
 
        if short:
942
 
            log_format = 'short'
943
 
        if line:
944
 
            log_format = 'line'
 
954
        log_format = get_log_format(long=long, short=short, line=line)
945
955
        lf = log_formatter(log_format,
946
956
                           show_ids=show_ids,
947
957
                           to_file=outf,
956
966
                 end_revision=rev2,
957
967
                 search=message)
958
968
 
 
969
def get_log_format(long=False, short=False, line=False, default='long'):
 
970
    log_format = default
 
971
    if long:
 
972
        log_format = 'long'
 
973
    if short:
 
974
        log_format = 'short'
 
975
    if line:
 
976
        log_format = 'line'
 
977
    return log_format
959
978
 
960
979
 
961
980
class cmd_touching_revisions(Command):
1247
1266
            unchanged=False, strict=False):
1248
1267
        from bzrlib.errors import (PointlessCommit, ConflictsInTree,
1249
1268
                StrictCommitFailed)
1250
 
        from bzrlib.msgeditor import edit_commit_message
 
1269
        from bzrlib.msgeditor import edit_commit_message, \
 
1270
                make_commit_message_template
1251
1271
        from bzrlib.status import show_status
1252
1272
        from tempfile import TemporaryFile
1253
1273
        import codecs
1254
1274
 
 
1275
        # TODO: Need a blackbox test for invoking the external editor; may be
 
1276
        # slightly problematic to run this cross-platform.
 
1277
 
1255
1278
        # TODO: do more checks that the commit will succeed before 
1256
1279
        # spending the user's valuable time typing a commit message.
1257
1280
        #
1259
1282
        # message to a temporary file where it can be recovered
1260
1283
        tree, selected_list = tree_files(selected_list)
1261
1284
        if message is None and not file:
1262
 
            template = make_commit_message_template(tree)
 
1285
            template = make_commit_message_template(tree, selected_list)
1263
1286
            message = edit_commit_message(template)
1264
1287
            if message is None:
1265
1288
                raise BzrCommandError("please specify a commit message"
1731
1754
 
1732
1755
 
1733
1756
class cmd_missing(Command):
1734
 
    """What is missing in this branch relative to other branch.
1735
 
    """
1736
 
    # TODO: rewrite this in terms of ancestry so that it shows only
1737
 
    # unmerged things
1738
 
    
1739
 
    takes_args = ['remote?']
1740
 
    aliases = ['mis', 'miss']
1741
 
    takes_options = ['verbose']
1742
 
 
1743
 
    @display_command
1744
 
    def run(self, remote=None, verbose=False):
1745
 
        from bzrlib.errors import BzrCommandError
1746
 
        from bzrlib.missing import show_missing
1747
 
 
1748
 
        if verbose and is_quiet():
1749
 
            raise BzrCommandError('Cannot pass both quiet and verbose')
1750
 
 
1751
 
        tree = WorkingTree.open_containing(u'.')[0]
1752
 
        parent = tree.branch.get_parent()
1753
 
        if remote is None:
1754
 
            if parent is None:
 
1757
    """Show unmerged/unpulled revisions between two branches.
 
1758
 
 
1759
    OTHER_BRANCH may be local or remote."""
 
1760
    takes_args = ['other_branch?']
 
1761
    takes_options = [Option('reverse', 'Reverse the order of revisions'),
 
1762
                     Option('mine-only', 
 
1763
                            'Display changes in the local branch only'),
 
1764
                     Option('theirs-only', 
 
1765
                            'Display changes in the remote branch only'), 
 
1766
                     'line',
 
1767
                     'long', 
 
1768
                     'short',
 
1769
                     'show-ids',
 
1770
                     'verbose'
 
1771
                     ]
 
1772
 
 
1773
    def run(self, other_branch=None, reverse=False, mine_only=False,
 
1774
            theirs_only=False, long=True, short=False, line=False, 
 
1775
            show_ids=False, verbose=False):
 
1776
        from bzrlib.missing import find_unmerged, iter_log_data
 
1777
        from bzrlib.log import log_formatter
 
1778
        local_branch = bzrlib.branch.Branch.open_containing(".")[0]
 
1779
        parent = local_branch.get_parent()
 
1780
        if other_branch is None:
 
1781
            other_branch = parent
 
1782
            if other_branch is None:
1755
1783
                raise BzrCommandError("No missing location known or specified.")
1756
 
            else:
1757
 
                if not is_quiet():
1758
 
                    print "Using last location: %s" % parent
1759
 
                remote = parent
1760
 
        elif parent is None:
1761
 
            # We only update parent if it did not exist, missing
1762
 
            # should not change the parent
1763
 
            tree.branch.set_parent(remote)
1764
 
        br_remote = Branch.open_containing(remote)[0]
1765
 
        return show_missing(tree.branch, br_remote, verbose=verbose, 
1766
 
                            quiet=is_quiet())
 
1784
            print "Using last location: " + local_branch.get_parent()
 
1785
        remote_branch = bzrlib.branch.Branch.open(other_branch)
 
1786
        local_extra, remote_extra = find_unmerged(local_branch, remote_branch)
 
1787
        log_format = get_log_format(long=long, short=short, line=line)
 
1788
        lf = log_formatter(log_format, sys.stdout,
 
1789
                           show_ids=show_ids,
 
1790
                           show_timezone='original')
 
1791
        if reverse is False:
 
1792
            local_extra.reverse()
 
1793
            remote_extra.reverse()
 
1794
        if local_extra and not theirs_only:
 
1795
            print "You have %d extra revision(s):" % len(local_extra)
 
1796
            for data in iter_log_data(local_extra, local_branch, verbose):
 
1797
                lf.show(*data)
 
1798
            printed_local = True
 
1799
        else:
 
1800
            printed_local = False
 
1801
        if remote_extra and not mine_only:
 
1802
            if printed_local is True:
 
1803
                print "\n\n"
 
1804
            print "You are missing %d revision(s):" % len(remote_extra)
 
1805
            for data in iter_log_data(remote_extra, remote_branch, verbose):
 
1806
                lf.show(*data)
 
1807
        if not remote_extra and not local_extra:
 
1808
            status_code = 0
 
1809
            print "Branches are up to date."
 
1810
        else:
 
1811
            status_code = 1
 
1812
        if parent is None and other_branch is not None:
 
1813
            local_branch.set_parent(other_branch)
 
1814
        return status_code
1767
1815
 
1768
1816
 
1769
1817
class cmd_plugins(Command):
1773
1821
    def run(self):
1774
1822
        import bzrlib.plugin
1775
1823
        from inspect import getdoc
1776
 
        for plugin in bzrlib.plugin.all_plugins:
 
1824
        for name, plugin in bzrlib.plugin.all_plugins().items():
1777
1825
            if hasattr(plugin, '__path__'):
1778
1826
                print plugin.__path__[0]
1779
1827
            elif hasattr(plugin, '__file__'):