diff options
Diffstat (limited to 'scripts/flxadd')
-rwxr-xr-x | scripts/flxadd | 350 |
1 files changed, 350 insertions, 0 deletions
diff --git a/scripts/flxadd b/scripts/flxadd new file mode 100755 index 0000000..4723957 --- /dev/null +++ b/scripts/flxadd @@ -0,0 +1,350 @@ +#!/bin/sh + +yesno () { + echo -n "$1 [$2] : "; read + if [ "$REPLY" = "" ]; then + REPLY=$2; + fi + if [[ ( "$REPLY" = "O" ) || ( "$REPLY" = "o" ) || \ + ( "$REPLY" = "y" ) || ( "$REPLY" = "Y" ) ]]; then + REPLY="O" + return 0 + fi + return 1 +} + +update_sig () { + file=$1 +} + +update_dep () { + file=$1 +} + +if [ -z "$PKGROOT" ] ; then PKGROOT=/var/install; fi +T=/tmp/flx.inst.$$ +T1=$T/f1 +T2=$T/f2 +T3=$T/f3 +T4=$T/f4 +T5=$T/f5 +rm -rf $T ; mkdir $T ; touch $T3 +touch $T5 + +if [ -f $PKGROOT/depend.lst ] ; then + . $PKGROOT/depend.lst +fi + +force=0 +lookfordepend=1 +while [ $# -gt 0 ] ; do + case $1 in + -t) # install most recent + doitfor=time + ;; + -f) # force reinstall + force=1 + ;; + -f*) # force n reinstall recursive level + force=${1#-f} + ;; + -s) # install most recent + doitfor=size + ;; + -nd) # no dependence + lookfordepend=0 + ;; + -r) # change root dir + shift + ROOT=$1 + ;; + -v) # view only + mode=view + ;; + -I) # read from input + cat >> $T1 + ;; + *) echo $1 >> $T1 ;; + esac + shift +done + +exec 3>&0 +# lire l'existant et s'en servir de base +if [ -f $ROOT/etc/formilux/sig.dat ] ; then + grep -v ^d $ROOT/etc/formilux/sig.dat | awk '{ print $8 }' > $T3 +elif [ -f $ROOT/etc/formilux/depend.dat ] ; then + cat $ROOT/etc/formilux/depend.dat | cut -f1 -d' ' | cut -f1 -d'('> $T3 +# find . ! -type d > $T3 +fi +# lecture des fichiers de dependance de manière infinie +while [ -f $T1 ] ; do + # lecture sur la dernière liste non résolue +while read ; do + if [ -z "$REPLY" -o "${REPLY// /}" = "" ] ; then continue; fi + if [ "${REPLY/*\$*/\$}" = '$' ] ; then + REPLY=`eval echo "$REPLY"` + for i in $REPLY ; do + echo $i >> $T2 + done + continue + fi + set $REPLY + depend=${1##*\(} + depend=${depend%%\)} + if [ "$depend" = "$1" ] ; then depend="" ; fi + file=`echo "${1%\(*\)}" | sed -e 's/\./\\./g' -e 's/*/.*/g' -e 's/\[/\\\[/g' -e 's/^\///' ` + # looking for existing + if [ "$force" -lt 0 ] && grep -q "^\(.*/\)\?$file$" $T3 ; then continue ; fi + # looking for already installed + if grep -q "^\(.*/\)\?$file$" $T5 ; then continue ; fi +# if [ -e $ROOT/$file ] ; then +# update_sig $file +# update_dep $file +# continue +# fi + request=$1 + echo -n "Looking for $request ... " + m="[^ ]\+ \+" + if [ "$depend" ] ; then + lfile=`find $PKGROOT/ -name "$depend.lst" | xargs grep -sH "^\($m\)\{7\}\([^ ]*/\)\?$file\( .*\)\?$" | tr -s ' ' :` + else + lfile=`find $PKGROOT/ -name "*.lst" | xargs grep -sH "^\($m\)\{7\}\([^ ]*/\)\?$file\( .*\)\?$" | tr -s ' ' :` + fi + n=1 + + if [ `echo $lfile | wc -w` -gt 1 ] ; then + if [ "$doitfor" = time ] ; then + n=1 + oldtime=0 + for i in $lfile ; do + set ${i//:/ } + Rtype=$2 + if [ ${#Rtype} = 10 ] ; then + Rtime=$7 + else + Rtime=$8 + fi + if [ $Rtime -gt $oldtime ] ; then + oldtime=$Rtime + oldn=$n + fi + n=$[ n + 1 ] + done + n=$oldn + elif [ "$doitfor" = size ] ; then + n=1 + oldsize=99999999 + for i in $lfile ; do + set ${i//:/ } + Rtype=$2 + if [ ${#Rtype} = 10 ] ; then + Rsize=$5 + else + Rsize=$6 + fi + if [ $Rsize -gt $oldsize ] ; then + oldsize=$Rsize + oldn=$n + fi + n=$[ n + 1 ] + done + n=$oldn + else + rep=n + all="" + echo + while [ "$rep" != O ] ; do + n=1 + for i in $lfile ; do + if [ -n "$all" ] ; then + all="$all,$n" + else + all=$n + fi + set ${i//:/ } + Rsrc=$1 + Rtype=$2 + if [ ${#Rtype} = 10 ] ; then + Rlink=$9 + Rtime=$7 + Rsize=$5 + Rfile=$8 + else + Rlink=${10} + Rtime=$8 + Rsize=$6 + Rfile=$9 + fi + if [ "$Rlink" ] ; then + echo "$n : $Rfile ($Rsize bytes,${Rtime}s,$Tlink) in $Rsrc" + else + echo "$n : $Rfile ($Rsize bytes,${Rtime}s) in $Rsrc" + fi + n=$[ n + 1 ] + done + echo -n "Which of these packages ? (separated by ',', 'a' for all) : " + read n <&3 + if [ "$n" = "a" ] ; then n=$all ; fi + yesno "Selection [$n] is ok (y/n)? " y <&3 + rep=$REPLY + done + echo -n " * Looking for $request ... " + fi + fi + if [ `echo $lfile | wc -w` -eq 0 -o "$n" = "" ] ; then + echo "missing." + echo "$file" >> $T4 + else + for line in `echo $lfile | cut -f$n -d' '` ; do + set ${line//:/ } + Rsrc=$1 + Rtype=$2 + if [ ${#Rtype} = 10 ] ; then + Rfile=$8 + Rlink=$9 + else + Rfile=$9 + Rlink=${10} + fi + grep -F "$Rfile" $1 >> $T/sig.dat + d=$T/`dirname $1` + if [ ! -d $d ] ; then mkdir -p $d ; fi + f1=`dirname $Rsrc`/`basename $Rsrc .lst`.dep + f2=`echo $Rsrc|sed 's/-[0-9].*\.lst//'`.dep + unset dep + if [ $lookfordepend = 1 ] ; then + if [ -f $f1 ] ; then + # grep "^$Rfile " $f1 | cut -f2- -d' ' | tr ' ' '\12' | tee -a $T2 + dep="$dep `grep "^\(.*/\)\?$Rfile " $f1 | cut -f2- -d' '`" + fi + if [ -f $f2 ] ; then + # grep "^$file " $f2 | cut -f2- -d' ' | tr ' ' '\12' | tee -a $T2 + dep="$dep `grep "^\(.*/\)\?$file " $f2 | cut -f2- -d' '`" + fi + if [ "$dep" ] ; then + dep="`echo "$dep" | tr ' ' '\012' | sort -u | tee -a $T2`" + fi + fi + # file=`eval echo "$file" | sed -e 's/\[/\\\[/g' ` + pkg=`basename $Rsrc .lst` + echo "$Rfile" >> $T/$Rsrc # where to find file + file=$Rfile + if [ "`echo $file | cut -c1`" = '/' ] ; then + echo "skipping (file $file begins with '/')" + continue + #elif [ "`echo $file | cut -c1-2`" != './' ] ; then + # file="./$file" + fi + echo $file >> $T5 # files that are already scan + if [ "$Rlink" ] ; then # link dependency + echo + echo -n " - Link '$Rlink' to '$file' -> " + if [ "`echo $Rlink | cut -c1`" = / ] ; then + echo "$Rlink" >> $T2 + echo "dependency link '$Rlink'" + else + d=`dirname $file`/$Rlink + d=`dirname $d` + d=`basename $d` + echo "$d/`basename $Rlink`" >> $T2 + echo "dependency link '$d/`basename $Rlink`'" + fi + echo -n " * Looking for $request ... " + fi + done + echo "done." + echo "$file($pkg) `echo "$dep" | tr '\012' ' '`" >> $T/depend.dat + fi + done < $T1 + force=$[ force - 1 ] + rm -f $T1 + if [ -f $T2 ] ; then mv -f $T2 $T1 ; fi +done + +echo "Files search done." +# untar data defined from designed package file +find $T -name "*.lst" | while read ; do + tgz=/`dirname $REPLY|cut -f4- -d/`/`basename $REPLY .lst` + pkg=`basename $REPLY .lst` + if [ "$mode" = view ] ; then + opt=Utv + else + opt=Uxv + fi + if [ -f $tgz.tgz ] ; then + (cd $ROOT/ ; tar z${opt}Uf $tgz.tgz -T $REPLY ) + elif [ -f $tgz.tar.gz ] ; then + (cd $ROOT/ ; tar z${opt}Uf $tgz.tar.gz -T $REPLY ) + elif [ -f $tgz.tar.bz2 ] ; then + (cd $ROOT/ tar j${opt}Uf $tgz.tar.bz2 -T $REPLY ) + fi +done + +if [ -e $T4 ] ; then + echo "Missing files are:" + cat $T4 +fi + +if [ ! -d $ROOT/etc/formilux ] ; then + mkdir -p -m 0755 $ROOT/etc/formilux +fi + +function update_depend { + if [ -e $T/depend.dat ] ; then + if [ -e $ROOT/etc/formilux/depend.dat ] ; then + sort -u $ROOT/etc/formilux/depend.dat > $T4 + while read ; do + set -- `echo "$REPLY" | sed 's/[() ]/ /'` + line="`grep "^$1[( )]" $T/depend.dat`" + if [ $? = 0 ] ; then + echo "$line" >> $T/newdepend.dat + else + echo "$REPLY" >> $T/newdepend.dat + fi + done < $T4 + # sort -u $T/depend.dat $T/newdepend.dat | diff -u -0 $T4 - + sort -i $T/depend.dat $T/newdepend.dat > $ROOT/etc/formilux/depend.dat + else + sort $T/depend.dat > $ROOT/etc/formilux/depend.dat + fi + fi +} + +function update_sig2 { + if [ -e $T/sig.dat ] ; then + if [ -e $ROOT/etc/formilux/sig.dat ] ; then + grep -v ^d $T/sig.dat | awk '{print $8}' | xargs signfs -f $ROOT/etc/formilux/sig.dat -c --ignore-date | \ + grep "^\(-\|+\|>\)" | cut -c3- > $T4 + cat $T4 > $ROOT/etc/formilux/sig.dat + else + sort +7 $T/sig.dat > $ROOT/etc/formilux/sig.dat + fi + fi +} + +function update_sig { + if [ -e $T/sig.dat ] ; then + if [ -e $ROOT/etc/formilux/sig.dat ] ; then + sort +7 -u $ROOT/etc/formilux/sig.dat > $T4 + while read ; do + set -- $REPLY + line="`grep " $8\([ ].\+\)\?$" $T/sig.dat`" + if [ $? = 0 ] ; then + echo "$line" >> $T/newsig.dat + else + echo "$REPLY" >> $T/newsig.dat + fi + done < $T4 + # sort +7 -u $T/sig.dat $T/newsig.dat | diff -u -0 $T4 - + sort +7 -u $T/sig.dat $T/newsig.dat > $ROOT/etc/formilux/sig.dat + else + sort +7 $T/sig.dat > $ROOT/etc/formilux/sig.dat + fi + fi +} + +update_sig2 + +rm -rf $T + |