Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
return lo
# END if we have a match
# END if we found something
return None
if 'PackIndexFile_sha_to_index' in globals():
# NOTE: Its just about 25% faster, the major bottleneck might be the attr
# accesses
def sha_to_index(self, sha):
return PackIndexFile_sha_to_index(self, sha)
# END redefine heavy-hitter with c version
#} END properties
class PackFile(LazyMixin):
"""A pack is a file written according to the Version 2 for git packs
As we currently use memory maps, it could be assumed that the maximum size of
packs therefor is 32 bit on 32 bit systems. On 64 bit systems, this should be
fine though.
**Note:** at some point, this might be implemented using streams as well, or
streams are an alternate path in the case memory maps cannot be created
for some reason - one clearly doesn't want to read 10GB at once in that
case"""
__slots__ = ('_packpath', '_cursor', '_size', '_version')
pack_signature = 0x5041434b # 'PACK'
pack_version_default = 2
# END for each offset
# offset 64
for ofs in tmplist:
sha_write(pack(">Q", ofs))
# END for each offset
# trailer
assert(len(pack_sha) == 20)
sha_write(pack_sha)
sha = sha_writer.sha(as_hex=False)
write(sha)
return sha
class PackIndexFile(LazyMixin):
"""A pack index provides offsets into the corresponding pack, allowing to find
locations for offsets faster."""
# Dont use slots as we dynamically bind functions for each version, need a dict for this
# The slots you see here are just to keep track of our instance variables
# __slots__ = ('_indexpath', '_fanout_table', '_cursor', '_version',
# '_sha_list_offset', '_crc_list_offset', '_pack_offset', '_pack_64_offset')
# used in v2 indices
_sha_list_offset = 8 + 1024
index_v2_signature = b'\xfftOc'
index_version_default = 2
def __init__(self, indexpath):
super(PackIndexFile, self).__init__()
def _databases_recursive(database, output):
"""Fill output list with database from db, in order. Deals with Loose, Packed
and compound databases."""
if isinstance(database, CompoundDB):
dbs = database.databases()
output.extend(db for db in dbs if not isinstance(db, CompoundDB))
for cdb in (db for db in dbs if isinstance(db, CompoundDB)):
_databases_recursive(cdb, output)
else:
output.append(database)
# END handle database type
class CompoundDB(ObjectDBR, LazyMixin, CachingDB):
"""A database which delegates calls to sub-databases.
Databases are stored in the lazy-loaded _dbs attribute.
Define _set_cache_ to update it with your databases"""
def _set_cache_(self, attr):
if attr == '_dbs':
self._dbs = list()
elif attr == '_db_cache':
self._db_cache = dict()
else:
super(CompoundDB, self)._set_cache_(attr)
def _db_query(self, sha):
""":return: database containing the given 20 byte sha
import os
from symbolic import SymbolicReference
from head import HEAD
from gitdb.util import (
LazyMixin,
Iterable,
isfile,
hex_to_bin
)
__all__ = ["Reference"]
class Reference(SymbolicReference, LazyMixin, Iterable):
"""Represents a named reference to any object. Subclasses may apply restrictions though,
i.e. Heads can only point to commits."""
__slots__ = tuple()
_points_to_commits_only = False
_resolve_ref_on_create = True
_common_path_default = "refs"
def __init__(self, repo, path):
"""Initialize this instance
:param repo: Our parent repository
:param path:
Path relative to the .git/ directory pointing to the ref in question, i.e.
refs/heads/master"""
if not path.startswith(self._common_path_default+'/'):
raise ValueError("Cannot instantiate %r from path %s" % ( self.__class__.__name__, path ))
def stream_iter(self, start_offset=0):
"""
:return: iterator yielding OPackStream compatible instances, allowing
to access the data in the pack directly.
:param start_offset: offset to the first object to iterate. If 0, iteration
starts at the very first object in the pack.
**Note:** Iterating a pack directly is costly as the datastream has to be decompressed
to determine the bounds between the objects"""
return self._iter_objects(start_offset, as_stream=True)
#} END Read-Database like Interface
class PackEntity(LazyMixin):
"""Combines the PackIndexFile and the PackFile into one, allowing the
actual objects to be resolved and iterated"""
__slots__ = ('_index', # our index file
'_pack', # our pack file
'_offset_map' # on demand dict mapping one offset to the next consecutive one
)
IndexFileCls = PackIndexFile
PackFileCls = PackFile
def __init__(self, pack_or_index_path):
"""Initialize ourselves with the path to the respective pack or index file"""
basename, ext = os.path.splitext(pack_or_index_path)
self._index = self.IndexFileCls("%s.idx" % basename) # PackIndexFile instance
def _databases_recursive(database, output):
"""Fill output list with database from db, in order. Deals with Loose, Packed
and compound databases."""
if isinstance(database, CompoundDB):
compounds = list()
dbs = database.databases()
output.extend(db for db in dbs if not isinstance(db, CompoundDB))
for cdb in (db for db in dbs if isinstance(db, CompoundDB)):
_databases_recursive(cdb, output)
else:
output.append(database)
# END handle database type
class PureCompoundDB(CompoundDB, PureObjectDBR, LazyMixin, CachingDB):
def _set_cache_(self, attr):
if attr == '_dbs':
self._dbs = list()
elif attr == '_db_cache':
self._db_cache = dict()
else:
super(PureCompoundDB, self)._set_cache_(attr)
def _db_query(self, sha):
""":return: database containing the given 20 byte sha
:raise BadObject:"""
# most databases use binary representations, prevent converting
# it everytime a database is being queried
try:
return self._db_cache[sha]
except KeyError:
return lo
# END if we have a match
# END if we found something
return None
if 'PackIndexFile_sha_to_index' in globals():
# NOTE: Its just about 25% faster, the major bottleneck might be the attr
# accesses
def sha_to_index(self, sha):
return PackIndexFile_sha_to_index(self, sha)
# END redefine heavy-hitter with c version
#} END properties
class PackFile(LazyMixin):
"""A pack is a file written according to the Version 2 for git packs
As we currently use memory maps, it could be assumed that the maximum size of
packs therefor is 32 bit on 32 bit systems. On 64 bit systems, this should be
fine though.
**Note:** at some point, this might be implemented using streams as well, or
streams are an alternate path in the case memory maps cannot be created
for some reason - one clearly doesn't want to read 10GB at once in that
case"""
__slots__ = ('_packpath', '_cursor', '_size', '_version')
pack_signature = 0x5041434b # 'PACK'
pack_version_default = 2
# END for each offset
# offset 64
for ofs in tmplist:
sha_write(pack(">Q", ofs))
# END for each offset
# trailer
assert(len(pack_sha) == 20)
sha_write(pack_sha)
sha = sha_writer.sha(as_hex=False)
write(sha)
return sha
class PackIndexFile(LazyMixin):
"""A pack index provides offsets into the corresponding pack, allowing to find
locations for offsets faster."""
# Dont use slots as we dynamically bind functions for each version, need a dict for this
# The slots you see here are just to keep track of our instance variables
# __slots__ = ('_indexpath', '_fanout_table', '_cursor', '_version',
# '_sha_list_offset', '_crc_list_offset', '_pack_offset', '_pack_64_offset')
# used in v2 indices
_sha_list_offset = 8 + 1024
index_v2_signature = b'\xfftOc'
index_version_default = 2
def __init__(self, indexpath):
super(PackIndexFile, self).__init__()
AmbiguousObjectName
)
from gitdb.pack import PackEntity
from functools import reduce
import os
import glob
__all__ = ('PackedDB', )
#{ Utilities
class PackedDB(FileDBBase, ObjectDBR, CachingDB, LazyMixin):
"""A database operating on a set of object packs"""
# sort the priority list every N queries
# Higher values are better, performance tests don't show this has
# any effect, but it should have one
_sort_interval = 500
def __init__(self, root_path):
super(PackedDB, self).__init__(root_path)
# list of lists with three items:
# * hits - number of times the pack was hit with a request
# * entity - Pack entity instance
# * sha_to_index - PackIndexFile.sha_to_index method for direct cache query
# self._entities = list() # lazy loaded list
self._hit_count = 0 # amount of hits
hex_to_bin,
bin_to_hex,
dirname,
basename,
LazyMixin,
join_path_native,
stream_copy
)
from gitdb.typ import ObjectType
_assertion_msg_format = "Created object %r whose python type %r disagrees with the acutal git object type %r"
__all__ = ("Object", "IndexObject")
class Object(LazyMixin):
"""Implements an Object which may be Blobs, Trees, Commits and Tags"""
NULL_HEX_SHA = '0'*40
NULL_BIN_SHA = '\0'*20
TYPES = (ObjectType.blob, ObjectType.tree, ObjectType.commit, ObjectType.tag)
__slots__ = ("odb", "binsha", "size" )
type = None # to be set by subclass
type_id = None # to be set by subclass
def __init__(self, odb, binsha):
"""Initialize an object by identifying it by its binary sha.
All keyword arguments will be set on demand if None.
:param odb: repository this object is located in