~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.84.1 by Aaron Bentley
Use full command name in bundle-revisions help
67
    bzr bundle-revisions
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
68
        - Bundle for the last commit
1185.84.1 by Aaron Bentley
Use full command name in bundle-revisions help
69
    bzr bundle-revisions BASE
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
70
        - Bundle to apply the current tree into BASE
1185.84.1 by Aaron Bentley
Use full command name in bundle-revisions help
71
    bzr bundle-revisions --revision A
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
72
        - Bundle for revision A
1185.84.1 by Aaron Bentley
Use full command name in bundle-revisions help
73
    bzr bundle-revisions --revision A..B
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
74
        - Bundle to transform A into B
1185.84.1 by Aaron Bentley
Use full command name in bundle-revisions help
75
    bzr bundle-revisions --revision A..B BASE
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
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
    """
1744.1.1 by Alexander Belchenko
Added --output option for bundle-revisions command
79
    takes_options = ['verbose', 'revision',
80
                     Option("output", help="write bundle to specified file",
81
                            type=unicode)]
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
82
    takes_args = ['base?']
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
83
    aliases = ['bundle']
0.5.1 by John Arbash Meinel
Just an initial working step.
84
1744.1.1 by Alexander Belchenko
Added --output option for bundle-revisions command
85
    def run(self, base=None, revision=None, output=None):
0.5.81 by John Arbash Meinel
Cleaning up from pychecker.
86
        from bzrlib import user_encoding
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
87
        from bzrlib.bundle.serializer import write_bundle
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
88
89
        if base is None:
90
            base_branch = None
91
        else:
92
            base_branch = Branch.open(base)
93
94
        # We don't want to lock the same branch across
95
        # 2 different branches
96
        target_branch = Branch.open_containing(u'.')[0]
97
        if base_branch is not None and target_branch.base == base_branch.base:
98
            base_branch = None
99
100
        base_revision = None
101
        if revision is None:
102
            target_revision = target_branch.last_revision()
103
        elif len(revision) == 1:
104
            target_revision = revision[0].in_history(target_branch).rev_id
105
            if base_branch is not None:
106
                base_revision = base_branch.last_revision()
107
        elif len(revision) == 2:
1185.82.85 by Aaron Bentley
Swap meaning of two-argument 'changeset' to match 'merge'
108
            target_revision = revision[1].in_history(target_branch).rev_id
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
109
            if base_branch is not None:
1185.82.85 by Aaron Bentley
Swap meaning of two-argument 'changeset' to match 'merge'
110
                base_revision = revision[0].in_history(base_branch).rev_id
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
111
            else:
1185.82.85 by Aaron Bentley
Swap meaning of two-argument 'changeset' to match 'merge'
112
                base_revision = revision[0].in_history(target_branch).rev_id
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
113
        else:
114
            raise errors.BzrCommandError('--revision takes 1 or 2 parameters')
115
1185.82.24 by Aaron Bentley
Use common ancestor as a changeset base when unspecified
116
        if revision is None or len(revision) == 1:
117
            if base_branch is not None:
118
                target_branch.repository.fetch(base_branch.repository, 
119
                                               base_branch.last_revision())
120
                base_revision = common_ancestor(base_branch.last_revision(),
121
                                                target_revision,
122
                                                target_branch.repository)
1185.82.58 by Aaron Bentley
Handle empty branches properly
123
                if base_revision is None:
124
                    base_revision = NULL_REVISION
1185.82.24 by Aaron Bentley
Use common ancestor as a changeset base when unspecified
125
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
126
        if base_revision is None:
1185.82.22 by Aaron Bentley
Start getting changeset merging under test
127
            rev = target_branch.repository.get_revision(target_revision)
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
128
            if rev.parent_ids:
129
                base_revision = rev.parent_ids[0]
130
            else:
131
                base_revision = NULL_REVISION
132
133
        if base_branch is not None:
1185.82.23 by Aaron Bentley
Switch the fetcher
134
            target_branch.repository.fetch(base_branch.repository, 
135
                                           revision_id=base_revision)
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
136
            del base_branch
1744.1.1 by Alexander Belchenko
Added --output option for bundle-revisions command
137
138
        if output is not None:
139
            fileobj = file(output, 'wb')
140
        else:
141
            fileobj = sys.stdout
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
142
        write_bundle(target_branch.repository, target_revision, base_revision,
1744.1.1 by Alexander Belchenko
Added --output option for bundle-revisions command
143
                     fileobj)
1185.82.10 by John Arbash Meinel
Worked out the changeset command.
144
0.5.1 by John Arbash Meinel
Just an initial working step.
145
0.5.81 by John Arbash Meinel
Cleaning up from pychecker.
146
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.
147
    """Read a written changeset, and make sure it is valid.
148
149
    """
150
    takes_args = ['filename?']
151
152
    def run(self, filename=None):
0.5.81 by John Arbash Meinel
Cleaning up from pychecker.
153
        from read_changeset import read_changeset
0.5.103 by John Arbash Meinel
Updated to having a changeset specific message.
154
        #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.
155
0.5.114 by John Arbash Meinel
Hiding OPTIONS since it has been removed. Updating for the new Branch.open_containing()
156
        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.
157
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
        if filename is None or filename == '-':
159
            f = sys.stdin
160
        else:
0.5.33 by John Arbash Meinel
Use universal newlines wherever appropriate.
161
            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.
162
0.5.88 by John Arbash Meinel
Fixed a bug in the rename code, added more tests.
163
        cset_info, cset_tree = read_changeset(f, b)
0.5.103 by John Arbash Meinel
Updated to having a changeset specific message.
164
        # print cset_info
165
        # print cset_tree
166
        #serializer_v4.write(cset_tree.inventory, sys.stdout)