diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-01-13 00:30:56 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-01-13 00:30:56 -0800 |
commit | fa9dcf80e1048ea996349891a885ac325019fcac (patch) | |
tree | f05ce66e4cb81298f83d7ade9c22530d34e98a43 /builtin-commit.c | |
parent | a8db80c22494396a81d2b4b7f4082c369fc0f78d (diff) | |
download | git-fa9dcf80e1048ea996349891a885ac325019fcac.tar.gz |
Fix performance regression for partial commits
When running "git commit paths" to create a partial commit, we
used to carefully build the temporary index so that we do not
lose the cached stat information. The rewrite of the command in
C lost it by carelessly using read_tree().
This resurrects the earlier behaviour to keep the cached stat
information as much as possible by using one-tree merge logic.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin-commit.c')
-rw-r--r-- | builtin-commit.c | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/builtin-commit.c b/builtin-commit.c index 73f1e3576a..6d2ca808b5 100644 --- a/builtin-commit.c +++ b/builtin-commit.c @@ -21,6 +21,7 @@ #include "utf8.h" #include "parse-options.h" #include "path-list.h" +#include "unpack-trees.h" static const char * const builtin_commit_usage[] = { "git-commit [options] [--] <filepattern>...", @@ -177,10 +178,34 @@ static void add_remove_files(struct path_list *list) } } +static void create_base_index(void) +{ + struct tree *tree; + struct unpack_trees_options opts; + struct tree_desc t; + + if (initial_commit) { + discard_cache(); + return; + } + + memset(&opts, 0, sizeof(opts)); + opts.head_idx = 1; + opts.index_only = 1; + opts.merge = 1; + + opts.fn = oneway_merge; + tree = parse_tree_indirect(head_sha1); + if (!tree) + die("failed to unpack HEAD tree object"); + parse_tree(tree); + init_tree_desc(&t, tree->buffer, tree->size); + unpack_trees(1, &t, &opts); +} + static char *prepare_index(int argc, const char **argv, const char *prefix) { int fd; - struct tree *tree; struct path_list partial; const char **pathspec = NULL; @@ -278,14 +303,8 @@ static char *prepare_index(int argc, const char **argv, const char *prefix) fd = hold_lock_file_for_update(&false_lock, git_path("next-index-%d", getpid()), 1); - discard_cache(); - if (!initial_commit) { - tree = parse_tree_indirect(head_sha1); - if (!tree) - die("failed to unpack HEAD tree object"); - if (read_tree(tree, 0, NULL)) - die("failed to read HEAD tree object"); - } + + create_base_index(); add_remove_files(&partial); refresh_cache(REFRESH_QUIET); |