179
def _get_client(self, thin_packs):
180
def _get_client(self):
180
181
if self._client is not None:
181
182
ret = self._client
182
183
self._client = None
186
return dulwich.client.LocalGitClient()
184
187
return dulwich.client.TCPGitClient(self._host, self._port,
185
thin_packs=thin_packs, report_activity=self._report_activity)
188
report_activity=self._report_activity)
188
191
class SSHSocketWrapper(object):
232
def _get_client(self, thin_packs):
235
def _get_client(self):
233
236
if self._client is not None:
234
237
ret = self._client
235
238
self._client = None
237
240
location_config = config.LocationConfig(self.base)
238
241
client = dulwich.client.SSHGitClient(self._host, self._port, self._username,
239
thin_packs=thin_packs, report_activity=self._report_activity)
242
report_activity=self._report_activity)
240
243
# Set up alternate pack program paths
241
244
upload_pack = location_config.get_user_option('git_upload_pack')
264
267
class RemoteGitDir(GitDir):
266
def __init__(self, transport, format, get_client, client_path):
269
def __init__(self, transport, format, client, client_path):
267
270
self._format = format
268
271
self.root_transport = transport
269
272
self.transport = transport
270
273
self._mode_check_done = None
271
self._get_client = get_client
274
self._client = client
272
275
self._client_path = client_path
273
276
self.base = self.root_transport.base
274
277
self._refs = None
283
286
trace.info("git: %s" % text)
284
287
def wrap_determine_wants(refs_dict):
285
288
return determine_wants(remote_refs_dict_to_container(refs_dict))
286
client = self._get_client(thin_packs=True)
288
refs_dict = client.fetch_pack(self._client_path, wrap_determine_wants,
290
refs_dict = self._client.fetch_pack(self._client_path, wrap_determine_wants,
289
291
graph_walker, pack_data, progress)
290
292
if refs_dict is None:
295
297
raise parse_git_error(self.transport.external_url(), e)
297
299
def send_pack(self, get_changed_refs, generate_pack_contents):
298
client = self._get_client(thin_packs=True)
300
return client.send_pack(self._client_path, get_changed_refs,
301
return self._client.send_pack(self._client_path, get_changed_refs,
301
302
generate_pack_contents)
302
303
except GitProtocolError, e:
303
304
raise parse_git_error(self.transport.external_url(), e)
433
434
url = transport.base
434
435
if url.startswith('readonly+'):
435
436
url = url[len('readonly+'):]
437
scheme = urlparse.urlsplit(transport.external_url())[0]
436
438
if isinstance(transport, GitSmartTransport):
437
get_client = transport._get_client
439
client = transport._get_client()
438
440
client_path = transport._get_path()
439
elif urlparse.urlsplit(transport.external_url())[0] in ("http", "https"):
440
def get_client(thin_packs):
441
return BzrGitHttpClient(transport, thin_packs=thin_packs)
441
elif scheme in ("http", "https"):
442
client = BzrGitHttpClient(transport)
442
443
client_path, _ = urlutils.split_segment_parameters(transport._path)
444
elif scheme == 'file':
445
client = dulwich.client.LocalGitClient()
446
client_path = transport.local_abspath('.')
444
448
raise NotBranchError(transport.base)
445
return RemoteGitDir(transport, self, get_client, client_path)
450
pass # TODO(jelmer): Actually probe for something
451
return RemoteGitDir(transport, self, client, client_path)
447
453
def get_format_description(self):
448
454
return "Remote Git Repository"