On Wed, 13 Jul 2005, Chris Wedgwood wrote:
>
> How about the following?
>
> echo_to_file() {
> local DEST="$2"
> local count=1
> local RET
>
> # follow symlinks until we run out or end up with something
> # dangling
> while [ -L "$DEST" ] ; do
If you really want to do something like this, then you should do it like
this:
update_head() {
head="$GIT_DIR/HEAD"
newvalue=$(git-rev-parse --verify "$1"^0) || exit
if [ -L "$head" ]; then
head=$(readlink "$head")
case "$head" in
refs/heads/*)
head="$GIT_DIR"/"$head"
;;
*)
exit 1
;;
esac
fi
echo $newvalue > "$head.lock" && rename "$head.lock" "$head"
}
which is at least slightly simpler, and might even work thanks to that.
Your was buggy for several reasons:
- following multiple links is _wrong_, since the next-level link could
actually be a symlink to another tree entirely (if somebody is crazy
enough to use "cp -Rl" to copy trees, then why not "cp -Rs"?)
Ergo: you should only follow a symlink if it points to refs/heads, and
anything else would be a BUG.
- you got relative links wrong.
Now, admittedly the above is totally untested too, so I'll probably have
typos etc in there. But the basic point stands: don't go for complexity.
Go for one _particular_ case.
Linus
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html