77 lines
3.0 KiB
Bash
77 lines
3.0 KiB
Bash
|
#!/bin/bash
|
||
|
# Copyright 2014 Edward J Huff ejhuff at gmail.com, not a work for hire.
|
||
|
# License: any GPL or BSD or MIT or any free software license.
|
||
|
|
||
|
# bash script to fix bogus weekdays in rpm spec files.
|
||
|
|
||
|
# This script automatically corrects bogus weekdays in spec files, generating a
|
||
|
# changelog entry and adding a line after the bogus date noting the original date.
|
||
|
# (The weekday might have been correct and the day of the month wrong).
|
||
|
# The input file is copied to a backup file, and a diff is printed.
|
||
|
# JP PIALASSE : added ? to handle date with one digit
|
||
|
|
||
|
[[ $# > 0 ]] || { echo "Usage: $0 packagename.spec ..."; exit 1; }
|
||
|
export LC_ALL=C
|
||
|
Www='[A-Z][a-z][a-z]'
|
||
|
Mmm='[A-Z][a-z][a-z]'
|
||
|
DD1='[0-9]'
|
||
|
DD0='[0-9]{1,2}'
|
||
|
DD='[0-9][0-9]'
|
||
|
YYYY='[12][90][0-9][0-9]'
|
||
|
WwwMmmDDYYYY="\($Www\) \($Mmm\) \($DD\) \($YYYY\)"
|
||
|
WwwMmmDD1YYYY="\($Www\) \($Mmm\) \($DD1\) \($YYYY\)"
|
||
|
WwwMmmDD0YYYY="\($Www\) \($Mmm\) \($DD0\) \($YYYY\)"
|
||
|
|
||
|
while [[ $# > 0 ]]; do
|
||
|
[[ -f "$1" ]] || { echo "$0: $1: no such file."; exit 1; }
|
||
|
changelog=$(mktemp --tmpdir=. changelog-XXXXXXXXX.txt)
|
||
|
sedscript=$(mktemp --tmpdir=. sedscript-XXXXXXXXX.sed)
|
||
|
printf "%s\n" \
|
||
|
"* $(date +'%a %b %d %Y') BogusDateBot" \
|
||
|
'- Eliminated rpmbuild "bogus date" warnings due to inconsistent weekday,' \
|
||
|
" by assuming the date is correct and changing the weekday." \
|
||
|
> "$changelog"
|
||
|
cat "$1" | \
|
||
|
grep -P "^\* $Www $Mmm $DD0 $YYYY" | \
|
||
|
grep -v '^echo' | \
|
||
|
sed 's/^\* '"$WwwMmmDDYYYY"'.*$/echo "$(date --date="\2 \3 \4" +"%a \1 %b %d %Y")"/' | \
|
||
|
sed 's/^\* '"$WwwMmmDD1YYYY"'.*$/echo "$(date --date="\2 0\3 \4" +"%a \1 %b %d %Y")"/' | \
|
||
|
grep '^echo' | \
|
||
|
bash | \
|
||
|
egrep -v "Mon Mon|Tue Tue|Wed Wed|Thu Thu|Fri Fri|Sat Sat|Sun Sun" | \
|
||
|
sort -u --key=5,5n --key=3,3M --key=4,4n | \
|
||
|
while read correct wrong Month Day Year; do
|
||
|
date="$Month $Day $Year"
|
||
|
alternatives="$wrong $Month $Day $Year --> "$(
|
||
|
for ((i = -6; i < 7; i++ )); do
|
||
|
date --date "$date $i day" +"%a %b %d %Y or ";
|
||
|
done | egrep "$date|$wrong" | tr -d \\n;
|
||
|
printf "%s" "....")
|
||
|
printf " %s\n" "$alternatives" >> "$changelog"
|
||
|
# re='^\* '"$wrong $Month $Day $Year"'\(.*\)$'
|
||
|
# subs='* '"$correct $Month $Day $Year"'\1\n '"$alternatives"
|
||
|
# printf "%s\n" "s:$re:$subs:" >> "$sedscript"
|
||
|
# if $Day only one digit
|
||
|
if [[ "$Day" =~ ^0([0-9])$ ]];
|
||
|
then echo "${BASH_REMATCH[1]}";
|
||
|
re='^\* '"$wrong $Month ${BASH_REMATCH[1]} $Year"'\(.*\)$'
|
||
|
subs='* '"$correct $Month $Day $Year"'\1\n '"$alternatives"
|
||
|
else
|
||
|
|
||
|
re='^\* '"$wrong $Month $Day $Year"'\(.*\)$'
|
||
|
subs='* '"$correct $Month $Day $Year"'\1\n '"$alternatives"
|
||
|
|
||
|
fi
|
||
|
printf "%s\n" "s:$re:$subs:" >> "$sedscript"
|
||
|
|
||
|
done
|
||
|
printf "\n" >> "$changelog"
|
||
|
backup="$1"-$(date --utc --ref="$1" +"%Y-%m-%d-%H-%M-%S-%NZ")
|
||
|
cp -vpf "$1" "$backup"
|
||
|
cat "$backup" | sed -f "$sedscript" -e '/^%changelog *$/ r '"$changelog" > "$1"
|
||
|
rm -f "$changelog" "$sedscript"
|
||
|
diff -u "$backup" "$1"
|
||
|
shift
|
||
|
done
|
||
|
|