예제 #1
0
    def is_valid_stream(self, sha, use_crc=False):
        """
		Verify that the stream at the given sha is valid.
		
		:param use_crc: if True, the index' crc is run over the compressed stream of 
			the object, which is much faster than checking the sha1. It is also
			more prone to unnoticed corruption or manipulation.
		:param sha: 20 byte sha1 of the object whose stream to verify
			whether the compressed stream of the object is valid. If it is 
			a delta, this only verifies that the delta's data is valid, not the 
			data of the actual undeltified object, as it depends on more than 
			just this stream.
			If False, the object will be decompressed and the sha generated. It must
			match the given sha
			
		:return: True if the stream is valid
		:raise UnsupportedOperation: If the index is version 1 only
		:raise BadObject: sha was not found"""
        if use_crc:
            if self._index.version() < 2:
                raise UnsupportedOperation(
                    "Version 1 indices do not contain crc's, verify by sha instead"
                )
            # END handle index version

            index = self._sha_to_index(sha)
            offset = self._index.offset(index)
            next_offset = self._offset_map[offset]
            crc_value = self._index.crc(index)

            # create the current crc value, on the compressed object data
            # Read it in chunks, without copying the data
            crc_update = zlib.crc32
            pack_data = self._pack.data()
            cur_pos = offset
            this_crc_value = 0
            while cur_pos < next_offset:
                rbound = min(cur_pos + chunk_size, next_offset)
                size = rbound - cur_pos
                this_crc_value = crc_update(buffer(pack_data, cur_pos, size),
                                            this_crc_value)
                cur_pos += size
            # END window size loop

            # crc returns signed 32 bit numbers, the AND op forces it into unsigned
            # mode ... wow, sneaky, from dulwich.
            return (this_crc_value & 0xffffffff) == crc_value
        else:
            shawriter = Sha1Writer()
            stream = self._object(sha, as_stream=True)
            # write a loose object, which is the basis for the sha
            write_object(stream.type, stream.size, stream.read,
                         shawriter.write)

            assert shawriter.sha(as_hex=False) == sha
            return shawriter.sha(as_hex=False) == sha
        # END handle crc/sha verification
        return True
예제 #2
0
    def abspath(self):
        """
        :return:
            Absolute path to this index object in the file system ( as opposed to the 
            .path field which is a path relative to the git repository ).

            The returned path will be native to the system and contains '\' on windows.
        :raise UnsupportedOperation: if underlying odb does not support the required method to obtain a working dir"""
        # TODO: Here we suddenly need something better than a plain object database
        # which indicates our odb should better be named repo !
        root = ''
        if isinstance(self.odb, RepositoryPathsMixin):
            root = self.odb.working_tree_dir
        else:
            raise UnsupportedOperation(
                "Cannot provide absolute path from a database without Repository path support"
            )
        # END handle odb type
        return join_path_native(root, self.path)
예제 #3
0
 def store_async(self, reader):
     raise UnsupportedOperation(
         "PureMemoryDBs cannot currently be used for async write access")
예제 #4
0
 def store(self, istream):
     """Storing individual objects is not feasible as a pack is designed to 
     hold multiple objects. Writing or rewriting packs for single objects is
     inefficient"""
     raise UnsupportedOperation()
예제 #5
0
 def set_ostream(self, stream):
     raise UnsupportedOperation("PureMemoryDB's always stream into memory")