Skip to content

Commit

Permalink
Use a temporary index for git commit --interactive
Browse files Browse the repository at this point in the history
Change the behaviour of git commit --interactive so that when you abort
the commit (by leaving the commit message empty) the index remains
unchanged.

Hitherto an aborted commit --interactive has added the selected hunks to
the index regardless of whether the commit succeeded or not.

Signed-off-by: Conrad Irwin <conrad.irwin@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Conrad Irwin authored and Junio C Hamano committed May 8, 2011
1 parent 6086ff6 commit 1020d08
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 9 deletions.
3 changes: 2 additions & 1 deletion Documentation/git-commit.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
36 changes: 28 additions & 8 deletions builtin/commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -336,25 +336,45 @@ 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);

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.
*
Expand Down

0 comments on commit 1020d08

Please sign in to comment.