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