You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
2.0 KiB
69 lines
2.0 KiB
#define USE_THE_INDEX_VARIABLE |
|
#include "test-tool.h" |
|
#include "cache.h" |
|
#include "gettext.h" |
|
#include "hex.h" |
|
#include "tree.h" |
|
#include "cache-tree.h" |
|
#include "parse-options.h" |
|
#include "repository.h" |
|
#include "setup.h" |
|
|
|
static char const * const test_cache_tree_usage[] = { |
|
N_("test-tool cache-tree <options> (control|prime|update)"), |
|
NULL |
|
}; |
|
|
|
int cmd__cache_tree(int argc, const char **argv) |
|
{ |
|
struct object_id oid; |
|
struct tree *tree; |
|
int empty = 0; |
|
int invalidate_qty = 0; |
|
int i; |
|
|
|
struct option options[] = { |
|
OPT_BOOL(0, "empty", &empty, |
|
N_("clear the cache tree before each iteration")), |
|
OPT_INTEGER_F(0, "invalidate", &invalidate_qty, |
|
N_("number of entries in the cache tree to invalidate (default 0)"), |
|
PARSE_OPT_NONEG), |
|
OPT_END() |
|
}; |
|
|
|
setup_git_directory(); |
|
|
|
argc = parse_options(argc, argv, NULL, options, test_cache_tree_usage, 0); |
|
|
|
if (repo_read_index(the_repository) < 0) |
|
die(_("unable to read index file")); |
|
|
|
oidcpy(&oid, &the_index.cache_tree->oid); |
|
tree = parse_tree_indirect(&oid); |
|
if (!tree) |
|
die(_("not a tree object: %s"), oid_to_hex(&oid)); |
|
|
|
if (empty) { |
|
/* clear the cache tree & allocate a new one */ |
|
cache_tree_free(&the_index.cache_tree); |
|
the_index.cache_tree = cache_tree(); |
|
} else if (invalidate_qty) { |
|
/* invalidate the specified number of unique paths */ |
|
float f_interval = (float)the_index.cache_nr / invalidate_qty; |
|
int interval = f_interval < 1.0 ? 1 : (int)f_interval; |
|
for (i = 0; i < invalidate_qty && i * interval < the_index.cache_nr; i++) |
|
cache_tree_invalidate_path(&the_index, the_index.cache[i * interval]->name); |
|
} |
|
|
|
if (argc != 1) |
|
usage_with_options(test_cache_tree_usage, options); |
|
else if (!strcmp(argv[0], "prime")) |
|
prime_cache_tree(the_repository, &the_index, tree); |
|
else if (!strcmp(argv[0], "update")) |
|
cache_tree_update(&the_index, WRITE_TREE_SILENT | WRITE_TREE_REPAIR); |
|
/* use "control" subcommand to specify no-op */ |
|
else if (!!strcmp(argv[0], "control")) |
|
die(_("Unhandled subcommand '%s'"), argv[0]); |
|
|
|
return 0; |
|
}
|
|
|