mirror of
https://git.proxmox.com/git/libgit2
synced 2026-08-26 18:40:39 +00:00
Merge remote-tracking branch 'gnprice/revwalk' into development
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
general
|
||||
showindex
|
||||
diff
|
||||
rev-list
|
||||
*.dSYM
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Executable
+95
@@ -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
|
||||
Reference in New Issue
Block a user