/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
1
# Copyright (C) 2007 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
"""An adapter between a Git control dir and a Bazaar BzrDir"""
18
0.200.123 by Jelmer Vernooij
Use central git module.
19
import os
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
20
0.200.109 by Jelmer Vernooij
Cope with new argument to cloning_metadir.
21
import bzrlib
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
22
from bzrlib.lazy_import import lazy_import
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
23
from bzrlib import (
24
    bzrdir,
25
    lockable_files,
26
    urlutils,
27
    )
28
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
29
lazy_import(globals(), """
0.200.108 by Jelmer Vernooij
Support bzr init --git.
30
from bzrlib.lockable_files import TransportLock
0.200.27 by David Allouche
Flat is better than nested, remove the gitlib hierarchy.
31
from bzrlib.plugins.git import (
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
32
    errors,
0.200.94 by Jelmer Vernooij
Eliminate (duplicate) git_ prefix.
33
    branch,
34
    repository,
35
    workingtree,
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
36
    )
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
37
""")
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
38
39
0.200.123 by Jelmer Vernooij
Use central git module.
40
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
41
class GitLock(object):
42
    """A lock that thunks through to Git."""
43
0.200.84 by Jelmer Vernooij
Fix lock_write argument.
44
    def lock_write(self, token=None):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
45
        pass
46
47
    def lock_read(self):
48
        pass
49
50
    def unlock(self):
51
        pass
52
0.200.73 by Jelmer Vernooij
Implement GitLock.peek().
53
    def peek(self):
54
        pass
55
0.200.130 by Jelmer Vernooij
Make most tree inspection tests succeed.
56
    def validate_token(self, token):
57
        pass
58
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
59
60
class GitLockableFiles(lockable_files.LockableFiles):
61
    """Git specific lockable files abstraction."""
62
0.200.129 by Jelmer Vernooij
merge dulwich.
63
    def __init__(self, transport, lock):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
64
        self._lock = lock
65
        self._transaction = None
66
        self._lock_mode = None
67
        self._lock_count = 0
0.200.129 by Jelmer Vernooij
merge dulwich.
68
        self._transport = transport
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
69
70
71
class GitDir(bzrdir.BzrDir):
72
    """An adapter to the '.git' dir used by git."""
73
0.200.148 by Jelmer Vernooij
Share more infrastructure between LocalGitDir and RemoteGitDir.
74
    def is_supported(self):
75
        return True
76
0.200.155 by Jelmer Vernooij
Fix formatting, remove catch-all for exceptions when opening local repositories.
77
    def cloning_metadir(self, stacked=False):
0.200.156 by Jelmer Vernooij
Use rich root formats.
78
        return bzrlib.bzrdir.format_registry.make_bzrdir("1.9-rich-root")
0.200.155 by Jelmer Vernooij
Fix formatting, remove catch-all for exceptions when opening local repositories.
79
0.200.148 by Jelmer Vernooij
Share more infrastructure between LocalGitDir and RemoteGitDir.
80
81
class LocalGitDir(GitDir):
82
    """An adapter to the '.git' dir used by git."""
83
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
84
    _gitrepository_class = repository.LocalGitRepository
0.202.2 by David Allouche
GitRepository.get_inventory and .revision_tree work for the null revision. Support for testing GitRepository without disk data.
85
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
86
    def __init__(self, transport, lockfiles, gitrepo, format):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
87
        self._format = format
88
        self.root_transport = transport
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
89
        self._git = gitrepo
90
        if gitrepo.bare:
91
            self.transport = transport
92
        else:
93
            self.transport = transport.clone('.git')
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
94
        self._lockfiles = lockfiles
95
96
    def get_branch_transport(self, branch_format):
97
        if branch_format is None:
98
            return self.transport
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
99
        if isinstance(branch_format, LocalGitBzrDirFormat):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
100
            return self.transport
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
101
        raise errors.bzr_errors.IncompatibleFormat(branch_format, self._format)
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
102
103
    get_repository_transport = get_branch_transport
104
    get_workingtree_transport = get_branch_transport
105
106
    def open_branch(self, ignored=None):
0.200.57 by Jelmer Vernooij
Fix more tests.
107
        """'create' a branch for this dir."""
108
        repo = self.open_repository()
0.200.147 by Jelmer Vernooij
Merge new dulwich; fetching objects from local repository works now; they aren't converted yet though.
109
        return branch.LocalGitBranch(self, repo, "HEAD", repo._git.head(), self._lockfiles)
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
110
111
    def open_repository(self, shared=False):
112
        """'open' a repository for this dir."""
0.202.2 by David Allouche
GitRepository.get_inventory and .revision_tree work for the null revision. Support for testing GitRepository without disk data.
113
        return self._gitrepository_class(self, self._lockfiles)
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
114
0.203.1 by Aaron Bentley
Make checkouts work
115
    def open_workingtree(self, recommend_upgrade=True):
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
116
        if self._git.bare:
117
            loc = urlutils.unescape_for_display(self.root_transport.base, 'ascii')
118
            raise errors.bzr_errors.NoWorkingTree(loc)
119
        else:
0.200.94 by Jelmer Vernooij
Eliminate (duplicate) git_ prefix.
120
            return workingtree.GitWorkingTree(self, self.open_repository(), 
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
121
                                                  self.open_branch())
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
122
0.200.108 by Jelmer Vernooij
Support bzr init --git.
123
    def create_repository(self, shared=False):
124
        return self.open_repository()
125
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
126
0.200.155 by Jelmer Vernooij
Fix formatting, remove catch-all for exceptions when opening local repositories.
127
class GitBzrDirFormat(bzrdir.BzrDirFormat):
128
    _lock_class = TransportLock
129
130
    def is_supported(self):
131
        return True
132
133
134
class LocalGitBzrDirFormat(GitBzrDirFormat):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
135
    """The .git directory control format."""
136
0.200.148 by Jelmer Vernooij
Share more infrastructure between LocalGitDir and RemoteGitDir.
137
    _gitdir_class = LocalGitDir
0.202.2 by David Allouche
GitRepository.get_inventory and .revision_tree work for the null revision. Support for testing GitRepository without disk data.
138
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
139
    @classmethod
140
    def _known_formats(self):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
141
        return set([LocalGitBzrDirFormat()])
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
142
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
143
    def open(self, transport, _found=None):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
144
        """Open this directory.
145
146
        """
0.200.123 by Jelmer Vernooij
Use central git module.
147
        from bzrlib.plugins.git import git
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
148
        # we dont grok readonly - git isn't integrated with transport.
149
        url = transport.base
150
        if url.startswith('readonly+'):
151
            url = url[len('readonly+'):]
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
152
153
        try:
0.200.119 by Jelmer Vernooij
Make API resemble that of python-git.
154
            gitrepo = git.repo.Repo(transport.local_abspath("."))
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
155
        except errors.bzr_errors.NotLocalUrl:
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
156
            raise errors.bzr_errors.NotBranchError(path=transport.base)
0.200.129 by Jelmer Vernooij
merge dulwich.
157
        lockfiles = GitLockableFiles(transport, GitLock())
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
158
        return self._gitdir_class(transport, lockfiles, gitrepo, self)
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
159
160
    @classmethod
161
    def probe_transport(klass, transport):
162
        """Our format is present if the transport ends in '.not/'."""
0.200.155 by Jelmer Vernooij
Fix formatting, remove catch-all for exceptions when opening local repositories.
163
        from bzrlib.plugins.git import git
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
164
        # little ugly, but works
165
        format = klass()
166
        # delegate to the main opening code. This pays a double rtt cost at the
167
        # moment, so perhaps we want probe_transport to return the opened thing
168
        # rather than an openener ? or we could return a curried thing with the
169
        # dir to open already instantiated ? Needs more thought.
170
        try:
171
            format.open(transport)
172
            return format
0.200.155 by Jelmer Vernooij
Fix formatting, remove catch-all for exceptions when opening local repositories.
173
        except git.errors.NotGitRepository, e:
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
174
            raise errors.bzr_errors.NotBranchError(path=transport.base)
175
        raise errors.bzr_errors.NotBranchError(path=transport.base)
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
176
0.200.69 by Jelmer Vernooij
Implement GitBzrDirFormat.get_format_description.
177
    def get_format_description(self):
178
        return "Local Git Repository"
179
0.200.108 by Jelmer Vernooij
Support bzr init --git.
180
    def get_format_string(self):
181
        return "Local Git Repository"
182
183
    def initialize_on_transport(self, transport):
184
        from bzrlib.transport.local import LocalTransport
0.200.123 by Jelmer Vernooij
Use central git module.
185
        from bzrlib.plugins.git import git
0.200.108 by Jelmer Vernooij
Support bzr init --git.
186
187
        if not isinstance(transport, LocalTransport):
188
            raise NotImplementedError(self.initialize, 
189
                "Can't create Git Repositories/branches on "
190
                "non-local transports")
191
192
        git.repo.Repo.create(transport.local_abspath(".")) 
193
        return self.open(transport)
194
0.200.133 by Jelmer Vernooij
Unmark as deprecated.
195
    def is_supported(self):
196
        return True
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
197
198
0.200.155 by Jelmer Vernooij
Fix formatting, remove catch-all for exceptions when opening local repositories.
199
class RemoteGitBzrDirFormat(GitBzrDirFormat):
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
200
    """The .git directory control format."""
201
202
    @classmethod
203
    def _known_formats(self):
204
        return set([RemoteGitBzrDirFormat()])
205
206
    def open(self, transport, _found=None):
207
        """Open this directory.
208
209
        """
210
        from bzrlib.plugins.git.remote import RemoteGitDir, GitSmartTransport
211
        if not isinstance(transport, GitSmartTransport):
212
            raise errors.bzr_errors.NotBranchError(transport.base)
213
        # we dont grok readonly - git isn't integrated with transport.
214
        url = transport.base
215
        if url.startswith('readonly+'):
216
            url = url[len('readonly+'):]
217
218
        lockfiles = GitLockableFiles(transport, GitLock())
219
        return RemoteGitDir(transport, lockfiles, self)
220
221
    @classmethod
222
    def probe_transport(klass, transport):
223
        """Our format is present if the transport ends in '.not/'."""
224
        # little ugly, but works
225
        format = klass()
226
        from bzrlib.plugins.git.remote import GitSmartTransport
227
        if not isinstance(transport, GitSmartTransport):
228
            raise errors.bzr_errors.NotBranchError(transport.base)
229
        # The only way to know a path exists and contains a valid repository 
230
        # is to do a request against it:
231
        try:
232
            transport.fetch_pack(lambda x: [], None, lambda x: None, 
233
                                 lambda x: mutter("git: %s" % x))
0.200.169 by Jelmer Vernooij
Fix branch cloning.
234
        except errors.git_errors.GitProtocolError:
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
235
            raise errors.bzr_errors.NotBranchError(path=transport.base)
236
        else:
237
            return format
238
        raise errors.bzr_errors.NotBranchError(path=transport.base)
239
240
    def get_format_description(self):
241
        return "Remote Git Repository"
242
243
    def get_format_string(self):
244
        return "Remote Git Repository"
245
246
    def initialize_on_transport(self, transport):
247
        raise errors.bzr_errors.UninitializableFormat(self)
248