From 56ec2256f24eb43b09351194d02cd8458ff39708 Mon Sep 17 00:00:00 2001 From: Jeff King Date: Thu, 8 May 2014 01:06:38 -0400 Subject: [PATCH] examples: add a basic for-each-ref example This is quite close to running "git for-each-ref" except: 1. It does not take any formatting or selection options at all. 2. The output is not sorted. I wrote it to look at debugging some issues with ref iteration, but there's no reason it can't live on as an example command. --- examples/.gitignore | 1 + examples/Makefile | 1 + examples/for-each-ref.c | 46 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 examples/for-each-ref.c diff --git a/examples/.gitignore b/examples/.gitignore index b652e28b5..083c8835e 100644 --- a/examples/.gitignore +++ b/examples/.gitignore @@ -9,4 +9,5 @@ log rev-parse status tag +for-each-ref *.dSYM diff --git a/examples/Makefile b/examples/Makefile index e866b7fee..11b019984 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -4,6 +4,7 @@ CC = gcc CFLAGS = -g -I../include -I../src -Wall -Wextra -Wmissing-prototypes -Wno-missing-field-initializers LFLAGS = -L../build -lgit2 -lz APPS = general showindex diff rev-list cat-file status log rev-parse init blame tag +APPS += for-each-ref all: $(APPS) diff --git a/examples/for-each-ref.c b/examples/for-each-ref.c new file mode 100644 index 000000000..d6846bb0d --- /dev/null +++ b/examples/for-each-ref.c @@ -0,0 +1,46 @@ +#include +#include +#include "common.h" + +static int show_ref(git_reference *ref, void *data) +{ + git_repository *repo = data; + git_reference *resolved = NULL; + char hex[GIT_OID_HEXSZ+1]; + const git_oid *oid; + git_object *obj; + + if (git_reference_type(ref) == GIT_REF_SYMBOLIC) + check_lg2(git_reference_resolve(&resolved, ref), + "Unable to resolve symbolic reference", + git_reference_name(ref)); + + oid = git_reference_target(resolved ? resolved : ref); + git_oid_fmt(hex, oid); + hex[GIT_OID_HEXSZ] = 0; + check_lg2(git_object_lookup(&obj, repo, oid, GIT_OBJ_ANY), + "Unable to lookup object", hex); + + printf("%s %-6s\t%s\n", + hex, + git_object_type2string(git_object_type(obj)), + git_reference_name(ref)); + + if (resolved) + git_reference_free(resolved); + return 0; +} + +int main(int argc, char **argv) +{ + git_repository *repo; + + if (argc != 1 || argv[1] /* silence -Wunused-parameter */) + fatal("Sorry, no for-each-ref options supported yet", NULL); + + check_lg2(git_repository_open(&repo, "."), + "Could not open repository", NULL); + check_lg2(git_reference_foreach(repo, show_ref, repo), + "Could not iterate over references", NULL); + return 0; +}