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