~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

Merge from mbp.

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):
1735
1754
 
1736
1755
 
1737
1756
class cmd_missing(Command):
1738
 
    """What is missing in this branch relative to other branch.
1739
 
    """
1740
 
    # TODO: rewrite this in terms of ancestry so that it shows only
1741
 
    # unmerged things
1742
 
    
1743
 
    takes_args = ['remote?']
1744
 
    aliases = ['mis', 'miss']
1745
 
    takes_options = ['verbose']
1746
 
 
1747
 
    @display_command
1748
 
    def run(self, remote=None, verbose=False):
1749
 
        from bzrlib.errors import BzrCommandError
1750
 
        from bzrlib.missing import show_missing
1751
 
 
1752
 
        if verbose and is_quiet():
1753
 
            raise BzrCommandError('Cannot pass both quiet and verbose')
1754
 
 
1755
 
        tree = WorkingTree.open_containing(u'.')[0]
1756
 
        parent = tree.branch.get_parent()
1757
 
        if remote is None:
1758
 
            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:
1759
1783
                raise BzrCommandError("No missing location known or specified.")
1760
 
            else:
1761
 
                if not is_quiet():
1762
 
                    print "Using last location: %s" % parent
1763
 
                remote = parent
1764
 
        elif parent is None:
1765
 
            # We only update parent if it did not exist, missing
1766
 
            # should not change the parent
1767
 
            tree.branch.set_parent(remote)
1768
 
        br_remote = Branch.open_containing(remote)[0]
1769
 
        return show_missing(tree.branch, br_remote, verbose=verbose, 
1770
 
                            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
1771
1815
 
1772
1816
 
1773
1817
class cmd_plugins(Command):