Skip to content

Commit

Permalink
Fix performance regression for partial commits
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Linus Torvalds authored and Junio C Hamano committed Jan 13, 2008
1 parent a8db80c commit fa9dcf8
Showing 1 changed file with 28 additions and 9 deletions.
37 changes: 28 additions & 9 deletions builtin-commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>...",
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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);

Expand Down

0 comments on commit fa9dcf8

Please sign in to comment.