summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorVicent Marti <tanoku@gmail.com>2013-04-07 07:22:38 +0200
committerVicent Marti <tanoku@gmail.com>2013-04-07 07:22:38 +0200
commitd9ecaf8c6f2d2d538319174e42e5c98585c902e5 (patch)
treeae3d0bee5061af1bf35fbda34f2afc2757365ee2 /examples
parent2274483727b62ae155d7206668713d5346756de6 (diff)
parent2e2332857d26c7dbed3e4b940bb571da348bb5c7 (diff)
downloadlibgit2-d9ecaf8c6f2d2d538319174e42e5c98585c902e5.tar.gz
Merge remote-tracking branch 'gnprice/revwalk' into development
Diffstat (limited to 'examples')
-rw-r--r--examples/.gitignore1
-rw-r--r--examples/rev-list.c116
-rwxr-xr-xexamples/test/test-rev-list.sh95
3 files changed, 212 insertions, 0 deletions
diff --git a/examples/.gitignore b/examples/.gitignore
index e40bfc29f..e8e0820a5 100644
--- a/examples/.gitignore
+++ b/examples/.gitignore
@@ -1,4 +1,5 @@
general
showindex
diff
+rev-list
*.dSYM
diff --git a/examples/rev-list.c b/examples/rev-list.c
new file mode 100644
index 000000000..b7e466f9e
--- /dev/null
+++ b/examples/rev-list.c
@@ -0,0 +1,116 @@
+#include <stdio.h>
+#include <string.h>
+
+#include <git2.h>
+
+static void check_error(int error_code, const char *action)
+{
+ if (!error_code)
+ return;
+
+ const git_error *error = giterr_last();
+ fprintf(stderr, "Error %d %s: %s\n", -error_code, action,
+ (error && error->message) ? error->message : "???");
+ exit(1);
+}
+
+static int push_commit(git_revwalk *walk, git_object *obj, int hide)
+{
+ if (hide)
+ return git_revwalk_hide(walk, git_object_id(obj));
+ else
+ return git_revwalk_push(walk, git_object_id(obj));
+}
+
+static int push_spec(git_repository *repo, git_revwalk *walk, const char *spec, int hide)
+{
+ int error;
+ git_object *obj;
+
+ if ((error = git_revparse_single(&obj, repo, spec)))
+ return error;
+ return push_commit(walk, obj, hide);
+}
+
+static int push_range(git_repository *repo, git_revwalk *walk, const char *range, int hide)
+{
+ git_object *left, *right;
+ int threedots;
+ int error = 0;
+
+ if ((error = git_revparse_rangelike(&left, &right, &threedots, repo, range)))
+ return error;
+ if (threedots) {
+ /* TODO: support "<commit>...<commit>" */
+ return GIT_EINVALIDSPEC;
+ }
+
+ if ((error = push_commit(walk, left, !hide)))
+ goto out;
+ error = push_commit(walk, right, hide);
+
+ out:
+ git_object_free(left);
+ git_object_free(right);
+ return error;
+}
+
+static int revwalk_parseopts(git_repository *repo, git_revwalk *walk, int nopts, const char *const *opts)
+{
+ int hide, i, error;
+ unsigned int sorting = GIT_SORT_NONE;
+
+ hide = 0;
+ for (i = 0; i < nopts; i++) {
+ if (!strcmp(opts[i], "--topo-order")) {
+ sorting = GIT_SORT_TOPOLOGICAL | (sorting & GIT_SORT_REVERSE);
+ git_revwalk_sorting(walk, sorting);
+ } else if (!strcmp(opts[i], "--date-order")) {
+ sorting = GIT_SORT_TIME | (sorting & GIT_SORT_REVERSE);
+ git_revwalk_sorting(walk, sorting);
+ } else if (!strcmp(opts[i], "--reverse")) {
+ sorting = (sorting & ~GIT_SORT_REVERSE)
+ | ((sorting & GIT_SORT_REVERSE) ? 0 : GIT_SORT_REVERSE);
+ git_revwalk_sorting(walk, sorting);
+ } else if (!strcmp(opts[i], "--not")) {
+ hide = !hide;
+ } else if (opts[i][0] == '^') {
+ if ((error = push_spec(repo, walk, opts[i] + 1, !hide)))
+ return error;
+ } else if (strstr(opts[i], "..")) {
+ if ((error = push_range(repo, walk, opts[i], hide)))
+ return error;
+ } else {
+ if ((error = push_spec(repo, walk, opts[i], hide)))
+ return error;
+ }
+ }
+
+ return 0;
+}
+
+int main (int argc, char **argv)
+{
+ int error;
+ git_repository *repo;
+ git_revwalk *walk;
+ git_oid oid;
+ char buf[41];
+
+ error = git_repository_open_ext(&repo, ".", 0, NULL);
+ check_error(error, "opening repository");
+
+ error = git_revwalk_new(&walk, repo);
+ check_error(error, "allocating revwalk");
+ error = revwalk_parseopts(repo, walk, argc-1, argv+1);
+ check_error(error, "parsing options");
+
+ while (!git_revwalk_next(&oid, walk)) {
+ git_oid_fmt(buf, &oid);
+ buf[40] = '\0';
+ printf("%s\n", buf);
+ }
+
+ return 0;
+}
+
diff --git a/examples/test/test-rev-list.sh b/examples/test/test-rev-list.sh
new file mode 100755
index 000000000..bc0eea7cf
--- /dev/null
+++ b/examples/test/test-rev-list.sh
@@ -0,0 +1,95 @@
+#!/bin/bash
+
+THIS_FILE="$(readlink -f "$0")"
+ROOT="$(dirname "$(dirname "$(dirname "$THIS_FILE")")")"
+PROGRAM="$ROOT"/examples/rev-list
+LIBDIR="$ROOT"/build
+REPO="$ROOT"/tests-clar/resources/testrepo.git
+
+cd "$REPO"
+
+run () {
+ LD_LIBRARY_PATH="$LIBDIR" "$PROGRAM" "$@"
+}
+
+diff -u - <(run --date-order a4a7dce) <<EOF
+a4a7dce85cf63874e984719f4fdd239f5145052f
+c47800c7266a2be04c571c04d5a6614691ea99bd
+9fd738e8f7967c078dceed8190330fc8648ee56a
+4a202b346bb0fb0db7eff3cffeb3c70babbd2045
+5b5b025afb0b4c913b4c338a42934a3863bf3644
+8496071c1b46c854b31185ea97743be6a8774479
+EOF
+
+out="$(run --topo-order a4a7dce)"
+diff -q - <(echo -n "$out") <<EOF >/dev/null ||
+a4a7dce85cf63874e984719f4fdd239f5145052f
+c47800c7266a2be04c571c04d5a6614691ea99bd
+9fd738e8f7967c078dceed8190330fc8648ee56a
+4a202b346bb0fb0db7eff3cffeb3c70babbd2045
+5b5b025afb0b4c913b4c338a42934a3863bf3644
+8496071c1b46c854b31185ea97743be6a8774479
+EOF
+diff -u - <(echo "$out") <<EOF
+a4a7dce85cf63874e984719f4fdd239f5145052f
+9fd738e8f7967c078dceed8190330fc8648ee56a
+4a202b346bb0fb0db7eff3cffeb3c70babbd2045
+c47800c7266a2be04c571c04d5a6614691ea99bd
+5b5b025afb0b4c913b4c338a42934a3863bf3644
+8496071c1b46c854b31185ea97743be6a8774479
+EOF
+
+diff -u - <(run --date-order --reverse a4a7dce) <<EOF
+8496071c1b46c854b31185ea97743be6a8774479
+5b5b025afb0b4c913b4c338a42934a3863bf3644
+4a202b346bb0fb0db7eff3cffeb3c70babbd2045
+9fd738e8f7967c078dceed8190330fc8648ee56a
+c47800c7266a2be04c571c04d5a6614691ea99bd
+a4a7dce85cf63874e984719f4fdd239f5145052f
+EOF
+
+out=$(run --topo-order --reverse a4a7dce)
+diff -q - <(echo -n "$out") <<EOF >/dev/null ||
+8496071c1b46c854b31185ea97743be6a8774479
+5b5b025afb0b4c913b4c338a42934a3863bf3644
+4a202b346bb0fb0db7eff3cffeb3c70babbd2045
+9fd738e8f7967c078dceed8190330fc8648ee56a
+c47800c7266a2be04c571c04d5a6614691ea99bd
+a4a7dce85cf63874e984719f4fdd239f5145052f
+EOF
+diff -u - <(echo "$out") <<EOF
+8496071c1b46c854b31185ea97743be6a8774479
+5b5b025afb0b4c913b4c338a42934a3863bf3644
+c47800c7266a2be04c571c04d5a6614691ea99bd
+4a202b346bb0fb0db7eff3cffeb3c70babbd2045
+9fd738e8f7967c078dceed8190330fc8648ee56a
+a4a7dce85cf63874e984719f4fdd239f5145052f
+EOF
+
+out="$(run --date-order --topo-order --reverse --reverse a4a7dce)"
+diff -q - <(echo -n "$out") <<EOF >/dev/null ||
+a4a7dce85cf63874e984719f4fdd239f5145052f
+c47800c7266a2be04c571c04d5a6614691ea99bd
+9fd738e8f7967c078dceed8190330fc8648ee56a
+4a202b346bb0fb0db7eff3cffeb3c70babbd2045
+5b5b025afb0b4c913b4c338a42934a3863bf3644
+8496071c1b46c854b31185ea97743be6a8774479
+EOF
+diff -u - <(echo "$out") <<EOF
+a4a7dce85cf63874e984719f4fdd239f5145052f
+9fd738e8f7967c078dceed8190330fc8648ee56a
+4a202b346bb0fb0db7eff3cffeb3c70babbd2045
+c47800c7266a2be04c571c04d5a6614691ea99bd
+5b5b025afb0b4c913b4c338a42934a3863bf3644
+8496071c1b46c854b31185ea97743be6a8774479
+EOF
+
+diff -u - <(run ^9fd738e~2 9fd738e) <<EOF
+9fd738e8f7967c078dceed8190330fc8648ee56a
+4a202b346bb0fb0db7eff3cffeb3c70babbd2045
+EOF
+
+diff -u - <(run --not 9fd738e..9fd738e~2) <<EOF
+9fd738e8f7967c078dceed8190330fc8648ee56a
+4a202b346bb0fb0db7eff3cffeb3c70babbd2045
+EOF