debian-cd-clone/tools/update_tasks

190 lines
4.8 KiB
Bash
Executable File

#!/bin/sh
set -e
if [ -z "$CODENAME" ]; then
echo "update_tasks: codename not specified" >&2
exit 1
fi
if [ "$MIRROR"x = ""x ] ; then
echo "update_tasks: mirror dir not specified" >&2
exit 1
fi
if [ "$BDIR"x = ""x ] ; then
echo "update_tasks: temp dir not specified" >&2
exit 1
fi
TDIR=$BDIR/update_tasks
mkdir -p $TDIR
# Sort primary and secondary tasks and add language tasks for both
# Secondary tasks are indicated by a "-" suffix in the task.list file
# When adding language tasks, 'desktop' is sorted before '*-desktop'
expand_task_list () {
tasklist=$1
langlist=$2
# Filter out comments, empty lines and secondary tasks
task_essential="$(grep -Ev "^(#.*)?(.*-)?[[:space:]]*$" $tasklist)"
# Select only secondary tasks
task_extra="$(grep -Ev "^(#.*)?[[:space:]]*$" $tasklist | \
grep -E "(.*-)[[:space:]]*$" | sed "s/[[:space:]]*-.*$//")"
echo "# Main tasks" >$tasklist.essential
echo "$task_essential" >>$tasklist.essential
echo >>$tasklist.essential
echo "# Main language tasks" >>$tasklist.essential
for task in "" $(echo "$task_essential" | grep "^desktop" || true) \
$(echo "$task_essential" | grep -- "-desktop" || true); do
for language in $(cat $langlist); do
echo $language${task:+-$task}
done
done >>$tasklist.essential
cp $tasklist.essential $tasklist.full
if [ "$task_extra" ]; then
echo >>$tasklist.full
echo "# Extra tasks" >>$tasklist.full
echo "$task_extra" >>$tasklist.full
echo >>$tasklist.full
echo "# Extra language tasks" >>$tasklist.full
for task in $(echo "$task_extra" | grep "^desktop" || true) \
$(echo "$task_extra" | grep -- "-desktop" || true); do
for language in $(cat $langlist); do
echo $language${task:+-$task}
done
done >>$tasklist.full
fi
}
update_full_list () {
file=$1
tasklist=$2
pkgfile=$3
(grep -Ev "^(#.*)?[[:space:]]*$" $tasklist ; echo DONE ; cat $pkgfile) | mawk '
/DONE/ {
in_packages = 1
next
}
/.*/ {
if (!in_packages) {
tasklist[$1] = num_tasks
num_tasks++
}
}
/^Package: / {
if (in_packages) {
pkgname = $2
next
}
}
/^Task: / {
if (in_packages) {
# Parse the Tasks: line, splitting into array "these"
gsub("Task: ", "", $0)
gsub(",", "", $0)
split($0, these)
# And see if we have any matches
for (task in these) {
for (taskname in tasklist) {
if (these[task] == taskname) {
printf("%d:%s\n", tasklist[taskname], pkgname)
next
}
}
}
}
next
}' | sort -n | cut -d: -f2 > $file
}
update_essential_list () {
file=$1
tasklist=$2
tasksel=$3
(grep -Ev "^(#.*)?[[:space:]]*$" $tasklist ;
echo DONE ;
cat $tasksel/usr/share/tasksel/debian-tasks.desc) | mawk '
/DONE/ {
in_tasks = 1
next
}
/^ / {
if (in_key) {
printf("%d:%s\n", tasklist[cur_task], $1)
next
}
}
/.*/ {
if (!in_tasks) {
tasklist[$1] = num_tasks
num_tasks++
}
if (in_key) {
in_key = 0
}
}
/^Task: / {
if (in_tasks) {
cur_task = $2
next
}
}
/^Key: / {
if (in_tasks) {
for (taskname in tasklist) {
if (taskname == cur_task) {
in_key = 1
}
}
}
next
}' | sort -s -n -k1 | cut -d: -f2 > $file
}
# We need to gunzip a copy of the appropriate Packages.gz file
# Assume i386, use the $CODENAME main Packages file
TMP_PKG=$TDIR/Packages
zcat $MIRROR/dists/$CODENAME/main/binary-i386/Packages.gz > $TMP_PKG
# Now grab the appropriate tasksel package
TASKSEL_DEB=$MIRROR/`mawk '
/^Package: tasksel-data$/ { found=1 }
/^Filename:/ { if (found==1) { print $2; exit } }' $TMP_PKG`
dpkg -x $TASKSEL_DEB $TDIR/tasksel
[ -e task.languages ] || exit 1
grep -Ev "^(#.*)?[[:space:]]*$" task.languages > $TDIR/languages
for variant in "" kde xfce; do
if [ ! -e task.list${variant:+.$variant} ]; then
echo "Warning: task.list${variant:+.$variant} does not exist; skipping"
continue
fi
expand_task_list \
task.list${variant:+.$variant} \
$TDIR/languages
update_essential_list \
task-essential${variant:+-$variant} \
task.list${variant:+.$variant}.essential \
$TDIR/tasksel
update_full_list \
task-full${variant:+-$variant} \
task.list${variant:+.$variant}.full \
$TMP_PKG
done
rm -rf $TDIR