Lindenii Project Forge
Login

hare-git

Git library for Hare

Warning: Due to various recent migrations, viewing non-HEAD refs may be broken.

/git/walk.ha (raw)

use errors;
use fs;
use io;
use strconv;

// List recent commits starting from the given commit ID, following first
// parents only.
// TODO: Consider cases with merge commits.
export fn recent_commits(r: repo, start: oid, limit: int)
	([]commit | error) = {
	if (limit <= 0) {
		let empty: []commit = [];
		return empty;
	};

	let out: []commit = [];
	let cur = start;

	for (let n = 0; n < limit; n += 1) {
		match (read_object(r, cur)) {
		case let c: commit =>
			append(out, c)!;
			if (len(c.parents) == 0) {
				return out;
			};
			cur = c.parents[0];
		case let b: blob =>
			blob_finish(b);
			return errors::invalid;
		case let t: tree =>
			tree_finish(t);
			return errors::invalid;
		case let e: (fs::error | io::error | errors::invalid | strconv::invalid | strconv::overflow | nomem) =>
			return (e: error);
		};
	};

	return out;
};