Lindenii Project Forge
Login

hare-git

WIP Git library for Hare
Commit info
ID
b1b744b33ab2e8c040ed75bfeb9f96bf4c0233c7
Author
Runxi Yu <me@runxiyu.org>
Author date
Sun, 14 Sep 2025 03:22:21 +0800
Committer
Runxi Yu <me@runxiyu.org>
Committer date
Sun, 14 Sep 2025 03:22:21 +0800
Actions
Split object.ha
export type blob = struct {
	oid: oid,
	data: []u8,
};
export fn blob_finish(b: blob) void = {
	free(b.data);
};

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 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 tree_entry = struct {
	mode: u32,
	name: []u8,
	oid: oid,
};
export fn tree_entry_finish(te: tree_entry) void = {
	free(te.name);
};
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);
	};
};

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);
};