summaryrefslogtreecommitdiffstats
path: root/examples/for-each-ref.c
diff options
context:
space:
mode:
Diffstat (limited to 'examples/for-each-ref.c')
-rw-r--r--examples/for-each-ref.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/examples/for-each-ref.c b/examples/for-each-ref.c
new file mode 100644
index 0000000..a070674
--- /dev/null
+++ b/examples/for-each-ref.c
@@ -0,0 +1,44 @@
+#include <git2.h>
+#include "common.h"
+
+static int show_ref(git_reference *ref, void *data)
+{
+ git_repository *repo = data;
+ git_reference *resolved = NULL;
+ char hex[GIT_OID_SHA1_HEXSIZE+1];
+ const git_oid *oid;
+ git_object *obj;
+
+ if (git_reference_type(ref) == GIT_REFERENCE_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_SHA1_HEXSIZE] = 0;
+ check_lg2(git_object_lookup(&obj, repo, oid, GIT_OBJECT_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 lg2_for_each_ref(git_repository *repo, int argc, char **argv)
+{
+ UNUSED(argv);
+
+ if (argc != 1)
+ fatal("Sorry, no for-each-ref options supported yet", NULL);
+
+ check_lg2(git_reference_foreach(repo, show_ref, repo),
+ "Could not iterate over references", NULL);
+
+ return 0;
+}