From 4b1f0f79ac95daf872232ad8dc968bed06aca01b Mon Sep 17 00:00:00 2001 From: Edward Thomson Date: Tue, 8 Mar 2016 11:44:21 -0500 Subject: [PATCH] git_odb_expand_ids: rename func, return the type --- include/git2/odb.h | 13 ++++++------ src/odb.c | 16 +++++++++----- tests/odb/mixed.c | 52 +++++++++++++++++++++++++++------------------- 3 files changed, 49 insertions(+), 32 deletions(-) diff --git a/include/git2/odb.h b/include/git2/odb.h index 2b542b523..010b9c1a4 100644 --- a/include/git2/odb.h +++ b/include/git2/odb.h @@ -175,11 +175,12 @@ GIT_EXTERN(int) git_odb_exists_prefix( /** * Determine if one or more objects can be found in the object database - * by their abbreviated object IDs. Callers may further restrict the - * lookup based on type. This function will write the complete object - * ID to the `id`s array, and the updated length to the `id_lengths` - * array. (If an object is found, it will have its length updated to - * `GIT_OID_HEXSZ`; if an object is not found, will be be `0`.) + * by their abbreviated object ID and type. The given array will be + * updated in place: for each abbreviated ID that is unique in the + * database, and of the given type (if specified), the full object ID, + * object ID length (`GIT_OID_HEXSZ`) and type will be written back to + * 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 * underlying database will not be asked to be reloaded if an object is @@ -194,7 +195,7 @@ GIT_EXTERN(int) git_odb_exists_prefix( * @param cnt The length of the `ids`, `id_lengths` and `types` arrays * @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_oid *ids, size_t *id_lengths, diff --git a/src/odb.c b/src/odb.c index e61958549..de05a6b3e 100644 --- a/src/odb.c +++ b/src/odb.c @@ -742,7 +742,7 @@ int git_odb_exists_prefix( return error; } -int git_odb_exists_many_prefixes( +int git_odb_expand_ids( git_odb *db, git_oid *ids, size_t *id_lengths, @@ -773,7 +773,7 @@ int git_odb_exists_many_prefixes( if (!error) { actual_id = &tmp; - if (types && types[i] != GIT_OBJ_ANY) + if (types) error = git_odb_read_header(&len, &actual_type, db, &tmp); else actual_type = GIT_OBJ_ANY; @@ -789,13 +789,19 @@ int git_odb_exists_many_prefixes( actual_type = 0; if (!actual_type) { - id_lengths[i] = 0; memset(&ids[i], 0, sizeof(git_oid)); - } else { - id_lengths[i] = GIT_OID_HEXSZ; + id_lengths[i] = 0; + if (types) + types[i] = 0; + } else { if (actual_id) git_oid_cpy(&ids[i], actual_id); + + id_lengths[i] = GIT_OID_HEXSZ; + + if (types) + types[i] = actual_type; } } diff --git a/tests/odb/mixed.c b/tests/odb/mixed.c index fe22f85bc..57364e4e6 100644 --- a/tests/odb/mixed.c +++ b/tests/odb/mixed.c @@ -109,13 +109,13 @@ void test_odb_mixed__dup_oid_prefix_0(void) { git_odb_object_free(obj); } -struct odb_test_data { +struct expand_id_test_data { char *lookup_id; char *expected_id; 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 */ { "dea509d0", NULL, GIT_OBJ_ANY }, { "00000000", NULL, GIT_OBJ_ANY }, @@ -155,16 +155,16 @@ static void setup_prefix_query( git_otype *types; 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((lengths = git__calloc(num, sizeof(size_t)))); cl_assert((types = git__calloc(num, sizeof(git_otype)))); for (i = 0; i < num; i++) { - lengths[i] = strlen(prefix_data[i].lookup_id); - git_oid_fromstrn(&ids[i], prefix_data[i].lookup_id, lengths[i]); - types[i] = prefix_data[i].expected_type; + lengths[i] = strlen(expand_id_test_data[i].lookup_id); + git_oid_fromstrn(&ids[i], expand_id_test_data[i].lookup_id, lengths[i]); + types[i] = expand_id_test_data[i].expected_type; } *out_ids = ids; @@ -173,40 +173,50 @@ static void setup_prefix_query( *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; - num = ARRAY_SIZE(prefix_data); + num = ARRAY_SIZE(expand_id_test_data); for (i = 0; i < num; i++) { git_oid expected_id = {{0}}; size_t expected_len = 0; + git_otype expected_type = 0; - if (prefix_data[i].expected_id) { - git_oid_fromstr(&expected_id, prefix_data[i].expected_id); + if (expand_id_test_data[i].expected_id) { + git_oid_fromstr(&expected_id, expand_id_test_data[i].expected_id); 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_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}}; size_t num, i; - num = ARRAY_SIZE(prefix_data); + num = ARRAY_SIZE(expand_id_test_data); for (i = 0; i < num; i++) { cl_assert_equal_i(0, lengths[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; size_t i, num, *lengths; @@ -215,15 +225,15 @@ void test_odb_mixed__prefix_many(void) /* test looking for the actual (correct) types */ setup_prefix_query(&ids, &lengths, &types, &num); - cl_git_pass(git_odb_exists_many_prefixes(_odb, ids, lengths, types, num)); - assert_found_objects(ids, lengths); + cl_git_pass(git_odb_expand_ids(_odb, ids, lengths, types, num)); + assert_found_objects(ids, lengths, types); git__free(ids); git__free(lengths); git__free(types); /* test looking for no specified types (types array == NULL) */ setup_prefix_query(&ids, &lengths, &types, &num); - cl_git_pass(git_odb_exists_many_prefixes(_odb, ids, lengths, NULL, num)); - assert_found_objects(ids, lengths); + cl_git_pass(git_odb_expand_ids(_odb, ids, lengths, NULL, num)); + assert_found_objects(ids, lengths, NULL); git__free(ids); git__free(lengths); git__free(types); /* test looking for an explicit GIT_OBJ_ANY */ @@ -233,8 +243,8 @@ void test_odb_mixed__prefix_many(void) for (i = 0; i < num; i++) types[i] = GIT_OBJ_ANY; - cl_git_pass(git_odb_exists_many_prefixes(_odb, ids, lengths, types, num)); - assert_found_objects(ids, lengths); + cl_git_pass(git_odb_expand_ids(_odb, ids, lengths, types, num)); + assert_found_objects(ids, lengths, types); git__free(ids); git__free(lengths); git__free(types); /* test looking for the completely wrong type */ @@ -244,8 +254,8 @@ void test_odb_mixed__prefix_many(void) for (i = 0; i < num; i++) 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)); - assert_notfound_objects(ids, lengths); + cl_git_pass(git_odb_expand_ids(_odb, ids, lengths, types, num)); + assert_notfound_objects(ids, lengths, types); git__free(ids); git__free(lengths); git__free(types); }