From ab9cb76f661c1794800361c27bc5a515245aaaef Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Fri, 25 Nov 2005 15:59:09 -0800 Subject: Repository format version check. This adds the repository format version code, first done by Martin Atukunda. Signed-off-by: Junio C Hamano --- setup.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'setup.c') diff --git a/setup.c b/setup.c index ab3c778e80..0e2e3c8c3c 100644 --- a/setup.c +++ b/setup.c @@ -154,6 +154,22 @@ static const char *setup_git_directory_1(void) return cwd + offset; } +int check_repository_format_version(const char *var, const char *value) +{ + if (strcmp(var, "core.repositoryformatversion") == 0) + repository_format_version = git_config_int(var, value); + return 0; +} + +int check_repository_format(void) +{ + git_config(check_repository_format_version); + if (GIT_REPO_VERSION < repository_format_version) + die ("Expected git repo version <= %d, found %d", + GIT_REPO_VERSION, repository_format_version); + return 0; +} + const char *setup_git_directory(void) { const char *retval = setup_git_directory_1(); -- cgit v1.3 From 22752e4c43e1bc864eaf1c2c015031a2b5e98a3b Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Fri, 25 Nov 2005 16:08:48 -0800 Subject: setup_git_directory(): check repository format version. After figuring out the GIT_DIR location, make sure the repository is of the right vintage, by calling check_repository_format(). . Signed-off-by: Junio C Hamano --- setup.c | 1 + 1 file changed, 1 insertion(+) (limited to 'setup.c') diff --git a/setup.c b/setup.c index 0e2e3c8c3c..cc44a724bf 100644 --- a/setup.c +++ b/setup.c @@ -173,5 +173,6 @@ int check_repository_format(void) const char *setup_git_directory(void) { const char *retval = setup_git_directory_1(); + check_repository_format(); return retval; } -- cgit v1.3 From 4ca0660816671f65546626b6e2c2038b6a347a8b Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Fri, 25 Nov 2005 23:14:15 -0800 Subject: working from subdirectory: preparation - prefix_filename() is like prefix_path() but can be used to name any file on the filesystem, not the files that might go into the index file. - setup_git_directory_gently() tries to find the GIT_DIR, but does not die() if called outside a git repository. Signed-off-by: Junio C Hamano --- cache.h | 2 ++ setup.c | 28 +++++++++++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) (limited to 'setup.c') diff --git a/cache.h b/cache.h index 634b5aa69c..f9b367f314 100644 --- a/cache.h +++ b/cache.h @@ -147,8 +147,10 @@ extern char *get_graft_file(void); #define ALTERNATE_DB_ENVIRONMENT "GIT_ALTERNATE_OBJECT_DIRECTORIES" extern const char **get_pathspec(const char *prefix, const char **pathspec); +extern const char *setup_git_directory_gently(int *); extern const char *setup_git_directory(void); extern const char *prefix_path(const char *prefix, int len, const char *path); +extern const char *prefix_filename(const char *prefix, int len, const char *path); #define alloc_nr(x) (((x)+16)*3/2) diff --git a/setup.c b/setup.c index cc44a724bf..bde590f7cc 100644 --- a/setup.c +++ b/setup.c @@ -47,6 +47,21 @@ const char *prefix_path(const char *prefix, int len, const char *path) return path; } +/* + * Unlike prefix_path, this should be used if the named file does + * not have to interact with index entry; i.e. name of a random file + * on the filesystem. + */ +const char *prefix_filename(const char *pfx, int pfx_len, const char *arg) +{ + static char path[PATH_MAX]; + if (!pfx || !*pfx || arg[0] == '/') + return arg; + memcpy(path, pfx, pfx_len); + strcpy(path + pfx_len, arg); + return path; +} + const char **get_pathspec(const char *prefix, const char **pathspec) { const char *entry = *pathspec; @@ -92,7 +107,7 @@ static int is_toplevel_directory(void) return 1; } -static const char *setup_git_directory_1(void) +const char *setup_git_directory_gently(int *nongit_ok) { static char cwd[PATH_MAX+1]; int len, offset; @@ -139,8 +154,15 @@ static const char *setup_git_directory_1(void) break; chdir(".."); do { - if (!offset) + if (!offset) { + if (nongit_ok) { + if (chdir(cwd)) + die("Cannot come back to cwd"); + *nongit_ok = 1; + return NULL; + } die("Not a git repository"); + } } while (cwd[--offset] != '/'); } @@ -172,7 +194,7 @@ int check_repository_format(void) const char *setup_git_directory(void) { - const char *retval = setup_git_directory_1(); + const char *retval = setup_git_directory_gently(NULL); check_repository_format(); return retval; } -- cgit v1.3 From 0738fc2192109f946c033b3b003cb10aace9554e Mon Sep 17 00:00:00 2001 From: Tommi Virtanen Date: Wed, 30 Nov 2005 17:37:10 +0200 Subject: Do not attempt to access literal dirname "GIT_OBJECT_DIRECTORY". Dereference the environment variable before using it. Signed-off-by: Tommi Virtanen Signed-off-by: Junio C Hamano --- setup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'setup.c') diff --git a/setup.c b/setup.c index cc44a724bf..3286a568ed 100644 --- a/setup.c +++ b/setup.c @@ -116,7 +116,7 @@ static const char *setup_git_directory_1(void) if (validate_symref(path)) goto bad_dir_environ; if (getenv(DB_ENVIRONMENT)) { - if (access(DB_ENVIRONMENT, X_OK)) + if (access(getenv(DB_ENVIRONMENT), X_OK)) goto bad_dir_environ; } else { -- cgit v1.3