/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.206 by Jelmer Vernooij
Move commands to a separate python module and register them lazily.
1
# Copyright (C) 2006-2009 Canonical Ltd
2
3
# Authors: Robert Collins <robert.collins@canonical.com>
4
#          Jelmer Vernooij <jelmer@samba.org>
5
#          John Carr <john.carr@unrouted.co.uk>
6
#
7
# This program is free software; you can redistribute it and/or modify
8
# it under the terms of the GNU General Public License as published by
9
# the Free Software Foundation; either version 2 of the License, or
10
# (at your option) any later version.
11
#
12
# This program is distributed in the hope that it will be useful,
13
# but WITHOUT ANY WARRANTY; without even the implied warranty of
14
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
# GNU General Public License for more details.
16
#
17
# You should have received a copy of the GNU General Public License
18
# along with this program; if not, write to the Free Software
19
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20
21
"""Git-specific subcommands for Bazaar."""
22
0.200.292 by Jelmer Vernooij
Fix formatting.
23
from bzrlib.commands import (
24
    Command,
0.200.423 by Jelmer Vernooij
Support pretty-printing git objects.
25
    display_command,
0.200.292 by Jelmer Vernooij
Fix formatting.
26
    )
27
from bzrlib.option import (
28
    Option,
29
    )
0.200.206 by Jelmer Vernooij
Move commands to a separate python module and register them lazily.
30
0.228.1 by Jelmer Vernooij
Add basic tests for local fetch.
31
0.200.206 by Jelmer Vernooij
Move commands to a separate python module and register them lazily.
32
class cmd_git_import(Command):
33
    """Import all branches from a git repository.
34
35
    """
36
0.200.234 by Jelmer Vernooij
Derive to_location from from_location, simialr to bzr branch.
37
    takes_args = ["src_location", "dest_location?"]
0.200.206 by Jelmer Vernooij
Move commands to a separate python module and register them lazily.
38
0.200.1452 by Jelmer Vernooij
Support colocated branches in 'bzr git-import', flatten namespace.
39
    def _get_colocated_branch(self, target_bzrdir, name):
40
        from bzrlib.errors import NotBranchError
41
        try:
42
            return target_bzrdir.open_branch(name=name)
43
        except NotBranchError:
44
            return target_bzrdir.create_branch(name=name)
45
46
    def _get_nested_branch(self, dest_transport, dest_format, name):
47
        from bzrlib.bzrdir import BzrDir
48
        from bzrlib.errors import NotBranchError
49
        head_transport = dest_transport.clone(name)
50
        try:
51
            head_bzrdir = BzrDir.open_from_transport(head_transport)
52
        except NotBranchError:
53
            head_bzrdir = dest_format.initialize_on_transport_ex(
54
                head_transport, create_prefix=True)[1]
55
        try:
56
            return head_bzrdir.open_branch()
57
        except NotBranchError:
58
            return head_bzrdir.create_branch()
59
0.200.234 by Jelmer Vernooij
Derive to_location from from_location, simialr to bzr branch.
60
    def run(self, src_location, dest_location=None):
0.200.1061 by Jelmer Vernooij
Add support for using unpeel map.
61
        from collections import defaultdict
0.200.247 by Jelmer Vernooij
Fix git-import.
62
        import os
0.200.1390 by Jelmer Vernooij
Set parent path in git-import.
63
        import urllib
0.200.247 by Jelmer Vernooij
Fix git-import.
64
        from bzrlib import (
0.200.1141 by Jelmer Vernooij
Use transports in git-import.
65
            controldir,
0.200.1143 by Jelmer Vernooij
Add note about creating working trees.
66
            trace,
0.200.247 by Jelmer Vernooij
Fix git-import.
67
            ui,
0.200.1390 by Jelmer Vernooij
Set parent path in git-import.
68
            urlutils,
0.200.247 by Jelmer Vernooij
Fix git-import.
69
            )
70
        from bzrlib.bzrdir import (
71
            BzrDir,
72
            )
0.200.243 by Jelmer Vernooij
Error out on non-git repositories.
73
        from bzrlib.errors import (
74
            BzrCommandError,
75
            NoRepositoryPresent,
76
            NotBranchError,
77
            )
0.200.1470 by Jelmer Vernooij
Import gettext from plugin.
78
        from bzrlib.plugins.git import gettext
0.200.306 by Jelmer Vernooij
Fix tests, split up InterGitNonGitRepository.
79
        from bzrlib.repository import (
80
            InterRepository,
81
            Repository,
82
            )
0.200.1141 by Jelmer Vernooij
Use transports in git-import.
83
        from bzrlib.transport import get_transport
0.239.1 by Jelmer Vernooij
Avoid re-connecting to fetch tags we already know.
84
        from bzrlib.plugins.git.branch import (
85
            GitBranch,
86
            extract_tags,
87
            )
0.200.1055 by Jelmer Vernooij
Cope with unknown refs.
88
        from bzrlib.plugins.git.refs import ref_to_branch_name
0.200.243 by Jelmer Vernooij
Error out on non-git repositories.
89
        from bzrlib.plugins.git.repository import GitRepository
0.200.234 by Jelmer Vernooij
Derive to_location from from_location, simialr to bzr branch.
90
0.200.1141 by Jelmer Vernooij
Use transports in git-import.
91
        dest_format = controldir.ControlDirFormat.get_default_format()
92
0.200.234 by Jelmer Vernooij
Derive to_location from from_location, simialr to bzr branch.
93
        if dest_location is None:
94
            dest_location = os.path.basename(src_location.rstrip("/\\"))
95
0.200.1141 by Jelmer Vernooij
Use transports in git-import.
96
        dest_transport = get_transport(dest_location)
97
0.200.206 by Jelmer Vernooij
Move commands to a separate python module and register them lazily.
98
        source_repo = Repository.open(src_location)
0.200.243 by Jelmer Vernooij
Error out on non-git repositories.
99
        if not isinstance(source_repo, GitRepository):
0.200.1483 by Jelmer Vernooij
Translate more strings.
100
            raise BzrCommandError(gettext("%r is not a git repository") % src_location)
0.200.206 by Jelmer Vernooij
Move commands to a separate python module and register them lazily.
101
        try:
0.200.1141 by Jelmer Vernooij
Use transports in git-import.
102
            target_bzrdir = BzrDir.open_from_transport(dest_transport)
0.200.206 by Jelmer Vernooij
Move commands to a separate python module and register them lazily.
103
        except NotBranchError:
0.200.1141 by Jelmer Vernooij
Use transports in git-import.
104
            target_bzrdir = dest_format.initialize_on_transport_ex(
0.200.1142 by Jelmer Vernooij
Fix use of initialize_on_transport_ex.
105
                dest_transport, shared_repo=True)[1]
0.200.206 by Jelmer Vernooij
Move commands to a separate python module and register them lazily.
106
        try:
0.200.612 by Jelmer Vernooij
Cope with Dulwich returning KeyError when a commit is not found.
107
            target_repo = target_bzrdir.find_repository()
0.200.206 by Jelmer Vernooij
Move commands to a separate python module and register them lazily.
108
        except NoRepositoryPresent:
109
            target_repo = target_bzrdir.create_repository(shared=True)
110
0.200.569 by Jelmer Vernooij
Check for rich root target repository.
111
        if not target_repo.supports_rich_root():
0.200.1483 by Jelmer Vernooij
Translate more strings.
112
            raise BzrCommandError(gettext("Target repository doesn't support rich roots"))
0.200.569 by Jelmer Vernooij
Check for rich root target repository.
113
0.200.306 by Jelmer Vernooij
Fix tests, split up InterGitNonGitRepository.
114
        interrepo = InterRepository.get(source_repo, target_repo)
0.200.247 by Jelmer Vernooij
Fix git-import.
115
        mapping = source_repo.get_mapping()
0.200.1002 by Jelmer Vernooij
Fix regression in git-import.
116
        refs = interrepo.fetch()
0.200.1061 by Jelmer Vernooij
Add support for using unpeel map.
117
        unpeeled_tags = defaultdict(set)
0.200.648 by Jelmer Vernooij
Fix tag handling when encountering packed refs.
118
        tags = {}
0.200.1060 by Jelmer Vernooij
Return unpeeled tags in extract_tags.
119
        for k, (peeled, unpeeled) in extract_tags(refs).iteritems():
120
            tags[k] = mapping.revision_id_foreign_to_bzr(peeled)
121
            if unpeeled is not None:
0.200.1061 by Jelmer Vernooij
Add support for using unpeel map.
122
                unpeeled_tags[peeled].add(unpeeled)
123
        # FIXME: Store unpeeled tag map
0.200.247 by Jelmer Vernooij
Fix git-import.
124
        pb = ui.ui_factory.nested_progress_bar()
125
        try:
126
            for i, (name, ref) in enumerate(refs.iteritems()):
0.200.1055 by Jelmer Vernooij
Cope with unknown refs.
127
                try:
0.200.1452 by Jelmer Vernooij
Support colocated branches in 'bzr git-import', flatten namespace.
128
                    branch_name = ref_to_branch_name(name)
0.200.1055 by Jelmer Vernooij
Cope with unknown refs.
129
                except ValueError:
130
                    # Not a branch, ignore
0.200.271 by Jelmer Vernooij
Stop importing tags as branches as part of git-import.
131
                    continue
0.200.1469 by Jelmer Vernooij
Add more strings.
132
                pb.update(gettext("creating branches"), i, len(refs))
0.200.1455 by Jelmer Vernooij
Cope with .colocated_branches not being available.
133
                if getattr(target_bzrdir._format, "colocated_branches", False):
0.200.1452 by Jelmer Vernooij
Support colocated branches in 'bzr git-import', flatten namespace.
134
                    if name == "HEAD":
135
                        branch_name = None
136
                    head_branch = self._get_colocated_branch(target_bzrdir, branch_name)
137
                else:
138
                    head_branch = self._get_nested_branch(dest_transport, dest_format, branch_name)
0.200.271 by Jelmer Vernooij
Stop importing tags as branches as part of git-import.
139
                revid = mapping.revision_id_foreign_to_bzr(ref)
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
140
                source_branch = GitBranch(source_repo.bzrdir, source_repo,
0.200.1450 by Jelmer Vernooij
Fix git-import after branch refactoring.
141
                    ref, tags)
0.200.488 by Jelmer Vernooij
Fix git-import.
142
                source_branch.head = ref
0.239.1 by Jelmer Vernooij
Avoid re-connecting to fetch tags we already know.
143
                if head_branch.last_revision() != revid:
144
                    head_branch.generate_revision_history(revid)
0.200.273 by Jelmer Vernooij
Fix import of tags in git-import.
145
                source_branch.tags.merge_to(head_branch.tags)
0.200.1390 by Jelmer Vernooij
Set parent path in git-import.
146
                if not head_branch.get_parent():
0.200.1452 by Jelmer Vernooij
Support colocated branches in 'bzr git-import', flatten namespace.
147
                    url = urlutils.join_segment_parameters(
148
                        source_branch.base, {"ref": urllib.quote(name, '')})
0.200.1390 by Jelmer Vernooij
Set parent path in git-import.
149
                    head_branch.set_parent(url)
0.200.247 by Jelmer Vernooij
Fix git-import.
150
        finally:
151
            pb.finished()
0.200.1469 by Jelmer Vernooij
Add more strings.
152
        trace.note(gettext(
153
            "Use 'bzr checkout' to create a working tree in "
154
            "the newly created branches."))
0.200.1143 by Jelmer Vernooij
Add note about creating working trees.
155
0.200.206 by Jelmer Vernooij
Move commands to a separate python module and register them lazily.
156
0.200.422 by Jelmer Vernooij
'bzr git-object' without arguments now prints the available git objects.
157
class cmd_git_object(Command):
158
    """List or display Git objects by SHA.
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
159
0.200.422 by Jelmer Vernooij
'bzr git-object' without arguments now prints the available git objects.
160
    Cat a particular object's Git representation if a SHA is specified.
161
    List all available SHAs otherwise.
162
    """
0.200.419 by Jelmer Vernooij
Add hidden git-cat command that can cat git objects from Bazaar repositories.
163
164
    hidden = True
165
0.200.422 by Jelmer Vernooij
'bzr git-object' without arguments now prints the available git objects.
166
    aliases = ["git-objects", "git-cat"]
167
    takes_args = ["sha1?"]
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
168
    takes_options = [Option('directory',
0.200.440 by Jelmer Vernooij
Remove silly mapping of timezones; dulwich uses offsets now as well.
169
        short_name='d',
0.200.424 by Jelmer Vernooij
Fix formatting.
170
        help='Location of repository.', type=unicode),
171
        Option('pretty', help='Pretty-print objects.')]
0.200.423 by Jelmer Vernooij
Support pretty-printing git objects.
172
    encoding_type = 'exact'
0.200.419 by Jelmer Vernooij
Add hidden git-cat command that can cat git objects from Bazaar repositories.
173
0.200.423 by Jelmer Vernooij
Support pretty-printing git objects.
174
    @display_command
175
    def run(self, sha1=None, directory=".", pretty=False):
0.200.419 by Jelmer Vernooij
Add hidden git-cat command that can cat git objects from Bazaar repositories.
176
        from bzrlib.errors import (
177
            BzrCommandError,
178
            )
179
        from bzrlib.bzrdir import (
180
            BzrDir,
181
            )
0.200.1484 by Jelmer Vernooij
Fix import.
182
        from bzrlib.plugins.git.object_store import (
183
            get_object_store,
184
            )
185
        from bzrlib.plugins.git import gettext
0.200.419 by Jelmer Vernooij
Add hidden git-cat command that can cat git objects from Bazaar repositories.
186
        bzrdir, _ = BzrDir.open_containing(directory)
187
        repo = bzrdir.find_repository()
0.200.452 by Jelmer Vernooij
Rename converter -> object_store, provide utility function for getting ObjectStore's.
188
        object_store = get_object_store(repo)
0.200.1212 by Jelmer Vernooij
Support read locking object stores.
189
        object_store.lock_read()
0.200.419 by Jelmer Vernooij
Add hidden git-cat command that can cat git objects from Bazaar repositories.
190
        try:
0.200.422 by Jelmer Vernooij
'bzr git-object' without arguments now prints the available git objects.
191
            if sha1 is not None:
192
                try:
0.200.532 by Jelmer Vernooij
The object store requires plain strings.
193
                    obj = object_store[str(sha1)]
0.200.422 by Jelmer Vernooij
'bzr git-object' without arguments now prints the available git objects.
194
                except KeyError:
0.200.1483 by Jelmer Vernooij
Translate more strings.
195
                    raise BzrCommandError(gettext("Object not found: %s") % sha1)
0.200.423 by Jelmer Vernooij
Support pretty-printing git objects.
196
                if pretty:
197
                    text = obj.as_pretty_string()
198
                else:
199
                    text = obj.as_raw_string()
200
                self.outf.write(text)
0.200.419 by Jelmer Vernooij
Add hidden git-cat command that can cat git objects from Bazaar repositories.
201
            else:
0.200.422 by Jelmer Vernooij
'bzr git-object' without arguments now prints the available git objects.
202
                for sha1 in object_store:
203
                    self.outf.write("%s\n" % sha1)
0.200.419 by Jelmer Vernooij
Add hidden git-cat command that can cat git objects from Bazaar repositories.
204
        finally:
0.200.1212 by Jelmer Vernooij
Support read locking object stores.
205
            object_store.unlock()
0.200.873 by Jelmer Vernooij
Add convenience command for accessing virtual git refs.
206
207
208
class cmd_git_refs(Command):
209
    """Output all of the virtual refs for a repository.
210
211
    """
212
213
    hidden = True
214
215
    takes_options = [Option('directory',
216
        short_name='d',
217
        help='Location of repository.', type=unicode)]
218
219
    @display_command
220
    def run(self, directory="."):
221
        from bzrlib.bzrdir import (
222
            BzrDir,
223
            )
224
        from bzrlib.plugins.git.refs import (
0.200.1433 by Jelmer Vernooij
Fix fetching between git repositories.
225
            get_refs,
0.200.873 by Jelmer Vernooij
Add convenience command for accessing virtual git refs.
226
            )
227
        from bzrlib.plugins.git.object_store import (
228
            get_object_store,
229
            )
230
        bzrdir, _ = BzrDir.open_containing(directory)
231
        repo = bzrdir.find_repository()
0.200.1212 by Jelmer Vernooij
Support read locking object stores.
232
        object_store = get_object_store(repo)
233
        object_store.lock_read()
0.200.873 by Jelmer Vernooij
Add convenience command for accessing virtual git refs.
234
        try:
0.200.1434 by Jelmer Vernooij
Move refs access to control dir.
235
            refs = get_refs(bzrdir)
0.200.1433 by Jelmer Vernooij
Fix fetching between git repositories.
236
            for k, v in refs.iteritems():
0.200.873 by Jelmer Vernooij
Add convenience command for accessing virtual git refs.
237
                self.outf.write("%s -> %s\n" % (k, v))
238
        finally:
0.200.1212 by Jelmer Vernooij
Support read locking object stores.
239
            object_store.unlock()
0.200.895 by Jelmer Vernooij
Add initial work on git-apply.
240
241
242
class cmd_git_apply(Command):
243
    """Apply a series of git-am style patches.
244
245
    This command will in the future probably be integrated into 
246
    "bzr pull".
247
    """
248
0.200.1050 by Jelmer Vernooij
Add --force option to 'bzr git-apply'.
249
    takes_options = [
250
        Option('signoff', short_name='s', help='Add a Signed-off-by line.'),
0.272.1 by Martin Packman
Add help for git-apply --force option
251
        Option('force',
252
            help='Apply patches even if tree has uncommitted changes.')
253
        ]
0.200.895 by Jelmer Vernooij
Add initial work on git-apply.
254
    takes_args = ["patches*"]
255
0.200.1049 by Jelmer Vernooij
Add --signoff option to 'bzr git-apply'.
256
    def _apply_patch(self, wt, f, signoff):
257
        """Apply a patch.
258
259
        :param wt: A Bazaar working tree object.
260
        :param f: Patch file to read.
261
        :param signoff: Add Signed-Off-By flag.
262
        """
0.200.1043 by Jelmer Vernooij
Finish git-apply command.
263
        from bzrlib.errors import BzrCommandError
0.200.895 by Jelmer Vernooij
Add initial work on git-apply.
264
        from dulwich.patch import git_am_patch_split
0.200.1043 by Jelmer Vernooij
Finish git-apply command.
265
        import subprocess
0.200.895 by Jelmer Vernooij
Add initial work on git-apply.
266
        (c, diff, version) = git_am_patch_split(f)
0.200.1043 by Jelmer Vernooij
Finish git-apply command.
267
        # FIXME: Cope with git-specific bits in patch
0.200.1298 by Jelmer Vernooij
Fix compatibility with newer versions of dulwich.
268
        # FIXME: Add new files to working tree
269
        p = subprocess.Popen(["patch", "-p1"], stdin=subprocess.PIPE,
270
            cwd=wt.basedir)
0.200.1043 by Jelmer Vernooij
Finish git-apply command.
271
        p.communicate(diff)
272
        exitcode = p.wait()
273
        if exitcode != 0:
0.200.1483 by Jelmer Vernooij
Translate more strings.
274
            raise BzrCommandError(gettext("error running patch"))
0.200.1049 by Jelmer Vernooij
Add --signoff option to 'bzr git-apply'.
275
        message = c.message
276
        if signoff:
277
            signed_off_by = wt.branch.get_config().username()
278
            message += "Signed-off-by: %s\n" % signed_off_by.encode('utf-8')
279
        wt.commit(authors=[c.author], message=message)
0.200.895 by Jelmer Vernooij
Add initial work on git-apply.
280
0.200.1050 by Jelmer Vernooij
Add --force option to 'bzr git-apply'.
281
    def run(self, patches_list=None, signoff=False, force=False):
0.200.1040 by Jelmer Vernooij
Error out about applying to a tree with changes.
282
        from bzrlib.errors import UncommittedChanges
0.200.895 by Jelmer Vernooij
Add initial work on git-apply.
283
        from bzrlib.workingtree import WorkingTree
284
        if patches_list is None:
285
            patches_list = []
0.200.1040 by Jelmer Vernooij
Error out about applying to a tree with changes.
286
0.200.895 by Jelmer Vernooij
Add initial work on git-apply.
287
        tree, _ = WorkingTree.open_containing(".")
0.200.1050 by Jelmer Vernooij
Add --force option to 'bzr git-apply'.
288
        if tree.basis_tree().changes_from(tree).has_changed() and not force:
0.200.1040 by Jelmer Vernooij
Error out about applying to a tree with changes.
289
            raise UncommittedChanges(tree)
0.200.895 by Jelmer Vernooij
Add initial work on git-apply.
290
        tree.lock_write()
291
        try:
292
            for patch in patches_list:
293
                f = open(patch, 'r')
294
                try:
0.200.1049 by Jelmer Vernooij
Add --signoff option to 'bzr git-apply'.
295
                    self._apply_patch(tree, f, signoff=signoff)
0.200.895 by Jelmer Vernooij
Add initial work on git-apply.
296
                finally:
297
                    f.close()
298
        finally:
299
            tree.unlock()