~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
1185.84.4 by Aaron Bentley
Use parent branch as default base branch
18
from bzrlib.trace import note
1185.82.78 by Aaron Bentley
Cleanups
19
0.5.1 by John Arbash Meinel
Just an initial working step.
20
0.5.81 by John Arbash Meinel
Cleaning up from pychecker.
21
class cmd_send_changeset(Command):
0.5.24 by John Arbash Meinel
Adding send-changeset from Johan Rydberg
22
    """Send a bundled up changset via mail.
23
24
    If no revision has been specified, the last commited change will
25
    be sent.
26
0.5.30 by John Arbash Meinel
Merging send-changeset updates from jrydberg
27
    Subject of the mail can be specified by the --message option,
0.5.24 by John Arbash Meinel
Adding send-changeset from Johan Rydberg
28
    otherwise information from the changeset log will be used.
0.5.30 by John Arbash Meinel
Merging send-changeset updates from jrydberg
29
30
    A editor will be spawned where the user may enter a description
31
    of the changeset.  The description can be read from a file with
32
    the --file FILE option.
0.5.24 by John Arbash Meinel
Adding send-changeset from Johan Rydberg
33
    """
0.5.31 by John Arbash Meinel
Some cleanup to the send_changeset work.
34
    takes_options = ['revision', 'message', 'file']
0.5.24 by John Arbash Meinel
Adding send-changeset from Johan Rydberg
35
    takes_args = ['to?']
36
0.5.31 by John Arbash Meinel
Some cleanup to the send_changeset work.
37
    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.
38
        from bzrlib.errors import BzrCommandError
0.5.31 by John Arbash Meinel
Some cleanup to the send_changeset work.
39
        from send_changeset import send_changeset
0.5.30 by John Arbash Meinel
Merging send-changeset updates from jrydberg
40
        
0.5.24 by John Arbash Meinel
Adding send-changeset from Johan Rydberg
41
        if isinstance(revision, (list, tuple)):
42
            if len(revision) > 1:
43
                raise BzrCommandError('We do not support rollup-changesets yet.')
44
            revision = revision[0]
45
0.5.99 by John Arbash Meinel
Updating to current Branch.open() and RevisionSpec changes.
46
        b = Branch.open_containing('.')
0.5.24 by John Arbash Meinel
Adding send-changeset from Johan Rydberg
47
48
        if not to:
49
            try:
50
                to = b.controlfile('x-send-address', 'rb').read().strip('\n')
51
            except:
52
                raise BzrCommandError('destination address is not known')
53
0.5.31 by John Arbash Meinel
Some cleanup to the send_changeset work.
54
        if not isinstance(revision, (list, tuple)):
55
            revision = [revision]
0.5.24 by John Arbash Meinel
Adding send-changeset from Johan Rydberg
56
0.5.31 by John Arbash Meinel
Some cleanup to the send_changeset work.
57
        send_changeset(b, revision, to, message, file)
0.5.24 by John Arbash Meinel
Adding send-changeset from Johan Rydberg
58
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
59
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
60
class cmd_bundle_revisions(Command):
61
    """Generate a revision bundle.
0.5.1 by John Arbash Meinel
Just an initial working step.
62
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
63
    This bundle contains all of the meta-information of a
0.5.1 by John Arbash Meinel
Just an initial working step.
64
    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.
65
1185.82.81 by Aaron Bentley
Remove unused functionality
66
    You can apply it to another tree using 'bzr merge'.
67
1185.84.1 by Aaron Bentley
Use full command name in bundle-revisions help
68
    bzr bundle-revisions
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
69
        - Bundle for the last commit
1185.84.1 by Aaron Bentley
Use full command name in bundle-revisions help
70
    bzr bundle-revisions BASE
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
71
        - Bundle to apply the current tree into BASE
1185.84.1 by Aaron Bentley
Use full command name in bundle-revisions help
72
    bzr bundle-revisions --revision A
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
73
        - Bundle for revision A
1185.84.1 by Aaron Bentley
Use full command name in bundle-revisions help
74
    bzr bundle-revisions --revision A..B
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
75
        - Bundle to transform A into B
1185.84.1 by Aaron Bentley
Use full command name in bundle-revisions help
76
    bzr bundle-revisions --revision A..B BASE
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
77
        - Bundle to transform revision A of BASE into revision B
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
78
          of the local tree
0.5.1 by John Arbash Meinel
Just an initial working step.
79
    """
1804.1.1 by Aaron Bentley
Add support for submit location to bundles
80
    takes_options = ['verbose', 'revision', 'remember',
1744.1.1 by Alexander Belchenko
Added --output option for bundle-revisions command
81
                     Option("output", help="write bundle to specified file",
82
                            type=unicode)]
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
83
    takes_args = ['base?']
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
84
    aliases = ['bundle']
0.5.1 by John Arbash Meinel
Just an initial working step.
85
1804.1.1 by Aaron Bentley
Add support for submit location to bundles
86
    def run(self, base=None, revision=None, output=None, remember=False):
0.5.81 by John Arbash Meinel
Cleaning up from pychecker.
87
        from bzrlib import user_encoding
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
88
        from bzrlib.bundle.serializer import write_bundle
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
89
1185.84.4 by Aaron Bentley
Use parent branch as default base branch
90
        target_branch = Branch.open_containing(u'.')[0]
1804.1.1 by Aaron Bentley
Add support for submit location to bundles
91
        submit_branch = target_branch.get_submit_branch()
92
93
        if base is None:
94
            base_specified = False
95
            base = submit_branch
96
            note('Using saved location: %s' % base)
97
        else:
98
            base_specified = True
1185.84.4 by Aaron Bentley
Use parent branch as default base branch
99
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
100
        if base is None:
1185.84.4 by Aaron Bentley
Use parent branch as default base branch
101
            base = target_branch.get_parent()
102
            if base is None:
103
                raise errors.BzrCommandError("No base branch known or"
104
                                             " specified.")
105
            else:
106
                note('Using saved location: %s' % base)
107
        base_branch = Branch.open(base)
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
108
109
        # We don't want to lock the same branch across
110
        # 2 different branches
1185.84.4 by Aaron Bentley
Use parent branch as default base branch
111
        if target_branch.base == base_branch.base:
112
            base_branch = target_branch 
1804.1.1 by Aaron Bentley
Add support for submit location to bundles
113
        if submit_branch is None or remember:
114
            if base_specified:
115
                target_branch.set_submit_branch(base_branch.base)
116
            elif remember:
117
                raise errors.BzrCommandError('--remember requires a branch to'
118
                                             ' be specified.')
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
119
120
        base_revision = None
121
        if revision is None:
122
            target_revision = target_branch.last_revision()
123
        elif len(revision) == 1:
124
            target_revision = revision[0].in_history(target_branch).rev_id
125
            if base_branch is not None:
126
                base_revision = base_branch.last_revision()
127
        elif len(revision) == 2:
1185.82.85 by Aaron Bentley
Swap meaning of two-argument 'changeset' to match 'merge'
128
            target_revision = revision[1].in_history(target_branch).rev_id
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
129
            if base_branch is not None:
1185.82.85 by Aaron Bentley
Swap meaning of two-argument 'changeset' to match 'merge'
130
                base_revision = revision[0].in_history(base_branch).rev_id
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
131
            else:
1185.82.85 by Aaron Bentley
Swap meaning of two-argument 'changeset' to match 'merge'
132
                base_revision = revision[0].in_history(target_branch).rev_id
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
133
        else:
134
            raise errors.BzrCommandError('--revision takes 1 or 2 parameters')
135
1185.82.24 by Aaron Bentley
Use common ancestor as a changeset base when unspecified
136
        if revision is None or len(revision) == 1:
137
            if base_branch is not None:
138
                target_branch.repository.fetch(base_branch.repository, 
139
                                               base_branch.last_revision())
140
                base_revision = common_ancestor(base_branch.last_revision(),
141
                                                target_revision,
142
                                                target_branch.repository)
1185.82.58 by Aaron Bentley
Handle empty branches properly
143
                if base_revision is None:
144
                    base_revision = NULL_REVISION
1185.82.24 by Aaron Bentley
Use common ancestor as a changeset base when unspecified
145
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
146
        if base_revision is None:
1185.82.22 by Aaron Bentley
Start getting changeset merging under test
147
            rev = target_branch.repository.get_revision(target_revision)
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
148
            if rev.parent_ids:
149
                base_revision = rev.parent_ids[0]
150
            else:
151
                base_revision = NULL_REVISION
152
153
        if base_branch is not None:
1185.82.23 by Aaron Bentley
Switch the fetcher
154
            target_branch.repository.fetch(base_branch.repository, 
155
                                           revision_id=base_revision)
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
156
            del base_branch
1744.1.1 by Alexander Belchenko
Added --output option for bundle-revisions command
157
158
        if output is not None:
159
            fileobj = file(output, 'wb')
160
        else:
161
            fileobj = sys.stdout
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
162
        write_bundle(target_branch.repository, target_revision, base_revision,
1744.1.1 by Alexander Belchenko
Added --output option for bundle-revisions command
163
                     fileobj)
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
164
0.5.1 by John Arbash Meinel
Just an initial working step.
165
0.5.81 by John Arbash Meinel
Cleaning up from pychecker.
166
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.
167
    """Read a written changeset, and make sure it is valid.
168
169
    """
170
    takes_args = ['filename?']
171
172
    def run(self, filename=None):
0.5.81 by John Arbash Meinel
Cleaning up from pychecker.
173
        from read_changeset import read_changeset
0.5.103 by John Arbash Meinel
Updated to having a changeset specific message.
174
        #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.
175
0.5.114 by John Arbash Meinel
Hiding OPTIONS since it has been removed. Updating for the new Branch.open_containing()
176
        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.
177
0.5.7 by John Arbash Meinel
Added a bunch more information about changesets. Can now read back in all of the meta information.
178
        if filename is None or filename == '-':
179
            f = sys.stdin
180
        else:
0.5.33 by John Arbash Meinel
Use universal newlines wherever appropriate.
181
            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.
182
0.5.88 by John Arbash Meinel
Fixed a bug in the rename code, added more tests.
183
        cset_info, cset_tree = read_changeset(f, b)
0.5.103 by John Arbash Meinel
Updated to having a changeset specific message.
184
        # print cset_info
185
        # print cset_tree
186
        #serializer_v4.write(cset_tree.inventory, sys.stdout)