diff options
Diffstat (limited to 'scripts/flxextract')
-rwxr-xr-x | scripts/flxextract | 95 |
1 files changed, 41 insertions, 54 deletions
diff --git a/scripts/flxextract b/scripts/flxextract index 43d4ca0..bfecb25 100755 --- a/scripts/flxextract +++ b/scripts/flxextract @@ -1,41 +1,55 @@ #!/bin/bash function main { - local file packages pack + local file packages pack pkgsrc exec 3>&0 # cette boucle permet de rechercher le package à utiliser pour trouver # le fichier si cela est possible while read file packages; do echo -n \# >&2 - if [ -z "$packages" ] ; then echo "$file -" >> $SFILES ; continue ; fi - packagesgrep=${packages//,/\\|} - files=( $(grep -m 1 "^$file .*/\($packagesgrep\).*$" $SOURCE | awk '{print $2}') ) - pkgsrc="" - for pack in ${packages//,/ } ; do - i=0; while [ $i -lt ${#files[*]} ] ; do - [ ${files[$i]/$pack} != ${files[$i]} ] && pkgsrc=${files[$i]} && break - i=$[$i+1] - done + if [ -z "$packages" ] ; then echo "##no package## $file" >> $LOGFILE ; continue ; fi + + for pack in ${packages//,/ }; do + pkgsrc=$(find $SEARCHPATH -name ${pack}'*'.lst | head -1) [ "$pkgsrc" ] && break - done - if [ "$pkgsrc" ] ; then - echo "$file $pkgsrc" >> $SFILES + done + + if [ -z "$pkgsrc" ]; then + echo "##no package## $file $packages" >> $LOGFILE + continue + fi + + set -- $( grep "$file" $pkgsrc | awk '{ if ($8=="'$file'") print $0; }' ) + if [ -z "$*" ]; then + echo "##not found## $file $pkgsrc" >> $LOGFILE + continue + fi + if [ "x$1" = "xd" ]; then + # it's a directory + rm -f $ROOTDIR/$8 # just in case it was something else + mkdir -p $ROOTDIR/$8 + touch -t `date -d "Jan 1 00:00:$7 UTC 1970" +"%Y%m%d%H%M.%S" ` $ROOTDIR/$8 + chown $3:$4 $ROOTDIR/$8 + chmod $2 $ROOTDIR/$8 + echo "$8/" >> $LOGFILE else - echo "$file -" >> $SFILES + # it's a regular file + echo $8 $pkgsrc >> $SFILES fi done < $LFILES - echo + + echo >&2 ; echo -n "Extracting files ..." >&2 for lst in $( awk '{print $2}' $SFILES | sort -u ) ; do - if [ "x$lst" = "x-" ] ; then continue ; fi tgz="$(dirname $lst)/$(basename $lst .lst).tgz" - grep -- " $lst$" $SFILES | awk '{print $1}' | tar zxpvf $tgz -C $ROOTDIR -T - >> $LOGFILE + grep -- " $lst$" $SFILES | awk '{print $1}' | tar zUxpvf $tgz -C $ROOTDIR -T - >> $LOGFILE + echo -n "." >&2 done - grep -- " -$" $SFILES | awk '{print "##unresolved##",$1}' >> $LOGFILE + echo "." >&2 } # repertoire contenant les .lst et les .tgz servant de source SEARCHPATH=$PKGROOT -SEARCHPATH=${SEARCHPATH:-.} +SEARCHPATH=${SEARCHPATH:-.}/. # temporary file and directory TMP=$(date +%y%m%d)-$RANDOM @@ -52,7 +66,7 @@ while [ $# -gt 0 ] ; do case "$1" in -i) # <infile> fichiers sources des autres fichiers [ "$2" ] || PRINTUSAGE=1 - INPUT="$INPUT $2" + INPUT=( $INPUT $2 ) shift; ;; -l) # <logfile> fichier de reference pour les associations fichier/package @@ -62,7 +76,7 @@ while [ $# -gt 0 ] ; do ;; -p) # <pkgdir> repertoire de recherche pour les packages [ "$2" ] || PRINTUSAGE=1 - SEARCHPATH="$SEARCHPATH $2" + SEARCHPATH="$SEARCHPATH $2/." shift ;; -R) # <destdir> répertoire d'extraction pour les fichiers @@ -89,12 +103,12 @@ fi # par défaut, ROOTDIR est fonction de la date DATE=$(date +%Y%m%d-%H%M%S) ROOTDIR=${ROOTDIR:-/tmp/package-$DATE} -if [ -e $ROOTDIR ] ; then - echo "Error : directory $ROOTDIR already exists." - exit 1 -fi +#if [ -e $ROOTDIR ] ; then +# echo "Error : directory $ROOTDIR already exists." +# exit 1 +#fi -LOGFILE=${LOGFILE:-/tmp/package-$DATE}.log +LOGFILE=${LOGFILE:-/tmp/package-$DATE.log} if [ -e $LOGFILE ] ; then echo "Error : log file $LOGFILE exists." exit 0 @@ -104,41 +118,14 @@ mkdir -p $ROOTDIR # 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 ; IFS=$'\n' -for path in $SEARCHPATH ; do - 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 +cat $INPUT > $LFILES sort -u $LFILES > $LFILES.new ; rm $LFILES ; mv $LFILES.new $LFILES main |