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