/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
    PackIndex,
75
    )
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
76
import os
77
import tempfile
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
78
import urllib
79
import urlparse
80
0.200.143 by Jelmer Vernooij
Reoncile InterGitRepository objects.
81
0.200.181 by Jelmer Vernooij
Support setting tags.
82
# Don't run any tests on GitSmartTransport as it is not intended to be 
83
# a full implementation of Transport
84
def get_test_permutations():
85
    return []
86
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
87
88
class GitSmartTransport(Transport):
89
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
90
    def __init__(self, url, _client=None):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
91
        Transport.__init__(self, url)
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
92
        (scheme, _, loc, _, _) = urlparse.urlsplit(url)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
93
        assert scheme == "git"
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
94
        hostport, self._path = urllib.splithost(loc)
95
        (self._host, self._port) = urllib.splitnport(hostport, git.protocol.TCP_GIT_PORT)
0.200.166 by Jelmer Vernooij
don't reuse client objects.
96
        self._client = _client
97
0.200.238 by Jelmer Vernooij
Import Transport.has().
98
    def has(self, relpath):
99
        return False
100
0.200.166 by Jelmer Vernooij
don't reuse client objects.
101
    def _get_client(self):
102
        if self._client is not None:
103
            ret = self._client
104
            self._client = None
105
            return ret
0.200.241 by Jelmer Vernooij
Use new thin packs argument.
106
        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.
107
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
108
    def fetch_pack(self, determine_wants, graph_walker, pack_data, progress=None):
109
        if progress is None:
110
            def progress(text):
111
                info("git: %s" % text)
0.200.240 by Jelmer Vernooij
Wrap socket errors.
112
        client = self._get_client()
113
        try:
114
            client.fetch_pack(self._path, determine_wants, 
115
                graph_walker, pack_data, progress)
116
        except GitProtocolError, e:
117
            raise BzrError(e)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
118
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
119
    def get(self, path):
120
        raise NoSuchFile(path)
121
0.200.160 by Jelmer Vernooij
Implement abspath.
122
    def abspath(self, relpath):
123
        return urlutils.join(self.base, relpath)
124
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
125
    def clone(self, offset=None):
126
        """See Transport.clone()."""
127
        if offset is None:
128
            newurl = self.base
129
        else:
130
            newurl = urlutils.join(self.base, offset)
131
132
        return GitSmartTransport(newurl, self._client)
133
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
134
0.200.148 by Jelmer Vernooij
Share more infrastructure between LocalGitDir and RemoteGitDir.
135
class RemoteGitDir(GitDir):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
136
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
137
    def __init__(self, transport, lockfiles, format):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
138
        self._format = format
139
        self.root_transport = transport
140
        self.transport = transport
141
        self._lockfiles = lockfiles
142
143
    def open_repository(self):
144
        return RemoteGitRepository(self, self._lockfiles)
145
0.200.174 by Jelmer Vernooij
Merge John.
146
    def open_branch(self, _unsupported=False):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
147
        repo = self.open_repository()
148
        # 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.
149
        return RemoteGitBranch(self, repo, "HEAD", self._lockfiles)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
150
151
    def open_workingtree(self):
152
        raise NotLocalUrl(self.transport.base)
153
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
154
0.225.2 by Jelmer Vernooij
Handle situation when repository is already up to date during pull.
155
class EmptyObjectStoreIterator(dict):
156
157
    def iterobjects(self):
158
        return []
159
160
0.200.218 by Jelmer Vernooij
Simplify TemporaryPack implementation.
161
class TemporaryPackIterator(Pack):
162
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
163
    def __init__(self, path, resolve_ext_ref):
164
        self.resolve_ext_ref = resolve_ext_ref
165
        super(TemporaryPackIterator, self).__init__(path)
166
0.200.218 by Jelmer Vernooij
Simplify TemporaryPack implementation.
167
    @property
168
    def idx(self):
169
        if self._idx is None:
0.200.302 by Jelmer Vernooij
Fix index creation when fetching from remote host.
170
            if self._data is None:
171
                self._data = PackData(self._data_path)
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
172
            self._data.create_index_v2(self._idx_path, self.resolve_ext_ref)
0.200.218 by Jelmer Vernooij
Simplify TemporaryPack implementation.
173
            self._idx = PackIndex(self._idx_path)
174
        return self._idx
0.200.205 by Jelmer Vernooij
Fix remote fetching.
175
176
    def __del__(self):
0.200.218 by Jelmer Vernooij
Simplify TemporaryPack implementation.
177
        os.remove(self._data_path)
178
        os.remove(self._idx_path)
0.200.205 by Jelmer Vernooij
Fix remote fetching.
179
180
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
181
class RemoteGitRepository(GitRepository):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
182
183
    def __init__(self, gitdir, lockfiles):
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
184
        GitRepository.__init__(self, gitdir, lockfiles)
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
185
        self._refs = None
186
187
    def get_refs(self):
188
        if self._refs is not None:
189
            return self._refs
190
        def determine_wants(heads):
191
            self._refs = heads
192
            return []
193
        self.bzrdir.root_transport.fetch_pack(determine_wants, None, 
194
            lambda x: None, lambda x: mutter("git: %s" % x))
195
        return self._refs
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
196
0.200.155 by Jelmer Vernooij
Fix formatting, remove catch-all for exceptions when opening local repositories.
197
    def fetch_pack(self, determine_wants, graph_walker, pack_data, 
198
                   progress=None):
199
        self._transport.fetch_pack(determine_wants, graph_walker, pack_data, 
200
            progress)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
201
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
202
    def fetch_objects(self, determine_wants, graph_walker, resolve_ext_ref, progress=None):
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
203
        fd, path = tempfile.mkstemp(suffix=".pack")
204
        self.fetch_pack(determine_wants, graph_walker, lambda x: os.write(fd, x), progress)
205
        os.close(fd)
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
206
        if os.path.getsize(path) == 0:
0.225.2 by Jelmer Vernooij
Handle situation when repository is already up to date during pull.
207
            return EmptyObjectStoreIterator()
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
208
        return TemporaryPackIterator(path[:-len(".pack")], resolve_ext_ref)
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
209
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
210
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
211
class RemoteGitTagDict(tag.BasicTags):
212
213
    def __init__(self, branch):
214
        self.branch = branch
215
        self.repository = branch.repository
216
217
    def get_tag_dict(self):
218
        ret = {}
219
        refs = self.repository.get_refs()
220
        for k,v in refs.iteritems():
221
            if k.startswith("refs/tags/") and not k.endswith("^{}"):
222
                v = refs.get(k+"^{}", v)
0.228.4 by Jelmer Vernooij
Strip ref directory name from tag names.
223
                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.
224
        return ret
225
226
    def set_tag(self, name, revid):
227
        # FIXME: Not supported yet, should do a push of a new ref
228
        raise NotImplementedError(self.set_tag)
229
230
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
231
class RemoteGitBranch(GitBranch):
232
233
    def __init__(self, bzrdir, repository, name, lockfiles):
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
234
        heads = repository.get_refs()
235
        if not name in heads:
236
            raise NoSuchRef(name)
237
        self._ref = heads[name]
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
238
        super(RemoteGitBranch, self).__init__(bzrdir, repository, name, self._ref, lockfiles)
239
240
    def last_revision(self):
0.200.140 by Jelmer Vernooij
Support negotiating with remote git repository and receiving pack.
241
        return self.mapping.revision_id_foreign_to_bzr(self._ref)
0.200.141 by Jelmer Vernooij
Separate out local and remote fetching.
242
0.200.169 by Jelmer Vernooij
Fix branch cloning.
243
    def _synchronize_history(self, destination, revision_id):
244
        """See Branch._synchronize_history()."""
245
        destination.generate_revision_history(self.last_revision())
246