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

Add basic infrastructure for dpush.

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
 
24
24
import bzrlib
25
25
import bzrlib.api
26
 
from bzrlib import bzrdir
 
26
from bzrlib import bzrdir, errors as bzr_errors
27
27
from bzrlib.foreign import foreign_vcs_registry
28
28
from bzrlib.lockable_files import TransportLock
29
29
from bzrlib.transport import register_lazy_transport
30
 
from bzrlib.commands import Command, register_command
31
 
from bzrlib.option import Option
 
30
from bzrlib.commands import plugin_cmds
32
31
from bzrlib.trace import warning
33
32
 
34
33
MINIMUM_DULWICH_VERSION = (0, 1, 0)
35
 
COMPATIBLE_BZR_VERSIONS = [(1, 12, 0)]
 
34
COMPATIBLE_BZR_VERSIONS = [(1, 11, 0), (1, 12, 0)]
36
35
 
37
36
_versions_checked = False
38
37
def lazy_check_versions():
57
56
    help='GIT repository.', native=False, experimental=True,
58
57
    )
59
58
 
 
59
try:
 
60
    from bzrlib.revisionspec import revspec_registry
 
61
    revspec_registry.register_lazy("git:", "bzrlib.plugins.git.revspec", 
 
62
        "RevisionSpec_git")
 
63
except ImportError:
 
64
    lazy_check_versions()
 
65
    from bzrlib.revisionspec import SPEC_TYPES
 
66
    from bzrlib.plugins.git.revspec import RevisionSpec_git
 
67
    SPEC_TYPES.append(RevisionSpec_git)
 
68
 
60
69
class GitBzrDirFormat(bzrdir.BzrDirFormat):
61
70
    _lock_class = TransportLock
62
71
 
83
92
 
84
93
        try:
85
94
            gitrepo = git.repo.Repo(transport.local_abspath("."))
86
 
        except errors.bzr_errors.NotLocalUrl:
87
 
            raise errors.bzr_errors.NotBranchError(path=transport.base)
 
95
        except bzr_errors.NotLocalUrl:
 
96
            raise bzr_errors.NotBranchError(path=transport.base)
88
97
        from bzrlib.plugins.git.dir import LocalGitDir, GitLockableFiles, GitLock
89
98
        lockfiles = GitLockableFiles(transport, GitLock())
90
99
        return LocalGitDir(transport, lockfiles, gitrepo, self)
95
104
        from bzrlib.transport.local import LocalTransport
96
105
 
97
106
        if not isinstance(transport, LocalTransport):
98
 
            raise errors.bzr_errors.NotBranchError(path=transport.base)
 
107
            raise bzr_errors.NotBranchError(path=transport.base)
99
108
 
100
109
        # This should quickly filter out most things that are not 
101
110
        # git repositories, saving us the trouble from loading dulwich.
102
111
        if not transport.has(".git") and not transport.has("objects"):
103
 
            raise errors.bzr_errors.NotBranchError(path=transport.base)
 
112
            raise bzr_errors.NotBranchError(path=transport.base)
104
113
 
105
114
        import dulwich as git
106
115
        format = klass()
108
117
            format.open(transport)
109
118
            return format
110
119
        except git.errors.NotGitRepository, e:
111
 
            raise errors.bzr_errors.NotBranchError(path=transport.base)
112
 
        raise errors.bzr_errors.NotBranchError(path=transport.base)
 
120
            raise bzr_errors.NotBranchError(path=transport.base)
 
121
        raise bzr_errors.NotBranchError(path=transport.base)
113
122
 
114
123
    def get_format_description(self):
115
124
        return "Local Git Repository"
146
155
        """
147
156
        from bzrlib.plugins.git.remote import RemoteGitDir, GitSmartTransport
148
157
        if not isinstance(transport, GitSmartTransport):
149
 
            raise errors.bzr_errors.NotBranchError(transport.base)
 
158
            raise bzr_errors.NotBranchError(transport.base)
150
159
        # we dont grok readonly - git isn't integrated with transport.
151
160
        url = transport.base
152
161
        if url.startswith('readonly+'):
163
172
        format = klass()
164
173
        from bzrlib.plugins.git.remote import GitSmartTransport
165
174
        if not isinstance(transport, GitSmartTransport):
166
 
            raise errors.bzr_errors.NotBranchError(transport.base)
 
175
            raise bzr_errors.NotBranchError(transport.base)
167
176
        # The only way to know a path exists and contains a valid repository 
168
177
        # is to do a request against it:
169
178
        try:
170
179
            transport.fetch_pack(lambda x: [], None, lambda x: None, 
171
180
                                 lambda x: mutter("git: %s" % x))
172
181
        except errors.git_errors.GitProtocolError:
173
 
            raise errors.bzr_errors.NotBranchError(path=transport.base)
 
182
            raise bzr_errors.NotBranchError(path=transport.base)
174
183
        else:
175
184
            return format
176
 
        raise errors.bzr_errors.NotBranchError(path=transport.base)
 
185
        raise bzr_errors.NotBranchError(path=transport.base)
177
186
 
178
187
    def get_format_description(self):
179
188
        return "Remote Git Repository"
182
191
        return "Remote Git Repository"
183
192
 
184
193
    def initialize_on_transport(self, transport):
185
 
        raise errors.bzr_errors.UninitializableFormat(self)
 
194
        raise bzr_errors.UninitializableFormat(self)
186
195
 
187
196
 
188
197
bzrdir.BzrDirFormat.register_control_format(LocalGitBzrDirFormat)
196
205
                        "foreign_git",
197
206
                        "Stupid content tracker")
198
207
 
199
 
 
200
 
class cmd_git_serve(Command):
201
 
    """Provide access to a Bazaar branch using the git protocol.
202
 
 
203
 
    This command is experimental and doesn't do much yet.
204
 
    """
205
 
    takes_options = [
206
 
        Option('directory',
207
 
               help='serve contents of directory',
208
 
               type=unicode)
209
 
    ]
210
 
 
211
 
    def run(self, directory=None):
212
 
        lazy_check_versions()
213
 
        from dulwich.server import TCPGitServer
214
 
        from bzrlib.plugins.git.server import BzrBackend
215
 
        from bzrlib.trace import warning
216
 
        import os
217
 
 
218
 
        warning("server support in bzr-git is experimental.")
219
 
 
220
 
        if directory is None:
221
 
            directory = os.getcwd()
222
 
 
223
 
        backend = BzrBackend(directory)
224
 
 
225
 
        server = TCPGitServer(backend, 'localhost')
226
 
        server.serve_forever()
227
 
 
228
 
register_command(cmd_git_serve)
229
 
 
230
 
 
231
 
class cmd_git_import(Command):
232
 
    """Import all branches from a git repository.
233
 
 
234
 
    """
235
 
 
236
 
    takes_args = ["src_location", "dest_location"]
237
 
 
238
 
    def run(self, src_location, dest_location):
239
 
        from bzrlib.bzrdir import BzrDir, format_registry
240
 
        from bzrlib.errors import NoRepositoryPresent, NotBranchError
241
 
        from bzrlib.repository import Repository
242
 
        source_repo = Repository.open(src_location)
243
 
        format = format_registry.make_bzrdir('rich-root-pack')
244
 
        try:
245
 
            target_bzrdir = BzrDir.open(dest_location)
246
 
        except NotBranchError:
247
 
            target_bzrdir = BzrDir.create(dest_location, format=format)
248
 
        try:
249
 
            target_repo = target_bzrdir.open_repository()
250
 
        except NoRepositoryPresent:
251
 
            target_repo = target_bzrdir.create_repository(shared=True)
252
 
 
253
 
        target_repo.fetch(source_repo)
254
 
        for name, ref in source_repo._git.heads().iteritems():
255
 
            head_loc = os.path.join(dest_location, name)
256
 
            try:
257
 
                head_bzrdir = BzrDir.open(head_loc)
258
 
            except NotBranchError:
259
 
                head_bzrdir = BzrDir.create(head_loc, format=format)
260
 
            try:
261
 
                head_branch = head_bzrdir.open_branch()
262
 
            except NotBranchError:
263
 
                head_branch = head_bzrdir.create_branch()
264
 
            head_branch.generate_revision_history(source_repo.get_mapping().revision_id_foreign_to_bzr(ref))
265
 
 
266
 
 
267
 
register_command(cmd_git_import)
268
 
 
 
208
plugin_cmds.register_lazy("cmd_git_serve", [], "bzrlib.plugins.git.commands")
 
209
plugin_cmds.register_lazy("cmd_git_import", [], "bzrlib.plugins.git.commands")
269
210
 
270
211
def test_suite():
271
212
    from bzrlib.plugins.git import tests