summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Straub <bs@github.com>2013-04-15 12:00:04 -0700
committerBen Straub <bs@github.com>2013-04-15 12:00:04 -0700
commit299a224be16368dc36bef4dc3f5e711ce35300cd (patch)
tree5371b54270c4b84abd586c49d7eb06b80d3d4e7b
parent2ebc3c66c292539786b6ec1538f740c5e444fe16 (diff)
downloadlibgit2-299a224be16368dc36bef4dc3f5e711ce35300cd.tar.gz
Change git_revparse to output git_object pointers
This will probably prevent many lookup/free operations in calling code.
-rw-r--r--examples/diff.c6
-rw-r--r--examples/rev-list.c16
-rw-r--r--include/git2/revparse.h4
-rw-r--r--src/revparse.c21
-rw-r--r--src/revwalk.c8
-rw-r--r--tests-clar/refs/revparse.c19
-rw-r--r--tests-clar/repo/head.c8
-rw-r--r--tests-clar/reset/default.c12
-rw-r--r--tests-clar/stash/drop.c15
-rw-r--r--tests-clar/stash/save.c11
10 files changed, 54 insertions, 66 deletions
diff --git a/examples/diff.c b/examples/diff.c
index 6fa0fee52..a977abd3f 100644
--- a/examples/diff.c
+++ b/examples/diff.c
@@ -15,12 +15,10 @@ static int resolve_to_tree(
git_repository *repo, const char *identifier, git_tree **tree)
{
int err = 0;
- git_oid oid;
git_object *obj = NULL;
- if (git_revparse(&oid, NULL, NULL, repo, identifier) < 0 ||
- git_object_lookup(&obj, repo, &oid, GIT_OBJ_ANY) < 0)
- return GIT_ENOTFOUND;
+ if ((err =git_revparse(&obj, NULL, NULL, repo, identifier)) < 0)
+ return err;
switch (git_object_type(obj)) {
case GIT_OBJ_TREE:
diff --git a/examples/rev-list.c b/examples/rev-list.c
index 71a8180f7..1747f2041 100644
--- a/examples/rev-list.c
+++ b/examples/rev-list.c
@@ -25,16 +25,18 @@ static int push_commit(git_revwalk *walk, git_oid *oid, int hide)
static int push_spec(git_repository *repo, git_revwalk *walk, const char *spec, int hide)
{
int error;
- git_oid oid;
+ git_object *obj;
- if ((error = git_revparse(&oid, NULL, NULL, repo, spec)))
+ if ((error = git_revparse(&obj, NULL, NULL, repo, spec)) < 0)
return error;
- return push_commit(walk, &oid, hide);
+ error = push_commit(walk, git_object_id(obj), hide);
+ git_object_free(obj);
+ return error;
}
static int push_range(git_repository *repo, git_revwalk *walk, const char *range, int hide)
{
- git_oid left, right;
+ git_object left, right;
git_revparse_flag_t flags;
int error = 0;
@@ -45,11 +47,13 @@ static int push_range(git_repository *repo, git_revwalk *walk, const char *range
return GIT_EINVALIDSPEC;
}
- if ((error = push_commit(walk, &left, !hide)))
+ if ((error = push_commit(walk, git_object_id(left), !hide)))
goto out;
- error = push_commit(walk, &right, hide);
+ error = push_commit(walk, git_object_id(right), hide);
out:
+ git_object_free(left);
+ git_object_free(right);
return error;
}
diff --git a/include/git2/revparse.h b/include/git2/revparse.h
index 2bbbaa5e1..4f8c274a4 100644
--- a/include/git2/revparse.h
+++ b/include/git2/revparse.h
@@ -66,8 +66,8 @@ typedef enum {
* @return 0 on success, GIT_INVALIDSPEC, GIT_ENOTFOUND, GIT_EAMBIGUOUS or an error code
*/
GIT_EXTERN(int) git_revparse(
- git_oid *left,
- git_oid *right,
+ git_object **left,
+ git_object **right,
unsigned int *flags,
git_repository *repo,
const char *spec);
diff --git a/src/revparse.c b/src/revparse.c
index 5f591406e..62be3128a 100644
--- a/src/revparse.c
+++ b/src/revparse.c
@@ -870,8 +870,8 @@ cleanup:
int git_revparse(
- git_oid *left,
- git_oid *right,
+ git_object **left,
+ git_object **right,
unsigned int *flags,
git_repository *repo,
const char *spec)
@@ -879,7 +879,6 @@ int git_revparse(
unsigned int lflags = 0;
const char *dotdot;
int error = 0;
- git_object *obj = NULL;
assert(left && repo && spec);
@@ -895,22 +894,18 @@ int git_revparse(
rstr++;
}
- if (!(error = git_revparse_single(&obj, repo, lstr))) {
- git_oid_cpy(left, git_object_id(obj));
- git_object_free(obj);
+ if ((error = git_revparse_single(left, repo, lstr)) < 0) {
+ return error;
}
- if (right && !(error = git_revparse_single(&obj, repo, rstr))) {
- git_oid_cpy(right, git_object_id(obj));
- git_object_free(obj);
+ if (right &&
+ (error = git_revparse_single(right, repo, rstr)) < 0) {
+ return error;
}
git__free((void*)lstr);
} else {
lflags = GIT_REVPARSE_SINGLE;
- if (!(error = git_revparse_single(&obj, repo, spec))) {
- git_oid_cpy(left, git_object_id(obj));
- git_object_free(obj);
- }
+ error = git_revparse_single(left, repo, spec);
}
if (flags)
diff --git a/src/revwalk.c b/src/revwalk.c
index b22fef07f..05e99c0b6 100644
--- a/src/revwalk.c
+++ b/src/revwalk.c
@@ -231,7 +231,7 @@ int git_revwalk_push_ref(git_revwalk *walk, const char *refname)
int git_revwalk_push_range(git_revwalk *walk, const char *range)
{
- git_oid left, right;
+ git_object *left, *right;
git_revparse_flag_t revparseflags;
int error = 0;
@@ -243,11 +243,13 @@ int git_revwalk_push_range(git_revwalk *walk, const char *range)
return GIT_EINVALIDSPEC;
}
- if ((error = push_commit(walk, &left, 1)))
+ if ((error = push_commit(walk, git_object_id(left), 1)))
goto out;
- error = push_commit(walk, &right, 0);
+ error = push_commit(walk, git_object_id(right), 0);
out:
+ git_object_free(left);
+ git_object_free(right);
return error;
}
diff --git a/tests-clar/refs/revparse.c b/tests-clar/refs/revparse.c
index 8c3e5e43a..c1cfc58af 100644
--- a/tests-clar/refs/revparse.c
+++ b/tests-clar/refs/revparse.c
@@ -34,7 +34,7 @@ static void test_id_inrepo(
git_revparse_flag_t expected_flags,
git_repository *repo)
{
- git_oid l = {{0}}, r = {{0}};
+ git_object *l, *r;
git_revparse_flag_t flags = 0;
int error = git_revparse(&l, &r, &flags, repo, spec);
@@ -42,16 +42,18 @@ static void test_id_inrepo(
if (expected_left) {
char str[64] = {0};
cl_assert_equal_i(0, error);
- git_oid_fmt(str, &l);
+ git_oid_fmt(str, git_object_id(l));
cl_assert_equal_s(str, expected_left);
+ git_object_free(l);
} else {
cl_assert_equal_i(GIT_ENOTFOUND, error);
}
if (expected_right) {
char str[64] = {0};
- git_oid_fmt(str, &r);
+ git_oid_fmt(str, git_object_id(r));
cl_assert_equal_s(str, expected_right);
+ git_object_free(r);
}
if (expected_flags)
@@ -69,7 +71,7 @@ static void test_rangelike(const char *rangelike,
git_revparse_flag_t expected_revparseflags)
{
char objstr[64] = {0};
- git_oid left = {{0}}, right = {{0}};
+ git_object *left = NULL, *right = NULL;
git_revparse_flag_t revparseflags;
int error;
@@ -78,12 +80,15 @@ static void test_rangelike(const char *rangelike,
if (expected_left != NULL) {
cl_assert_equal_i(0, error);
cl_assert_equal_i(revparseflags, expected_revparseflags);
- git_oid_fmt(objstr, &left);
+ git_oid_fmt(objstr, git_object_id(left));
cl_assert_equal_s(objstr, expected_left);
- git_oid_fmt(objstr, &right);
+ git_oid_fmt(objstr, git_object_id(right));
cl_assert_equal_s(objstr, expected_right);
} else
cl_assert(error != 0);
+
+ git_object_free(left);
+ git_object_free(right);
}
@@ -681,7 +686,7 @@ void test_refs_revparse__range(void)
void test_refs_revparse__validates_args(void)
{
- git_oid l={{0}}, r={{0}};
+ git_object *l, *r;
git_revparse_flag_t flags = 0;
cl_git_pass(git_revparse(&l,&r,NULL, g_repo, "HEAD"));
diff --git a/tests-clar/repo/head.c b/tests-clar/repo/head.c
index bb81bb087..a9f5cfc58 100644
--- a/tests-clar/repo/head.c
+++ b/tests-clar/repo/head.c
@@ -120,11 +120,9 @@ void test_repo_head__set_head_detached_Return_ENOTFOUND_when_the_object_doesnt_e
void test_repo_head__set_head_detached_Fails_when_the_object_isnt_a_commitish(void)
{
- git_oid oid;
git_object *blob;
- cl_git_pass(git_revparse(&oid, NULL, NULL, repo, "point_to_blob"));
- cl_git_pass(git_object_lookup(&blob, repo, &oid, GIT_OBJ_ANY));
+ cl_git_pass(git_revparse_single(&blob, repo, "point_to_blob"));
cl_git_fail(git_repository_set_head_detached(repo, git_object_id(blob)));
@@ -133,11 +131,9 @@ void test_repo_head__set_head_detached_Fails_when_the_object_isnt_a_commitish(vo
void test_repo_head__set_head_detached_Detaches_HEAD_and_make_it_point_to_the_peeled_commit(void)
{
- git_oid oid;
git_object *tag;
- cl_git_pass(git_revparse(&oid, NULL, NULL, repo, "tags/test"));
- cl_git_pass(git_object_lookup(&tag, repo, &oid, GIT_OBJ_ANY));
+ cl_git_pass(git_revparse_single(&tag, repo, "tags/test"));
cl_assert_equal_i(GIT_OBJ_TAG, git_object_type(tag));
cl_git_pass(git_repository_set_head_detached(repo, git_object_id(tag)));
diff --git a/tests-clar/reset/default.c b/tests-clar/reset/default.c
index bc8da7392..506d971ff 100644
--- a/tests-clar/reset/default.c
+++ b/tests-clar/reset/default.c
@@ -95,7 +95,6 @@ void test_reset_default__resetting_filepaths_against_a_null_target_removes_them_
void test_reset_default__resetting_filepaths_replaces_their_corresponding_index_entries(void)
{
git_strarray before, after;
- git_oid oid;
char *paths[] = { "staged_changes", "staged_changes_file_deleted" };
char *before_shas[] = { "55d316c9ba708999f1918e9677d01dfcae69c6b9",
@@ -110,8 +109,7 @@ void test_reset_default__resetting_filepaths_replaces_their_corresponding_index_
after.strings = after_shas;
after.count = 2;
- cl_git_pass(git_revparse(&oid, NULL, NULL, _repo, "0017bd4"));
- cl_git_pass(git_object_lookup(&_target, _repo, &oid, GIT_OBJ_ANY));
+ cl_git_pass(git_revparse_single(&_target, _repo, "0017bd4"));
assert_content_in_index(&_pathspecs, true, &before);
cl_git_pass(git_reset_default(_repo, _target, &_pathspecs));
@@ -137,7 +135,6 @@ void test_reset_default__resetting_filepaths_clears_previous_conflicts(void)
{
git_index_entry *conflict_entry[3];
git_strarray after;
- git_oid oid;
char *paths[] = { "conflicts-one.txt" };
char *after_shas[] = { "1f85ca51b8e0aac893a621b61a9c2661d6aa6d81" };
@@ -153,8 +150,7 @@ void test_reset_default__resetting_filepaths_clears_previous_conflicts(void)
cl_git_pass(git_index_conflict_get(&conflict_entry[0], &conflict_entry[1],
&conflict_entry[2], _index, "conflicts-one.txt"));
- cl_git_pass(git_revparse(&oid, NULL, NULL, _repo, "9a05ccb"));
- cl_git_pass(git_object_lookup(&_target, _repo, &oid, GIT_OBJ_ANY));
+ cl_git_pass(git_revparse_single(&_target, _repo, "9a05ccb"));
cl_git_pass(git_reset_default(_repo, _target, &_pathspecs));
assert_content_in_index(&_pathspecs, true, &after);
@@ -171,15 +167,13 @@ Unstaged changes after reset:
void test_reset_default__resetting_unknown_filepaths_does_not_fail(void)
{
char *paths[] = { "I_am_not_there.txt", "me_neither.txt" };
- git_oid oid;
_pathspecs.strings = paths;
_pathspecs.count = 2;
assert_content_in_index(&_pathspecs, false, NULL);
- cl_git_pass(git_revparse(&oid, NULL, NULL, _repo, "HEAD"));
- cl_git_pass(git_object_lookup(&_target, _repo, &oid, GIT_OBJ_ANY));
+ cl_git_pass(git_revparse_single(&_target, _repo, "HEAD"));
cl_git_pass(git_reset_default(_repo, _target, &_pathspecs));
assert_content_in_index(&_pathspecs, false, NULL);
diff --git a/tests-clar/stash/drop.c b/tests-clar/stash/drop.c
index da9e676a9..12f922630 100644
--- a/tests-clar/stash/drop.c
+++ b/tests-clar/stash/drop.c
@@ -140,30 +140,29 @@ void test_stash_drop__dropping_the_last_entry_removes_the_stash(void)
void retrieve_top_stash_id(git_oid *out)
{
- git_oid top_stash_id;
+ git_object *top_stash;
- cl_git_pass(git_revparse(&top_stash_id, NULL, NULL, repo, "stash@{0}"));
+ cl_git_pass(git_revparse_single(&top_stash, repo, "stash@{0}"));
cl_git_pass(git_reference_name_to_id(out, repo, GIT_REFS_STASH_FILE));
- cl_assert_equal_i(true, git_oid_cmp(out, &top_stash_id) == 0);
+ cl_assert_equal_i(true, git_oid_cmp(out, git_object_id(top_stash)) == 0);
}
void test_stash_drop__dropping_the_top_stash_updates_the_stash_reference(void)
{
- git_oid next_top_stash_id;
+ git_object *next_top_stash;
git_oid oid;
push_three_states();
retrieve_top_stash_id(&oid);
- cl_git_pass(git_revparse(&next_top_stash_id, NULL, NULL, repo, "stash@{1}"));
- cl_assert_equal_i(false, git_oid_cmp(&oid, &next_top_stash_id) == 0);
+ cl_git_pass(git_revparse_single(&next_top_stash, repo, "stash@{1}"));
+ cl_assert_equal_i(false, git_oid_cmp(&oid, git_object_id(next_top_stash)) == 0);
cl_git_pass(git_stash_drop(repo, 0));
retrieve_top_stash_id(&oid);
- cl_assert_equal_i(
- true, git_oid_cmp(&oid, &next_top_stash_id) == 0);
+ cl_git_pass(git_oid_cmp(&oid, git_object_id(next_top_stash)));
}
diff --git a/tests-clar/stash/save.c b/tests-clar/stash/save.c
index 4185e549c..eae116ac5 100644
--- a/tests-clar/stash/save.c
+++ b/tests-clar/stash/save.c
@@ -37,11 +37,10 @@ void test_stash_save__cleanup(void)
static void assert_object_oid(const char* revision, const char* expected_oid, git_otype type)
{
- git_oid oid;
int result;
git_object *obj;
- result = git_revparse(&oid, NULL, NULL, repo, revision);
+ result = git_revparse_single(&obj, repo, revision);
if (!expected_oid) {
cl_assert_equal_i(GIT_ENOTFOUND, result);
@@ -49,9 +48,7 @@ static void assert_object_oid(const char* revision, const char* expected_oid, gi
} else
cl_assert_equal_i(0, result);
- cl_git_pass(git_oid_streq(&oid, expected_oid));
-
- cl_git_pass(git_object_lookup(&obj, repo, &oid, GIT_OBJ_ANY));
+ cl_git_pass(git_oid_streq(git_object_id(obj), expected_oid));
cl_assert_equal_i(type, git_object_type(obj));
git_object_free(obj);
}
@@ -147,11 +144,9 @@ void test_stash_save__can_keep_index(void)
static void assert_commit_message_contains(const char *revision, const char *fragment)
{
- git_oid oid;
git_commit *commit;
- cl_git_pass(git_revparse(&oid, NULL, NULL, repo, revision));
- cl_git_pass(git_commit_lookup(&commit, repo, &oid));
+ cl_git_pass(git_revparse_single((git_object**)&commit, repo, revision));
cl_assert(strstr(git_commit_message(commit), fragment) != NULL);