/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.205.34 by Jelmer Vernooij
s/get_revision/get_inventory.
1
# Copyright (C) 2008-2009 Jelmer Vernooij <jelmer@samba.org>
0.205.1 by Jelmer Vernooij
Import utility functions for foreign branches.
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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
"""Foreign branch utilities."""
18
0.205.34 by Jelmer Vernooij
s/get_revision/get_inventory.
19
from bzrlib import errors
0.207.1 by Jelmer Vernooij
Add ForeignBranch class, make dpush fallback to regular push.
20
from bzrlib.branch import Branch
0.205.7 by Jelmer Vernooij
Import dpush.
21
from bzrlib.commands import Command, Option
0.205.23 by Jelmer Vernooij
Add more docstrings.
22
0.205.6 by Jelmer Vernooij
Import FakeControlFiles.
23
0.207.1 by Jelmer Vernooij
Add ForeignBranch class, make dpush fallback to regular push.
24
class ForeignBranch(Branch):
0.205.18 by Jelmer Vernooij
Add docstrings.
25
    """Branch that exists in a foreign version control system."""
0.207.1 by Jelmer Vernooij
Add ForeignBranch class, make dpush fallback to regular push.
26
27
    def __init__(self, mapping):
0.205.21 by Jelmer Vernooij
Only register foreign property show function once.
28
        self.mapping = mapping
0.207.1 by Jelmer Vernooij
Add ForeignBranch class, make dpush fallback to regular push.
29
        super(ForeignBranch, self).__init__()
30
31
    def dpull(self, source, stop_revision=None):
0.205.18 by Jelmer Vernooij
Add docstrings.
32
        """Pull deltas from another branch.
33
34
        :note: This does not, like pull, retain the revision ids from 
0.205.29 by Jelmer Vernooij
Fix updating of file ids.
35
            the source branch and will, rather than adding bzr-specific 
36
            metadata, push only those semantics of the revision that can be 
37
            natively represented in this branch.
0.205.18 by Jelmer Vernooij
Add docstrings.
38
39
        :param source: Source branch
40
        :param stop_revision: Revision to pull, defaults to last revision.
0.205.29 by Jelmer Vernooij
Fix updating of file ids.
41
        :return: Revision id map and file id map
0.205.18 by Jelmer Vernooij
Add docstrings.
42
        """
0.205.25 by Jelmer Vernooij
Fix function names.
43
        raise NotImplementedError(self.dpull)
0.207.1 by Jelmer Vernooij
Add ForeignBranch class, make dpush fallback to regular push.
44
45
0.205.6 by Jelmer Vernooij
Import FakeControlFiles.
46
class FakeControlFiles(object):
47
    """Dummy implementation of ControlFiles.
48
    
49
    This is required as some code relies on controlfiles being 
50
    available."""
51
    def get_utf8(self, name):
52
        raise errors.NoSuchFile(name)
53
54
    def get(self, name):
55
        raise errors.NoSuchFile(name)
56
57
    def break_lock(self):
58
        pass
59
0.205.7 by Jelmer Vernooij
Import dpush.
60
61
class cmd_dpush(Command):
0.205.8 by Jelmer Vernooij
Remove references to svn.
62
    """Push diffs into a foreign version control system without any 
63
    Bazaar-specific metadata.
0.205.7 by Jelmer Vernooij
Import dpush.
64
0.205.8 by Jelmer Vernooij
Remove references to svn.
65
    This will afterwards rebase the local Bazaar branch on the remote
0.205.7 by Jelmer Vernooij
Import dpush.
66
    branch unless the --no-rebase option is used, in which case 
67
    the two branches will be out of sync. 
68
    """
69
    takes_args = ['location?']
70
    takes_options = ['remember', Option('directory',
71
            help='Branch to push from, '
72
                 'rather than the one containing the working directory.',
73
            short_name='d',
74
            type=unicode,
75
            ),
76
            Option('no-rebase', help="Don't rebase after push")]
77
78
    def run(self, location=None, remember=False, directory=None, 
79
            no_rebase=False):
80
        from bzrlib import urlutils
81
        from bzrlib.bzrdir import BzrDir
82
        from bzrlib.errors import BzrCommandError, NoWorkingTree
0.205.35 by Jelmer Vernooij
Fix empty dpush case.
83
        from bzrlib.inventory import Inventory
84
        from bzrlib.revision import NULL_REVISION
0.205.23 by Jelmer Vernooij
Add more docstrings.
85
        from bzrlib.trace import info
0.205.7 by Jelmer Vernooij
Import dpush.
86
        from bzrlib.workingtree import WorkingTree
0.205.34 by Jelmer Vernooij
s/get_revision/get_inventory.
87
        from upgrade import update_workinginv_fileids
0.205.7 by Jelmer Vernooij
Import dpush.
88
0.205.35 by Jelmer Vernooij
Fix empty dpush case.
89
        def get_inv(wt, revid):
90
            if revid == NULL_REVISION:
91
                return Inventory()
92
            else:
93
                return wt.branch.repository.get_inventory(revid)
94
0.205.7 by Jelmer Vernooij
Import dpush.
95
        if directory is None:
96
            directory = "."
97
        try:
98
            source_wt = WorkingTree.open_containing(directory)[0]
99
            source_branch = source_wt.branch
100
        except NoWorkingTree:
101
            source_branch = Branch.open_containing(directory)[0]
102
            source_wt = None
103
        stored_loc = source_branch.get_push_location()
104
        if location is None:
105
            if stored_loc is None:
106
                raise BzrCommandError("No push location known or specified.")
107
            else:
108
                display_url = urlutils.unescape_for_display(stored_loc,
109
                        self.outf.encoding)
110
                self.outf.write("Using saved location: %s\n" % display_url)
111
                location = stored_loc
112
113
        bzrdir = BzrDir.open(location)
114
        target_branch = bzrdir.open_branch()
115
        target_branch.lock_write()
0.205.27 by Jelmer Vernooij
Make sure target branch is unlocked.
116
        try:
0.205.32 by Jelmer Vernooij
Don't rely on isinstance when there are multiple copies of a type around.
117
            if getattr(target_branch, "dpull", None) is None:
0.205.27 by Jelmer Vernooij
Make sure target branch is unlocked.
118
                info("target branch is not a foreign branch, using regular push.")
119
                target_branch.pull(source_branch)
120
                no_rebase = True
0.205.7 by Jelmer Vernooij
Import dpush.
121
            else:
0.205.27 by Jelmer Vernooij
Make sure target branch is unlocked.
122
                revid_map = target_branch.dpull(source_branch)
123
            # We successfully created the target, remember it
124
            if source_branch.get_push_location() is None or remember:
125
                source_branch.set_push_location(target_branch.base)
126
            if not no_rebase:
127
                _, old_last_revid = source_branch.last_revision_info()
128
                new_last_revid = revid_map[old_last_revid]
129
                if source_wt is not None:
130
                    source_wt.pull(target_branch, overwrite=True, 
0.205.7 by Jelmer Vernooij
Import dpush.
131
                                   stop_revision=new_last_revid)
0.205.29 by Jelmer Vernooij
Fix updating of file ids.
132
                    source_wt.lock_write()
133
                    try:
0.205.34 by Jelmer Vernooij
s/get_revision/get_inventory.
134
                        update_workinginv_fileids(source_wt, 
0.205.35 by Jelmer Vernooij
Fix empty dpush case.
135
                            get_inv(source_wt, old_last_revid), 
136
                            get_inv(source_wt, new_last_revid))
0.205.29 by Jelmer Vernooij
Fix updating of file ids.
137
                    finally:
138
                        source_wt.unlock()
0.205.27 by Jelmer Vernooij
Make sure target branch is unlocked.
139
                else:
140
                    source_branch.pull(target_branch, overwrite=True, 
141
                                       stop_revision=new_last_revid)
142
        finally:
143
            target_branch.unlock()
0.205.7 by Jelmer Vernooij
Import dpush.
144
0.205.15 by Jelmer Vernooij
Add test_suite function.
145
def test_suite():
146
    from unittest import TestSuite
147
    from bzrlib.tests import TestUtil
148
    loader = TestUtil.TestLoader()
149
    suite = TestSuite()
0.205.19 by Jelmer Vernooij
import bzr-svn improvements.
150
    testmod_names = ['test_versionedfiles', ]
0.205.15 by Jelmer Vernooij
Add test_suite function.
151
    suite.addTest(loader.loadTestsFromModuleNames(testmod_names))
152
    return suite
0.205.7 by Jelmer Vernooij
Import dpush.
153
0.205.18 by Jelmer Vernooij
Add docstrings.
154
0.207.2 by Jelmer Vernooij
Import escape commit message function.
155
def escape_commit_message(message):
156
    """Replace xml-incompatible control characters."""
157
    if message is None:
158
        return None
159
    import re
160
    # FIXME: RBC 20060419 this should be done by the revision
161
    # serialiser not by commit. Then we can also add an unescaper
162
    # in the deserializer and start roundtripping revision messages
163
    # precisely. See repository_implementations/test_repository.py
164
    
165
    # Python strings can include characters that can't be
166
    # represented in well-formed XML; escape characters that
167
    # aren't listed in the XML specification
168
    # (http://www.w3.org/TR/REC-xml/#NT-Char).
169
    message, _ = re.subn(
170
        u'[^\x09\x0A\x0D\u0020-\uD7FF\uE000-\uFFFD]+',
171
        lambda match: match.group(0).encode('unicode_escape'),
172
        message)
173
    return message
174
0.205.19 by Jelmer Vernooij
import bzr-svn improvements.
175