276
285
self._remove_packed_ref(name)
288
def get(self, name, default=None):
280
295
class TransportRepo(BaseRepo):
282
def __init__(self, transport):
297
def __init__(self, transport, bare, refs_text=None):
283
298
self.transport = transport
285
if self.transport.has(".git/%s" % OBJECTDIR):
287
self._controltransport = self.transport.clone('.git')
288
elif self.transport.has_any(["info/refs", OBJECTDIR, REFSDIR]):
290
self._controltransport = self.transport
292
raise NotGitRepository(self.transport)
294
raise NotGitRepository(self.transport)
301
self._controltransport = self.transport
303
self._controltransport = self.transport.clone('.git')
295
304
object_store = TransportObjectStore(
296
305
self._controltransport.clone(OBJECTDIR))
306
if refs_text is not None:
307
from dulwich.repo import InfoRefsContainer # dulwich >= 0.8.2
308
refs_container = InfoRefsContainer(StringIO(refs_text))
310
refs_container = TransportRefsContainer(self._controltransport)
297
311
super(TransportRepo, self).__init__(object_store,
298
TransportRefsContainer(self._controltransport))
300
314
def get_named_file(self, path):
301
315
"""Get a file from the control dir with a specific name.
312
326
except NoSuchFile:
329
def _put_named_file(self, relpath, contents):
330
self._controltransport.put_bytes(relpath, contents)
315
332
def index_path(self):
316
333
"""Return the path to the index file."""
317
334
return self._controltransport.local_abspath(INDEX_FILENAME)
332
349
def __repr__(self):
333
350
return "<%s for %r>" % (self.__class__.__name__, self.transport)
353
def init(cls, transport, bare=False):
355
transport.mkdir(".git")
356
control_transport = transport.clone(".git")
358
control_transport = transport
359
for d in BASE_DIRECTORIES:
360
control_transport.mkdir("/".join(d))
361
control_transport.mkdir(OBJECTDIR)
362
TransportObjectStore.init(control_transport.clone(OBJECTDIR))
363
ret = cls(transport, bare)
364
ret.refs.set_symbolic_ref("HEAD", "refs/heads/master")
365
ret._init_files(bare)
336
369
class TransportObjectStore(PackBasedObjectStore):
337
370
"""Git-style object store that exists on disk."""
344
377
super(TransportObjectStore, self).__init__()
345
378
self.transport = transport
346
379
self.pack_transport = self.transport.clone(PACKDIR)
380
self._alternates = None
348
382
def __repr__(self):
349
383
return "%s(%r)" % (self.__class__.__name__, self.transport)
351
385
def _pack_cache_stale(self):
352
386
return False # FIXME
389
def alternates(self):
390
if self._alternates is not None:
391
return self._alternates
392
self._alternates = []
393
for path in self._read_alternate_paths():
395
t = _mod_transport.get_transport_from_path(path)
396
self._alternates.append(self.__class__(t))
397
return self._alternates
399
def _read_alternate_paths(self):
401
f = self.transport.get("info/alternates")
406
for l in f.readlines():
354
417
def _pack_names(self):
356
419
f = self.transport.get('info/packs')
473
536
:param path: Path to the pack file.
476
data = ThinPackData.from_file(self.get_raw, f, len(f.getvalue()))
539
data = PackData.from_file(self.get_raw, f, len(f.getvalue()))
477
540
idx = MemoryPackIndex(data.sorted_entries(), data.get_stored_checksum())
478
541
p = Pack.from_objects(data, idx)
480
543
pack_sha = idx.objects_sha1()
482
datafile = self.pack_transport.open_write_stream("pack-%s.pack" % pack_sha)
545
datafile = self.pack_transport.open_write_stream(
546
"pack-%s.pack" % pack_sha)
484
entries, data_sum = write_pack_data(datafile, ((o, None) for o in p.iterobjects()), len(p))
548
entries, data_sum = write_pack_data(datafile, p.pack_tuples())
488
idxfile = self.pack_transport.open_write_stream("pack-%s.idx" % pack_sha)
552
idxfile = self.pack_transport.open_write_stream(
553
"pack-%s.idx" % pack_sha)
490
555
write_pack_index_v2(idxfile, data.sorted_entries(), data_sum)