~bzr-pqm/bzr/bzr.dev

0.5.1 by John Arbash Meinel
Just an initial working step.
1
#!/usr/bin/env python
2
"""\
3
This is an attempt to take the internal delta object, and represent
4
it as a single-file text-only changeset.
5
This should have commands for both generating a changeset,
6
and for applying a changeset.
7
"""
8
0.5.99 by John Arbash Meinel
Updating to current Branch.open() and RevisionSpec changes.
9
import sys
1185.82.78 by Aaron Bentley
Cleanups
10
11
from bzrlib.branch import Branch
0.5.114 by John Arbash Meinel
Hiding OPTIONS since it has been removed. Updating for the new Branch.open_containing()
12
from bzrlib.commands import Command, register_command
1185.82.78 by Aaron Bentley
Cleanups
13
import bzrlib.errors as errors
0.5.121 by John Arbash Meinel
Fixing options to apply-changeset
14
from bzrlib.option import Option
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
15
from bzrlib.revision import (common_ancestor, MultipleRevisionSources,
1185.82.54 by Aaron Bentley
Removed import of get_intervening revision
16
                             NULL_REVISION)
1185.82.78 by Aaron Bentley
Cleanups
17
from bzrlib.revisionspec import RevisionSpec
18
0.5.1 by John Arbash Meinel
Just an initial working step.
19
0.5.81 by John Arbash Meinel
Cleaning up from pychecker.
20
class cmd_send_changeset(Command):
0.5.24 by John Arbash Meinel
Adding send-changeset from Johan Rydberg
21
    """Send a bundled up changset via mail.
22
23
    If no revision has been specified, the last commited change will
24
    be sent.
25
0.5.30 by John Arbash Meinel
Merging send-changeset updates from jrydberg
26
    Subject of the mail can be specified by the --message option,
0.5.24 by John Arbash Meinel
Adding send-changeset from Johan Rydberg
27
    otherwise information from the changeset log will be used.
0.5.30 by John Arbash Meinel
Merging send-changeset updates from jrydberg
28
29
    A editor will be spawned where the user may enter a description
30
    of the changeset.  The description can be read from a file with
31
    the --file FILE option.
0.5.24 by John Arbash Meinel
Adding send-changeset from Johan Rydberg
32
    """
0.5.31 by John Arbash Meinel
Some cleanup to the send_changeset work.
33
    takes_options = ['revision', 'message', 'file']
0.5.24 by John Arbash Meinel
Adding send-changeset from Johan Rydberg
34
    takes_args = ['to?']
35
0.5.31 by John Arbash Meinel
Some cleanup to the send_changeset work.
36
    def run(self, to=None, message=None, revision=None, file=None):
0.5.68 by John Arbash Meinel
(broken), starting to change the syntax of the command to allow cset to take a base and a target.
37
        from bzrlib.errors import BzrCommandError
0.5.31 by John Arbash Meinel
Some cleanup to the send_changeset work.
38
        from send_changeset import send_changeset
0.5.30 by John Arbash Meinel
Merging send-changeset updates from jrydberg
39
        
0.5.24 by John Arbash Meinel
Adding send-changeset from Johan Rydberg
40
        if isinstance(revision, (list, tuple)):
41
            if len(revision) > 1:
42
                raise BzrCommandError('We do not support rollup-changesets yet.')
43
            revision = revision[0]
44
0.5.99 by John Arbash Meinel
Updating to current Branch.open() and RevisionSpec changes.
45
        b = Branch.open_containing('.')
0.5.24 by John Arbash Meinel
Adding send-changeset from Johan Rydberg
46
47
        if not to:
48
            try:
49
                to = b.controlfile('x-send-address', 'rb').read().strip('\n')
50
            except:
51
                raise BzrCommandError('destination address is not known')
52
0.5.31 by John Arbash Meinel
Some cleanup to the send_changeset work.
53
        if not isinstance(revision, (list, tuple)):
54
            revision = [revision]
0.5.24 by John Arbash Meinel
Adding send-changeset from Johan Rydberg
55
0.5.31 by John Arbash Meinel
Some cleanup to the send_changeset work.
56
        send_changeset(b, revision, to, message, file)
0.5.24 by John Arbash Meinel
Adding send-changeset from Johan Rydberg
57
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
58
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
59
class cmd_bundle_revisions(Command):
60
    """Generate a revision bundle.
0.5.1 by John Arbash Meinel
Just an initial working step.
61
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
62
    This bundle contains all of the meta-information of a
0.5.1 by John Arbash Meinel
Just an initial working step.
63
    diff, rather than just containing the patch information.
0.5.7 by John Arbash Meinel
Added a bunch more information about changesets. Can now read back in all of the meta information.
64
1185.82.81 by Aaron Bentley
Remove unused functionality
65
    You can apply it to another tree using 'bzr merge'.
66
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
67
    bzr bundle
68
        - Bundle for the last commit
69
    bzr bundle BASE
70
        - Bundle to apply the current tree into BASE
71
    bzr bundle --revision A
72
        - Bundle for revision A
73
    bzr bundle --revision A..B
74
        - Bundle to transform A into B
75
    bzr bundle --revision A..B BASE
76
        - Bundle to transform revision A of BASE into revision B
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
77
          of the local tree
0.5.1 by John Arbash Meinel
Just an initial working step.
78
    """
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
79
    takes_options = ['verbose', 'revision']
80
    takes_args = ['base?']
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
81
    aliases = ['bundle']
0.5.1 by John Arbash Meinel
Just an initial working step.
82
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
83
    def run(self, base=None, revision=None):
0.5.81 by John Arbash Meinel
Cleaning up from pychecker.
84
        from bzrlib import user_encoding
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
85
        from bzrlib.bundle.serializer import write_bundle
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
86
87
        if base is None:
88
            base_branch = None
89
        else:
90
            base_branch = Branch.open(base)
91
92
        # We don't want to lock the same branch across
93
        # 2 different branches
94
        target_branch = Branch.open_containing(u'.')[0]
95
        if base_branch is not None and target_branch.base == base_branch.base:
96
            base_branch = None
97
98
        base_revision = None
99
        if revision is None:
100
            target_revision = target_branch.last_revision()
101
        elif len(revision) == 1:
102
            target_revision = revision[0].in_history(target_branch).rev_id
103
            if base_branch is not None:
104
                base_revision = base_branch.last_revision()
105
        elif len(revision) == 2:
1185.82.85 by Aaron Bentley
Swap meaning of two-argument 'changeset' to match 'merge'
106
            target_revision = revision[1].in_history(target_branch).rev_id
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
107
            if base_branch is not None:
1185.82.85 by Aaron Bentley
Swap meaning of two-argument 'changeset' to match 'merge'
108
                base_revision = revision[0].in_history(base_branch).rev_id
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
109
            else:
1185.82.85 by Aaron Bentley
Swap meaning of two-argument 'changeset' to match 'merge'
110
                base_revision = revision[0].in_history(target_branch).rev_id
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
111
        else:
112
            raise errors.BzrCommandError('--revision takes 1 or 2 parameters')
113
1185.82.24 by Aaron Bentley
Use common ancestor as a changeset base when unspecified
114
        if revision is None or len(revision) == 1:
115
            if base_branch is not None:
116
                target_branch.repository.fetch(base_branch.repository, 
117
                                               base_branch.last_revision())
118
                base_revision = common_ancestor(base_branch.last_revision(),
119
                                                target_revision,
120
                                                target_branch.repository)
1185.82.58 by Aaron Bentley
Handle empty branches properly
121
                if base_revision is None:
122
                    base_revision = NULL_REVISION
1185.82.24 by Aaron Bentley
Use common ancestor as a changeset base when unspecified
123
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
124
        if base_revision is None:
1185.82.22 by Aaron Bentley
Start getting changeset merging under test
125
            rev = target_branch.repository.get_revision(target_revision)
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
126
            if rev.parent_ids:
127
                base_revision = rev.parent_ids[0]
128
            else:
129
                base_revision = NULL_REVISION
130
131
        if base_branch is not None:
1185.82.23 by Aaron Bentley
Switch the fetcher
132
            target_branch.repository.fetch(base_branch.repository, 
133
                                           revision_id=base_revision)
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
134
            del base_branch
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
135
        write_bundle(target_branch.repository, target_revision, base_revision,
136
                     sys.stdout)
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
137
0.5.1 by John Arbash Meinel
Just an initial working step.
138
0.5.81 by John Arbash Meinel
Cleaning up from pychecker.
139
class cmd_verify_changeset(Command):
0.5.7 by John Arbash Meinel
Added a bunch more information about changesets. Can now read back in all of the meta information.
140
    """Read a written changeset, and make sure it is valid.
141
142
    """
143
    takes_args = ['filename?']
144
145
    def run(self, filename=None):
0.5.81 by John Arbash Meinel
Cleaning up from pychecker.
146
        from read_changeset import read_changeset
0.5.103 by John Arbash Meinel
Updated to having a changeset specific message.
147
        #from bzrlib.xml import serializer_v4
0.5.56 by John Arbash Meinel
A couple more fixups, it seems actually capable now of writing out a changeset, and reading it back.
148
0.5.114 by John Arbash Meinel
Hiding OPTIONS since it has been removed. Updating for the new Branch.open_containing()
149
        b, relpath = Branch.open_containing('.')
0.5.56 by John Arbash Meinel
A couple more fixups, it seems actually capable now of writing out a changeset, and reading it back.
150
0.5.7 by John Arbash Meinel
Added a bunch more information about changesets. Can now read back in all of the meta information.
151
        if filename is None or filename == '-':
152
            f = sys.stdin
153
        else:
0.5.33 by John Arbash Meinel
Use universal newlines wherever appropriate.
154
            f = open(filename, 'U')
0.5.7 by John Arbash Meinel
Added a bunch more information about changesets. Can now read back in all of the meta information.
155
0.5.88 by John Arbash Meinel
Fixed a bug in the rename code, added more tests.
156
        cset_info, cset_tree = read_changeset(f, b)
0.5.103 by John Arbash Meinel
Updated to having a changeset specific message.
157
        # print cset_info
158
        # print cset_tree
159
        #serializer_v4.write(cset_tree.inventory, sys.stdout)