{"thread":{"id":"6450","subject":"[PATCH] Do not verify filenames in a bare repository","startedAt":"2007-01-20T02:09:34Z","lastAt":"2007-01-20T02:09:34Z","messageCount":1,"participants":["Johannes Schindelin"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"32131","messageId":"Pine.LNX.4.63.0701200308280.22628@wbgn013.biozentrum.uni-wuerzburg.de","threadId":"6450","inReplyTo":null,"subject":"[PATCH] Do not verify filenames in a bare repository","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2007-01-20T02:09:34Z","receivedAt":"2007-01-20T02:09:34Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"\nFor example, it makes no sense to check the presence of a file\nnamed \"HEAD\" when calling \"git log HEAD\" in a bare repository.\n\nNoticed by Han-Wen Nienhuys.\n\nSigned-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>\n---\n\n\tThis is slightly longer than my 1st attempt, but more complete: \n\tthis works now, too:\n\n\t\t(cd git; git show HEAD)\n\n cache.h                 |    1 +\n setup.c                 |   26 ++++++++++++++++++++++++++\n t/t1020-subdirectory.sh |    7 +++++++\n 3 files changed, 34 insertions(+), 0 deletions(-)\n\ndiff --git a/cache.h b/cache.h\nindex bdaabbe..9690f0f 100644\n--- a/cache.h\n+++ b/cache.h\n@@ -129,6 +129,7 @@ extern int cache_errno;\n \n extern int is_bare_repository_cfg;\n extern int is_bare_repository(void);\n+extern int is_inside_git_dir(void);\n extern const char *get_git_dir(void);\n extern char *get_object_directory(void);\n extern char *get_refs_directory(void);\ndiff --git a/setup.c b/setup.c\nindex cc97f9f..e9d3f5a 100644\n--- a/setup.c\n+++ b/setup.c\n@@ -95,6 +95,8 @@ void verify_non_filename(const char *prefix, const char *arg)\n \tconst char *name;\n \tstruct stat st;\n \n+\tif (is_inside_git_dir())\n+\t\treturn;\n \tif (*arg == '-')\n \t\treturn; /* flag */\n \tname = prefix ? prefix_filename(prefix, strlen(prefix), arg) : arg;\n@@ -168,6 +170,28 @@ static int is_git_directory(const char *suspect)\n \treturn 1;\n }\n \n+static int inside_git_dir = -1;\n+\n+int is_inside_git_dir(void)\n+{\n+\tif (inside_git_dir < 0) {\n+\t\tchar buffer[1024];\n+\n+\t\tif (is_bare_repository())\n+\t\t\treturn (inside_git_dir = 1);\n+\t\tif (getcwd(buffer, sizeof(buffer))) {\n+\t\t\tconst char *git_dir = get_git_dir(), *cwd = buffer;\n+\t\t\twhile (*git_dir && *git_dir == *cwd) {\n+\t\t\t\tgit_dir++;\n+\t\t\t\tcwd++;\n+\t\t\t}\n+\t\t\tinside_git_dir = !*git_dir;\n+\t\t} else\n+\t\t\tinside_git_dir = 0;\n+\t}\n+\treturn inside_git_dir;\n+}\n+\n const char *setup_git_directory_gently(int *nongit_ok)\n {\n \tstatic char cwd[PATH_MAX+1];\n@@ -206,6 +230,7 @@ const char *setup_git_directory_gently(int *nongit_ok)\n \t\t\t\t\tif (chdir(cwd))\n \t\t\t\t\t\tdie(\"Cannot come back to cwd\");\n \t\t\t\t\tsetenv(GIT_DIR_ENVIRONMENT, cwd, 1);\n+\t\t\t\t\tinside_git_dir = 1;\n \t\t\t\t\treturn NULL;\n \t\t\t\t}\n \t\t\t\tif (nongit_ok) {\n@@ -226,6 +251,7 @@ const char *setup_git_directory_gently(int *nongit_ok)\n \toffset++;\n \tcwd[len++] = '/';\n \tcwd[len] = 0;\n+\tinside_git_dir = !strncmp(cwd + offset, \".git/\", 5);\n \treturn cwd + offset;\n }\n \ndiff --git a/t/t1020-subdirectory.sh b/t/t1020-subdirectory.sh\nindex 4409b87..b4b035a 100755\n--- a/t/t1020-subdirectory.sh\n+++ b/t/t1020-subdirectory.sh\n@@ -106,4 +106,11 @@ test_expect_success 'read-tree' '\n \tcmp ../one ../original.one\n '\n \n+test_expect_success 'no file/rev ambuguity check inside .git' '\n+\tcd $HERE &&\n+\tgit commit -a -m 1 &&\n+\tcd $HERE/.git &&\n+\tgit show HEAD\n+'\n+\n test_done\n-- \n1.5.0.rc1.g6d11-dirty\n"}]}