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

[PATCH 3/3] Replace setenv(GIT_DIR_ENVIRONMENT, ...) with set_git_dir()

From
Steffen Prohaska <prohaska@zib.de>
Date
Nov 21, 2007, 20:27 UTC
Message-ID
<11956768412755-git-send-email-prohaska@zib.de>
In-Reply-To
<11956768413887-git-send-email-prohaska@zib.de>
From: Dmitry Kakurin <Dmitry.Kakurin@gmail.com>

We have a function set_git_dir(). So let's use it, instead of setting the evironment directly.

This also fixes a problem on Windows: environment.c caches results of many getenv calls. A setenv(X) call to the Windows C runtime (CRT) invalidates all previous values returned by getenv(X). So cached values become dangling pointers.

Before this change, git clone was failing with 'invalid object name HEAD' if ran from Windows' cmd.exe.

[sp: rebased; split off get_git_dir() in builtin-init-db.c
     to separate commit; adjusted commit message. ]
Signed-off-by: Dmitry Kakurin <Dmitry.Kakurin@gmail.com>
Signed-off-by: Steffen Prohaska <prohaska@zib.de>
---
 git.c   |    6 +++---
 path.c  |    2 +-
 setup.c |    2 +-
 3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/git.c b/git.c
index 7604319..8bc25b7 100644
--- a/git.c
+++ b/git.c
@@ -45,14 +45,14 @@ static int handle_options(const char*** argv, int* argc, int* envchanged)
 				fprintf(stderr, "No directory given for --git-dir.\n" );
 				usage(git_usage_string);
 			}
-			setenv(GIT_DIR_ENVIRONMENT, (*argv)[1], 1);
+			set_git_dir( (*argv)[1] );
 			if (envchanged)
 				*envchanged = 1;
 			(*argv)++;
 			(*argc)--;
 			handled++;
 		} else if (!prefixcmp(cmd, "--git-dir=")) {
-			setenv(GIT_DIR_ENVIRONMENT, cmd + 10, 1);
+			set_git_dir(cmd + 10);
 			if (envchanged)
 				*envchanged = 1;
 		} else if (!strcmp(cmd, "--work-tree")) {
@@ -72,7 +72,7 @@ static int handle_options(const char*** argv, int* argc, int* envchanged)
 		} else if (!strcmp(cmd, "--bare")) {
 			static char git_dir[PATH_MAX+1];
 			is_bare_repository_cfg = 1;
-			setenv(GIT_DIR_ENVIRONMENT, getcwd(git_dir, sizeof(git_dir)), 0);
+			set_git_dir(getcwd(git_dir, sizeof(git_dir)));
 			if (envchanged)
 				*envchanged = 1;
 		} else {
diff --git a/path.c b/path.c
index 4260952..f26a4a1 100644
--- a/path.c
+++ b/path.c
@@ -248,7 +248,7 @@ char *enter_repo(char *path, int strict)
 
 	if (access("objects", X_OK) == 0 && access("refs", X_OK) == 0 &&
 	    validate_headref("HEAD") == 0) {
-		setenv(GIT_DIR_ENVIRONMENT, ".", 1);
+		set_git_dir(".");
 		check_repository_format();
 		return path;
 	}
diff --git a/setup.c b/setup.c
index 43cd3f9..8dbd46c 100644
--- a/setup.c
+++ b/setup.c
@@ -285,7 +285,7 @@ const char *setup_git_directory_gently(int *nongit_ok)
 			inside_git_dir = 1;
 			if (!work_tree_env)
 				inside_work_tree = 0;
-			setenv(GIT_DIR_ENVIRONMENT, ".", 1);
+			set_git_dir(".");
 			return NULL;
 		}
 		chdir("..");
-- 
1.5.3.5.750.g8692
Previous: Steffen ProhaskaNext: Johannes Schindelin
Message 4 of 18 in “msysgit fallout”
  1. 0/3 msysgit falloutSteffen Prohaska, Nov 21, 2007
  2. 1/3 sha1_file.c: Fix size_t related printf format warningsSteffen Prohaska, Nov 21, 2007
  3. 2/3 builtin-init-db: use get_git_dir() instead of getenv()Steffen Prohaska, Nov 21, 2007
  4. 3/3 Replace setenv(GIT_DIR_ENVIRONMENT, ...) with set_git_dir()Steffen Prohaska, Nov 21, 2007
  5. Johannes SchindelinNov 22, 2007
  6. Junio C HamanoNov 22, 2007
  7. Steffen ProhaskaNov 22, 2007
  8. Junio C HamanoNov 22, 2007
  9. Steffen ProhaskaNov 22, 2007
  10. Johannes SixtNov 22, 2007
  11. Steffen ProhaskaNov 22, 2007
  12. Johannes SchindelinNov 22, 2007
  13. Steffen ProhaskaJan 1, 2008
  14. Dmitry KakurinJan 3, 2008
  15. Steffen ProhaskaJan 3, 2008
  16. Dmitry KakurinJan 3, 2008
  17. Steffen ProhaskaJan 3, 2008
  18. Johannes SixtNov 22, 2007

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.