#define USE_THE_INDEX_VARIABLE
#include "test-tool.h"
#include "gettext.h"
#include "hex.h"
#include "tree.h"
#include "cache-tree.h"
#include "parse-options.h"
#include "read-cache-ll.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;
}
