# process a directory set file.
# set name in $setname.
# output files:  dirlist  and  findtests.

#process .set file.

grep -v "^ *$" /etc/tbackup/$setname.set | grep -v "^ *#" | \
gawk "NF == 1"  >dirlist

if [ ! -s dirlist ]; then
 echo "Error in /etc/tbackup/$setname.set: no directories specified."
 echo "Aborting..."
 cd /tmp
 rm -rf /tmp/tbup
 exit 1
fi

if [ "`grep -v \"^ */\" dirlist`" != "" ]; then
 echo "Error in /etc/tbackup/$setname.set: all directory names must start with a / ."
 echo "Aborting..."
 cd /tmp
 rm -rf /tmp/tbup
 exit 1
fi

err=no
set -f
for i in `cat dirlist`; do
 if [ ! -e $i ]; then err=yes; 
  echo "Error in /etc/tbackup/$setname.set: file or directory $i not present.";
 fi
done
set +f

if [ $err = yes ]; then 
 echo "Aborting..."
 cd /tmp
 rm -rf /tmp/tbup
 exit 1
fi


gawk -f- /etc/tbackup/$setname.set >findtests <<-'WUXTA'
($1 == "not") && ($2!="findtest") \
   { if ($2=="name") { f="! -name '%s'" } else
     if ($2=="fullname") { f="! -path '%s'" } else
     if ($2=="ext") { f="! -name '*%s'" } else
     if ($2=="dir") { f="! -path '%s/*'"
                      for(i=3; i<=NF; i++) 
                         printf "! -path '%s'\n",$i >>"optitests";
                    } else
      { print "\nError in line",NR,":",$0; next; };

     if ($3=="") { print "\nError in line",NR,": ",$0; next; };

     for(i=3; i<=NF; i++) printf f"\n",$i;
    
    }
(($1 == "not") && ($2=="findtest")) || ($1 == "findtest") \
   {
    a=substr($0,index($0,"findtest")+9);
    if($1=="not") printf "! %s\n",a;
             else printf "%s\n",a;
   }
(NF > 1) && ( substr($1,1,1) != "#" ) && ($1 != "not") && ($1 != "findtest")\
                { print "\nError in line",NR,": ",$0; }
WUXTA

if [ "`grep \"Error in\" findtests`" != "" ]; then
 echo "Syntax errors in /etc/tbackup/$setname.set:"
 grep "Error in" findtests
 echo "Aborting..."
 cd /tmp
 rm -rf /tmp/tbup
 exit 1
fi

#optimize if dirlist=/.

if [ "`cat dirlist`" = "/" ]; then

#find all non-excluded files and dirs under /
 eval find `cat dirlist` -mindepth 1 -maxdepth 1 `cat optitests` \
  >dirlist2

#and make them the dirlist.  This way, unwanted filesystems under /
#are not traversed by find.

 if [ -s dirlist2 ]; then
#dirlist2 not empty
  rm dirlist
  mv dirlist2 dirlist
 fi

fi
#optimize
