Codebase list irssi-scripts / 04df961c-bcac-4118-9a73-41a83f296b97/main update-scripts
04df961c-bcac-4118-9a73-41a83f296b97/main

Tree @04df961c-bcac-4118-9a73-41a83f296b97/main (Download .tar.gz)

update-scripts @04df961c-bcac-4118-9a73-41a83f296b97/mainraw · history · blame

#!/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