aboutsummaryrefslogblamecommitdiff
path: root/scripts/flxsearch
blob: 44eac13214cc8cc1e3123c144c16d2fa64e4df02 (plain) (tree)


























                                                                     
                                    







































                                                                                                                      
                           














                                                                                                 






                                                                                                   



                                          





                                                                                                    












                                                                  
                                                                                       


















                                                                                                           
                                                                                    






                                                   



































































                                                                                  



                                                             


















                                                                                          
           
                            
             






































                                                                                     
#!/bin/bash


# cette fonction donne le choix entre plusieurs possibiltés de source
function choice {
     local file=$1 ; shift
     local -a choices=()
     local i=1
     local best choice
     
     OLDIFS=$IFS ; IFS=$'\n'
     choices=( $( for choice in $* ; do
         awk '{ if ($8 == "'$file'") print "'$choice'",$0 }' $choice
     done ) )
     IFS=$OLDIFS

     echo
     echo "Choix indéterminé pour '$file':" >&2
     best=0
     i=0 ; while [ $i -lt ${#choices[*]} ] ; do
         # if [ $i == $best ] ; then echo -n " * " ;
         # else                      echo -n "   " ;
         # fi          
         echo -n "   " ;
         set -- ${choices[$i]}
         case $2 in
             l) type="lien vers ${10}" ;;
             d) type="repertoire" ;;
             s) type="socket" ;;
             c|b) type="device" ;;
             *) 
                if [ $6 -lt 100000 ]      ; then type="fichier ($[$6]o)"
                elif [ $6 -lt 100000000 ] ; then type="fichier ($[$6/1000]Ko)"
                else                             type="fichier ($[$6/1000000]Mo)"
                fi
         esac
         echo "$[$i+1]: dans $( basename $1 .lst), $type créé le $(date -d "1/1/1970 00:00:$8" "+%Y/%m/%d %H:%M")" >&2
         i=$[$i+1]
     done
     if [ ${#choices[*]} == 0 ] ; then
         echo -n "Entrez le nom du package pour forcer une source ('.' pour arreter)" >&2
         best=""
     else
         echo -n "Entrez le nom du package ou sélectionnez les numéros souhaités ('.' pour arreter): " >&2
     fi
     read choice ; # [ -z "$choice" ] && choice=$[$best+1]
      
     if [ "x$choice" = "x." ] ; then
         SIGINT=1 ; REPLY=""
         return
     fi

     choices=( $( for i in ${choice//,/ } ; do
         if [ "$i" -a "x${i//[0-9]/}" == "x" ] ; then
             echo ${choices[$[$i-1]]%% *}
         else 
             echo $i
         fi
     done ) )

     REPLY="${choices[*]}"
}

# cette fonction permet de rechercher l'existance de chacun des fichiers de LFILES dans
# les packages préparés
function main {
    local file
    local packages pack
    local -a sources forced
    local pkgname matchlist

    exec 3>&0
    while read file packages; do 
        # attention on ne traite pas pour le moment le cas des entrées multiples
        # on commence par rechercher pour tous les fichiers quels sont les packages 
        # source qui répondent à la demande

        [ "$SIGINT" = 1 ] && echo -n \# >&2 && echo $file $packages >> $TMPDIR/OUTPUT && continue

        sources=( $( IFS=,$IFS ; v=$( grep "^$file " $SOURCE | \
                      awk '{ print $2 }' ) ; echo $v) )

        # check forced packages
        if [ ${#sources[*]} -gt 1 ] ; then
            forced=( $( for i in ${sources[*]} ; do f=${i##*/} ; 
                        f=${f%%.lst}; [ "x${FORCED/* $f */}" == "x" ] && echo $i && break ; 
                        f=${f%-*}; [ "x${FORCED/* $f */}" == "x" ] && echo $i && break ; 
                        f=${f%-*}; [ "x${FORCED/* $f */}" == "x" ] && echo $i && break ; 
                        f=${f%%[._-][0-9]*}; [ "x${FORCED/* $f */}" == "x" ] && echo $i && break ; 
                        done ) )
            [ "${#forced[*]}" -gt 0 ] && sources=( ${forced[*]} )
        fi

        # remove rejected package 
        if [ ${#sources[*]} -gt 1 ] ; then
            sources=( $( for i in ${sources[*]} ; do f=${i##*/} ; 
                         f=${f%%.lst}; [ "x${EXCEPT/* $f */}" == "x" ] && echo $i && break ; 
                         f=${f%-*}; [ "x${EXCEPT/* $f */}" == "x" ] && echo $i && break ; 
                         f=${f%-*}; [ "x${EXCEPT/* $f */}" == "x" ] && echo $i && break ; 
                         f=${f%%[._-][0-9]*}; [ "x${EXCEPT/* $f */}" == "x" ] && echo $i && break ; 
                         done ) )
        fi
        
        if [ "$RECHECK" = 1 -a "$packages" ] ; then 
            local tab=" ${sources[*]} "
            local found=0

            for pack in $packages ; do
                [ "x${tab/* $pack */}" = "x" ] && found=1 && break
            done
            if [ "$found" = 0 ] ; then
                packages=""
            fi
        fi
        if [ "$packages" ] ; then    # des packages potentiels de source ont été donnés
            echo -n \# >&2 
            REPLY=""
        elif [ $SILENT = 0 -a ${#sources[*]} = 0 ] ; then    # le fichier n'a été trouvé dans aucun package
            # etant la recherche
            sources=( $( IFS=,$IFS ; v=$( grep "^[^ ]*$file " $SOURCE | awk '{ print $2 }' ) ; echo $v) )
            if [ ${#sources[*]} -lt 20 ] ; then # trop de possibilité
                choice $file ${sources[*]} <&3
            else 
                packages=""
                REPLY=""
            fi
        elif [ ${#sources[*]} -gt 1 ] ; then  # le fichier a été trouvé dans plusieurs packages
            choice $file ${sources[*]} <&3
        else
            echo -n \# >&2
            REPLY=${sources}
        fi
        if [ "$REPLY" ] ; then
            pkgname=$( basename $REPLY .lst ) 
            matchlist=$pkgname,${pkgname%-*},${pkgname%-*-*},${pkgname%%[._-][0-9]*}
            echo $file $matchlist >> $TMPDIR/OUTPUT
        else
            echo $file $packages >> $TMPDIR/OUTPUT
        fi
    done < $LFILES
}

# temporary file and directory
TMP=$(date +%y%m%d)-$RANDOM
while [ -e /tmp/pg-$TMP ] ; do TMP=$(date +%y%m%d)-$RANDOM ; done
TMPDIR=/tmp/pg-$TMP

SIGINT=0
UPDATE=0
SILENT=0
RECHECK=0
PRINTUSAGE=0

EXCEPT=" "
FORCED=" "

# traitement des parametres
if [ $# -eq 0 ]; then
    PRINTUSAGE=1
fi

while [ $# -gt 0 ] ; do
    case "$1" in 
        -i) # <infile> fichiers sources des autres fichiers
            [ "$2" ] || PRINTUSAGE=1
            INPUT="$INPUT $2"
            shift;
            ;; 
        -u) # update first source file with results
            UPDATE=1
            ;;
        -s) # do not tell a choice for null list of choices
            SILENT=1
            ;;
        -c) # want to verify each package
            RECHECK=1
            ;;
        -o) # <outfile> fichier dans lequel écrire le résultat des recherches
            [ "$2" ] || PRINTUSAGE=1
            OUTPUT="$2"
            shift
            ;;
        -l) # <logfile> fichier de reference pour les associations fichier/package
            [ "$2" ] || PRINTUSAGE=1
            LOGFILE="$2"
            shift
            ;;
        -U) # <package> ignore this package if not alone
            [ "$2" ] || PRINTUSAGE=1
            EXCEPT="$EXCEPT$2 "
            shift
            ;;
        -F) # <package> force to use this package when possible
            [ "$2" ] || PRINTUSAGE=1
            FORCED="$FORCED$2 "
            shift
            ;;
        -p) # <path> repertoire de recherche pour les packages
            [ "$2" ] || PRINTUSAGE=1
            SEARCHPATH="$SEARCHPATH $2"
            shift
            ;;
        -h) # affiche l'aide sur les paramètres
            PRINTUSAGE=1
            shift
            ;;
    esac
    shift
done

# repertoire contenant les .lst et les .tgz servant de source
SEARCHPATH=${SEARCHPATH:-${PKGROOT:+$PKGROOT/.}}
SEARCHPATH=${SEARCHPATH:-.}

if [ $PRINTUSAGE -gt 0 ]; then
    # affiche les lignes du case ci-dessus
    echo "Usage : $0 followed by these parameters :"
    grep '^[ 	]\+-.) #.*' $0
    echo
    exit 1
fi

# fabrication des fichiers temporaires
mkdir -p -m 700 $TMPDIR
# fichier contenant l'ensemble des fichiers disponibles et leur package source
SOURCE=$TMPDIR/source ; touch $SOURCE
# fichier contenant l'ensemble des fichiers requis
LFILES=$TMPDIR/lfiles ; touch $LFILES
# fichier contenant la correspondance non du package source du package
# SFILES=$TMPDIR/sfiles ; touch $SFILES

# fabrication d'un fichier contenant l'ensemble des fichiers disponibles avec leur package
# source
OLDIFS=$IFS
for path in $SEARCHPATH ; do
    IFS=$'\n'
    if [ -d $path ] ; then
        for file in $( ls $path/*.lst ) ; do
            # echo -n \# >&2
            # pkgname=$( basename $file .lst ) 
            # matchlist=$pkgname # ,${pkgname%-*},${pkgname%-*-*},${pkgname%%-*}
            # attention aucun traitement d'un espace (\ ) dans le nom de fichier
            awk '{print $8,"'$file'"}' $file >> $SOURCE
        done
    fi
done

IFS=$OLDIFS

# fabrication d'un fichier contenant la liste de tous les fichiers recherchés
# le fichier source peut contenir lui-même des informations de packages de provenance
if [ "$INPUT" ] ; then
    for file in $INPUT ; do
        cat $file >> $LFILES
    done
else 
    cat >> $LFILES
fi
sort -u $LFILES > $LFILES.new ; rm $LFILES ; mv $LFILES.new $LFILES

main

if [ -e $TMPDIR/OUTPUT ] ; then
    if [ "$UPDATE" == 1 -a "$INPUT" ] ; then
        set -- $INPUT
        rm -f $1 ; mv $TMPDIR/OUTPUT $1
    elif [ "$OUTPUT" ] ; then
        mv $TMPDIR/OUTPUT $OUTPUT
    else
        cat $TMPDIR/OUTPUT
    fi
fi
echo
rm -rf $TMPDIR
exit $SIGINT