v2 fixes the incorrect use of consecutive getenv() and adds a comment
to clarify the role of old_gitdir
Interdiff:
diff --git a/environment.c b/environment.c
index 95de419de8..47c6e31559 100644
--- a/environment.c
+++ b/environment.c
@@ -14,6 +14,7 @@
#include "fmt-merge-msg.h"
#include "commit.h"
#include "object-store.h"
+#include "argv-array.h"
int trust_executable_bit = 1;
int trust_ctime = 1;
@@ -148,18 +149,34 @@ static char *expand_namespace(const char *raw_namespace)
return strbuf_detach(&buf, NULL);
}
+/* Wrapper of getenv() that returns a strdup value. This value is kept
+ * in argv to be freed later.
+ */
+static const char *getenv_safe(struct argv_array *argv, const char *name)
+{
+ const char *value = getenv(name);
+
+ if (!value)
+ return NULL;
+
+ argv_array_push(argv, value);
+ return argv->argv[argv->argc - 1];
+}
+
void setup_git_env(const char *git_dir)
{
const char *shallow_file;
const char *replace_ref_base;
struct set_gitdir_args args = { NULL };
+ struct argv_array to_free = ARGV_ARRAY_INIT;
- args.shared_root = getenv(GIT_COMMON_DIR_ENVIRONMENT);
- args.object_dir = getenv(DB_ENVIRONMENT);
- args.graft_file = getenv(GRAFT_ENVIRONMENT);
- args.index_file = getenv(INDEX_ENVIRONMENT);
- args.alternate_db = getenv(ALTERNATE_DB_ENVIRONMENT);
+ args.shared_root = getenv_safe(&to_free, GIT_COMMON_DIR_ENVIRONMENT);
+ args.object_dir = getenv_safe(&to_free, DB_ENVIRONMENT);
+ args.graft_file = getenv_safe(&to_free, GRAFT_ENVIRONMENT);
+ args.index_file = getenv_safe(&to_free, INDEX_ENVIRONMENT);
+ args.alternate_db = getenv_safe(&to_free, ALTERNATE_DB_ENVIRONMENT);
repo_set_gitdir(the_repository, git_dir, &args);
+ argv_array_clear(&to_free);
if (getenv(NO_REPLACE_OBJECTS_ENVIRONMENT))
check_replace_refs = 0;
diff --git a/repository.c b/repository.c
index 8f6386022f..c555dacad2 100644
--- a/repository.c
+++ b/repository.c
@@ -48,6 +48,11 @@ void repo_set_gitdir(struct repository *repo,
const struct set_gitdir_args *o)
{
const char *gitfile = read_gitfile(root);
+ /*
+ * repo->gitdir is saved because the caller could pass "root"
+ * that also points to repo->gitdir. We want to keep it alive
+ * until after xstrdup(root). Then we can free it.
+ */
char *old_gitdir = repo->gitdir;
repo->gitdir = xstrdup(gitfile ? gitfile : root);
Nguyễn Thái Ngọc Duy (4):
repository.c: move env-related setup code back to environment.c
repository.c: delete dead functions
sha1_file.c: move delayed getenv(altdb) back to setup_git_env()
repository: delete ignore_env member
cache.h | 2 +-
environment.c | 30 ++++++++++++++++--
object-store.h | 5 ++-
object.c | 1 +
repository.c | 84 ++++++++++++++++++++++++--------------------------
repository.h | 21 +++++++------
setup.c | 3 +-
sha1_file.c | 6 +---
8 files changed, 86 insertions(+), 66 deletions(-)
--
2.16.1.435.g8f24da2e1a