From: Chris Wedgwood Date: Wed, 13 Jul 2005 18:53:39 GMT Subject: Re: [RFC PATCH] cogito --- don't overwrite metadata files in place (breaks CoW use) Message-ID: <20050713185339.GA9260@taniwha.stupidest.org> In-Reply-To: On Wed, Jul 13, 2005 at 09:03:26AM +0200, Matthias Urlichs wrote: > You are ;-) the tree itsels is no symlinked, but HEAD points to > refs/heads/ by default. Thanks for pointing that out. I honestly never noticed that. 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 local NLINK=`readlink "$DEST"` if [ ! -e "$NLINK" ] ; then # dangling link, just poke as-is echo "$1" > "$DEST" return $? fi # follow link if [ -L "$NLINK" ] ; then count=$(("$count" + 1)) if [ "$count" -gt 5 ] ; then echo "Too many symlinks when resolving $2" 1>&2 return 1 fi DEST="$NLINK" fi done # end up with a regular file local TMPFILE=`mktemp "$DEST.tmp-XXXXXXX"` echo "$1" > "$TMPFILE" RET="$?" mv -f "$TMPFILE" "$DEST" return "$RET" } Obvious changes from last time are: - mark things local - follow links, bailing out if it takes too long - if the link is dangling, just use as-is - when doing the 'replace' at the end use -f because it's quite possible someone will have done cp -Rl ~otheruser/tree here and mv *might* bitch if the UID is different? - return (some) errors (just because, it's not like cogito checks for these)