You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
distros-overlay/profiles/templates/3.2/6_ac_update_sync/revision/000/65

53 lines
2.4 KiB

# 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)