mirror of
https://github.com/bottlesdevs/Bottles.git
synced 2026-10-18 07:01:31 +08:00
71 lines
2.0 KiB
Python
71 lines
2.0 KiB
Python
import os
|
|
import hashlib
|
|
|
|
|
|
class Diff:
|
|
"""
|
|
This class is no more used by the application, it's just a
|
|
reference for future implementations.
|
|
"""
|
|
|
|
__ignored = ["dosdevices", "users", "bottle.yml", "storage"]
|
|
|
|
@staticmethod
|
|
def hashify(path: str) -> dict:
|
|
"""
|
|
Hash (SHA-1) all files in a directory and return
|
|
them in a dictionary. Here we use SHA-1 instead of
|
|
better ones like SHA-256 because we only need to
|
|
compare the file hashes, it's faster, and it's
|
|
not a security risk.
|
|
"""
|
|
_files = {}
|
|
|
|
if path[-1] != os.sep:
|
|
"""
|
|
Be sure to add a trailing slash at the end of the path to
|
|
prevent the correct path name in the result.
|
|
"""
|
|
path += os.sep
|
|
|
|
for root, dirs, files in os.walk(path):
|
|
dirs[:] = [d for d in dirs if d not in Diff.__ignored]
|
|
for f in files:
|
|
if f in Diff.__ignored:
|
|
continue
|
|
with open(os.path.join(root, f), "rb") as fr:
|
|
_hash = hashlib.sha1(fr.read()).hexdigest()
|
|
|
|
_key = os.path.join(root, f)
|
|
_key = _key.replace(path, "")
|
|
_files[_key] = _hash
|
|
|
|
return _files
|
|
|
|
@staticmethod
|
|
def file_hashify(path: str) -> str:
|
|
"""Hash (SHA-1) a file and return it."""
|
|
with open(path, "rb") as fr:
|
|
_hash = hashlib.sha1(fr.read()).hexdigest()
|
|
|
|
return _hash
|
|
|
|
@staticmethod
|
|
def compare(parent: dict, child: dict) -> dict:
|
|
"""
|
|
Compare two hashes dictionaries and return the
|
|
differences (added, removed, changed).
|
|
"""
|
|
|
|
added = []
|
|
changed = []
|
|
removed = [f for f in parent if f not in child]
|
|
|
|
for f in child:
|
|
if f not in parent:
|
|
added.append(f)
|
|
elif parent[f] != child[f]:
|
|
changed.append(f)
|
|
|
|
return {"added": added, "removed": removed, "changed": changed}
|