diff options
-rw-r--r-- | Documentation/git-commit.txt | 3 | ||||
-rw-r--r-- | builtin/commit.c | 36 |
2 files changed, 30 insertions, 9 deletions
diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt index d0534b8c05..ed50271aab 100644 --- a/Documentation/git-commit.txt +++ b/Documentation/git-commit.txt @@ -41,7 +41,8 @@ The content to be added can be specified in several ways: 5. by using the --interactive switch with the 'commit' command to decide one by one which files should be part of the commit, before finalizing the - operation. Currently, this is done by invoking 'git add --interactive'. + operation. Currently, this is done by invoking 'git add --interactive' + on a temporary index. The `--dry-run` option can be used to obtain a summary of what is included by any of the above for the next diff --git a/builtin/commit.c b/builtin/commit.c index 67757e999f..636aea6d62 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -336,18 +336,11 @@ static char *prepare_index(int argc, const char **argv, const char *prefix, int int fd; struct string_list partial; const char **pathspec = NULL; + char *old_index_env = NULL; int refresh_flags = REFRESH_QUIET; if (is_status) refresh_flags |= REFRESH_UNMERGED; - if (interactive) { - if (interactive_add(argc, argv, prefix) != 0) - die(_("interactive add failed")); - if (read_cache_preload(NULL) < 0) - die(_("index file corrupt")); - commit_style = COMMIT_AS_IS; - return get_index_file(); - } if (*argv) pathspec = get_pathspec(prefix, argv); @@ -355,6 +348,33 @@ static char *prepare_index(int argc, const char **argv, const char *prefix, int if (read_cache_preload(pathspec) < 0) die(_("index file corrupt")); + if (interactive) { + fd = hold_locked_index(&index_lock, 1); + + refresh_cache_or_die(refresh_flags); + + if (write_cache(fd, active_cache, active_nr) || + close_lock_file(&index_lock)) + die(_("unable to create temporary index")); + + old_index_env = getenv(INDEX_ENVIRONMENT); + setenv(INDEX_ENVIRONMENT, index_lock.filename, 1); + + if (interactive_add(argc, argv, prefix) != 0) + die(_("interactive add failed")); + + if (old_index_env && *old_index_env) + setenv(INDEX_ENVIRONMENT, old_index_env, 1); + else + unsetenv(INDEX_ENVIRONMENT); + + discard_cache(); + read_cache_from(index_lock.filename); + + commit_style = COMMIT_NORMAL; + return index_lock.filename; + } + /* * Non partial, non as-is commit. * |