# Calculate ini(update.rev)<65 exec=/bin/bash cl_chroot_status==off # # Скрипт исправляет CONTENTS файлы пакетов, к которым ошибочно привязаны # файлы изменяемые clt шаблонами. # (c) 2013 Calculate Ltd. http://www.calculate-linux.org #-ini(update.rev,65)-# # получить содержимое всех функций merge в шаблонах clt find_merge_func_values() { local search_path=$1 find ${search_path} -name "*.clt" | xargs grep -hoP "(?<=merge\()[^)]+" } # получить имена всех файлов которые изменяются шаблонами clt find_clt_target_files() { local search_path=$1 while read cltfile; do local target_path=$( sed -nr '/\s+path/{s/^.*path=([^ ]+).*/\1/p}' $cltfile) local target_name=$( sed -nr '/\s+name/{s/^.*name=([^ ]+).*/\1/p}' $cltfile) [[ -n $target_path ]] || target_path=$(dirname $cltfile) [[ -n $target_name ]] || target_name=$(basename $cltfile .clt) # исключить из удаления файлы которые содержат merge функцию head -1 $cltfile | grep -q merge\( || echo "${target_path}/${target_name}" done < <(find ${search_path} -name "*.clt") } # исключить "чужие" файлы из CONTENTS пакета fix_contents() { local package=$1 local cltpath=$2 for content in /var/db/pkg/$package-*/CONTENTS;do [[ -f $content ]] || continue # исключить похожие по названию пакеты (например если ищем calculate-console # исключаем calculate-console-gui) local real_package=$((bunzip2 -dc $(dirname $content)/environment.bz2 | grep -e "declare -x PN=" -e "declare -x CATEGORY="; echo echo \$CATEGORY/\$PN ) | bash) [[ $package == $real_package ]] || continue # сформировать сценарий для sed который исключит из CONTENTS все указанные файлы sed -i -f <(find_clt_target_files $cltpath | sed 's/\//\\\//g' | sed -r 's/.*/\/obj & \/d/') $content done } while read package;do fix_contents $package /etc done < <(find_merge_func_values /etc)