/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.90 by Jelmer Vernooij
Basic support for opening working trees.
19
import git
20
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
21
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.
22
from bzrlib import (
23
    bzrdir,
24
    lockable_files,
25
    urlutils,
26
    )
27
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
28
lazy_import(globals(), """
0.200.27 by David Allouche
Flat is better than nested, remove the gitlib hierarchy.
29
from bzrlib.plugins.git import (
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
30
    errors,
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
31
    git_branch,
32
    git_repository,
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
33
    git_workingtree,
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
34
    )
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
35
""")
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
36
37
38
class GitLock(object):
39
    """A lock that thunks through to Git."""
40
0.200.84 by Jelmer Vernooij
Fix lock_write argument.
41
    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.
42
        pass
43
44
    def lock_read(self):
45
        pass
46
47
    def unlock(self):
48
        pass
49
0.200.73 by Jelmer Vernooij
Implement GitLock.peek().
50
    def peek(self):
51
        pass
52
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
53
54
class GitLockableFiles(lockable_files.LockableFiles):
55
    """Git specific lockable files abstraction."""
56
57
    def __init__(self, lock):
58
        self._lock = lock
59
        self._transaction = None
60
        self._lock_mode = None
61
        self._lock_count = 0
62
63
64
class GitDir(bzrdir.BzrDir):
65
    """An adapter to the '.git' dir used by git."""
66
0.202.2 by David Allouche
GitRepository.get_inventory and .revision_tree work for the null revision. Support for testing GitRepository without disk data.
67
    _gitrepository_class = git_repository.GitRepository
68
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
69
    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.
70
        self._format = format
71
        self.root_transport = transport
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
72
        self._git = gitrepo
73
        if gitrepo.bare:
74
            self.transport = transport
75
        else:
76
            self.transport = transport.clone('.git')
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
77
        self._lockfiles = lockfiles
78
79
    def get_branch_transport(self, branch_format):
80
        if branch_format is None:
81
            return self.transport
82
        if isinstance(branch_format, GitBzrDirFormat):
83
            return self.transport
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
84
        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.
85
86
    get_repository_transport = get_branch_transport
87
    get_workingtree_transport = get_branch_transport
88
89
    def is_supported(self):
90
        return True
91
92
    def open_branch(self, ignored=None):
0.200.57 by Jelmer Vernooij
Fix more tests.
93
        """'create' a branch for this dir."""
94
        repo = self.open_repository()
95
        if repo._git.heads == []:
96
            head = None
97
        else:
0.200.58 by Jelmer Vernooij
Fix remaining tests.
98
            head = repo._git.heads[0].commit.id
0.200.59 by Jelmer Vernooij
Add more tests, fix revision history.
99
        return git_branch.GitBranch(self, repo, head, 
0.200.57 by Jelmer Vernooij
Fix more tests.
100
                                    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.
101
102
    def open_repository(self, shared=False):
103
        """'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.
104
        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.
105
0.203.1 by Aaron Bentley
Make checkouts work
106
    def open_workingtree(self, recommend_upgrade=True):
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
107
        if self._git.bare:
108
            loc = urlutils.unescape_for_display(self.root_transport.base, 'ascii')
109
            raise errors.bzr_errors.NoWorkingTree(loc)
110
        else:
111
            return git_workingtree.GitWorkingTree(self, self.open_repository(), 
112
                                                  self.open_branch())
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
113
0.203.1 by Aaron Bentley
Make checkouts work
114
    def cloning_metadir(self):
115
        return bzrdir.BzrDirFormat.get_default_format()
116
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
117
118
class GitBzrDirFormat(bzrdir.BzrDirFormat):
119
    """The .git directory control format."""
120
0.202.2 by David Allouche
GitRepository.get_inventory and .revision_tree work for the null revision. Support for testing GitRepository without disk data.
121
    _gitdir_class = GitDir
122
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
123
    @classmethod
124
    def _known_formats(self):
125
        return set([GitBzrDirFormat()])
126
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
127
    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.
128
        """Open this directory.
129
130
        """
131
        # we dont grok readonly - git isn't integrated with transport.
132
        url = transport.base
133
        if url.startswith('readonly+'):
134
            url = url[len('readonly+'):]
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
135
136
        try:
137
            gitrepo = git.repo.Repo(transport.local_abspath("."))
138
        except errors.bzr_errors.NotLocalUrl:
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
139
            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.
140
        lockfiles = GitLockableFiles(GitLock())
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
141
        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.
142
143
    @classmethod
144
    def probe_transport(klass, transport):
145
        """Our format is present if the transport ends in '.not/'."""
146
        # little ugly, but works
147
        format = klass()
148
        # delegate to the main opening code. This pays a double rtt cost at the
149
        # moment, so perhaps we want probe_transport to return the opened thing
150
        # rather than an openener ? or we could return a curried thing with the
151
        # dir to open already instantiated ? Needs more thought.
152
        try:
153
            format.open(transport)
154
            return format
155
        except Exception, e:
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
156
            raise errors.bzr_errors.NotBranchError(path=transport.base)
157
        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.
158
0.200.69 by Jelmer Vernooij
Implement GitBzrDirFormat.get_format_description.
159
    def get_format_description(self):
160
        return "Local Git Repository"
161
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
162
163
bzrdir.BzrDirFormat.register_control_format(GitBzrDirFormat)