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