summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVicent Marti <tanoku@gmail.com>2013-04-15 23:32:40 +0200
committerVicent Marti <tanoku@gmail.com>2013-04-15 23:32:40 +0200
commit36c2dfed696f80a20ca1352f32ec8b136b800c30 (patch)
tree99faf618d89ca3ee182331449df9ee5fd4b3c2f8
parentd064c74794f51e759cd84648f84f2609d3283ecc (diff)
downloadlibgit2-36c2dfed696f80a20ca1352f32ec8b136b800c30.tar.gz
Is this crazy?
-rw-r--r--include/git2/revparse.h14
-rw-r--r--src/revparse.c32
-rw-r--r--src/revwalk.c19
-rw-r--r--tests-clar/refs/revparse.c59
4 files changed, 60 insertions, 64 deletions
diff --git a/include/git2/revparse.h b/include/git2/revparse.h
index a992d2c48..3e334b4bb 100644
--- a/include/git2/revparse.h
+++ b/include/git2/revparse.h
@@ -44,8 +44,16 @@ typedef enum {
GIT_REVPARSE_RANGE = 1 << 1,
/** The spec used the '...' operator, which invokes special semantics. */
GIT_REVPARSE_MERGE_BASE = 1 << 2,
-} git_revparse_flag_t;
+} git_revparse_mode_t;
+/**
+ * Git Revision: output of a `git_revparse` operation
+ */
+typedef struct {
+ git_object *from;
+ git_object *to;
+ unsigned int flags;
+} git_revision;
/**
* Parse a revision string for left, right, and intent. See `man gitrevisions` or
@@ -64,9 +72,7 @@ typedef enum {
* @return 0 on success, GIT_INVALIDSPEC, GIT_ENOTFOUND, GIT_EAMBIGUOUS or an error code
*/
GIT_EXTERN(int) git_revparse(
- git_object **left,
- git_object **right,
- unsigned int *flags,
+ git_revision *revision,
git_repository *repo,
const char *spec);
diff --git a/src/revparse.c b/src/revparse.c
index d2c14ccbb..a4fedd27c 100644
--- a/src/revparse.c
+++ b/src/revparse.c
@@ -870,47 +870,43 @@ cleanup:
int git_revparse(
- git_object **left,
- git_object **right,
- unsigned int *flags,
- git_repository *repo,
- const char *spec)
+ git_revision *revision,
+ git_repository *repo,
+ const char *spec)
{
- unsigned int lflags = 0;
const char *dotdot;
int error = 0;
- assert(left && repo && spec);
+ assert(revision && repo && spec);
+
+ memset(revision, 0x0, sizeof(*revision));
if ((dotdot = strstr(spec, "..")) != NULL) {
char *lstr;
const char *rstr;
- lflags = GIT_REVPARSE_RANGE;
+ revision->flags = GIT_REVPARSE_RANGE;
- lstr = git__substrdup(spec, dotdot-spec);
+ lstr = git__substrdup(spec, dotdot - spec);
rstr = dotdot + 2;
if (dotdot[2] == '.') {
- lflags |= GIT_REVPARSE_MERGE_BASE;
+ revision->flags |= GIT_REVPARSE_MERGE_BASE;
rstr++;
}
- if ((error = git_revparse_single(left, repo, lstr)) < 0) {
+ if ((error = git_revparse_single(&revision->from, repo, lstr)) < 0) {
return error;
}
- if (right &&
- (error = git_revparse_single(right, repo, rstr)) < 0) {
+
+ if ((error = git_revparse_single(&revision->to, repo, rstr)) < 0) {
return error;
}
git__free((void*)lstr);
} else {
- lflags = GIT_REVPARSE_SINGLE;
- error = git_revparse_single(left, repo, spec);
+ revision->flags = GIT_REVPARSE_SINGLE;
+ error = git_revparse_single(&revision->from, repo, spec);
}
- if (flags)
- *flags = lflags;
-
return error;
}
diff --git a/src/revwalk.c b/src/revwalk.c
index 05e99c0b6..9e32198fc 100644
--- a/src/revwalk.c
+++ b/src/revwalk.c
@@ -231,25 +231,26 @@ int git_revwalk_push_ref(git_revwalk *walk, const char *refname)
int git_revwalk_push_range(git_revwalk *walk, const char *range)
{
- git_object *left, *right;
- git_revparse_flag_t revparseflags;
+ git_revision revision;
int error = 0;
- if ((error = git_revparse(&left, &right, &revparseflags, walk->repo, range)))
+ if ((error = git_revparse(&revision, walk->repo, range)))
return error;
- if (revparseflags & GIT_REVPARSE_MERGE_BASE) {
+
+ if (revision.flags & GIT_REVPARSE_MERGE_BASE) {
/* TODO: support "<commit>...<commit>" */
giterr_set(GITERR_INVALID, "Symmetric differences not implemented in revwalk");
return GIT_EINVALIDSPEC;
}
- if ((error = push_commit(walk, git_object_id(left), 1)))
+ if ((error = push_commit(walk, git_object_id(revision.from), 1)))
goto out;
- error = push_commit(walk, git_object_id(right), 0);
- out:
- git_object_free(left);
- git_object_free(right);
+ error = push_commit(walk, git_object_id(revision.to), 0);
+
+out:
+ git_object_free(revision.from);
+ git_object_free(revision.to);
return error;
}
diff --git a/tests-clar/refs/revparse.c b/tests-clar/refs/revparse.c
index c1cfc58af..ad520067b 100644
--- a/tests-clar/refs/revparse.c
+++ b/tests-clar/refs/revparse.c
@@ -31,33 +31,31 @@ static void test_id_inrepo(
const char *spec,
const char *expected_left,
const char *expected_right,
- git_revparse_flag_t expected_flags,
+ git_revparse_mode_t expected_flags,
git_repository *repo)
{
- git_object *l, *r;
- git_revparse_flag_t flags = 0;
-
- int error = git_revparse(&l, &r, &flags, repo, spec);
+ git_revision revision;
+ int error = git_revparse(&revision, repo, spec);
if (expected_left) {
char str[64] = {0};
cl_assert_equal_i(0, error);
- git_oid_fmt(str, git_object_id(l));
+ git_oid_fmt(str, git_object_id(revision.from));
cl_assert_equal_s(str, expected_left);
- git_object_free(l);
+ git_object_free(revision.from);
} else {
cl_assert_equal_i(GIT_ENOTFOUND, error);
}
if (expected_right) {
char str[64] = {0};
- git_oid_fmt(str, git_object_id(r));
+ git_oid_fmt(str, git_object_id(revision.to));
cl_assert_equal_s(str, expected_right);
- git_object_free(r);
+ git_object_free(revision.to);
}
if (expected_flags)
- cl_assert_equal_i(expected_flags, flags);
+ cl_assert_equal_i(expected_flags, revision.flags);
}
static void test_object(const char *spec, const char *expected_oid)
@@ -68,27 +66,26 @@ static void test_object(const char *spec, const char *expected_oid)
static void test_rangelike(const char *rangelike,
const char *expected_left,
const char *expected_right,
- git_revparse_flag_t expected_revparseflags)
+ git_revparse_mode_t expected_revparseflags)
{
char objstr[64] = {0};
- git_object *left = NULL, *right = NULL;
- git_revparse_flag_t revparseflags;
+ git_revision revision;
int error;
- error = git_revparse(&left, &right, &revparseflags, g_repo, rangelike);
+ error = git_revparse(&revision, g_repo, rangelike);
if (expected_left != NULL) {
cl_assert_equal_i(0, error);
- cl_assert_equal_i(revparseflags, expected_revparseflags);
- git_oid_fmt(objstr, git_object_id(left));
+ cl_assert_equal_i(revision.flags, expected_revparseflags);
+ git_oid_fmt(objstr, git_object_id(revision.from));
cl_assert_equal_s(objstr, expected_left);
- git_oid_fmt(objstr, git_object_id(right));
+ git_oid_fmt(objstr, git_object_id(revision.to));
cl_assert_equal_s(objstr, expected_right);
} else
cl_assert(error != 0);
- git_object_free(left);
- git_object_free(right);
+ git_object_free(revision.from);
+ git_object_free(revision.to);
}
@@ -96,7 +93,7 @@ static void test_id(
const char *spec,
const char *expected_left,
const char *expected_right,
- git_revparse_flag_t expected_flags)
+ git_revparse_mode_t expected_flags)
{
test_id_inrepo(spec, expected_left, expected_right, expected_flags, g_repo);
}
@@ -684,21 +681,17 @@ void test_refs_revparse__range(void)
test_rangelike("be3563a^1.be3563a", NULL, NULL, 0);
}
-void test_refs_revparse__validates_args(void)
-{
- git_object *l, *r;
- git_revparse_flag_t flags = 0;
-
- cl_git_pass(git_revparse(&l,&r,NULL, g_repo, "HEAD"));
- cl_git_pass(git_revparse(&l,NULL,&flags, g_repo, "HEAD"));
- cl_assert_equal_i(GIT_EINVALIDSPEC, git_revparse(&l,&r,&flags, g_repo, "^&*("));
-}
-
void test_refs_revparse__parses_range_operator(void)
{
test_id("HEAD", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", NULL, GIT_REVPARSE_SINGLE);
- test_id("HEAD~3..HEAD", "4a202b346bb0fb0db7eff3cffeb3c70babbd2045", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", GIT_REVPARSE_RANGE);
- test_id("HEAD~3...HEAD", "4a202b346bb0fb0db7eff3cffeb3c70babbd2045", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750",
- GIT_REVPARSE_RANGE | GIT_REVPARSE_MERGE_BASE);
+ test_id("HEAD~3..HEAD",
+ "4a202b346bb0fb0db7eff3cffeb3c70babbd2045",
+ "a65fedf39aefe402d3bb6e24df4d4f5fe4547750",
+ GIT_REVPARSE_RANGE);
+
+ test_id("HEAD~3...HEAD",
+ "4a202b346bb0fb0db7eff3cffeb3c70babbd2045",
+ "a65fedf39aefe402d3bb6e24df4d4f5fe4547750",
+ GIT_REVPARSE_RANGE | GIT_REVPARSE_MERGE_BASE);
}