/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/send.py

  • Committer: John Arbash Meinel
  • Date: 2009-06-02 21:11:18 UTC
  • mto: This revision was merged to the branch mainline in revision 4412.
  • Revision ID: john@arbash-meinel.com-20090602211118-fjsx4dxokahrqkrr
Change groupcompress.DeltaIndex to be lazy about indexing the first source.

This changes the performance characteristics of 'commit', especially of large files.
The main benefit is that during commit, we won't be doing any deltas as we add
all new content to a new group anyway.
Thus we know that we won't ever use the delta index we were creating, so
we can save both time and memory by never creating the index until it is
needed.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2009 Canonical Ltd
 
2
#
 
3
# This program is free software; you can redistribute it and/or modify
 
4
# it under the terms of the GNU General Public License as published by
 
5
# the Free Software Foundation; either version 2 of the License, or
 
6
# (at your option) any later version.
 
7
#
 
8
# This program is distributed in the hope that it will be useful,
 
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
# GNU General Public License for more details.
 
12
#
 
13
# You should have received a copy of the GNU General Public License
 
14
# along with this program; if not, write to the Free Software
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
16
 
 
17
 
 
18
import time
 
19
 
 
20
from bzrlib import (
 
21
    bzrdir,
 
22
    errors,
 
23
    merge_directive,
 
24
    osutils,
 
25
    registry,
 
26
    trace,
 
27
    )
 
28
from bzrlib.branch import (
 
29
    Branch,
 
30
    )
 
31
from bzrlib.revision import (
 
32
    NULL_REVISION,
 
33
    )
 
34
 
 
35
 
 
36
format_registry = registry.Registry()
 
37
 
 
38
 
 
39
def send(submit_branch, revision, public_branch, remember, format,
 
40
         no_bundle, no_patch, output, from_, mail_to, message, body, 
 
41
         to_file):
 
42
    tree, branch = bzrdir.BzrDir.open_containing_tree_or_branch(from_)[:2]
 
43
    # we may need to write data into branch's repository to calculate
 
44
    # the data to send.
 
45
    branch.lock_write()
 
46
    try:
 
47
        if output is None:
 
48
            config = branch.get_config()
 
49
            if mail_to is None:
 
50
                mail_to = config.get_user_option('submit_to')
 
51
            mail_client = config.get_mail_client()
 
52
            if (not getattr(mail_client, 'supports_body', False)
 
53
                and body is not None):
 
54
                raise errors.BzrCommandError(
 
55
                    'Mail client "%s" does not support specifying body' %
 
56
                    mail_client.__class__.__name__)
 
57
        if remember and submit_branch is None:
 
58
            raise errors.BzrCommandError(
 
59
                '--remember requires a branch to be specified.')
 
60
        stored_submit_branch = branch.get_submit_branch()
 
61
        remembered_submit_branch = None
 
62
        if submit_branch is None:
 
63
            submit_branch = stored_submit_branch
 
64
            remembered_submit_branch = "submit"
 
65
        else:
 
66
            if stored_submit_branch is None or remember:
 
67
                branch.set_submit_branch(submit_branch)
 
68
        if submit_branch is None:
 
69
            submit_branch = branch.get_parent()
 
70
            remembered_submit_branch = "parent"
 
71
        if submit_branch is None:
 
72
            raise errors.BzrCommandError('No submit branch known or'
 
73
                                         ' specified')
 
74
        if remembered_submit_branch is not None:
 
75
            trace.note('Using saved %s location "%s" to determine what '
 
76
                       'changes to submit.', remembered_submit_branch,
 
77
                       submit_branch)
 
78
 
 
79
        if mail_to is None or format is None:
 
80
            submit_br = Branch.open(submit_branch)
 
81
            submit_config = submit_br.get_config()
 
82
            if mail_to is None:
 
83
                mail_to = submit_config.get_user_option("child_submit_to")
 
84
            if format is None:
 
85
                formatname = submit_br.get_child_submit_format()
 
86
                try:
 
87
                    format = format_registry.get(formatname)
 
88
                except KeyError:
 
89
                    raise errors.BzrCommandError("No such send format '%s'." % 
 
90
                                                 formatname)
 
91
 
 
92
        stored_public_branch = branch.get_public_branch()
 
93
        if public_branch is None:
 
94
            public_branch = stored_public_branch
 
95
        elif stored_public_branch is None or remember:
 
96
            branch.set_public_branch(public_branch)
 
97
        if no_bundle and public_branch is None:
 
98
            raise errors.BzrCommandError('No public branch specified or'
 
99
                                         ' known')
 
100
        base_revision_id = None
 
101
        revision_id = None
 
102
        if revision is not None:
 
103
            if len(revision) > 2:
 
104
                raise errors.BzrCommandError('bzr send takes '
 
105
                    'at most two one revision identifiers')
 
106
            revision_id = revision[-1].as_revision_id(branch)
 
107
            if len(revision) == 2:
 
108
                base_revision_id = revision[0].as_revision_id(branch)
 
109
        if revision_id is None:
 
110
            revision_id = branch.last_revision()
 
111
        if revision_id == NULL_REVISION:
 
112
            raise errors.BzrCommandError('No revisions to submit.')
 
113
        if format is None:
 
114
            # TODO: Query submit branch for its preferred format
 
115
            format = format_registry.get()
 
116
        directive = format(branch, revision_id, submit_branch, 
 
117
            public_branch, no_patch, no_bundle, message, base_revision_id)
 
118
        if output is None:
 
119
            directive.compose_merge_request(mail_client, mail_to, body,
 
120
                                            branch, tree)
 
121
        else:
 
122
            if output == '-':
 
123
                outfile = to_file
 
124
            else:
 
125
                outfile = open(output, 'wb')
 
126
            try:
 
127
                outfile.writelines(directive.to_lines())
 
128
            finally:
 
129
                if outfile is not to_file:
 
130
                    outfile.close()
 
131
    finally:
 
132
        branch.unlock()
 
133
 
 
134
 
 
135
def _send_4(branch, revision_id, submit_branch, public_branch,
 
136
            no_patch, no_bundle, message, base_revision_id):
 
137
    return merge_directive.MergeDirective2.from_objects(
 
138
        branch.repository, revision_id, time.time(),
 
139
        osutils.local_time_offset(), submit_branch,
 
140
        public_branch=public_branch, include_patch=not no_patch,
 
141
        include_bundle=not no_bundle, message=message,
 
142
        base_revision_id=base_revision_id)
 
143
 
 
144
 
 
145
def _send_0_9(branch, revision_id, submit_branch, public_branch,
 
146
              no_patch, no_bundle, message, base_revision_id):
 
147
    if not no_bundle:
 
148
        if not no_patch:
 
149
            patch_type = 'bundle'
 
150
        else:
 
151
            raise errors.BzrCommandError('Format 0.9 does not'
 
152
                ' permit bundle with no patch')
 
153
    else:
 
154
        if not no_patch:
 
155
            patch_type = 'diff'
 
156
        else:
 
157
            patch_type = None
 
158
    return merge_directive.MergeDirective.from_objects(
 
159
        branch.repository, revision_id, time.time(),
 
160
        osutils.local_time_offset(), submit_branch,
 
161
        public_branch=public_branch, patch_type=patch_type,
 
162
        message=message)
 
163
 
 
164
 
 
165
format_registry.register('4', 
 
166
    _send_4, 'Bundle format 4, Merge Directive 2 (default)')
 
167
format_registry.register('0.9',
 
168
    _send_0_9, 'Bundle format 0.9, Merge Directive 1')
 
169
format_registry.default_key = '4'