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