424
424
_mod_transport.get_transport_from_path(commondir)
426
426
self._commontransport = self._controltransport
427
object_store = TransportObjectStore(
428
self._commontransport.clone(OBJECTDIR))
427
config = self.get_config()
428
object_store = TransportObjectStore.from_config(
429
self._commontransport.clone(OBJECTDIR),
429
431
if refs_text is not None:
430
432
refs_container = InfoRefsContainer(BytesIO(refs_text))
512
514
backends.extend(StackedConfig.default_backends())
513
515
return StackedConfig(backends, writable=writable)
517
# Here for compatibility with dulwich < 0.19.17
518
def generate_pack_data(self, have, want, progress=None, ofs_delta=None):
519
"""Generate pack data objects for a set of wants/haves.
522
have: List of SHA1s of objects that should not be sent
523
want: List of SHA1s of objects that should be sent
524
ofs_delta: Whether OFS deltas can be included
525
progress: Optional progress reporting method
527
shallow = self.get_shallow()
529
return self.object_store.generate_pack_data(
530
have, want, shallow=shallow,
531
progress=progress, ofs_delta=ofs_delta)
533
return self.object_store.generate_pack_data(
534
have, want, progress=progress, ofs_delta=ofs_delta)
515
536
def __repr__(self):
516
537
return "<%s for %r>" % (self.__class__.__name__, self.transport)
544
565
class TransportObjectStore(PackBasedObjectStore):
545
566
"""Git-style object store that exists on disk."""
547
def __init__(self, transport):
568
def __init__(self, transport,
569
loose_compression_level=-1, pack_compression_level=-1):
548
570
"""Open an object store.
550
572
:param transport: Transport to open data from
552
574
super(TransportObjectStore, self).__init__()
575
self.pack_compression_level = pack_compression_level
576
self.loose_compression_level = loose_compression_level
553
577
self.transport = transport
554
578
self.pack_transport = self.transport.clone(PACKDIR)
555
579
self._alternates = None
582
def from_config(cls, path, config):
584
default_compression_level = int(config.get(
585
(b'core', ), b'compression').decode())
587
default_compression_level = -1
589
loose_compression_level = int(config.get(
590
(b'core', ), b'looseCompression').decode())
592
loose_compression_level = default_compression_level
594
pack_compression_level = int(config.get(
595
(b'core', ), 'packCompression').decode())
597
pack_compression_level = default_compression_level
598
return cls(path, loose_compression_level, pack_compression_level)
557
600
def __eq__(self, other):
558
601
if not isinstance(other, TransportObjectStore):
686
729
path = urlutils.quote_from_bytes(osutils.pathjoin(dir, file))
687
730
if self.transport.has(path):
688
731
return # Already there, no need to write again
689
self.transport.put_bytes(path, obj.as_legacy_object())
732
# Backwards compatibility with Dulwich < 0.20, which doesn't support
733
# the compression_level parameter.
734
if self.loose_compression_level not in (-1, None):
735
raw_string = obj.as_legacy_object(
736
compression_level=self.loose_compression_level)
738
raw_string = obj.as_legacy_object()
739
self.transport.put_bytes(path, raw_string)
691
741
def move_in_pack(self, f):
692
742
"""Move a specific file containing a pack into the pack directory.