Commit 4b1f0f79 by Edward Thomson

git_odb_expand_ids: rename func, return the type

parent 6c04269c
...@@ -175,11 +175,12 @@ GIT_EXTERN(int) git_odb_exists_prefix( ...@@ -175,11 +175,12 @@ GIT_EXTERN(int) git_odb_exists_prefix(
/** /**
* Determine if one or more objects can be found in the object database * Determine if one or more objects can be found in the object database
* by their abbreviated object IDs. Callers may further restrict the * by their abbreviated object ID and type. The given array will be
* lookup based on type. This function will write the complete object * updated in place: for each abbreviated ID that is unique in the
* ID to the `id`s array, and the updated length to the `id_lengths` * database, and of the given type (if specified), the full object ID,
* array. (If an object is found, it will have its length updated to * object ID length (`GIT_OID_HEXSZ`) and type will be written back to
* `GIT_OID_HEXSZ`; if an object is not found, will be be `0`.) * the array. For IDs that are not found (or are ambiguous), the
* array entry will be zeroed.
* *
* Note that since this function operates on multiple objects, the * Note that since this function operates on multiple objects, the
* underlying database will not be asked to be reloaded if an object is * underlying database will not be asked to be reloaded if an object is
...@@ -194,7 +195,7 @@ GIT_EXTERN(int) git_odb_exists_prefix( ...@@ -194,7 +195,7 @@ GIT_EXTERN(int) git_odb_exists_prefix(
* @param cnt The length of the `ids`, `id_lengths` and `types` arrays * @param cnt The length of the `ids`, `id_lengths` and `types` arrays
* @return 0 on success or an error code on failure * @return 0 on success or an error code on failure
*/ */
GIT_EXTERN(int) git_odb_exists_many_prefixes( GIT_EXTERN(int) git_odb_expand_ids(
git_odb *db, git_odb *db,
git_oid *ids, git_oid *ids,
size_t *id_lengths, size_t *id_lengths,
......
...@@ -742,7 +742,7 @@ int git_odb_exists_prefix( ...@@ -742,7 +742,7 @@ int git_odb_exists_prefix(
return error; return error;
} }
int git_odb_exists_many_prefixes( int git_odb_expand_ids(
git_odb *db, git_odb *db,
git_oid *ids, git_oid *ids,
size_t *id_lengths, size_t *id_lengths,
...@@ -773,7 +773,7 @@ int git_odb_exists_many_prefixes( ...@@ -773,7 +773,7 @@ int git_odb_exists_many_prefixes(
if (!error) { if (!error) {
actual_id = &tmp; actual_id = &tmp;
if (types && types[i] != GIT_OBJ_ANY) if (types)
error = git_odb_read_header(&len, &actual_type, db, &tmp); error = git_odb_read_header(&len, &actual_type, db, &tmp);
else else
actual_type = GIT_OBJ_ANY; actual_type = GIT_OBJ_ANY;
...@@ -789,13 +789,19 @@ int git_odb_exists_many_prefixes( ...@@ -789,13 +789,19 @@ int git_odb_exists_many_prefixes(
actual_type = 0; actual_type = 0;
if (!actual_type) { if (!actual_type) {
id_lengths[i] = 0;
memset(&ids[i], 0, sizeof(git_oid)); memset(&ids[i], 0, sizeof(git_oid));
} else { id_lengths[i] = 0;
id_lengths[i] = GIT_OID_HEXSZ;
if (types)
types[i] = 0;
} else {
if (actual_id) if (actual_id)
git_oid_cpy(&ids[i], actual_id); git_oid_cpy(&ids[i], actual_id);
id_lengths[i] = GIT_OID_HEXSZ;
if (types)
types[i] = actual_type;
} }
} }
......
...@@ -109,13 +109,13 @@ void test_odb_mixed__dup_oid_prefix_0(void) { ...@@ -109,13 +109,13 @@ void test_odb_mixed__dup_oid_prefix_0(void) {
git_odb_object_free(obj); git_odb_object_free(obj);
} }
struct odb_test_data { struct expand_id_test_data {
char *lookup_id; char *lookup_id;
char *expected_id; char *expected_id;
git_otype expected_type; git_otype expected_type;
}; };
struct odb_test_data prefix_data[] = { struct expand_id_test_data expand_id_test_data[] = {
/* some prefixes and their expected values */ /* some prefixes and their expected values */
{ "dea509d0", NULL, GIT_OBJ_ANY }, { "dea509d0", NULL, GIT_OBJ_ANY },
{ "00000000", NULL, GIT_OBJ_ANY }, { "00000000", NULL, GIT_OBJ_ANY },
...@@ -155,16 +155,16 @@ static void setup_prefix_query( ...@@ -155,16 +155,16 @@ static void setup_prefix_query(
git_otype *types; git_otype *types;
size_t num, *lengths, i; size_t num, *lengths, i;
num = ARRAY_SIZE(prefix_data); num = ARRAY_SIZE(expand_id_test_data);
cl_assert((ids = git__calloc(num, sizeof(git_oid)))); cl_assert((ids = git__calloc(num, sizeof(git_oid))));
cl_assert((lengths = git__calloc(num, sizeof(size_t)))); cl_assert((lengths = git__calloc(num, sizeof(size_t))));
cl_assert((types = git__calloc(num, sizeof(git_otype)))); cl_assert((types = git__calloc(num, sizeof(git_otype))));
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
lengths[i] = strlen(prefix_data[i].lookup_id); lengths[i] = strlen(expand_id_test_data[i].lookup_id);
git_oid_fromstrn(&ids[i], prefix_data[i].lookup_id, lengths[i]); git_oid_fromstrn(&ids[i], expand_id_test_data[i].lookup_id, lengths[i]);
types[i] = prefix_data[i].expected_type; types[i] = expand_id_test_data[i].expected_type;
} }
*out_ids = ids; *out_ids = ids;
...@@ -173,40 +173,50 @@ static void setup_prefix_query( ...@@ -173,40 +173,50 @@ static void setup_prefix_query(
*out_num = num; *out_num = num;
} }
static void assert_found_objects(git_oid *ids, size_t *lengths) static void assert_found_objects(
git_oid *ids, size_t *lengths, git_otype *types)
{ {
size_t num, i; size_t num, i;
num = ARRAY_SIZE(prefix_data); num = ARRAY_SIZE(expand_id_test_data);
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
git_oid expected_id = {{0}}; git_oid expected_id = {{0}};
size_t expected_len = 0; size_t expected_len = 0;
git_otype expected_type = 0;
if (prefix_data[i].expected_id) { if (expand_id_test_data[i].expected_id) {
git_oid_fromstr(&expected_id, prefix_data[i].expected_id); git_oid_fromstr(&expected_id, expand_id_test_data[i].expected_id);
expected_len = GIT_OID_HEXSZ; expected_len = GIT_OID_HEXSZ;
expected_type = expand_id_test_data[i].expected_type;
} }
cl_assert_equal_i(expected_len, lengths[i]); cl_assert_equal_i(expected_len, lengths[i]);
cl_assert_equal_oid(&expected_id, &ids[i]); cl_assert_equal_oid(&expected_id, &ids[i]);
if (types)
cl_assert_equal_i(expected_type, types[i]);
} }
} }
static void assert_notfound_objects(git_oid *ids, size_t *lengths) static void assert_notfound_objects(
git_oid *ids, size_t *lengths, git_otype *types)
{ {
git_oid expected_id = {{0}}; git_oid expected_id = {{0}};
size_t num, i; size_t num, i;
num = ARRAY_SIZE(prefix_data); num = ARRAY_SIZE(expand_id_test_data);
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
cl_assert_equal_i(0, lengths[i]); cl_assert_equal_i(0, lengths[i]);
cl_assert_equal_oid(&expected_id, &ids[i]); cl_assert_equal_oid(&expected_id, &ids[i]);
if (types)
cl_assert_equal_i(0, types[i]);
} }
} }
void test_odb_mixed__prefix_many(void) void test_odb_mixed__expand_ids(void)
{ {
git_oid *ids; git_oid *ids;
size_t i, num, *lengths; size_t i, num, *lengths;
...@@ -215,15 +225,15 @@ void test_odb_mixed__prefix_many(void) ...@@ -215,15 +225,15 @@ void test_odb_mixed__prefix_many(void)
/* test looking for the actual (correct) types */ /* test looking for the actual (correct) types */
setup_prefix_query(&ids, &lengths, &types, &num); setup_prefix_query(&ids, &lengths, &types, &num);
cl_git_pass(git_odb_exists_many_prefixes(_odb, ids, lengths, types, num)); cl_git_pass(git_odb_expand_ids(_odb, ids, lengths, types, num));
assert_found_objects(ids, lengths); assert_found_objects(ids, lengths, types);
git__free(ids); git__free(lengths); git__free(types); git__free(ids); git__free(lengths); git__free(types);
/* test looking for no specified types (types array == NULL) */ /* test looking for no specified types (types array == NULL) */
setup_prefix_query(&ids, &lengths, &types, &num); setup_prefix_query(&ids, &lengths, &types, &num);
cl_git_pass(git_odb_exists_many_prefixes(_odb, ids, lengths, NULL, num)); cl_git_pass(git_odb_expand_ids(_odb, ids, lengths, NULL, num));
assert_found_objects(ids, lengths); assert_found_objects(ids, lengths, NULL);
git__free(ids); git__free(lengths); git__free(types); git__free(ids); git__free(lengths); git__free(types);
/* test looking for an explicit GIT_OBJ_ANY */ /* test looking for an explicit GIT_OBJ_ANY */
...@@ -233,8 +243,8 @@ void test_odb_mixed__prefix_many(void) ...@@ -233,8 +243,8 @@ void test_odb_mixed__prefix_many(void)
for (i = 0; i < num; i++) for (i = 0; i < num; i++)
types[i] = GIT_OBJ_ANY; types[i] = GIT_OBJ_ANY;
cl_git_pass(git_odb_exists_many_prefixes(_odb, ids, lengths, types, num)); cl_git_pass(git_odb_expand_ids(_odb, ids, lengths, types, num));
assert_found_objects(ids, lengths); assert_found_objects(ids, lengths, types);
git__free(ids); git__free(lengths); git__free(types); git__free(ids); git__free(lengths); git__free(types);
/* test looking for the completely wrong type */ /* test looking for the completely wrong type */
...@@ -244,8 +254,8 @@ void test_odb_mixed__prefix_many(void) ...@@ -244,8 +254,8 @@ void test_odb_mixed__prefix_many(void)
for (i = 0; i < num; i++) for (i = 0; i < num; i++)
types[i] = (types[i] == GIT_OBJ_BLOB) ? GIT_OBJ_TREE : GIT_OBJ_BLOB; types[i] = (types[i] == GIT_OBJ_BLOB) ? GIT_OBJ_TREE : GIT_OBJ_BLOB;
cl_git_pass(git_odb_exists_many_prefixes(_odb, ids, lengths, types, num)); cl_git_pass(git_odb_expand_ids(_odb, ids, lengths, types, num));
assert_notfound_objects(ids, lengths); assert_notfound_objects(ids, lengths, types);
git__free(ids); git__free(lengths); git__free(types); git__free(ids); git__free(lengths); git__free(types);
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment