426
426
_mod_transport.get_transport_from_path(commondir)
428
428
self._commontransport = self._controltransport
429
object_store = TransportObjectStore(
430
self._commontransport.clone(OBJECTDIR))
429
config = self.get_config()
430
object_store = TransportObjectStore.from_config(
431
self._commontransport.clone(OBJECTDIR),
431
433
if refs_text is not None:
432
434
refs_container = InfoRefsContainer(BytesIO(refs_text))
514
516
backends.extend(StackedConfig.default_backends())
515
517
return StackedConfig(backends, writable=writable)
519
# Here for compatibility with dulwich < 0.19.17
520
def generate_pack_data(self, have, want, progress=None, ofs_delta=None):
521
"""Generate pack data objects for a set of wants/haves.
524
have: List of SHA1s of objects that should not be sent
525
want: List of SHA1s of objects that should be sent
526
ofs_delta: Whether OFS deltas can be included
527
progress: Optional progress reporting method
529
shallow = self.get_shallow()
531
return self.object_store.generate_pack_data(
532
have, want, shallow=shallow,
533
progress=progress, ofs_delta=ofs_delta)
535
return self.object_store.generate_pack_data(
536
have, want, progress=progress, ofs_delta=ofs_delta)
517
538
def __repr__(self):
518
539
return "<%s for %r>" % (self.__class__.__name__, self.transport)
546
567
class TransportObjectStore(PackBasedObjectStore):
547
568
"""Git-style object store that exists on disk."""
549
def __init__(self, transport):
570
def __init__(self, transport,
571
loose_compression_level=-1, pack_compression_level=-1):
550
572
"""Open an object store.
552
574
:param transport: Transport to open data from
554
576
super(TransportObjectStore, self).__init__()
577
self.pack_compression_level = pack_compression_level
578
self.loose_compression_level = loose_compression_level
555
579
self.transport = transport
556
580
self.pack_transport = self.transport.clone(PACKDIR)
557
581
self._alternates = None
584
def from_config(cls, path, config):
586
default_compression_level = int(config.get(
587
(b'core', ), b'compression').decode())
589
default_compression_level = -1
591
loose_compression_level = int(config.get(
592
(b'core', ), b'looseCompression').decode())
594
loose_compression_level = default_compression_level
596
pack_compression_level = int(config.get(
597
(b'core', ), 'packCompression').decode())
599
pack_compression_level = default_compression_level
600
return cls(path, loose_compression_level, pack_compression_level)
559
602
def __eq__(self, other):
560
603
if not isinstance(other, TransportObjectStore):
688
731
path = urlutils.quote_from_bytes(osutils.pathjoin(dir, file))
689
732
if self.transport.has(path):
690
733
return # Already there, no need to write again
691
self.transport.put_bytes(path, obj.as_legacy_object())
734
# Backwards compatibility with Dulwich < 0.20, which doesn't support
735
# the compression_level parameter.
736
if self.loose_compression_level not in (-1, None):
737
raw_string = obj.as_legacy_object(
738
compression_level=self.loose_compression_level)
740
raw_string = obj.as_legacy_object()
741
self.transport.put_bytes(path, raw_string)
693
743
def move_in_pack(self, f):
694
744
"""Move a specific file containing a pack into the pack directory.