15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23
from bzrlib.bzrdir import (
27
from bzrlib.errors import (
32
from bzrlib.lockable_files import (
35
from bzrlib.repository import (
38
from bzrlib.trace import (
41
from bzrlib.transport import (
45
from bzrlib.plugins.git import (
50
from bzrlib.plugins.git.branch import (
53
from bzrlib.plugins.git.errors import (
56
from bzrlib.plugins.git.dir import (
59
from bzrlib.plugins.git.foreign import (
62
from bzrlib.plugins.git.repository import (
68
from dulwich.errors import (
71
from dulwich.pack import (
18
from bzrlib import urlutils
19
from bzrlib.bzrdir import BzrDir, BzrDirFormat
20
from bzrlib.errors import NoSuchFile, NotLocalUrl
21
from bzrlib.lockable_files import TransportLock
22
from bzrlib.repository import Repository
23
from bzrlib.trace import info
24
from bzrlib.transport import Transport
26
from bzrlib.plugins.git import git
27
from bzrlib.plugins.git.branch import GitBranch
28
from bzrlib.plugins.git.errors import NoSuchRef
29
from bzrlib.plugins.git.dir import GitDir
30
from bzrlib.plugins.git.foreign import ForeignBranch
31
from bzrlib.plugins.git.repository import GitFormat, GitRepository
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():
38
from dulwich.pack import PackData, Pack
88
41
class GitSmartTransport(Transport):
95
48
(self._host, self._port) = urllib.splitnport(hostport, git.protocol.TCP_GIT_PORT)
96
49
self._client = _client
98
def has(self, relpath):
101
51
def _get_client(self):
102
52
if self._client is not None:
103
53
ret = self._client
104
54
self._client = None
106
return git.client.TCPGitClient(self._host, self._port, thin_packs=False)
56
return git.client.TCPGitClient(self._host, self._port)
108
58
def fetch_pack(self, determine_wants, graph_walker, pack_data, progress=None):
109
59
if progress is None:
110
60
def progress(text):
111
61
info("git: %s" % text)
112
client = self._get_client()
114
client.fetch_pack(self._path, determine_wants,
115
graph_walker, pack_data, progress)
116
except GitProtocolError, e:
62
self._get_client().fetch_pack(self._path, determine_wants,
63
graph_walker, pack_data, progress)
119
65
def get(self, path):
120
66
raise NoSuchFile(path)
152
98
raise NotLocalUrl(self.transport.base)
155
class EmptyObjectStoreIterator(dict):
157
def iterobjects(self):
161
class TemporaryPackIterator(Pack):
163
def __init__(self, path, resolve_ext_ref):
164
self.resolve_ext_ref = resolve_ext_ref
165
super(TemporaryPackIterator, self).__init__(path)
169
if self._idx is None:
170
if self._data is None:
171
self._data = PackData(self._data_path)
172
self._data.create_index_v2(self._idx_path, self.resolve_ext_ref)
173
self._idx = PackIndex(self._idx_path)
177
os.remove(self._data_path)
178
os.remove(self._idx_path)
181
101
class RemoteGitRepository(GitRepository):
183
103
def __init__(self, gitdir, lockfiles):
184
104
GitRepository.__init__(self, gitdir, lockfiles)
188
if self._refs is not None:
190
def determine_wants(heads):
193
self.bzrdir.root_transport.fetch_pack(determine_wants, None,
194
lambda x: None, lambda x: mutter("git: %s" % x))
197
106
def fetch_pack(self, determine_wants, graph_walker, pack_data,
199
108
self._transport.fetch_pack(determine_wants, graph_walker, pack_data,
202
def fetch_objects(self, determine_wants, graph_walker, resolve_ext_ref, progress=None):
111
def fetch_objects(self, determine_wants, graph_walker, progress=None):
203
112
fd, path = tempfile.mkstemp(suffix=".pack")
204
113
self.fetch_pack(determine_wants, graph_walker, lambda x: os.write(fd, x), progress)
206
if os.path.getsize(path) == 0:
207
return EmptyObjectStoreIterator()
208
return TemporaryPackIterator(path[:-len(".pack")], resolve_ext_ref)
211
class RemoteGitTagDict(tag.BasicTags):
213
def __init__(self, branch):
215
self.repository = branch.repository
217
def get_tag_dict(self):
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)
223
ret[k[len("refs/tags/"):]] = self.branch.mapping.revision_id_foreign_to_bzr(v)
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)
116
basename = path[:-len(".pack")]
118
p.create_index_v2(basename+".idx")
119
for o in Pack(basename).iterobjects():
231
125
class RemoteGitBranch(GitBranch):
233
127
def __init__(self, bzrdir, repository, name, lockfiles):
234
heads = repository.get_refs()
235
if not name in heads:
236
raise NoSuchRef(name)
237
self._ref = heads[name]
128
def determine_wants(heads):
129
if not name in heads:
130
raise NoSuchRef(name)
131
self._ref = heads[name]
132
bzrdir.root_transport.fetch_pack(determine_wants, None, lambda x: None,
133
lambda x: mutter("git: %s" % x))
238
134
super(RemoteGitBranch, self).__init__(bzrdir, repository, name, self._ref, lockfiles)
240
136
def last_revision(self):