git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v3 1/3] Use a temporary index for git commit --interactive

From
conrad.irwin@gmail.com <conrad.irwin@gmail.com>
Date
May 7, 2011, 05:59 UTC
Message-ID
<1304748001-17982-2-git-send-email-conrad.irwin@gmail.com>
In-Reply-To
<1304748001-17982-1-git-send-email-conrad.irwin@gmail.com>
From: Conrad Irwin <conrad.irwin@gmail.com>

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>
---
 Documentation/git-commit.txt |    3 ++-
 builtin/commit.c             |   36 ++++++++++++++++++++++++++++--------
 2 files changed, 30 insertions(+), 9 deletions(-)
diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt
index d0534b8..ed50271 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 67757e9..636aea6 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.
 	 *
-- 
1.7.5.188.g4817
Previous: conrad.irwin@gmail.comNext: conrad.irwin@gmail.com
Message 2 of 21 in “Git commit --patch (again)”
  1. 0/3 Git commit --patch (again)conrad.irwin@gmail.com, May 7, 2011
  2. 1/3 Use a temporary index for git commit --interactiveconrad.irwin@gmail.com, May 7, 2011
  3. 2/3 Allow git commit --interactive with pathsconrad.irwin@gmail.com, May 7, 2011
  4. 3/3 Add support for -p/--patch to git-commitconrad.irwin@gmail.com, May 7, 2011
  5. Valentin HaenelMay 7, 2011
  6. Conrad IrwinMay 7, 2011
  7. 3/3 Add support for -p/--patch to git-commitConrad Irwin, May 7, 2011
  8. Junio C HamanoMay 8, 2011
  9. Add commit to list of config.singlekey commandsConrad Irwin, May 7, 2011
  10. Sverre RabbelierMay 7, 2011
  11. Jeff KingMay 9, 2011
  12. Junio C HamanoMay 9, 2011
  13. Jeff KingMay 9, 2011
  14. Junio C HamanoMay 9, 2011
  15. Junio C HamanoMay 9, 2011
  16. Jeff KingMay 10, 2011
  17. Jeff KingMay 10, 2011
  18. Conrad IrwinMay 10, 2011
  19. Test atomic git-commit --interactiveConrad Irwin, May 10, 2011
  20. Jeff KingMay 10, 2011
  21. Conrad IrwinMay 10, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.