X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=write-tree.c;h=895e7a359d108312918c27d98c7b529f2e25e300;hb=c7e3a75121877ecc8ea60c2d3873a1c6c504ed68;hp=cef0c5bb422ae81b7d6be933b107244f8c9de789;hpb=5b5e4d64874823b0041a542c6fca415023174eb3;p=git.git diff --git a/write-tree.c b/write-tree.c index cef0c5bb4..895e7a359 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 cache_file cache_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_index_file_for_update(&cache_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_index_file(&cache_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; }