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

[PATCH v3 3/4] git: simplify environment save/restore logic

From
Junio C Hamano <gitster@pobox.com>
Date
Feb 2, 2016, 23:48 UTC
Message-ID
<xmqqmvriptaw.fsf_-_@gitster.mtv.corp.google.com>
In-Reply-To
<xmqqy4ba627n.fsf_-_@gitster.mtv.corp.google.com>

The only code that cares about the value of the global variable saved_env_before_alias after the previous fix is handle_builtin() that turns into a glorified no-op when the variable is true, so the logic could safely be lifted to its caller, i.e. the caller can refrain from calling it when the variable is set.

This variable tells us if save_env_before_alias() was called (with or without matching restore_env()), but the sole caller of the function, handle_alias(), always calls it as the first thing, so we can consider that the variable essentially keeps track of the fact that handle_alias() has ever been called.

It turns out that handle_builtin() and handle_alias() are called only from one function in a way that the value of the variable matters, which is run_argv(), and it already keeps track of the fact that it already called handle_alias().

So we can simplify the whole thing by:
- Change handle_builtin() to always make a direct call to the
  builtin implementation it finds, and make sure the caller
  refrains from calling it if handle_alias() has ever been
  called;
- Remove saved_env_before_alias variable, and instead use the
  local "done_alias" variable maintained inside run_argv() to
  make the same decision.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 git.c | 27 +++++++++++++--------------
 1 file changed, 13 insertions(+), 14 deletions(-)
diff --git a/git.c b/git.c
index e39b972..1cbe267 100644
--- a/git.c
+++ b/git.c
@@ -25,13 +25,11 @@ static const char *env_names[] = {
 	GIT_PREFIX_ENVIRONMENT
 };
 static char *orig_env[4];
-static int saved_env_before_alias;
 static int save_restore_env_balance;
 
 static void save_env_before_alias(void)
 {
 	int i;
-	saved_env_before_alias = 1;
 
 	assert(save_restore_env_balance == 0);
 	save_restore_env_balance = 1;
@@ -533,16 +531,8 @@ static void handle_builtin(int argc, const char **argv)
 	}
 
 	builtin = get_builtin(cmd);
-	if (builtin) {
-		/*
-		 * XXX: if we can figure out cases where it is _safe_
-		 * to do, we can avoid spawning a new process when
-		 * saved_env_before_alias is true
-		 * (i.e. setup_git_dir* has been run once)
-		 */
-		if (!saved_env_before_alias)
-			exit(run_builtin(builtin, argc, argv));
-	}
+	if (builtin)
+		exit(run_builtin(builtin, argc, argv));
 }
 
 static void execv_dashed_external(const char **argv)
@@ -586,8 +576,17 @@ static int run_argv(int *argcp, const char ***argv)
 	int done_alias = 0;
 
 	while (1) {
-		/* See if it's a builtin */
-		handle_builtin(*argcp, *argv);
+		/*
+		 * If we tried alias and futzed with our environment,
+		 * it no longer is safe to invoke builtins directly in
+		 * general.  We have to spawn them as dashed externals.
+		 *
+		 * NEEDSWORK: if we can figure out cases
+		 * where it is safe to do, we can avoid spawning a new
+		 * process.
+		 */
+		if (!done_alias)
+			handle_builtin(*argcp, *argv);
 
 		/* .. then try the external ones */
 		execv_dashed_external(*argv);
-- 
2.7.0-391-gcd29568
Previous: Junio C HamanoNext: Junio C Hamano
Message 19 of 22 in “[BUG] typo DWIMery with alias broken (cd to random dir)”
  1. Michael J GruberJan 26, 2016
  2. Duy NguyenJan 26, 2016
  3. git.c: fix help.autocorrect after 57ea712 breaks itNguyễn Thái Ngọc Duy, Jan 26, 2016
  4. Michael J GruberJan 26, 2016
  5. Junio C HamanoJan 26, 2016
  6. Junio C HamanoJan 26, 2016
  7. Junio C HamanoJan 26, 2016
  8. Junio C HamanoJan 27, 2016
  9. 2/3 git: protect against unbalanced calls to {save,restore}_env()Junio C Hamano, Jan 27, 2016
  10. 2/3 git: protect against unbalanced calls to {save,restore}_env()Junio C Hamano, Jan 27, 2016
  11. 3/3 git: simplify environment save/restore logicJunio C Hamano, Jan 27, 2016
  12. 3/3 git: simplify environment save/restore logicJunio C Hamano, Jan 27, 2016
  13. Junio C HamanoJan 27, 2016
  14. Duy NguyenJan 27, 2016
  15. Junio C HamanoJan 27, 2016
  16. 1/3 git: remove an early return from save_env_before_alias()Junio C Hamano, Jan 27, 2016
  17. 1/4 git: remove an early return from save_env_before_alias()Junio C Hamano, Feb 2, 2016
  18. 2/4 git: protect against unbalanced calls to {save,restore}_env()Junio C Hamano, Feb 2, 2016
  19. 3/4 git: simplify environment save/restore logicJunio C Hamano, Feb 2, 2016
  20. 4/4 restore_env(): free the saved environment variable once we are doneJunio C Hamano, Feb 2, 2016
  21. Eric SunshineFeb 3, 2016
  22. Junio C HamanoFeb 3, 2016

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.