mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-05 20:33:41 +00:00

The old 'git_revpool' object has been removed and split into two distinct objects with separate functionality, in order to have separate methods for object management and object walking. * A new object 'git_repository' does the high-level management of a repository's objects (commits, trees, tags, etc) on top of a 'git_odb'. Eventually, it will also manage other repository attributes (e.g. tag resolution, references, etc). See: src/git/repository.h * A new external method 'git_repository_lookup(repo, oid, type)' has been added to the 'git_repository' API. All object lookups (git_XXX_lookup()) are now wrappers to this method, and duplicated code has been removed. The method does automatic type checking and returns a generic 'git_revpool_object' that can be cast to any specific object. See: src/git/repository.h * The external methods for object parsing of repository objects (git_XXX_parse()) have been removed. Loading objects from the repository is now managed through the 'lookup' functions. These objects are loaded with minimal information, and the relevant parsing is done automatically when the user requests any of the parsed attributes through accessor methods. An attribute has been added to 'git_repository' in order to force the parsing of all the repository objects immediately after lookup. See: src/git/commit.h See: src/git/tag.h See: src/git/tree.h * The previous walking functionality of the revpool is now found in 'git_revwalk', which does the actual revision walking on a repository; the attributes when walking through commits in a database have been decoupled from the actual commit objects. This increases performance when accessing commits during the walk and allows to have several 'git_revwalk' instances working at the same time on top of the same repository, without having to load commits in memory several times. See: src/git/revwalk.h * The old 'git_revpool_table' has been renamed to 'git_hashtable' and now works as a generic hashtable with support for any kind of object and custom hash functions. See: src/hashtable.h * All the relevant unit tests have been updated, renamed and grouped accordingly. Signed-off-by: Vicent Marti <tanoku@gmail.com>
135 lines
2.8 KiB
C
135 lines
2.8 KiB
C
#include "test_lib.h"
|
|
#include "test_helpers.h"
|
|
#include "commit.h"
|
|
#include "hash.h"
|
|
#include "hashtable.h"
|
|
|
|
typedef struct table_item
|
|
{
|
|
int __bulk;
|
|
git_oid id;
|
|
} table_item;
|
|
|
|
|
|
uint32_t hash_func(const void *key)
|
|
{
|
|
uint32_t r;
|
|
git_oid *id;
|
|
|
|
id = (git_oid *)key;
|
|
memcpy(&r, id->id, sizeof(r));
|
|
return r;
|
|
}
|
|
|
|
int hash_haskey(void *item, const void *key)
|
|
{
|
|
table_item *obj;
|
|
git_oid *oid;
|
|
|
|
obj = (table_item *)item;
|
|
oid = (git_oid *)key;
|
|
|
|
return (git_oid_cmp(oid, &obj->id) == 0);
|
|
}
|
|
|
|
BEGIN_TEST(table_create)
|
|
|
|
git_hashtable *table = NULL;
|
|
|
|
table = git_hashtable_alloc(55, hash_func, hash_haskey);
|
|
must_be_true(table != NULL);
|
|
must_be_true(table->size_mask + 1 == 64);
|
|
|
|
git_hashtable_free(table);
|
|
|
|
END_TEST
|
|
|
|
BEGIN_TEST(table_populate)
|
|
|
|
const int objects_n = 32;
|
|
int i;
|
|
|
|
table_item *objects;
|
|
git_hashtable *table = NULL;
|
|
|
|
table = git_hashtable_alloc(objects_n * 2, hash_func, hash_haskey);
|
|
must_be_true(table != NULL);
|
|
|
|
objects = git__malloc(objects_n * sizeof(table_item));
|
|
memset(objects, 0x0, objects_n * sizeof(table_item));
|
|
|
|
/* populate the hash table */
|
|
for (i = 0; i < objects_n; ++i) {
|
|
git_hash_buf(&(objects[i].id), &i, sizeof(int));
|
|
must_pass(git_hashtable_insert(table, &(objects[i].id), &(objects[i])));
|
|
}
|
|
|
|
/* make sure all the inserted objects can be found */
|
|
for (i = 0; i < objects_n; ++i) {
|
|
git_oid id;
|
|
table_item *ob;
|
|
|
|
git_hash_buf(&id, &i, sizeof(int));
|
|
ob = (table_item *)git_hashtable_lookup(table, &id);
|
|
|
|
must_be_true(ob != NULL);
|
|
must_be_true(ob == &(objects[i]));
|
|
}
|
|
|
|
/* make sure we cannot find inexisting objects */
|
|
for (i = 0; i < 50; ++i) {
|
|
int hash_id;
|
|
git_oid id;
|
|
|
|
hash_id = (rand() % 50000) + objects_n;
|
|
git_hash_buf(&id, &hash_id, sizeof(int));
|
|
must_be_true(git_hashtable_lookup(table, &id) == NULL);
|
|
}
|
|
|
|
git_hashtable_free(table);
|
|
free(objects);
|
|
|
|
END_TEST
|
|
|
|
|
|
BEGIN_TEST(table_resize)
|
|
|
|
const int objects_n = 64;
|
|
int i;
|
|
unsigned int old_size;
|
|
table_item *objects;
|
|
git_hashtable *table = NULL;
|
|
|
|
table = git_hashtable_alloc(objects_n, hash_func, hash_haskey);
|
|
must_be_true(table != NULL);
|
|
|
|
objects = git__malloc(objects_n * sizeof(table_item));
|
|
memset(objects, 0x0, objects_n * sizeof(table_item));
|
|
|
|
old_size = table->size_mask + 1;
|
|
|
|
/* populate the hash table -- should be automatically resized */
|
|
for (i = 0; i < objects_n; ++i) {
|
|
git_hash_buf(&(objects[i].id), &i, sizeof(int));
|
|
must_pass(git_hashtable_insert(table, &(objects[i].id), &(objects[i])));
|
|
}
|
|
|
|
must_be_true(table->size_mask > old_size);
|
|
|
|
/* make sure all the inserted objects can be found */
|
|
for (i = 0; i < objects_n; ++i) {
|
|
git_oid id;
|
|
table_item *ob;
|
|
|
|
git_hash_buf(&id, &i, sizeof(int));
|
|
ob = (table_item *)git_hashtable_lookup(table, &id);
|
|
|
|
must_be_true(ob != NULL);
|
|
must_be_true(ob == &(objects[i]));
|
|
}
|
|
|
|
git_hashtable_free(table);
|
|
free(objects);
|
|
|
|
END_TEST
|