mirror of
				https://git.proxmox.com/git/libgit2
				synced 2025-11-04 01:08:41 +00:00 
			
		
		
		
	Reorganize rev-parse example
This commit is contained in:
		
							parent
							
								
									784b3abbd5
								
							
						
					
					
						commit
						b9d02460f1
					
				@ -1,17 +1,37 @@
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <git2.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) the libgit2 contributors. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of libgit2, distributed under the GNU GPL v2 with
 | 
			
		||||
 * a Linking Exception. For full terms see the included COPYING file.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static void check(int error, const char *message, const char *arg)
 | 
			
		||||
#include "common.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Forward declarations for helpers */
 | 
			
		||||
struct parse_state {
 | 
			
		||||
	git_repository *repo;
 | 
			
		||||
	const char *repodir;
 | 
			
		||||
	const char *spec;
 | 
			
		||||
	int not;
 | 
			
		||||
};
 | 
			
		||||
static void parse_opts(struct parse_state *ps, int argc, char *argv[]);
 | 
			
		||||
static int parse_revision(struct parse_state *ps);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int main(int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
	if (!error)
 | 
			
		||||
		return;
 | 
			
		||||
	if (arg)
 | 
			
		||||
		fprintf(stderr, "%s %s (%d)\n", message, arg, error);
 | 
			
		||||
	else
 | 
			
		||||
		fprintf(stderr, "%s(%d)\n", message, error);
 | 
			
		||||
	exit(1);
 | 
			
		||||
	struct parse_state ps = {0};
 | 
			
		||||
 | 
			
		||||
	git_threads_init();
 | 
			
		||||
	parse_opts(&ps, argc, argv);
 | 
			
		||||
 | 
			
		||||
	check_lg2(parse_revision(&ps), "Parsing", NULL);
 | 
			
		||||
 | 
			
		||||
	git_repository_free(ps.repo);
 | 
			
		||||
	git_threads_shutdown();
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void usage(const char *message, const char *arg)
 | 
			
		||||
@ -24,13 +44,25 @@ static void usage(const char *message, const char *arg)
 | 
			
		||||
	exit(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct parse_state {
 | 
			
		||||
	git_repository *repo;
 | 
			
		||||
	const char *repodir;
 | 
			
		||||
	int not;
 | 
			
		||||
};
 | 
			
		||||
static void parse_opts(struct parse_state *ps, int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
	struct args_info args = ARGS_INFO_INIT;
 | 
			
		||||
 | 
			
		||||
static int parse_revision(struct parse_state *ps, const char *revstr)
 | 
			
		||||
	for (args.pos=1; args.pos < argc; ++args.pos) {
 | 
			
		||||
		const char *a = argv[args.pos];
 | 
			
		||||
 | 
			
		||||
		if (a[0] != '-') {
 | 
			
		||||
			if (ps->spec)
 | 
			
		||||
				usage("Too many specs", a);
 | 
			
		||||
			ps->spec = a;
 | 
			
		||||
		} else if (!strcmp(a, "--not"))
 | 
			
		||||
			ps->not = !ps->not;
 | 
			
		||||
		else if (!match_str_arg(&ps->repodir, &args, "--git-dir"))
 | 
			
		||||
			usage("Cannot handle argument", a);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int parse_revision(struct parse_state *ps)
 | 
			
		||||
{
 | 
			
		||||
	git_revspec rs;
 | 
			
		||||
	char str[GIT_OID_HEXSZ + 1];
 | 
			
		||||
@ -38,11 +70,11 @@ static int parse_revision(struct parse_state *ps, const char *revstr)
 | 
			
		||||
	if (!ps->repo) {
 | 
			
		||||
		if (!ps->repodir)
 | 
			
		||||
			ps->repodir = ".";
 | 
			
		||||
		check(git_repository_open_ext(&ps->repo, ps->repodir, 0, NULL),
 | 
			
		||||
		check_lg2(git_repository_open_ext(&ps->repo, ps->repodir, 0, NULL),
 | 
			
		||||
			"Could not open repository from", ps->repodir);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	check(git_revparse(&rs, ps->repo, revstr), "Could not parse", revstr);
 | 
			
		||||
	check_lg2(git_revparse(&rs, ps->repo, ps->spec), "Could not parse", ps->spec);
 | 
			
		||||
 | 
			
		||||
	if ((rs.flags & GIT_REVPARSE_SINGLE) != 0) {
 | 
			
		||||
		git_oid_tostr(str, sizeof(str), git_object_id(rs.from));
 | 
			
		||||
@ -56,9 +88,9 @@ static int parse_revision(struct parse_state *ps, const char *revstr)
 | 
			
		||||
 | 
			
		||||
		if ((rs.flags & GIT_REVPARSE_MERGE_BASE) != 0) {
 | 
			
		||||
			git_oid base;
 | 
			
		||||
			check(git_merge_base(&base, ps->repo,
 | 
			
		||||
				git_object_id(rs.from), git_object_id(rs.to)),
 | 
			
		||||
				"Could not find merge base", revstr);
 | 
			
		||||
			check_lg2(git_merge_base(&base, ps->repo,
 | 
			
		||||
						git_object_id(rs.from), git_object_id(rs.to)),
 | 
			
		||||
					"Could not find merge base", ps->spec);
 | 
			
		||||
 | 
			
		||||
			git_oid_tostr(str, sizeof(str), &base);
 | 
			
		||||
			printf("%s\n", str);
 | 
			
		||||
@ -69,38 +101,9 @@ static int parse_revision(struct parse_state *ps, const char *revstr)
 | 
			
		||||
		git_object_free(rs.from);
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
		check(0, "Invalid results from git_revparse", revstr);
 | 
			
		||||
		fatal("Invalid results from git_revparse", ps->spec);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
	int i;
 | 
			
		||||
	char *a;
 | 
			
		||||
	struct parse_state ps;
 | 
			
		||||
 | 
			
		||||
	git_threads_init();
 | 
			
		||||
 | 
			
		||||
	memset(&ps, 0, sizeof(ps));
 | 
			
		||||
 | 
			
		||||
	for (i = 1; i < argc; ++i) {
 | 
			
		||||
		a = argv[i];
 | 
			
		||||
 | 
			
		||||
		if (a[0] != '-') {
 | 
			
		||||
			if (parse_revision(&ps, a) != 0)
 | 
			
		||||
				break;
 | 
			
		||||
		} else if (!strcmp(a, "--not"))
 | 
			
		||||
			ps.not = !ps.not;
 | 
			
		||||
		else if (!strncmp(a, "--git-dir=", strlen("--git-dir=")))
 | 
			
		||||
			ps.repodir = a + strlen("--git-dir=");
 | 
			
		||||
		else
 | 
			
		||||
			usage("Cannot handle argument", a);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	git_repository_free(ps.repo);
 | 
			
		||||
	git_threads_shutdown();
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user