Re: Q about git rev-parse {--is-inside-work-tree, --show-cdup}
From: Junio C Hamano <hidden>
Date: 2016-06-15 22:50:10
Dirk Süsserott [off-list ref] writes:
Hi together,
I wrote some shell scripts that do sth with my git repositories. I place
my scripts in my ~/bin folder (not in the repo). So the first step in my
scripts is always to check whether they get called from whithin a git
repo and bail out if they don't.
I do this like so:
---------------------
if [ "$(git rev-parse --is-inside-work-tree)" = "true" ] # (1)
then
here=$(pwd)
cdup=$(git rev-parse --show-cdup); # (2a)
cdup=${cdup:-"."} # (2b)
cd $cdup # (2c)
[do sth useful from the topdir]
cd $here
exit 0;
else
echo "Not inside a git working tree."
exit 1;
fi
---------------------
I have two questions:
1. Wouldn't it be useful, if "git rev-parse" (1) had an option "-q" that
simply indicates whether "--is-inside-work-tree" is true by means of the
return code? Actually it has an option "-q" but that doesn't work with
"--is-inside-work-tree".
That would break existing scripts that expect "-q" to squelch only the
error output, no? I think the risk of breaking existing scripts that
other people wrote over time that you (and I) haven't seen outweighs any
benefit (i.e. "if test $(rev-parse...) = true" vs "if rev-parse...") you
are seeing here.
Another thing to consider is what the script should do when rev-parse
detects an error. Do we know that all scripts want to behave exactly the
same way in two cases: (1) when run outside the work tree; and (2) when
they cannot determine if they were run from inside or outside? I don't
think so.
In your example, you are only interested to work inside work tree, and you
may find "if rev-parse... then do this interesting thing else fail fi"
sufficient, but a script by somebody else may want to make sure that it is
not run inside any git controlled working tree, and it cannot say "if
rev-parse then punt else do this big thing fi" is not an appropriate way
to write it.
So in that sense, "if rev-parse ..." is not a huge improvement to begin
with, for people who want to write their script strictly. They would
probably need to say something like:
ans=$(git rev-parse ...) || {
do the error thing
exit 1
}
case "$ans" in
true)
do the inside-work-tree thing ;;
false)
do the outside-work-tree thing ;;
*)
do the oops thing;;
esac