/*
 * GIT - The information manager from hell
 *
 * Copyright (C) Linus Torvalds, 2005
 */
#include "cache.h"
#include "tree.h"
#include "cache-tree.h"

static int missing_ok = 0;

static const char write_tree_usage[] = "git-write-tree [--missing-ok]";

static struct lock_file lock_file;

int main(int argc, char **argv)
{
	int entries, was_valid, newfd;

	setup_git_directory();

	newfd = hold_lock_file_for_update(&lock_file, get_index_file());
	entries = read_cache();
	if (argc == 2) {
		if (!strcmp(argv[1], "--missing-ok"))
			missing_ok = 1;
		else
			die(write_tree_usage);
	}
	
	if (argc > 2)
		die("too many options");

	if (entries < 0)
		die("git-write-tree: error reading cache");

	if (!active_cache_tree)
		active_cache_tree = cache_tree();

	was_valid = cache_tree_fully_valid(active_cache_tree);
	if (!was_valid) {
		if (cache_tree_update(active_cache_tree,
				      active_cache, active_nr,
				      missing_ok, 0) < 0)
			die("git-write-tree: error building trees");
		if (0 <= newfd) {
			if (!write_cache(newfd, active_cache, active_nr))
				commit_lock_file(&lock_file);
		}
		/* Not being able to write is fine -- we are only interested
		 * in updating the cache-tree part, and if the next caller
		 * ends up using the old index with unupdated cache-tree part
		 * it misses the work we did here, but that is just a
		 * performance penalty and not a big deal.
		 */
	}
	printf("%s\n", sha1_to_hex(active_cache_tree->sha1));
	return 0;
}
