mirror of
https://github.com/git/git
synced 2024-08-28 12:09:19 +00:00
![Elijah Newren](/assets/img/avatar_default.png)
hash.h depends upon and includes repository.h, due to the definition and use of the_hash_algo (defined as the_repository->hash_algo). However, most headers trying to include hash.h are only interested in the layout of the structs like object_id. Move the parts of hash.h that do not depend upon repository.h into a new file hash-ll.h (the "low level" parts of hash.h), and adjust other files to use this new header where the convenience inline functions aren't needed. This allows hash.h and object.h to be fairly small, minimal headers. It also exposes a lot of hidden dependencies on both path.h (which was brought in by repository.h) and repository.h (which was previously implicitly brought in by object.h), so also adjust other files to be more explicit about what they depend upon. Signed-off-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
102 lines
2.3 KiB
C
102 lines
2.3 KiB
C
#include "test-tool.h"
|
|
#include "bloom.h"
|
|
#include "hex.h"
|
|
#include "commit.h"
|
|
#include "repository.h"
|
|
#include "setup.h"
|
|
|
|
static struct bloom_filter_settings settings = DEFAULT_BLOOM_FILTER_SETTINGS;
|
|
|
|
static void add_string_to_filter(const char *data, struct bloom_filter *filter) {
|
|
struct bloom_key key;
|
|
int i;
|
|
|
|
fill_bloom_key(data, strlen(data), &key, &settings);
|
|
printf("Hashes:");
|
|
for (i = 0; i < settings.num_hashes; i++){
|
|
printf("0x%08x|", key.hashes[i]);
|
|
}
|
|
printf("\n");
|
|
add_key_to_filter(&key, filter, &settings);
|
|
clear_bloom_key(&key);
|
|
}
|
|
|
|
static void print_bloom_filter(struct bloom_filter *filter) {
|
|
int i;
|
|
|
|
if (!filter) {
|
|
printf("No filter.\n");
|
|
return;
|
|
}
|
|
printf("Filter_Length:%d\n", (int)filter->len);
|
|
printf("Filter_Data:");
|
|
for (i = 0; i < filter->len; i++) {
|
|
printf("%02x|", filter->data[i]);
|
|
}
|
|
printf("\n");
|
|
}
|
|
|
|
static void get_bloom_filter_for_commit(const struct object_id *commit_oid)
|
|
{
|
|
struct commit *c;
|
|
struct bloom_filter *filter;
|
|
setup_git_directory();
|
|
c = lookup_commit(the_repository, commit_oid);
|
|
filter = get_or_compute_bloom_filter(the_repository, c, 1,
|
|
&settings,
|
|
NULL);
|
|
print_bloom_filter(filter);
|
|
}
|
|
|
|
static const char *bloom_usage = "\n"
|
|
" test-tool bloom get_murmur3 <string>\n"
|
|
" test-tool bloom generate_filter <string> [<string>...]\n"
|
|
" test-tool bloom get_filter_for_commit <commit-hex>\n";
|
|
|
|
int cmd__bloom(int argc, const char **argv)
|
|
{
|
|
setup_git_directory();
|
|
|
|
if (argc < 2)
|
|
usage(bloom_usage);
|
|
|
|
if (!strcmp(argv[1], "get_murmur3")) {
|
|
uint32_t hashed;
|
|
if (argc < 3)
|
|
usage(bloom_usage);
|
|
hashed = murmur3_seeded(0, argv[2], strlen(argv[2]));
|
|
printf("Murmur3 Hash with seed=0:0x%08x\n", hashed);
|
|
}
|
|
|
|
if (!strcmp(argv[1], "generate_filter")) {
|
|
struct bloom_filter filter;
|
|
int i = 2;
|
|
filter.len = (settings.bits_per_entry + BITS_PER_WORD - 1) / BITS_PER_WORD;
|
|
CALLOC_ARRAY(filter.data, filter.len);
|
|
|
|
if (argc - 1 < i)
|
|
usage(bloom_usage);
|
|
|
|
while (argv[i]) {
|
|
add_string_to_filter(argv[i], &filter);
|
|
i++;
|
|
}
|
|
|
|
print_bloom_filter(&filter);
|
|
free(filter.data);
|
|
}
|
|
|
|
if (!strcmp(argv[1], "get_filter_for_commit")) {
|
|
struct object_id oid;
|
|
const char *end;
|
|
if (argc < 3)
|
|
usage(bloom_usage);
|
|
if (parse_oid_hex(argv[2], &oid, &end))
|
|
die("cannot parse oid '%s'", argv[2]);
|
|
init_bloom_filters();
|
|
get_bloom_filter_for_commit(&oid);
|
|
}
|
|
|
|
return 0;
|
|
}
|