From aa8aaefe497533effb4011c6c9de5e65b0ad5c7b Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Sun, 14 Sep 2025 02:59:02 +0800 Subject: [PATCH] Add basic objects --- git/object.ha | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++ git/oid.ha | 8 ++++---- git/repo.ha | 3 +++ diff --git a/git/object.ha b/git/object.ha new file mode 100644 index 0000000000000000000000000000000000000000..04100a8d86e7b9d74c8fd16e39299166724f25e7 --- /dev/null +++ b/git/object.ha @@ -0,0 +1,64 @@ +export type blob = struct { + oid: oid, + data: []u8, +}; +export fn blob_finish(b: blob) void = { + free(b.data); +}; + +export type tree_entry = struct { + mode: u32, + name: []u8, + oid: oid, +}; +export fn tree_entry_finish(te: tree_entry) void = { + free(te.name); +}; + +export type tree = struct { + oid: oid, + entries: []tree_entry, +}; +export fn tree_finish(t: tree) void = { + for (let entry .. t.entries) { + tree_entry_finish(entry); + }; + free(t.entries); +}; + +export type person = struct { + name: []u8, + email: []u8, + when: i64, + ofs: i32, +}; +export fn person_finish(p: person) void = { + free(p.name); + free(p.email); +}; + +export type commit = struct { + oid: oid, + tree: oid, + parents: []oid, + author: person, + committer: person, + message: []u8, + // other raw headers? +}; +export fn commit_finish(c: commit) void = { + free(c.parents); + person_finish(c.author); + person_finish(c.committer); + free(c.message); +}; + +export type object = (blob | tree | commit); +export fn object_finish(o: object) void = { + match (o) { + case let b: blob => blob_finish(b); + case let t: tree => tree_finish(t); + case let c: commit => commit_finish(c); + }; +}; + diff --git a/git/oid.ha b/git/oid.ha index 3a6f98eab5e9d1c7c63bde5d3ce71e1bdf01983e..e8df1aaf5351d648c67cc72218ab8c93da58c00b 100644 --- a/git/oid.ha +++ b/git/oid.ha @@ -10,7 +10,7 @@ export fn parse_oid(s: const str) (oid | nomem | errors::invalid) = { const d = hex::decodestr(s)?; defer free(d); - let o: oid; + let o: oid = [0...]; o[..] = d[..]; return o; @@ -18,6 +18,6 @@ }; // Returns a hex-encoded string representation of the given [[oid]]. // The returned string is allocated on the heap and must be freed by the caller. -export fn oid_string(id: oid) const str { - return hex::encodestr(id); -} +export fn oid_string(id: oid) (const str | nomem) = { + return hex::encodestr(id)?; +}; diff --git a/git/repo.ha b/git/repo.ha new file mode 100644 index 0000000000000000000000000000000000000000..125fb17421814326a8215398f912374605bb1f0f --- /dev/null +++ b/git/repo.ha @@ -0,0 +1,3 @@ +export type repo = struct { + gitdir: str, +}; -- 2.48.1