/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 commands.py

  • Committer: Andrew Bennetts
  • Date: 2009-10-21 11:13:40 UTC
  • mto: This revision was merged to the branch mainline in revision 4762.
  • Revision ID: andrew.bennetts@canonical.com-20091021111340-w7x4d5yf83qwjncc
Add test that WSGI glue allows request handlers to access paths above that request's. backing transport, so long as it is within the WSGI app's backing transport.

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
 
 
23
 
from bzrlib.commands import (
24
 
    Command,
25
 
    display_command,
26
 
    )
27
 
from bzrlib.option import (
28
 
    Option,
29
 
    )
30
 
 
31
 
from bzrlib.plugins.git import (
32
 
    get_rich_root_format,
33
 
    )
34
 
 
35
 
class cmd_git_serve(Command):
36
 
    """Provide access to a Bazaar branch using the git protocol.
37
 
 
38
 
    This command is experimental and doesn't do much yet.
39
 
    """
40
 
    takes_options = [
41
 
        Option('directory',
42
 
               help='serve contents of directory',
43
 
               type=unicode)
44
 
    ]
45
 
 
46
 
    def run(self, directory=None):
47
 
        lazy_check_versions()
48
 
        from dulwich.server import TCPGitServer
49
 
        from bzrlib.plugins.git.server import BzrBackend
50
 
        from bzrlib.trace import warning
51
 
        import os
52
 
 
53
 
        warning("server support in bzr-git is experimental.")
54
 
 
55
 
        if directory is None:
56
 
            directory = os.getcwd()
57
 
 
58
 
        backend = BzrBackend(directory)
59
 
 
60
 
        server = TCPGitServer(backend, 'localhost')
61
 
        server.serve_forever()
62
 
 
63
 
 
64
 
class cmd_git_import(Command):
65
 
    """Import all branches from a git repository.
66
 
 
67
 
    """
68
 
 
69
 
    takes_args = ["src_location", "dest_location?"]
70
 
 
71
 
    def run(self, src_location, dest_location=None):
72
 
        import os
73
 
        from bzrlib import (
74
 
            ui,
75
 
            urlutils,
76
 
            )
77
 
        from bzrlib.bzrdir import (
78
 
            BzrDir,
79
 
            format_registry,
80
 
            )
81
 
        from bzrlib.errors import (
82
 
            BzrCommandError,
83
 
            NoRepositoryPresent,
84
 
            NotBranchError,
85
 
            )
86
 
        from bzrlib.repository import (
87
 
            InterRepository,
88
 
            Repository,
89
 
            )
90
 
        from bzrlib.plugins.git.branch import GitBranch
91
 
        from bzrlib.plugins.git.repository import GitRepository
92
 
 
93
 
        if dest_location is None:
94
 
            dest_location = os.path.basename(src_location.rstrip("/\\"))
95
 
 
96
 
        source_repo = Repository.open(src_location)
97
 
        if not isinstance(source_repo, GitRepository):
98
 
            raise BzrCommandError("%r is not a git repository" % src_location)
99
 
        format = get_rich_root_format()
100
 
        try:
101
 
            target_bzrdir = BzrDir.open(dest_location)
102
 
        except NotBranchError:
103
 
            target_bzrdir = BzrDir.create(dest_location, format=format)
104
 
        try:
105
 
            target_repo = target_bzrdir.open_repository()
106
 
        except NoRepositoryPresent:
107
 
            target_repo = target_bzrdir.create_repository(shared=True)
108
 
 
109
 
        interrepo = InterRepository.get(source_repo, target_repo)
110
 
        mapping = source_repo.get_mapping()
111
 
        refs = interrepo.fetch_refs()
112
 
        pb = ui.ui_factory.nested_progress_bar()
113
 
        try:
114
 
            for i, (name, ref) in enumerate(refs.iteritems()):
115
 
                if name.startswith("refs/tags/"):
116
 
                    continue
117
 
                pb.update("creating branches", i, len(refs))
118
 
                head_loc = os.path.join(dest_location, name)
119
 
                try:
120
 
                    head_bzrdir = BzrDir.open(head_loc)
121
 
                except NotBranchError:
122
 
                    parent_path = urlutils.dirname(head_loc)
123
 
                    if not os.path.isdir(parent_path):
124
 
                        os.makedirs(parent_path)
125
 
                    head_bzrdir = BzrDir.create(head_loc, format=format)
126
 
                try:
127
 
                    head_branch = head_bzrdir.open_branch()
128
 
                except NotBranchError:
129
 
                    head_branch = head_bzrdir.create_branch()
130
 
                revid = mapping.revision_id_foreign_to_bzr(ref)
131
 
                source_branch = GitBranch(source_repo.bzrdir, source_repo, 
132
 
                    name, ref, None)
133
 
                head_branch.generate_revision_history(revid)
134
 
                source_branch.tags.merge_to(head_branch.tags)
135
 
        finally:
136
 
            pb.finished()
137
 
 
138
 
 
139
 
def repo_get_object_store(repo):
140
 
    from bzrlib.plugins.git.converter import (
141
 
        BazaarObjectStore,
142
 
        )
143
 
    from bzrlib.plugins.git.mapping import (
144
 
        default_mapping,
145
 
        )
146
 
    from bzrlib.plugins.git.repository import (
147
 
        GitRepository,
148
 
        )
149
 
    if isinstance(repo, GitRepository):
150
 
        return repo._git.object_store
151
 
    else:
152
 
        return BazaarObjectStore(repo, default_mapping)
153
 
 
154
 
 
155
 
class cmd_git_object(Command):
156
 
    """List or display Git objects by SHA.
157
 
    
158
 
    Cat a particular object's Git representation if a SHA is specified.
159
 
    List all available SHAs otherwise.
160
 
    """
161
 
 
162
 
    hidden = True
163
 
 
164
 
    aliases = ["git-objects", "git-cat"]
165
 
    takes_args = ["sha1?"]
166
 
    takes_options = [Option('directory', 
167
 
        help='Location of repository.', type=unicode),
168
 
        Option('pretty', help='Pretty-print objects.')]
169
 
    encoding_type = 'exact'
170
 
 
171
 
    @display_command
172
 
    def run(self, sha1=None, directory=".", pretty=False):
173
 
        from bzrlib.errors import (
174
 
            BzrCommandError,
175
 
            )
176
 
        from bzrlib.bzrdir import (
177
 
            BzrDir,
178
 
            )
179
 
        bzrdir, _ = BzrDir.open_containing(directory)
180
 
        repo = bzrdir.find_repository()
181
 
        object_store = repo_get_object_store(repo)
182
 
        repo.lock_read()
183
 
        try:
184
 
            if sha1 is not None:
185
 
                try:
186
 
                    obj = object_store[sha1]
187
 
                except KeyError:
188
 
                    raise BzrCommandError("Object not found: %s" % sha1)
189
 
                if pretty:
190
 
                    text = obj.as_pretty_string()
191
 
                else:
192
 
                    text = obj.as_raw_string()
193
 
                self.outf.write(text)
194
 
            else:
195
 
                for sha1 in object_store:
196
 
                    self.outf.write("%s\n" % sha1)
197
 
        finally:
198
 
            repo.unlock()