diff --git a/ugit/cli.py b/ugit/cli.py index 56edbd8..6ffe1e1 100644 --- a/ugit/cli.py +++ b/ugit/cli.py @@ -43,4 +43,4 @@ def hash_object(args): def cat_file(args): sys.stdout.flush() - sys.stdout.buffer.write(data.get_object(args.object)) + sys.stdout.buffer.write(data.get_object(args.object), expected=None) diff --git a/ugit/data.py b/ugit/data.py index 756df6d..11a8c07 100644 --- a/ugit/data.py +++ b/ugit/data.py @@ -10,13 +10,21 @@ def init(): Path.mkdir(f"{GIT_DIR}/objects") -def hash_object(data): - oid = hashlib.sha1(data).hexdigest() +def hash_object(data, type_="blob"): + obj = type_.encode() + b"\x00" + data + oid = hashlib.sha1(obj).hexdigest() with open(f"{GIT_DIR}/objects/{oid}", "wb") as out: - out.write(data) + out.write(obj) return oid -def get_object(oid): +def get_object(oid, expected="blob"): with open(f"{GIT_DIR}/objects/{oid}", "rb") as f: - return f.read() + obj = f.read() + + type_, _, content = obj.partition(b"\x00") + type_ = type_.decode() + + if expected is not None: + assert type_ == expected, f"Expected {expected}, got {type_}" + return content