/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.252 by Jelmer Vernooij
Clarify history, copyright.
1
# Copyright (C) 2007-2009 Jelmer Vernooij <jelmer@samba.org>
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
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.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
17
import bzrlib
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
18
from bzrlib import (
19
    branch,
20
    tag,
21
    urlutils,
22
    )
23
from bzrlib.bzrdir import (
24
    BzrDir,
25
    BzrDirFormat,
26
    )
27
from bzrlib.errors import (
28
    BzrError,
29
    NoSuchFile,
30
    NotLocalUrl,
31
    )
0.200.292 by Jelmer Vernooij
Fix formatting.
32
from bzrlib.lockable_files import (
33
    TransportLock,
34
    )
35
from bzrlib.repository import (
36
    Repository,
37
    )
38
from bzrlib.trace import (
39
    info,
40
    )
41
from bzrlib.transport import (
42
    Transport,
43
    )
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
44
0.200.292 by Jelmer Vernooij
Fix formatting.
45
from bzrlib.plugins.git import (
46
    lazy_check_versions,
47
    )
0.200.200 by Jelmer Vernooij
Register lazily where possible.
48
lazy_check_versions()
49
0.200.292 by Jelmer Vernooij
Fix formatting.
50
from bzrlib.plugins.git.branch import (
51
    GitBranch,
52
    )
53
from bzrlib.plugins.git.errors import (
54
    NoSuchRef,
55
    )
56
from bzrlib.plugins.git.dir import (
57
    GitDir,
58
    )
59
from bzrlib.plugins.git.foreign import (
60
    ForeignBranch,
61
    )
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
62
from bzrlib.plugins.git.repository import (
63
    GitRepositoryFormat,
64
    GitRepository,
65
    )
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
66
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
67
import dulwich as git
0.200.292 by Jelmer Vernooij
Fix formatting.
68
from dulwich.errors import (
69
    GitProtocolError,
70
    )
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
71
from dulwich.pack import (
72
    Pack,
73
    PackData,
74
    )
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
75
import os
76
import tempfile
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
77
import urllib
78
import urlparse
79
0.200.306 by Jelmer Vernooij
Fix tests, split up InterGitNonGitRepository.
80
try:
81
    from dulwich.pack import load_pack_index
82
except ImportError:
83
    from dulwich.pack import PackIndex as load_pack_index
84
0.200.143 by Jelmer Vernooij
Reoncile InterGitRepository objects.
85
0.200.181 by Jelmer Vernooij
Support setting tags.
86
# Don't run any tests on GitSmartTransport as it is not intended to be 
87
# a full implementation of Transport
88
def get_test_permutations():
89
    return []
90
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
91
92
class GitSmartTransport(Transport):
93
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
94
    def __init__(self, url, _client=None):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
95
        Transport.__init__(self, url)
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
96
        (scheme, _, loc, _, _) = urlparse.urlsplit(url)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
97
        assert scheme == "git"
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
98
        hostport, self._path = urllib.splithost(loc)
99
        (self._host, self._port) = urllib.splitnport(hostport, git.protocol.TCP_GIT_PORT)
0.200.166 by Jelmer Vernooij
don't reuse client objects.
100
        self._client = _client
101
0.200.238 by Jelmer Vernooij
Import Transport.has().
102
    def has(self, relpath):
103
        return False
104
0.200.166 by Jelmer Vernooij
don't reuse client objects.
105
    def _get_client(self):
106
        if self._client is not None:
107
            ret = self._client
108
            self._client = None
109
            return ret
0.200.241 by Jelmer Vernooij
Use new thin packs argument.
110
        return git.client.TCPGitClient(self._host, self._port, thin_packs=False)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
111
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
112
    def fetch_pack(self, determine_wants, graph_walker, pack_data, progress=None):
113
        if progress is None:
114
            def progress(text):
115
                info("git: %s" % text)
0.200.240 by Jelmer Vernooij
Wrap socket errors.
116
        client = self._get_client()
117
        try:
118
            client.fetch_pack(self._path, determine_wants, 
119
                graph_walker, pack_data, progress)
120
        except GitProtocolError, e:
121
            raise BzrError(e)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
122
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
123
    def get(self, path):
124
        raise NoSuchFile(path)
125
0.200.160 by Jelmer Vernooij
Implement abspath.
126
    def abspath(self, relpath):
127
        return urlutils.join(self.base, relpath)
128
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
129
    def clone(self, offset=None):
130
        """See Transport.clone()."""
131
        if offset is None:
132
            newurl = self.base
133
        else:
134
            newurl = urlutils.join(self.base, offset)
135
136
        return GitSmartTransport(newurl, self._client)
137
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
138
0.200.148 by Jelmer Vernooij
Share more infrastructure between LocalGitDir and RemoteGitDir.
139
class RemoteGitDir(GitDir):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
140
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
141
    def __init__(self, transport, lockfiles, format):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
142
        self._format = format
143
        self.root_transport = transport
144
        self.transport = transport
145
        self._lockfiles = lockfiles
146
147
    def open_repository(self):
148
        return RemoteGitRepository(self, self._lockfiles)
149
0.200.174 by Jelmer Vernooij
Merge John.
150
    def open_branch(self, _unsupported=False):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
151
        repo = self.open_repository()
152
        # TODO: Support for multiple branches in one bzrdir in bzrlib!
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
153
        return RemoteGitBranch(self, repo, "HEAD", self._lockfiles)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
154
155
    def open_workingtree(self):
156
        raise NotLocalUrl(self.transport.base)
157
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
158
0.225.2 by Jelmer Vernooij
Handle situation when repository is already up to date during pull.
159
class EmptyObjectStoreIterator(dict):
160
161
    def iterobjects(self):
162
        return []
163
164
0.200.218 by Jelmer Vernooij
Simplify TemporaryPack implementation.
165
class TemporaryPackIterator(Pack):
166
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
167
    def __init__(self, path, resolve_ext_ref):
168
        self.resolve_ext_ref = resolve_ext_ref
169
        super(TemporaryPackIterator, self).__init__(path)
170
0.200.218 by Jelmer Vernooij
Simplify TemporaryPack implementation.
171
    @property
172
    def idx(self):
173
        if self._idx is None:
0.200.302 by Jelmer Vernooij
Fix index creation when fetching from remote host.
174
            if self._data is None:
175
                self._data = PackData(self._data_path)
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
176
            self._data.create_index_v2(self._idx_path, self.resolve_ext_ref)
0.200.306 by Jelmer Vernooij
Fix tests, split up InterGitNonGitRepository.
177
            self._idx = load_pack_index(self._idx_path)
0.200.218 by Jelmer Vernooij
Simplify TemporaryPack implementation.
178
        return self._idx
0.200.205 by Jelmer Vernooij
Fix remote fetching.
179
180
    def __del__(self):
0.200.218 by Jelmer Vernooij
Simplify TemporaryPack implementation.
181
        os.remove(self._data_path)
182
        os.remove(self._idx_path)
0.200.205 by Jelmer Vernooij
Fix remote fetching.
183
184
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
185
class RemoteGitRepository(GitRepository):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
186
187
    def __init__(self, gitdir, lockfiles):
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
188
        GitRepository.__init__(self, gitdir, lockfiles)
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
189
        self._refs = None
190
191
    def get_refs(self):
192
        if self._refs is not None:
193
            return self._refs
194
        def determine_wants(heads):
195
            self._refs = heads
196
            return []
197
        self.bzrdir.root_transport.fetch_pack(determine_wants, None, 
198
            lambda x: None, lambda x: mutter("git: %s" % x))
199
        return self._refs
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
200
0.200.155 by Jelmer Vernooij
Fix formatting, remove catch-all for exceptions when opening local repositories.
201
    def fetch_pack(self, determine_wants, graph_walker, pack_data, 
202
                   progress=None):
203
        self._transport.fetch_pack(determine_wants, graph_walker, pack_data, 
204
            progress)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
205
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
206
    def fetch_objects(self, determine_wants, graph_walker, resolve_ext_ref, progress=None):
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
207
        fd, path = tempfile.mkstemp(suffix=".pack")
208
        self.fetch_pack(determine_wants, graph_walker, lambda x: os.write(fd, x), progress)
209
        os.close(fd)
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
210
        if os.path.getsize(path) == 0:
0.225.2 by Jelmer Vernooij
Handle situation when repository is already up to date during pull.
211
            return EmptyObjectStoreIterator()
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
212
        return TemporaryPackIterator(path[:-len(".pack")], resolve_ext_ref)
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
213
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
214
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
215
class RemoteGitTagDict(tag.BasicTags):
216
217
    def __init__(self, branch):
218
        self.branch = branch
219
        self.repository = branch.repository
220
221
    def get_tag_dict(self):
222
        ret = {}
223
        refs = self.repository.get_refs()
224
        for k,v in refs.iteritems():
225
            if k.startswith("refs/tags/") and not k.endswith("^{}"):
226
                v = refs.get(k+"^{}", v)
0.228.4 by Jelmer Vernooij
Strip ref directory name from tag names.
227
                ret[k[len("refs/tags/"):]] = self.branch.mapping.revision_id_foreign_to_bzr(v)
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
228
        return ret
229
230
    def set_tag(self, name, revid):
231
        # FIXME: Not supported yet, should do a push of a new ref
232
        raise NotImplementedError(self.set_tag)
233
234
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
235
class RemoteGitBranch(GitBranch):
236
237
    def __init__(self, bzrdir, repository, name, lockfiles):
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
238
        heads = repository.get_refs()
239
        if not name in heads:
240
            raise NoSuchRef(name)
241
        self._ref = heads[name]
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
242
        super(RemoteGitBranch, self).__init__(bzrdir, repository, name, self._ref, lockfiles)
243
244
    def last_revision(self):
0.200.140 by Jelmer Vernooij
Support negotiating with remote git repository and receiving pack.
245
        return self.mapping.revision_id_foreign_to_bzr(self._ref)
0.200.141 by Jelmer Vernooij
Separate out local and remote fetching.
246
0.200.169 by Jelmer Vernooij
Fix branch cloning.
247
    def _synchronize_history(self, destination, revision_id):
248
        """See Branch._synchronize_history()."""
249
        destination.generate_revision_history(self.last_revision())
250