mirror of https://github.com/peridotbuild/pv2.git
56 lines
1.5 KiB
Python
56 lines
1.5 KiB
Python
"""
|
|
File functions
|
|
"""
|
|
|
|
import os
|
|
import hashlib
|
|
from pv2.util import error as err
|
|
|
|
# File utilities
|
|
__all__ = [
|
|
'filter_files',
|
|
'get_checksum'
|
|
]
|
|
|
|
def filter_files(directory_path: str, filter_filename: str) -> list:
|
|
"""
|
|
Filter out specified files
|
|
"""
|
|
# it's literally 101/100 ...
|
|
# pylint: disable=line-too-long
|
|
return_list = []
|
|
for file in os.listdir(directory_path):
|
|
if filter_filename(file):
|
|
return_list.append(os.path.join(directory_path, file))
|
|
|
|
return return_list
|
|
|
|
def get_checksum(file_path: str, hashtype: str = 'sha256') -> str:
|
|
"""
|
|
Generates a checksum from the provided path by doing things in chunks. This
|
|
reduces the time needed to make the hashes and avoids memory issues.
|
|
|
|
Borrowed from empanadas with some modifications
|
|
"""
|
|
# We shouldn't be using sha1 or md5.
|
|
if hashtype in ('sha', 'sha1', 'md5'):
|
|
raise err.ProvidedValueError(f'{hashtype} is not allowed.')
|
|
|
|
try:
|
|
checksum = hashlib.new(hashtype)
|
|
except ValueError as exc:
|
|
raise err.GenericError(f'hash type not available: {ValueError}') from exc
|
|
|
|
try:
|
|
with open(file_path, 'rb') as input_file:
|
|
while True:
|
|
chunk = input_file.read(8192)
|
|
if not chunk:
|
|
break
|
|
checksum.update(chunk)
|
|
|
|
input_file.close()
|
|
return checksum.hexdigest()
|
|
except IOError as exc:
|
|
raise err.GenericError(f'Could not open or process file {file_path}: {exc})')
|