/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
0.200.910 by Jelmer Vernooij
update copyright years
2
# Copyright (C) 2010 Jelmer Vernooij
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
3
#
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
0.200.261 by Jelmer Vernooij
More formatting fixes.
18
"""An adapter between a Git control dir and a Bazaar BzrDir."""
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
19
20
from bzrlib import (
21
    bzrdir,
0.239.13 by Jelmer Vernooij
Don't break "bzr info -v" when Dulwich is not installed.
22
    errors as bzr_errors,
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
23
    lockable_files,
24
    urlutils,
0.200.768 by Jelmer Vernooij
Fix compatibility with older versions of bzrlib.
25
    version_info as bzrlib_version,
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
26
    )
27
0.200.280 by Jelmer Vernooij
Support bzr.dev.
28
LockWarner = getattr(lockable_files, "_LockWarner", None)
29
0.200.27 by David Allouche
Flat is better than nested, remove the gitlib hierarchy.
30
from bzrlib.plugins.git import (
0.200.280 by Jelmer Vernooij
Support bzr.dev.
31
    LocalGitBzrDirFormat,
0.228.1 by Jelmer Vernooij
Add basic tests for local fetch.
32
    get_rich_root_format,
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
33
    )
34
0.200.123 by Jelmer Vernooij
Use central git module.
35
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
36
class GitLock(object):
37
    """A lock that thunks through to Git."""
38
0.200.84 by Jelmer Vernooij
Fix lock_write argument.
39
    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.
40
        pass
41
42
    def lock_read(self):
43
        pass
44
45
    def unlock(self):
46
        pass
47
0.200.73 by Jelmer Vernooij
Implement GitLock.peek().
48
    def peek(self):
49
        pass
50
0.200.130 by Jelmer Vernooij
Make most tree inspection tests succeed.
51
    def validate_token(self, token):
52
        pass
53
0.200.629 by Jelmer Vernooij
Add GitLock.break_lock().
54
    def break_lock(self):
55
        pass
56
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
57
58
class GitLockableFiles(lockable_files.LockableFiles):
59
    """Git specific lockable files abstraction."""
60
0.200.129 by Jelmer Vernooij
merge dulwich.
61
    def __init__(self, transport, lock):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
62
        self._lock = lock
63
        self._transaction = None
64
        self._lock_mode = None
0.200.129 by Jelmer Vernooij
merge dulwich.
65
        self._transport = transport
0.200.280 by Jelmer Vernooij
Support bzr.dev.
66
        if LockWarner is None:
67
            # Bzr 1.13
68
            self._lock_count = 0
69
        else:
70
            self._lock_warner = LockWarner(repr(self))
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
71
72
73
class GitDir(bzrdir.BzrDir):
74
    """An adapter to the '.git' dir used by git."""
75
0.200.148 by Jelmer Vernooij
Share more infrastructure between LocalGitDir and RemoteGitDir.
76
    def is_supported(self):
77
        return True
78
0.200.155 by Jelmer Vernooij
Fix formatting, remove catch-all for exceptions when opening local repositories.
79
    def cloning_metadir(self, stacked=False):
0.200.328 by Jelmer Vernooij
Support stacking, depend on bzr 1.15.
80
        return get_rich_root_format(stacked)
0.200.155 by Jelmer Vernooij
Fix formatting, remove catch-all for exceptions when opening local repositories.
81
0.200.729 by Jelmer Vernooij
Improve colocated branches support.
82
    def _branch_name_to_ref(self, name):
0.200.832 by Jelmer Vernooij
Update to newer version of Dulwich, saner branch names.
83
        raise NotImplementedError(self._branch_name_to_ref)
0.200.729 by Jelmer Vernooij
Improve colocated branches support.
84
0.200.777 by Jelmer Vernooij
Fix colocated remote branches.
85
    if bzrlib_version >= (2, 2):
86
        def open_branch(self, name=None, ignore_fallbacks=None,
87
            unsupported=False):
88
            return self._open_branch(name=name,
89
                ignore_fallbacks=ignore_fallbacks, unsupported=unsupported)
90
    else:
91
        def open_branch(self, ignore_fallbacks=None, unsupported=False):
92
            return self._open_branch(name=None,
93
                ignore_fallbacks=ignore_fallbacks, unsupported=unsupported)
94
0.200.148 by Jelmer Vernooij
Share more infrastructure between LocalGitDir and RemoteGitDir.
95
96
class LocalGitDir(GitDir):
97
    """An adapter to the '.git' dir used by git."""
98
0.239.13 by Jelmer Vernooij
Don't break "bzr info -v" when Dulwich is not installed.
99
    def _get_gitrepository_class(self):
100
        from bzrlib.plugins.git.repository import LocalGitRepository
101
        return LocalGitRepository
102
103
    _gitrepository_class = property(_get_gitrepository_class)
0.202.2 by David Allouche
GitRepository.get_inventory and .revision_tree work for the null revision. Support for testing GitRepository without disk data.
104
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
105
    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.
106
        self._format = format
107
        self.root_transport = transport
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
108
        self._git = gitrepo
109
        if gitrepo.bare:
110
            self.transport = transport
111
        else:
112
            self.transport = transport.clone('.git')
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
113
        self._lockfiles = lockfiles
0.200.381 by Jelmer Vernooij
Support working trees properly, status and ls.
114
        self._mode_check_done = None
115
0.200.832 by Jelmer Vernooij
Update to newer version of Dulwich, saner branch names.
116
    def _branch_name_to_ref(self, name):
0.200.872 by Jelmer Vernooij
Move refs code to separate module.
117
        from bzrlib.plugins.git.refs import branch_name_to_ref
0.200.832 by Jelmer Vernooij
Update to newer version of Dulwich, saner branch names.
118
        if name in (None, "HEAD"):
119
            from dulwich.repo import SYMREF
120
            refcontents = self._git.refs.read_ref("HEAD")
121
            if refcontents.startswith(SYMREF):
122
                name = refcontents[len(SYMREF):]
123
            else:
124
                name = "HEAD"
125
        return branch_name_to_ref(name, "HEAD")
126
0.200.381 by Jelmer Vernooij
Support working trees properly, status and ls.
127
    def is_control_filename(self, filename):
128
        return filename == '.git' or filename.startswith('.git/')
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
129
0.200.887 by Jelmer Vernooij
get_branch_transport takes a name argument.
130
    def get_branch_transport(self, branch_format, name):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
131
        if branch_format is None:
132
            return self.transport
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
133
        if isinstance(branch_format, LocalGitBzrDirFormat):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
134
            return self.transport
0.239.13 by Jelmer Vernooij
Don't break "bzr info -v" when Dulwich is not installed.
135
        raise 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.
136
0.200.887 by Jelmer Vernooij
get_branch_transport takes a name argument.
137
    def get_repository_transport(self, format):
138
        if format is None:
139
            return self.transport
140
        if isinstance(format, LocalGitBzrDirFormat):
141
            return self.transport
142
        raise bzr_errors.IncompatibleFormat(format, self._format)
143
144
    def get_workingtree_transport(self, format):
145
        if format is None:
146
            return self.transport
147
        if isinstance(format, LocalGitBzrDirFormat):
148
            return self.transport
149
        raise bzr_errors.IncompatibleFormat(format, self._format)
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
150
0.200.769 by Jelmer Vernooij
Cope with open_branch() actually checking whether there is a branch present.
151
    def _open_branch(self, name=None, ignore_fallbacks=None, unsupported=False):
0.200.57 by Jelmer Vernooij
Fix more tests.
152
        """'create' a branch for this dir."""
153
        repo = self.open_repository()
0.239.13 by Jelmer Vernooij
Don't break "bzr info -v" when Dulwich is not installed.
154
        from bzrlib.plugins.git.branch import LocalGitBranch
0.200.726 by Jelmer Vernooij
Factor out conversion of branch names to refs.
155
        return LocalGitBranch(self, repo, self._branch_name_to_ref(name),
156
            self._lockfiles)
0.200.722 by Jelmer Vernooij
Implement GitDir.list_branches() and support name argument to open_branch.
157
0.200.724 by Jelmer Vernooij
support destroy_branch
158
    def destroy_branch(self, name=None):
0.200.726 by Jelmer Vernooij
Factor out conversion of branch names to refs.
159
        del self._git.refs[self._branch_name_to_ref(name)]
0.200.724 by Jelmer Vernooij
support destroy_branch
160
0.200.722 by Jelmer Vernooij
Implement GitDir.list_branches() and support name argument to open_branch.
161
    def list_branches(self):
162
        ret = []
163
        for name in self._git.get_refs():
0.200.832 by Jelmer Vernooij
Update to newer version of Dulwich, saner branch names.
164
            if name.startswith("refs/heads/"):
0.200.766 by Jelmer Vernooij
Only list actual branches, not tags.
165
                ret.append(self.open_branch(name=name))
0.200.722 by Jelmer Vernooij
Implement GitDir.list_branches() and support name argument to open_branch.
166
        return ret
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
167
168
    def open_repository(self, shared=False):
169
        """'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.
170
        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.
171
0.203.1 by Aaron Bentley
Make checkouts work
172
    def open_workingtree(self, recommend_upgrade=True):
0.246.5 by Jelmer Vernooij
Cope with has_index not existing.
173
        if not self._git.bare:
174
            from dulwich.errors import NoIndexPresent
0.200.803 by Jelmer Vernooij
Default to non-bare repositories when initializing a control directory.
175
            repo = self.open_repository()
0.246.5 by Jelmer Vernooij
Cope with has_index not existing.
176
            try:
0.200.803 by Jelmer Vernooij
Default to non-bare repositories when initializing a control directory.
177
                index = repo._git.open_index()
0.246.5 by Jelmer Vernooij
Cope with has_index not existing.
178
            except NoIndexPresent:
179
                pass
0.200.803 by Jelmer Vernooij
Default to non-bare repositories when initializing a control directory.
180
            else:
181
                from bzrlib.plugins.git.workingtree import GitWorkingTree
182
                return GitWorkingTree(self, repo, self.open_branch(), index)
0.200.392 by Jelmer Vernooij
Fix some tests now that working trees are supported.
183
        loc = urlutils.unescape_for_display(self.root_transport.base, 'ascii')
0.239.13 by Jelmer Vernooij
Don't break "bzr info -v" when Dulwich is not installed.
184
        raise bzr_errors.NoWorkingTree(loc)
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
185
0.200.108 by Jelmer Vernooij
Support bzr init --git.
186
    def create_repository(self, shared=False):
187
        return self.open_repository()
0.200.288 by Jelmer Vernooij
Add test for init-repo.
188
0.200.726 by Jelmer Vernooij
Factor out conversion of branch names to refs.
189
    def create_branch(self, name=None):
190
        refname = self._branch_name_to_ref(name)
0.200.891 by Jelmer Vernooij
Use ZERO_SHA constant where possible.
191
        from dulwich.protocol import ZERO_SHA
192
        self._git.refs[refname] = ZERO_SHA
0.200.731 by Jelmer Vernooij
Handle unsupported flag to open_branch().
193
        return self.open_branch(name)
0.200.535 by Jelmer Vernooij
use standard version to check for index.
194
195
    def backup_bzrdir(self):
196
        if self._git.bare:
197
            self.root_transport.copy_tree(".git", ".git.backup")
198
            return (self.root_transport.abspath(".git"),
199
                    self.root_transport.abspath(".git.backup"))
200
        else:
0.239.13 by Jelmer Vernooij
Don't break "bzr info -v" when Dulwich is not installed.
201
            raise bzr_errors.BzrError("Unable to backup bare repositories")
0.200.535 by Jelmer Vernooij
use standard version to check for index.
202
203
    def create_workingtree(self, revision_id=None, from_branch=None,
204
        accelerator_tree=None, hardlink=False):
205
        if self._git.bare:
0.239.13 by Jelmer Vernooij
Don't break "bzr info -v" when Dulwich is not installed.
206
            raise bzr_errors.BzrError("Can't create working tree in a bare repo")
0.200.535 by Jelmer Vernooij
use standard version to check for index.
207
        from dulwich.index import write_index
0.200.613 by Jelmer Vernooij
Support creating working tree for existing git repo.
208
        from dulwich.pack import SHA1Writer
209
        f = open(self.transport.local_abspath("index"), 'w+')
210
        try:
211
            f = SHA1Writer(f)
212
            write_index(f, [])
213
        finally:
214
            f.close()
0.200.535 by Jelmer Vernooij
use standard version to check for index.
215
        return self.open_workingtree()