#!/usr/bin/awk -f
#
# fft.awk
#
# Usage : cvs log -r range 2>/dev/null | fft.awk [-v html=(yes|no)]
#
# Variables globales :
#
# ft[] : Hashtable des faits techniques
#
# ftfiles[] : Hashtable des fichiers impactes par les faits techniques
#
# ftrev[] : Hashtable des revisions des fichiers impactes par faits techniques
##
# fft_length -- retourne la longueur d'un tableau
#
# param array Tableau dont on veut connaitre la longueur
# return la longueur du tableau
##
function fft_length( array, s ) {
s=0
for( i in array ) {
s++;
}
return s
}
##
# fft_indexArray -- retourne le tableau des index d'une hashtable avec des indices entiers
#
# param array hashtable
# param new Tableau des clefs indice par des entiers
# return taille du tableau des indices
##
function fft_indexArray( array, new, s ) {
s=0
for( i in array ) {
new[s++] = i ;
}
return s
}
##
# fft_sort -- Tri du tableau en parametre
#
# param array Tableau a trier
##
function fft_sort( array, i, j, s ) {
s = fft_length(array)
for( i = 1 ; i < s ; i++ ) {
for( j = i ; j > 0 && array[j-1] > array[j] ; j-- ) {
fft_swap( array, j-1, j );
}
}
}
##
# fft_swap -- echange de deux valeurs d'un tableau
#
# param array Tableau contenant les valeurs
# param i Indice de la premiere valeur
# param j Indice de la seconde valeur
##
function fft_swap( array, i, j, t ) {
t = array[i]
array[i] = array[j]
array[j] = t
}
BEGIN {
if( html == "yes" ) {
g_header = "<HTLM><HEADER><TITLE>Listage des FT</TITLE></HEADER><BODY>" ;
g_table_header = "<TABLE border=1><TR><TH align=center>Référence ATOS<TH align=center>Référence MAP<TH align=center>Fichiers impactés" ;
g_table_row_begin = "<TR><TD> %s <TD> %s <TD><UL>\n"
g_table_row_files = "<LI> %s <FONT color=\"%s\">%s</FONT>\n"
g_table_row_end = "</UL></TR>"
g_table_foot = "</TABLE></BODY></HTML>"
} else {
g_header = "=== Fiche des Faits Techniques ===" ;
trait = g_table_header = sprintf("| %-16s | %-20s | %-128s |","Reference ATOS","Reference MAP", "Fichiers impactes");
gsub( /./, "-", trait )
g_table_header = sprintf("%s\n%s\n%s", trait, g_table_header, trait );
g_table_row = "| %-16s | %-20s | %-128s |\n"
g_table_foot = trait ;
}
print g_header ;
print g_table_header ;
}
/^RCS file:/ {
fichier = $3 ;
sameFile = 0
}
/^symbolic names:/ {
getline
newTagRev = $2
getline
oldTagRev = $2
if (newTagRev == oldTagRev)
{
sameFile = 1
}
}
/^revision/, /^---/ {
if( $1 == "revision" ) {
revision = $2
next ;
}
if (!sameFile && (revision != oldTagRev) && ( match( $0, /^FT / ) == 1 )) {
refAtos = $2 ;
refMap = $3 ;
ft[refAtos] = refMap
if( match( ftfiles[refAtos] , fichier) == 0 ) {
ftfiles[refAtos] = ftfiles[refAtos]"\t"fichier
}
ftrev[refAtos,fichier] = revision" "ftrev[refAtos,fichier]
}
}
END {
fft_indexArray(ft,idx)
fft_sort(idx)
s = fft_length(idx)
for( f = 0 ; f < s ; f++ ) {
z = idx[f]
refAtos = z
sub( /^.*=/, "", refAtos )
refMap = ft[z]
sub( /^.*=/, "", refMap )
if( html == "yes" ) {
printf( g_table_row_begin, refAtos, refMap );
split( ftfiles[z], fichiers, /\t/ );
for( file in fichiers ) {
if( fichiers[file] != "" ) {
nom = fichiers[file]
sub( /^.*trapeze_1.0\//, "", nom )
sub( /,v/, "", nom )
if( split(ftrev[z,fichiers[file]], bidon, / /) > 2 ) {
color="green"
} else {
color="blue"
}
printf( g_table_row_files, nom, color, ftrev[z,fichiers[file]] );
}
}
print g_table_row_end
} else {
printf( g_table_row, refAtos, refMap, "-" );
split( ftfiles[z], fichiers, /\t/ );
for( file in fichiers ) {
if( fichiers[file] != "" ) {
nom = fichiers[file]
sub( /^.*trapeze_1.0\//, "", nom )
sub( /,v/, "", nom )
printf( g_table_row, "", "", nom" "ftrev[z,fichiers[file]] );
}
}
}
}
print g_table_foot
}