X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=write-tree.c;h=d6a605893dcbb4d8d65979309cf9ce1199aa8279;hb=5b139a66fcac6ebe6a1ca483ced8cc70f65d3a78;hp=cef0c5bb422ae81b7d6be933b107244f8c9de789;hpb=a52139b47e505e74e23a02f5324485e11dfe4ef9;p=git.git diff --git a/write-tree.c b/write-tree.c index cef0c5bb..d6a60589 100644 --- a/write-tree.c +++ b/write-tree.c @@ -7,21 +7,20 @@ #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 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); + 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; @@ -35,11 +34,26 @@ int main(int argc, char **argv) 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(); + + 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; }