/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.94 by Jelmer Vernooij
Eliminate (duplicate) git_ prefix.
74
    _gitrepository_class = repository.GitRepository
0.202.2 by David Allouche
GitRepository.get_inventory and .revision_tree work for the null revision. Support for testing GitRepository without disk data.
75
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
76
    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.
77
        self._format = format
78
        self.root_transport = transport
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
79
        self._git = gitrepo
80
        if gitrepo.bare:
81
            self.transport = transport
82
        else:
83
            self.transport = transport.clone('.git')
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
84
        self._lockfiles = lockfiles
85
86
    def get_branch_transport(self, branch_format):
87
        if branch_format is None:
88
            return self.transport
89
        if isinstance(branch_format, GitBzrDirFormat):
90
            return self.transport
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
91
        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.
92
93
    get_repository_transport = get_branch_transport
94
    get_workingtree_transport = get_branch_transport
95
96
    def is_supported(self):
97
        return True
98
99
    def open_branch(self, ignored=None):
0.200.57 by Jelmer Vernooij
Fix more tests.
100
        """'create' a branch for this dir."""
101
        repo = self.open_repository()
102
        if repo._git.heads == []:
103
            head = None
104
        else:
0.200.118 by Jelmer Vernooij
Cope with slightly different names.
105
            head = repo._git.head()
0.200.94 by Jelmer Vernooij
Eliminate (duplicate) git_ prefix.
106
        return branch.GitBranch(self, repo, head, 
0.200.57 by Jelmer Vernooij
Fix more tests.
107
                                    self.root_transport.base, self._lockfiles)
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
108
109
    def open_repository(self, shared=False):
110
        """'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.
111
        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.
112
0.203.1 by Aaron Bentley
Make checkouts work
113
    def open_workingtree(self, recommend_upgrade=True):
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
114
        if self._git.bare:
115
            loc = urlutils.unescape_for_display(self.root_transport.base, 'ascii')
116
            raise errors.bzr_errors.NoWorkingTree(loc)
117
        else:
0.200.94 by Jelmer Vernooij
Eliminate (duplicate) git_ prefix.
118
            return workingtree.GitWorkingTree(self, self.open_repository(), 
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
119
                                                  self.open_branch())
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
120
0.200.109 by Jelmer Vernooij
Cope with new argument to cloning_metadir.
121
    def cloning_metadir(self, stacked=False):
122
        if stacked:
123
            return bzrlib.bzrdir.format_registry.make_bzrdir("pack-0.92")
124
        else:
125
            return bzrlib.bzrdir.format_registry.make_bzrdir("1.6")
0.203.1 by Aaron Bentley
Make checkouts work
126
0.200.108 by Jelmer Vernooij
Support bzr init --git.
127
    def create_repository(self, shared=False):
128
        return self.open_repository()
129
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
130
131
class GitBzrDirFormat(bzrdir.BzrDirFormat):
132
    """The .git directory control format."""
133
0.202.2 by David Allouche
GitRepository.get_inventory and .revision_tree work for the null revision. Support for testing GitRepository without disk data.
134
    _gitdir_class = GitDir
0.200.108 by Jelmer Vernooij
Support bzr init --git.
135
    _lock_class = TransportLock
0.202.2 by David Allouche
GitRepository.get_inventory and .revision_tree work for the null revision. Support for testing GitRepository without disk data.
136
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
137
    @classmethod
138
    def _known_formats(self):
139
        return set([GitBzrDirFormat()])
140
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
141
    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.
142
        """Open this directory.
143
144
        """
0.200.123 by Jelmer Vernooij
Use central git module.
145
        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.
146
        # we dont grok readonly - git isn't integrated with transport.
147
        url = transport.base
148
        if url.startswith('readonly+'):
149
            url = url[len('readonly+'):]
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
150
151
        try:
0.200.119 by Jelmer Vernooij
Make API resemble that of python-git.
152
            gitrepo = git.repo.Repo(transport.local_abspath("."))
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
153
        except errors.bzr_errors.NotLocalUrl:
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
154
            raise errors.bzr_errors.NotBranchError(path=transport.base)
0.200.129 by Jelmer Vernooij
merge dulwich.
155
        lockfiles = GitLockableFiles(transport, GitLock())
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
156
        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.
157
158
    @classmethod
159
    def probe_transport(klass, transport):
160
        """Our format is present if the transport ends in '.not/'."""
161
        # little ugly, but works
162
        format = klass()
163
        # delegate to the main opening code. This pays a double rtt cost at the
164
        # moment, so perhaps we want probe_transport to return the opened thing
165
        # rather than an openener ? or we could return a curried thing with the
166
        # dir to open already instantiated ? Needs more thought.
167
        try:
168
            format.open(transport)
169
            return format
170
        except Exception, e:
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
171
            raise errors.bzr_errors.NotBranchError(path=transport.base)
172
        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.
173
0.200.69 by Jelmer Vernooij
Implement GitBzrDirFormat.get_format_description.
174
    def get_format_description(self):
175
        return "Local Git Repository"
176
0.200.108 by Jelmer Vernooij
Support bzr init --git.
177
    def get_format_string(self):
178
        return "Local Git Repository"
179
180
    def initialize_on_transport(self, transport):
181
        from bzrlib.transport.local import LocalTransport
0.200.123 by Jelmer Vernooij
Use central git module.
182
        from bzrlib.plugins.git import git
0.200.108 by Jelmer Vernooij
Support bzr init --git.
183
184
        if not isinstance(transport, LocalTransport):
185
            raise NotImplementedError(self.initialize, 
186
                "Can't create Git Repositories/branches on "
187
                "non-local transports")
188
189
        git.repo.Repo.create(transport.local_abspath(".")) 
190
        return self.open(transport)
191
0.200.133 by Jelmer Vernooij
Unmark as deprecated.
192
    def is_supported(self):
193
        return True
194
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
195
196
bzrdir.BzrDirFormat.register_control_format(GitBzrDirFormat)