Новый, улучшенный, скрипт:
http://pastebin.mozilla-russia.org/91499
Код:
#!/usr/local/bin/bash
#===
cR="\033[01;31m" ; cB="\033[01;34m" ; cNR="\033[00m";\
#===
PKGS="" ;
RLEVEL="" ;
DELTA="" ;
#===
f1() {
_pkgs=""
c="`echo "$1" | wc -l | tr -d ' '`" ; echo -n [$c] >&2
#-
for _port in $1 ; do
_pkgs="$(printf "${_pkgs}\n${_port}\n`make -C ${_port} all-depends-list`")"
#-
c=`expr $c - 1`
[ `expr $c % 10` -eq 0 ] && echo -n [$c] >&2 || echo -n "." >&2
[ $c -lt 0 ] && echo "[0]" >&2
done
#-
_pkgs="$(echo "${_pkgs}" | sort | uniq)"
DELTA="$(printf "${_pkgs}\n`printf "${PKGS}\n${_pkgs}" | sort | uniq -d`" | sort | uniq -u)"
PKGS="${PKGS}${DELTA}"
}
#===
f2() { echo ;
for port in $1 ; do
optionsfile=`make -C $port -V OPTIONSFILE`
[ -e "$optionsfile" ] && md5=`md5 -q "$optionsfile"`
make -C $port config-conditional
if [ -e "$optionsfile" ] ; then
if [ "`md5 -q "$optionsfile"`" != "$md5" ] ; then
#echo c10 > /dev/speaker
RLEVEL="${RLEVEL}>"
f1 "$port"
f2 "${DELTA}"
port="= = = = = = = ="
RLEVEL="${RLEVEL%%>}";
fi
fi
echo "$RLEVEL ${port}"
done
}
#====
f3(){
f1 "$1" ;
for port in $PKGS ; do \
f1(){ make -C $port fetch-required-list | \
while read l1 ; do \
echo "Каталог назначения: `make -C $port -V _DISTDIR`" ; \
echo ${l1} | perl -ne 'print "Файл/размер: ",/.*\/(.+?)\s.*/,"/"' ; \
echo ${l1} | perl -ne 'print /.*?-S\s*(\d*?)\s.*/,"\n"' ; \
echo "Зеркала загрузки:" ; \
echo ${l1} | tr -s "|" "\n" | \
while read l2 ; do \
echo $l2 | perl -ne 'print "\t",/.*?(http|ftp)(:.+?\s).*/' ; \
done ; echo ;\
done ; } ; \
list=`f1` ;\
printf "\nПорт: $port" ; \
if [ -n "$list" ] ; then printf "\n$list\n" ; else echo " - получение файлов не требуется" ; fi \
done
}
#====
f4(){
in_ports_list="`portversion -vl '<'`" ;
[ $? -ne 0 ] && { printf "${cR}Ошибка(!):${cNR} $LINENO \n"; exit ;}
echo "$(for _pkg in `echo "$in_ports_list" | cut -d" " -f1` ; do echo "/usr/ports/`pkg_info -oq ${_pkg}`" ; done)"
}
######################################
### GO
######################################
if [ "$1" = "fetch_list" ] ; then
if [ "$2" ] ; then f3 "$2" ; else f3 "`f4`" ; fi
elif [ "$1" = "config" ] ; then
if [ "$2" ] ; then f1 "$2" ; else f1 "`f4`" ; fi
f2 "${DELTA}"
echo "${PKGS}" | grep -q "print/ghostscript" && printf "${cR}Внимание!${cNR} порт \"${cB}print/ghostscript*${cNR}\" не сохраняет конфигурацию и при каждом обновлении процесс конфигурации повторится!\n"
else
printf "${cB}Синтаксис:${cNR} $0 [ fetch_list | config ] /usr/ports/...порт\n"
printf "${cB}Рекурсивный \"config-conditional\" по всем портам требующим обновления:${cNR} $0 config\n"
printf "${cB}Рекурсивный \"config-conditional\":${cNR} $0 config /usr/ports/порт...\n"
printf "${cB}Список файлов для закачки, для обновления:${cNR} $0 fetch_list\n"
printf "${cB}Список файлов для закачки, для указанного порта:${cNR} $0 fetch_list /usr/ports/порт...\n"
printf "${cB}Перед использованием ключа \"fetch_list\" рекомендуется выполнить рекурсивную конфигурацию (config-conditional).${cNR}\n"
exit 1
fi
Рекурсивный "config-conditional" для всех портов требующих обновления:
script.sh config
Рекурсивный "config-conditional" для указанного порта:
script.sh config /usr/ports/порт...
Список файлов для закачки (рекурсивно), для портов требующих обновления:
script.sh fetch_list
Список файлов для закачки (рекурсивно), для указанного порта:
script.sh fetch_list /usr/ports/порт...
*Перед использованием ключа "fetch_list" рекомендуется выполнить рекурсивную конфигурацию (config-conditional).