X-Git-Url: https://git.octo.it/?p=git.git;a=blobdiff_plain;f=write-tree.c;h=bd07da6183b25470b00b9a2eedef29b7275760ec;hp=cef0c5bb422ae81b7d6be933b107244f8c9de789;hb=HEAD;hpb=a52139b47e505e74e23a02f5324485e11dfe4ef9 diff --git a/write-tree.c b/write-tree.c index cef0c5bb..bd07da61 100644 --- a/write-tree.c +++ b/write-tree.c @@ -7,39 +7,66 @@ #include "tree.h" #include "cache-tree.h" -static unsigned char active_cache_sha1[20]; -static struct cache_tree *active_cache_tree; - static int missing_ok = 0; +static char *prefix = NULL; + +static const char write_tree_usage[] = +"git-write-tree [--missing-ok] [--prefix=/]"; -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; + int entries, was_valid, newfd; setup_git_directory(); - entries = read_cache_1(active_cache_sha1); - active_cache_tree = read_cache_tree(active_cache_sha1); - if (argc == 2) { - if (!strcmp(argv[1], "--missing-ok")) + newfd = hold_lock_file_for_update(&lock_file, get_index_file()); + entries = read_cache(); + + while (1 < argc) { + char *arg = argv[1]; + if (!strcmp(arg, "--missing-ok")) missing_ok = 1; + else if (!strncmp(arg, "--prefix=", 9)) + prefix = arg + 9; else die(write_tree_usage); + argc--; argv++; } - + if (argc > 2) die("too many options"); if (entries < 0) die("git-write-tree: error reading cache"); - if (cache_tree_update(active_cache_tree, active_cache, active_nr, - missing_ok)) - die("git-write-tree: error building trees"); - write_cache_tree(active_cache_sha1, active_cache_tree); + if (!active_cache_tree) + active_cache_tree = cache_tree(); - printf("%s\n", sha1_to_hex(active_cache_tree->sha1)); + 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. + */ + } + if (prefix) { + struct cache_tree *subtree = + cache_tree_find(active_cache_tree, prefix); + printf("%s\n", sha1_to_hex(subtree->sha1)); + } + else + printf("%s\n", sha1_to_hex(active_cache_tree->sha1)); return 0; }