From: Junio C Hamano <gitster@pobox.com>
To: Duy Nguyen <pclouds@gmail.com>
Cc: Git Mailing List <git@vger.kernel.org>,
Michael J Gruber <git@drmicha.warpmail.net>
Subject: [PATCH v3 3/4] git: simplify environment save/restore logic
Date: Tue, 02 Feb 2016 15:48:55 -0800 [thread overview]
Message-ID: <xmqqmvriptaw.fsf_-_@gitster.mtv.corp.google.com> (raw)
In-Reply-To: <xmqqy4ba627n.fsf_-_@gitster.mtv.corp.google.com> (Junio C. Hamano's message of "Wed, 27 Jan 2016 15:18:36 -0800")
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
next prev parent reply other threads:[~2016-02-02 23:49 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-26 7:37 [BUG] typo DWIMery with alias broken (cd to random dir) Michael J Gruber
2016-01-26 12:50 ` Duy Nguyen
2016-01-26 13:26 ` [PATCH] git.c: fix help.autocorrect after 57ea712 breaks it Nguyễn Thái Ngọc Duy
2016-01-26 14:39 ` Michael J Gruber
2016-01-26 17:44 ` Junio C Hamano
2016-01-26 19:02 ` Junio C Hamano
2016-01-26 20:11 ` Junio C Hamano
2016-01-27 6:49 ` Junio C Hamano
2016-01-27 6:50 ` [PATCH 2/3] git: protect against unbalanced calls to {save,restore}_env() Junio C Hamano
2016-01-27 23:19 ` [PATCH v2 " Junio C Hamano
2016-01-27 6:52 ` [PATCH 3/3] git: simplify environment save/restore logic Junio C Hamano
2016-01-27 23:22 ` [PATCH v2 " Junio C Hamano
2016-01-27 23:47 ` Junio C Hamano
2016-01-27 9:14 ` [PATCH] git.c: fix help.autocorrect after 57ea712 breaks it Duy Nguyen
2016-01-27 12:01 ` Junio C Hamano
2016-01-27 23:18 ` [PATCH v2 1/3] git: remove an early return from save_env_before_alias() Junio C Hamano
2016-02-02 23:47 ` [PATCH v3 1/4] " Junio C Hamano
2016-02-02 23:47 ` [PATCH v3 2/4] git: protect against unbalanced calls to {save,restore}_env() Junio C Hamano
2016-02-02 23:48 ` Junio C Hamano [this message]
2016-02-02 23:50 ` [PATCH v3 4/4] restore_env(): free the saved environment variable once we are done Junio C Hamano
2016-02-03 1:47 ` Eric Sunshine
2016-02-03 2:19 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqmvriptaw.fsf_-_@gitster.mtv.corp.google.com \
--to=gitster@pobox.com \
--cc=git@drmicha.warpmail.net \
--cc=git@vger.kernel.org \
--cc=pclouds@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.