Blame examples/rev-list.c

Packit Service 20376f
/*
Packit Service 20376f
 * libgit2 "rev-list" example - shows how to transform a rev-spec into a list
Packit Service 20376f
 * of commit ids
Packit Service 20376f
 *
Packit Service 20376f
 * Written by the libgit2 contributors
Packit Service 20376f
 *
Packit Service 20376f
 * To the extent possible under law, the author(s) have dedicated all copyright
Packit Service 20376f
 * and related and neighboring rights to this software to the public domain
Packit Service 20376f
 * worldwide. This software is distributed without any warranty.
Packit Service 20376f
 *
Packit Service 20376f
 * You should have received a copy of the CC0 Public Domain Dedication along
Packit Service 20376f
 * with this software. If not, see
Packit Service 20376f
 * <http://creativecommons.org/publicdomain/zero/1.0/>.
Packit Service 20376f
 */
Packit Service 20376f
Packit Service 20376f
#include "common.h"
Packit Service 20376f
Packit Service 20376f
static int revwalk_parseopts(git_repository *repo, git_revwalk *walk, int nopts, char **opts);
Packit Service 20376f
Packit Service 20376f
int main (int argc, char **argv)
Packit Service 20376f
{
Packit Service 20376f
	git_repository *repo;
Packit Service 20376f
	git_revwalk *walk;
Packit Service 20376f
	git_oid oid;
Packit Service 20376f
	char buf[GIT_OID_HEXSZ+1];
Packit Service 20376f
Packit Service 20376f
	git_libgit2_init();
Packit Service 20376f
Packit Service 20376f
	check_lg2(git_repository_open_ext(&repo, ".", 0, NULL), "opening repository", NULL);
Packit Service 20376f
	check_lg2(git_revwalk_new(&walk, repo), "allocating revwalk", NULL);
Packit Service 20376f
	check_lg2(revwalk_parseopts(repo, walk, argc-1, argv+1), "parsing options", NULL);
Packit Service 20376f
Packit Service 20376f
	while (!git_revwalk_next(&oid, walk)) {
Packit Service 20376f
		git_oid_fmt(buf, &oid;;
Packit Service 20376f
		buf[GIT_OID_HEXSZ] = '\0';
Packit Service 20376f
		printf("%s\n", buf);
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	git_libgit2_shutdown();
Packit Service 20376f
	return 0;
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
static int push_commit(git_revwalk *walk, const git_oid *oid, int hide)
Packit Service 20376f
{
Packit Service 20376f
	if (hide)
Packit Service 20376f
		return git_revwalk_hide(walk, oid);
Packit Service 20376f
	else
Packit Service 20376f
		return git_revwalk_push(walk, oid);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
static int push_spec(git_repository *repo, git_revwalk *walk, const char *spec, int hide)
Packit Service 20376f
{
Packit Service 20376f
	int error;
Packit Service 20376f
	git_object *obj;
Packit Service 20376f
Packit Service 20376f
	if ((error = git_revparse_single(&obj, repo, spec)) < 0)
Packit Service 20376f
		return error;
Packit Service 20376f
Packit Service 20376f
	error = push_commit(walk, git_object_id(obj), hide);
Packit Service 20376f
	git_object_free(obj);
Packit Service 20376f
	return error;
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
static int push_range(git_repository *repo, git_revwalk *walk, const char *range, int hide)
Packit Service 20376f
{
Packit Service 20376f
	git_revspec revspec;
Packit Service 20376f
	int error = 0;
Packit Service 20376f
Packit Service 20376f
	if ((error = git_revparse(&revspec, repo, range)))
Packit Service 20376f
		return error;
Packit Service 20376f
Packit Service 20376f
	if (revspec.flags & GIT_REVPARSE_MERGE_BASE) {
Packit Service 20376f
		/* TODO: support "<commit>...<commit>" */
Packit Service 20376f
		return GIT_EINVALIDSPEC;
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	if ((error = push_commit(walk, git_object_id(revspec.from), !hide)))
Packit Service 20376f
		goto out;
Packit Service 20376f
Packit Service 20376f
	error = push_commit(walk, git_object_id(revspec.to), hide);
Packit Service 20376f
Packit Service 20376f
out:
Packit Service 20376f
	git_object_free(revspec.from);
Packit Service 20376f
	git_object_free(revspec.to);
Packit Service 20376f
	return error;
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
static int revwalk_parseopts(git_repository *repo, git_revwalk *walk, int nopts, char **opts)
Packit Service 20376f
{
Packit Service 20376f
	int hide, i, error;
Packit Service 20376f
	unsigned int sorting = GIT_SORT_NONE;
Packit Service 20376f
Packit Service 20376f
	hide = 0;
Packit Service 20376f
	for (i = 0; i < nopts; i++) {
Packit Service 20376f
		if (!strcmp(opts[i], "--topo-order")) {
Packit Service 20376f
			sorting = GIT_SORT_TOPOLOGICAL | (sorting & GIT_SORT_REVERSE);
Packit Service 20376f
			git_revwalk_sorting(walk, sorting);
Packit Service 20376f
		} else if (!strcmp(opts[i], "--date-order")) {
Packit Service 20376f
			sorting = GIT_SORT_TIME | (sorting & GIT_SORT_REVERSE);
Packit Service 20376f
			git_revwalk_sorting(walk, sorting);
Packit Service 20376f
		} else if (!strcmp(opts[i], "--reverse")) {
Packit Service 20376f
			sorting = (sorting & ~GIT_SORT_REVERSE)
Packit Service 20376f
			    | ((sorting & GIT_SORT_REVERSE) ? 0 : GIT_SORT_REVERSE);
Packit Service 20376f
			git_revwalk_sorting(walk, sorting);
Packit Service 20376f
		} else if (!strcmp(opts[i], "--not")) {
Packit Service 20376f
			hide = !hide;
Packit Service 20376f
		} else if (opts[i][0] == '^') {
Packit Service 20376f
			if ((error = push_spec(repo, walk, opts[i] + 1, !hide)))
Packit Service 20376f
				return error;
Packit Service 20376f
		} else if (strstr(opts[i], "..")) {
Packit Service 20376f
			if ((error = push_range(repo, walk, opts[i], hide)))
Packit Service 20376f
				return error;
Packit Service 20376f
		} else {
Packit Service 20376f
			if ((error = push_spec(repo, walk, opts[i], hide)))
Packit Service 20376f
				return error;
Packit Service 20376f
		}
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	return 0;
Packit Service 20376f
}
Packit Service 20376f