/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.226 by Jelmer Vernooij
Merge thin-pack work.
170
            self._data.create_index_v2(self._idx_path, self.resolve_ext_ref)
0.200.218 by Jelmer Vernooij
Simplify TemporaryPack implementation.
171
            self._idx = PackIndex(self._idx_path)
172
        return self._idx
0.200.205 by Jelmer Vernooij
Fix remote fetching.
173
174
    def __del__(self):
0.200.218 by Jelmer Vernooij
Simplify TemporaryPack implementation.
175
        os.remove(self._data_path)
176
        os.remove(self._idx_path)
0.200.205 by Jelmer Vernooij
Fix remote fetching.
177
178
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
179
class RemoteGitRepository(GitRepository):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
180
181
    def __init__(self, gitdir, lockfiles):
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
182
        GitRepository.__init__(self, gitdir, lockfiles)
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
183
        self._refs = None
184
185
    def get_refs(self):
186
        if self._refs is not None:
187
            return self._refs
188
        def determine_wants(heads):
189
            self._refs = heads
190
            return []
191
        self.bzrdir.root_transport.fetch_pack(determine_wants, None, 
192
            lambda x: None, lambda x: mutter("git: %s" % x))
193
        return self._refs
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
194
0.200.155 by Jelmer Vernooij
Fix formatting, remove catch-all for exceptions when opening local repositories.
195
    def fetch_pack(self, determine_wants, graph_walker, pack_data, 
196
                   progress=None):
197
        self._transport.fetch_pack(determine_wants, graph_walker, pack_data, 
198
            progress)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
199
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
200
    def fetch_objects(self, determine_wants, graph_walker, resolve_ext_ref, progress=None):
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
201
        fd, path = tempfile.mkstemp(suffix=".pack")
202
        self.fetch_pack(determine_wants, graph_walker, lambda x: os.write(fd, x), progress)
203
        os.close(fd)
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
204
        if os.path.getsize(path) == 0:
0.225.2 by Jelmer Vernooij
Handle situation when repository is already up to date during pull.
205
            return EmptyObjectStoreIterator()
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
206
        return TemporaryPackIterator(path[:-len(".pack")], resolve_ext_ref)
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
207
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
208
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
209
class RemoteGitTagDict(tag.BasicTags):
210
211
    def __init__(self, branch):
212
        self.branch = branch
213
        self.repository = branch.repository
214
215
    def get_tag_dict(self):
216
        ret = {}
217
        refs = self.repository.get_refs()
218
        for k,v in refs.iteritems():
219
            if k.startswith("refs/tags/") and not k.endswith("^{}"):
220
                v = refs.get(k+"^{}", v)
0.228.4 by Jelmer Vernooij
Strip ref directory name from tag names.
221
                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.
222
        return ret
223
224
    def set_tag(self, name, revid):
225
        # FIXME: Not supported yet, should do a push of a new ref
226
        raise NotImplementedError(self.set_tag)
227
228
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
229
class RemoteGitBranch(GitBranch):
230
231
    def __init__(self, bzrdir, repository, name, lockfiles):
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
232
        heads = repository.get_refs()
233
        if not name in heads:
234
            raise NoSuchRef(name)
235
        self._ref = heads[name]
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
236
        super(RemoteGitBranch, self).__init__(bzrdir, repository, name, self._ref, lockfiles)
237
238
    def last_revision(self):
0.200.140 by Jelmer Vernooij
Support negotiating with remote git repository and receiving pack.
239
        return self.mapping.revision_id_foreign_to_bzr(self._ref)
0.200.141 by Jelmer Vernooij
Separate out local and remote fetching.
240
0.200.169 by Jelmer Vernooij
Fix branch cloning.
241
    def _synchronize_history(self, destination, revision_id):
242
        """See Branch._synchronize_history()."""
243
        destination.generate_revision_history(self.last_revision())
244