~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
    """
1744.1.1 by Alexander Belchenko
Added --output option for bundle-revisions command
80
    takes_options = ['verbose', 'revision',
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
1744.1.1 by Alexander Belchenko
Added --output option for bundle-revisions command
86
    def run(self, base=None, revision=None, output=None):
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]
91
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
92
        if base is None:
1185.84.4 by Aaron Bentley
Use parent branch as default base branch
93
            base = target_branch.get_parent()
94
            if base is None:
95
                raise errors.BzrCommandError("No base branch known or"
96
                                             " specified.")
97
            else:
98
                note('Using saved location: %s' % base)
99
        base_branch = Branch.open(base)
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
100
101
        # We don't want to lock the same branch across
102
        # 2 different branches
1185.84.4 by Aaron Bentley
Use parent branch as default base branch
103
        if target_branch.base == base_branch.base:
104
            base_branch = target_branch 
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
105
106
        base_revision = None
107
        if revision is None:
108
            target_revision = target_branch.last_revision()
109
        elif len(revision) == 1:
110
            target_revision = revision[0].in_history(target_branch).rev_id
111
            if base_branch is not None:
112
                base_revision = base_branch.last_revision()
113
        elif len(revision) == 2:
1185.82.85 by Aaron Bentley
Swap meaning of two-argument 'changeset' to match 'merge'
114
            target_revision = revision[1].in_history(target_branch).rev_id
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
115
            if base_branch is not None:
1185.82.85 by Aaron Bentley
Swap meaning of two-argument 'changeset' to match 'merge'
116
                base_revision = revision[0].in_history(base_branch).rev_id
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
117
            else:
1185.82.85 by Aaron Bentley
Swap meaning of two-argument 'changeset' to match 'merge'
118
                base_revision = revision[0].in_history(target_branch).rev_id
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
119
        else:
120
            raise errors.BzrCommandError('--revision takes 1 or 2 parameters')
121
1185.82.24 by Aaron Bentley
Use common ancestor as a changeset base when unspecified
122
        if revision is None or len(revision) == 1:
123
            if base_branch is not None:
124
                target_branch.repository.fetch(base_branch.repository, 
125
                                               base_branch.last_revision())
126
                base_revision = common_ancestor(base_branch.last_revision(),
127
                                                target_revision,
128
                                                target_branch.repository)
1185.82.58 by Aaron Bentley
Handle empty branches properly
129
                if base_revision is None:
130
                    base_revision = NULL_REVISION
1185.82.24 by Aaron Bentley
Use common ancestor as a changeset base when unspecified
131
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
132
        if base_revision is None:
1185.82.22 by Aaron Bentley
Start getting changeset merging under test
133
            rev = target_branch.repository.get_revision(target_revision)
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
134
            if rev.parent_ids:
135
                base_revision = rev.parent_ids[0]
136
            else:
137
                base_revision = NULL_REVISION
138
139
        if base_branch is not None:
1185.82.23 by Aaron Bentley
Switch the fetcher
140
            target_branch.repository.fetch(base_branch.repository, 
141
                                           revision_id=base_revision)
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
142
            del base_branch
1744.1.1 by Alexander Belchenko
Added --output option for bundle-revisions command
143
144
        if output is not None:
145
            fileobj = file(output, 'wb')
146
        else:
147
            fileobj = sys.stdout
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
148
        write_bundle(target_branch.repository, target_revision, base_revision,
1744.1.1 by Alexander Belchenko
Added --output option for bundle-revisions command
149
                     fileobj)
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
150
0.5.1 by John Arbash Meinel
Just an initial working step.
151
0.5.81 by John Arbash Meinel
Cleaning up from pychecker.
152
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.
153
    """Read a written changeset, and make sure it is valid.
154
155
    """
156
    takes_args = ['filename?']
157
158
    def run(self, filename=None):
0.5.81 by John Arbash Meinel
Cleaning up from pychecker.
159
        from read_changeset import read_changeset
0.5.103 by John Arbash Meinel
Updated to having a changeset specific message.
160
        #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.
161
0.5.114 by John Arbash Meinel
Hiding OPTIONS since it has been removed. Updating for the new Branch.open_containing()
162
        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.
163
0.5.7 by John Arbash Meinel
Added a bunch more information about changesets. Can now read back in all of the meta information.
164
        if filename is None or filename == '-':
165
            f = sys.stdin
166
        else:
0.5.33 by John Arbash Meinel
Use universal newlines wherever appropriate.
167
            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.
168
0.5.88 by John Arbash Meinel
Fixed a bug in the rename code, added more tests.
169
        cset_info, cset_tree = read_changeset(f, b)
0.5.103 by John Arbash Meinel
Updated to having a changeset specific message.
170
        # print cset_info
171
        # print cset_tree
172
        #serializer_v4.write(cset_tree.inventory, sys.stdout)