#!/bin/bash
usage () {
printf "\nUsage:\n"
printf "\t update-scripts [options]\n\n"
printf "Options:\n\n"
printf "\t -c, --check Don't actually apply any changes.\n"
printf "\t -n, --nodown Don't download any scripts.\n"
printf "\t -h, --help Print this help text.\n\n"
}
parse () {
while read -r col1 col2; do
case $col1 in
script)
if [[ $scrdup = no && $scrpack = yes ]]; then
if [ "$urlfnd" = "no" ]; then
echo "$script has no upstream source."
printf "url\t\tNo upstream source.\n" >> INDEX
fi
if [ "$descfnd" = "no" ]; then
echo "$script has no description."
printf "description\tNo description.\n\n" >> INDEX
printf "%-29s No description.\n" "$script" >> debian/description-list
fi
fi
script="$col2"
urlfnd="no"
descfnd="no"
if ! grep -q "^$script$" .scriptlist; then
scrdup="no"
echo "$script --------------------"
echo "$script" >> .scriptlist
if grep -q "^$script$" .packagedlist; then
scrpack="yes"
printf "script\t\t%s\n" "$script" >> INDEX
else
scrpack="no"
echo "$script is not included yet, skipping."
echo "$script" >> .nonincludes
fi
else
scrdup="yes"
fi
;;
url)
urlfnd="yes"
url="$col2"
if [[ $scrdup = no && $scrpack = yes ]]; then
if [[ $url =~ ^(https?|ftps?):// ]]; then
printf "url\t\t%s\n" "$url" >> INDEX
if [ "$nodown" != "yes" ]; then
get_new "$script" "$url"
fi
else
echo "$script has no upstream source."
printf "url\t\tNo upstream source.\n" >> INDEX
fi
fi
;;
description)
descfnd="yes"
desc="$col2"
if [[ $scrdup = no && $scrpack = yes ]]; then
if [ "$urlfnd" = "no" ]; then
urlfnd="yes"
echo "$script has no upstream source."
printf "url\t\tNo upstream source.\n" >> INDEX
fi
if [ -z "$desc" ]; then
echo "$script has no description."
desc="No description."
fi
printf "description\t%s\n\n" "$desc" >> INDEX
printf "%-29s %s\n" "$script" "$desc" >> debian/description-list
fi
;;
esac
done <<< "$1" | tee -a update-scripts.log
}
get_new () {
script="$1"
url="$2"
wget -t 5 -T 10 -qO "scripts/$script.new" "$url" || {
echo "$script failed to download."
rm "scripts/$script.new"
return
}
if diff "scripts/$script" "scripts/$script.new" > /dev/null; then
echo "$script is up to date."
rm "scripts/$script.new"
else
echo "$script needs updating."
echo "$script" >> .changes
if [ "$noapply" != "yes" ]; then
mv "scripts/$script.new" "scripts/$script"
else
rm "scripts/$script.new"
fi
fi
}
opts=$(getopt -o "cnh" -l "check,nodown,help" -- "$@")
eval set -- "$opts"
while true; do
case $1 in
-c|--check)
noapply="yes"
shift
;;
-n|--nodown)
nodown="yes"
shift
;;
-h|--help)
usage
exit 0
;;
--)
shift
break
;;
esac
done
shopt -s extglob
debclean > /dev/null 2>&1 || exit 1
### Main
indexweb=$(wget -t 5 -T 10 -qO - http://scripts.irssi.org/) && {
wording="Downloaded"
indexweb=$(sed -ne '/<tr>/,/<\tr>/ {/<tr>/h; /<tr>/!H; /<\/tr>/ {g; /<td class="filename">.*<small>.*<td class="description">/ '\
'{s/[[:space:]]\+/ /g;s/[^[:print:]]//g;s@^.*<td class="filename">.*<a href="[^"]*/\([^/"]\+\)".*<small>.*<a href="\([^"]\+\)"'\
'.*<td class="description">\([^<]*\)</td>.*$@script\t\t\1\nurl\t\t\2\ndescription\t\3\n@;s|\(github.com/.*\)/blob/|\1/raw/|g;p}}}' <<< "$indexweb" \
| perl -MHTML::Entities -ne 'print decode_entities($_)')
} || wording="Could not download"
printf "\n%s web index.\n\n" "$wording" | tee update-scripts.log
indexcurr=$(sed -n 's/^\(script\|\url\)[ \t]\+/\1\t\t/p;s/^\(description\)[ \t]\+\(.*\)$/\1\t\2\n/p' INDEX)
touch $(awk -F '[\t]+' '$1 == "script" {print "scripts/" $2}' <<< "$indexcurr")
packlist=(scripts/!(*.asc|*.new|XMMSInfo.pm))
packlist=("${packlist[@]##*/}")
printf "%s\n" "${packlist[@]}" > .packagedlist
mv INDEX INDEX.orig
mv debian/description-list debian/description-list.orig
> .scriptlist
> .changes
> .nonincludes
parse "$indexweb"
parse "$indexcurr"
buffer=$(sort .scriptlist)
echo "$buffer" > .scriptlist
### Index
if ! diff INDEX.orig INDEX > /dev/null; then
if [ "$noapply" != "yes" ]; then
wording="has been updated"
rm INDEX.orig
else
wording="needs updating"
mv INDEX.orig INDEX
fi
printf "\nThe index file %s.\n" "$wording" | tee -a update-scripts.log
fi
### Descriptions
buffer=$(sort -t ' ' -k 1,1 debian/description-list)
echo "$buffer" > debian/description-list
buffer=$(debian/rewrap.pl)
echo "$buffer" > debian/description-list
if ! diff debian/description-list.orig debian/description-list > /dev/null; then
if [ "$noapply" != "yes" ]; then
wording="has been updated"
rm debian/description-list.orig
else
wording="needs updating"
mv debian/description-list.orig debian/description-list
fi
printf "\nThe description list %s.\n" "$wording" | tee -a update-scripts.log
fi
### Missing
diff .scriptlist .packagedlist | awk '/^>/ {print $2}' > .missinglist
rm .scriptlist .packagedlist
sed -n '/^Known-Missing:/ {s/^Known-Missing: //;s/, /\n/g;p}' debian/copyright | sort > .knownlist
missdiff=$(diff .knownlist .missinglist | grep '^[><]')
if [ -n "$missdiff" ]; then
printf "\nThese are the differences between the known missing\nupstreams and the discovered missing upstreams:\n%s\n" "$missdiff" \
| tee -a update-scripts.log
fi
rm .missinglist .knownlist
### Changes
changes=$(sed -n '1 h; 2,$ {s/^.\+$/, &/;H}; $ {g;s/\n//g;p}' .changes)
if [ -n "$changes" ]; then
if [ "$noapply" != "yes" ]; then
wording="Updated"
dch "Update: $changes"
else
wording="Updating needed"
fi
printf "\n%s: %s\n" "$wording" "$changes" | tee -a update-scripts.log
fi
rm .changes
### Non-includes
nonincludes=$(sed -n '1 h; 2,$ {s/^.\+$/, &/;H}; $ {g;s/\n//g;p}' .nonincludes)
if [ -n "$nonincludes" ]; then
printf "\nNot included: %s\n" "$nonincludes" | tee -a update-scripts.log
fi
rm .nonincludes