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

Reply via email to