: # This utility is used to generate a compact list of changes # for each release, bjm 2000-02-22 # Usage $0 file # all branches: # cvs log -d '>1999-06-14 00:00:00 GMT' . > log # # head: # cvs log -d'>2000-05-29 00:00:00 GMT' -b . # branch: # cvs log -d'>2000-05-29 00:00:00 GMT' -rREL7_3_STABLE` . # # date range # cvs log -d'2000-05-08 00:00:00 GMT<2000-05-29 00:00:00 GMT' -b . # # Remove TODO and FAQ logs if desired # if [ "X$1" == "X-h" ] then HTML="Y" shift else HTML="N" fi cat "$@" | # protect HTML input if in HTML mode if [ "$HTML" = "Y" ] then sed -e 's/\&/\&/g' \ -e 's//\>/g' \ -e 's/"/\"/g' else cat fi | # mark each line with a datetime and line number, for sorting and merging # We don't print anything from the -- or == line and the date: awk ' BEGIN {html="'"$HTML"'"; lineno = 0;} # store working directory $0 ~ /^Working file:/ {workingfile = "/" $3} ($0 ~ /^====*$/ || $0 ~ /^----*$/) \ { # print blank line to separate entries if (datetime != "") { if (html != "Y") printf ("%s| %10d|%s\n", datetime, lineno++, ""); printf ("%s| %10d|", datetime, lineno++); if (html != "Y") printf ("%s\n", "---"); else printf ("
\n"); } datetime=""; } # if we have a saved datetime, print filename, date line, and committer datetime != "" && $1 != "branches:" {printf ("%s| %10d| %s\n", datetime, lineno++, $0);} $1 == "date:" \ { # get entry date datetime=$2"-"$3 if (workingfile != "") { printf ("%s| %10d|", datetime, lineno++); if (html != "Y") printf ("%s\n", workingfile); else printf ("%s\n", workingfile); # output name of committer # remove semicolon from committers name gsub("/", "-", $2); gsub(";", "", $3); gsub(";", "", $5); printf ("%s| %10d|", datetime, lineno++); if (html != "Y") printf ("%78s\n", $5); else printf ("
%s %s
\n", $5, $2); } } /* clear working file */ $0 ~ /^====*$/ {workingfile=""}' | sort | cut -d'|' -f3 | cat | # collect duplicate narratives awk ' BEGIN { slot = 0; oldslot=0; save_working = ""; html="'"$HTML"'"} { # We have a filename, so we look at the previous # narrative to see if it is new narrative text. if ($0 ~ /^\// || $0 ~ />\//) { # If there are a different number of narrative # lines, they can not possibly be the same. if (slot != oldslot) same = "N"; else { same = "Y"; for (i=1; i <= slot; i++) { if (oldnarr[i] != narr[i]) { same = "N"; break; } } } # dump out the old narrative if it is new if (same == "N") { if (oldslot) for (i=1; i <= oldslot; i++) { print oldnarr[i]; if (html == "Y" && oldnarr[i] != "
" && oldnarr[i] !~ "^
"; } # save the current narrative for (i=1; i <= slot; i++) oldnarr[i] = narr[i]; oldslot = slot; } slot = 0; # dump out the previous filename print save_working; if (html == "Y") print "
"; # store the current filename for later printing save_working = $0; } else # we have a narrative line { # accumulate narrative narr[++slot] = $0; } } END { # If there are a different number of narrative # lines, they can not possibly be the same. if (slot != oldslot) same = "N"; else { same = "Y"; for (i=1; i <= slot; i++) { if (oldnarr[i] != narr[i]) { same = "N"; break; } } } # dump out the old narrative if it is new if (same == "N") { if (oldslot) for (i=1; i <= oldslot; i++) { print oldnarr[i]; if (html == "Y" && oldnarr[i] != "
" && oldnarr[i] !~ "^
"; } } # dump out the last filename print save_working; if (html == "Y") print "
"; # dump out the last narrative for (i=1; i <= slot; i++) { print narr[i]; if (html == "Y" && narr[i] != "
" && narr[i] !~ "^
"; } }' | # add HTML wrapper if [ "$HTML" = "Y" ] then echo "" echo "" echo "CVS" echo "" echo "" cat echo "" echo "" else cat fi