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