From dad5a2e004ea5f045de01d49184e10067cbf8519 Mon Sep 17 00:00:00 2001 From: curt mayer Date: Sat, 22 Feb 2020 19:58:59 -0800 Subject: [PATCH] added real cache validation --- Tools/unix/casefn.sh | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/Tools/unix/casefn.sh b/Tools/unix/casefn.sh index f198c7bb..34e7eb40 100755 --- a/Tools/unix/casefn.sh +++ b/Tools/unix/casefn.sh @@ -6,6 +6,11 @@ # # this is a bit slow with lots of files, so there's a cache of the join file # +# the form of this cache file is gnarly: +# pwd dir:%d dir:%d ... +# where pwd is the current dir, dir are relative paths, and %d are mod times in +# seconds from the epoch +# pid=.$$ search=/tmp/casefn.search$pid join=/tmp/casefn.join$pid @@ -23,6 +28,23 @@ if [ $# -lt 1 ] ; then exit 0 fi +scmd="stat -c %Y" +if [ $(uname) = "Darwin" ] ; then + scmd="stat -f %m" +fi + +function dirtime { + d=$1 + if [ -d $d ] ; then + $scmd $d + else + echo 0 + fi +} + +here=$(pwd) +chead="$here" + # # normalize to lower case all input file names # while building an enumeration of all distinct directories @@ -38,22 +60,23 @@ for infn in $* ; do done if [ -z $df ] ; then dirs="$dirs $dirn" + chead="$chead $dirn:$(dirtime $dirn)" fi echo -n $dirn/ >> $in basename $infn | tr '[A-Z]' '[a-z]' >> $in done sort -u $in > $search -here=$(pwd) - # # if our cached join list matches our directory list, use it # if [ -f $cache ] ; then cachedirs="$(head -1 $cache)" - if [ "$here $dirs" = "$cachedirs" ] ; then + if [ "$chead" = "$cachedirs" ] ; then + # echo hit >/dev/stderr tail -n +2 $cache > $join else + # echo miss >/dev/stderr rm -f $cache fi fi @@ -63,7 +86,7 @@ fi # if [ ! -f $join ] ; then rm -f $in - for dn in ${dirs[@]} ; do + for dn in $dirs ; do cd $here cd $dn for i in * ; do @@ -75,7 +98,7 @@ if [ ! -f $join ] ; then done done sort -t, -k 1,1 $in > $join - echo "$here $dirs" > $cache + echo "$chead" > $cache cat $join >> $cache fi @@ -84,6 +107,4 @@ if [ $(wc -l < $in) -gt 0 ] ; then cat $in exit 0 fi - -echo nofile exit 2