~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commands.py

  • Committer: Martin Pool
  • Date: 2005-06-06 04:17:53 UTC
  • Revision ID: mbp@sourcefrog.net-20050606041753-abe590daf0d7f959
Updated merge patch from Aaron

This patch contains all the changes to merge that I'd like to get into
0.5, namely
* common ancestor BASE selection
* merge reports conflicts when they are encountered
* merge refuses to operate in working trees with changes
* introduces revert command to revert the working tree to the
last-committed state
* Adds some reasonable help text

Show diffs side-by-side

added added

removed removed

Lines of Context:
967
967
        print "it sure does!"
968
968
 
969
969
def parse_spec(spec):
 
970
    """
 
971
    >>> parse_spec(None)
 
972
    [None, None]
 
973
    >>> parse_spec("./")
 
974
    ['./', None]
 
975
    >>> parse_spec("../@")
 
976
    ['..', -1]
 
977
    >>> parse_spec("../f/@35")
 
978
    ['../f', 35]
 
979
    """
 
980
    if spec is None:
 
981
        return [None, None]
970
982
    if '/@' in spec:
971
983
        parsed = spec.split('/@')
972
984
        assert len(parsed) == 2
980
992
    return parsed
981
993
 
982
994
class cmd_merge(Command):
983
 
    """Perform a three-way merge of trees."""
984
 
    takes_args = ['other_spec', 'base_spec']
985
 
 
986
 
    def run(self, other_spec, base_spec):
 
995
    """Perform a three-way merge of trees.
 
996
    
 
997
    The SPEC parameters are working tree or revision specifiers.  Working trees
 
998
    are specified using standard paths or urls.  No component of a directory
 
999
    path may begin with '@'.
 
1000
    
 
1001
    Working tree examples: '.', '..', 'foo@', but NOT 'foo/@bar'
 
1002
 
 
1003
    Revisions are specified using a dirname/@revno pair, where dirname is the
 
1004
    branch directory and revno is the revision within that branch.  If no revno
 
1005
    is specified, the latest revision is used.
 
1006
 
 
1007
    Revision examples: './@127', 'foo/@', '../@1'
 
1008
 
 
1009
    The OTHER_SPEC parameter is required.  If the BASE_SPEC parameter is
 
1010
    not supplied, the common ancestor of OTHER_SPEC the current branch is used
 
1011
    as the BASE.
 
1012
    """
 
1013
    takes_args = ['other_spec', 'base_spec?']
 
1014
 
 
1015
    def run(self, other_spec, base_spec=None):
987
1016
        from bzrlib.merge import merge
988
1017
        merge(parse_spec(other_spec), parse_spec(base_spec))
989
1018
 
 
1019
 
 
1020
class cmd_revert(Command):
 
1021
    """
 
1022
    Reverse all changes since the last commit.  Only versioned files are
 
1023
    affected.
 
1024
    """
 
1025
    takes_options = ['revision']
 
1026
 
 
1027
    def run(self, revision=-1):
 
1028
        merge.merge(('.', revision), parse_spec('.'), no_changes=False,
 
1029
                    ignore_zero=True)
 
1030
 
 
1031
 
990
1032
class cmd_assert_fail(Command):
991
1033
    """Test reporting of assertion failures"""
992
1034
    hidden = True