Skip to contentSkip to conversation

git-sh-setup: Fail if the git directory was not found.

PATCH In review Robert Shearman 3 participants 5 messages Jun 15, 2016

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 git-sh-setup: Fail if the git directory was not found.

Always use git-rev-parse to find a valid git directory, as git-repo-config no longer returns an error code if a git directory wasn't found.

This fixes the message received when invoking certain commands implemented as shell scripts from outside of a git tree, so e.g. instead of receiving this:
/home/rob/bin/git-fetch: line 89: /FETCH_HEAD: Permission denied
We get this again:
fatal: Not a git repository: '.git'

Also, move the setting of GIT_OBJECT_DIRECTORY to outside of the non-subdir-ok case as it isn't specific to that case.

---
 git-sh-setup.sh |   12 +++---------
 1 files changed, 3 insertions(+), 9 deletions(-)

Hopefully this patch addresses the concerns of Junio and others by continuing to allow git-ls-remotes to work outside of a git repository.

git-sh-setup.sh +3 -9
index d15747f..49f9e3b 100755
@@ -37,15 +37,9 @@ esac
 
 if [ -z "$SUBDIRECTORY_OK" ]
 then
-	: ${GIT_DIR=.git}
-	: ${GIT_OBJECT_DIRECTORY="$GIT_DIR/objects"}
-
-	# Make sure we are in a valid repository of a vintage we understand.
-	GIT_DIR="$GIT_DIR" git repo-config --get core.nosuch >/dev/null
-	if test $? = 128
-	then
-	    exit
-	fi
+	GIT_DIR=$(GIT_DIR=.git git-rev-parse --git-dir) || exit
 else
 	GIT_DIR=$(git-rev-parse --git-dir) || exit
 fi
+
+GIT_OBJECT_DIRECTORY="$GIT_DIR/objects"
#1 lore raw

Robert Shearman, Fri, Aug 11, 2006 11:23:30 +0200:

Quoted 3 lines

Always use git-rev-parse to find a valid git directory, as git-repo-config no longer returns an error code if a git directory wasn't found.

BTW, did anyone notice that "--usage" almost always needs git directory? That is quite unusual.

#2 lore raw
In reply to Robert Shearman
Quoted 11 lines · Robert Shearman

Always use git-rev-parse to find a valid git directory, as git-repo-config no longer returns an error code if a git directory wasn't found.

This fixes the message received when invoking certain commands implemented as shell scripts from outside of a git tree, so e.g. instead of receiving this:
/home/rob/bin/git-fetch: line 89: /FETCH_HEAD: Permission denied We get this again:
fatal: Not a git repository: '.git'

Quoted 4 lines

Also, move the setting of GIT_OBJECT_DIRECTORY to outside of the non-subdir-ok case as it isn't specific to that case.

Moving the assignment of GIT_OBJECT_DIRECTORY is fine, but changing it to an unconditional assignment is wrong. The user can have a GIT_OBJECT_DIRECTORY set independently from GIT_DIR (or ../some/where/.git that is detected).

The rest looks sane; the new test should still detect the case the original test tried to catch.

Quoted 28 lines
 git-sh-setup.sh |   12 +++---------
 1 files changed, 3 insertions(+), 9 deletions(-)

Hopefully this patch addresses the concerns of Junio and others by continuing to allow git-ls-remotes to work outside of a git repository.

git-sh-setup.sh +3 -9
index d15747f..49f9e3b 100755
@@ -37,15 +37,9 @@ esac
 
 if [ -z "$SUBDIRECTORY_OK" ]
 then
-	: ${GIT_DIR=.git}
-	: ${GIT_OBJECT_DIRECTORY="$GIT_DIR/objects"}
-
-	# Make sure we are in a valid repository of a vintage we understand.
-	GIT_DIR="$GIT_DIR" git repo-config --get core.nosuch >/dev/null
-	if test $? = 128
-	then
-	    exit
-	fi
+	GIT_DIR=$(GIT_DIR=.git git-rev-parse --git-dir) || exit
 else
 	GIT_DIR=$(git-rev-parse --git-dir) || exit
 fi
+
+GIT_OBJECT_DIRECTORY="$GIT_DIR/objects"
#3 lore raw
Quoted 4 lines · Junio C Hamano

Moving the assignment of GIT_OBJECT_DIRECTORY is fine, but changing it to an unconditional assignment is wrong. The user can have a GIT_OBJECT_DIRECTORY set independently from GIT_DIR (or ../some/where/.git that is detected).

How about this as a replacement?

-- >8 --
[PATCH] git-sh-setup: do not use repo-config to test the git directory

Since repo-config does not fail in non-git directory, it is not a good command to use to test the git-ness nor validate the repository revision of $GIT_DIR.

Original patch by Robert Shearman but with minor fixes.

---
 git-sh-setup.sh |   11 +++--------
 1 files changed, 3 insertions(+), 8 deletions(-)
git-sh-setup.sh +3 -8
index d15747f..42f9b1c 100755
@@ -35,17 +35,12 @@ case "$1" in
 	exit
 esac
 
+# Make sure we are in a valid repository of a vintage we understand.
 if [ -z "$SUBDIRECTORY_OK" ]
 then
 	: ${GIT_DIR=.git}
-	: ${GIT_OBJECT_DIRECTORY="$GIT_DIR/objects"}
-
-	# Make sure we are in a valid repository of a vintage we understand.
-	GIT_DIR="$GIT_DIR" git repo-config --get core.nosuch >/dev/null
-	if test $? = 128
-	then
-	    exit
-	fi
+	GIT_DIR=$(GIT_DIR="$GIT_DIR" git-rev-parse --git-dir) || exit
 else
 	GIT_DIR=$(git-rev-parse --git-dir) || exit
 fi
+: ${GIT_OBJECT_DIRECTORY="$GIT_DIR/objects"}
Signature · 1 line
1.4.2.rc4.g9d8df
#4 lore raw
Quoted 10 lines · Junio C Hamano
Quoted 6 lines · Junio C Hamano

Moving the assignment of GIT_OBJECT_DIRECTORY is fine, but changing it to an unconditional assignment is wrong. The user can have a GIT_OBJECT_DIRECTORY set independently from GIT_DIR (or ../some/where/.git that is detected).

I'm not an expert in shell scripting so I didn't notice that it was a conditional assignment.

Quoted 3 lines

How about this as a replacement?

Looks good.

Thanks,

Signature · 1 line
Rob Shearman