Skip to Content

Cambiar header de archivos fuentes .cs

A veces en la vida de un programador resulta que tropezamos con varios problemas donde una acción repetitiva esta presente cuando se tratan de pocos archivos es una tarea que puede realizarse manualmente pero se vuelve una pesadilla cuando se tratan mas de mil archivos, esta es la experiencia que puede resultar util a otras personas que tienen problemas similares.

En el trabajo cotidiano los proyectos se manejan con subversion, el código fuente debe estar correctamente comentado, ya sean .net, php o java. El problema se presento cuanto un proyecto en asp.net habian muchos archivos fuentes, clases en .net c# especificamente las cuales no tenián en encabezado necesario, lo que se requeria es que se debian colocar la cabecera en los muchos archivos faltantes quedando de esta forma:

/*
 * ${name}.cs
 *
 * Created on: ${date}
 *
 * Last updated :
 *    $Author$
 *    $Date$
 *    $Rev$
 * ____________________________________________________________________________
 * Texto adicional aqui
 * License
 * ____________________________________________________________________________
 *
 */

Las variables name, Author, Date, Rev pueden ser obtenidas desde subversión, esta tarea automatizada podia tambien ser resuelta desde una macro en .net pero como no tengo experiencia en ello use un shell scrip para linux ;) , por que desde linux tambien se puede trabajar con el repositorio y los archivos del mismo

La solucion:

#/bin/bash!
# header.sh
#
# Created on   : 2009-08-17
# Autor: Daniel Vasquez C.
#
# Example:
#   Changing the cs files:
#      header.sh cs headerfile.txt
 
tempFile="/tmp/header.tmp"
searchPattern="License" 
 
EXTENSION=$1
HEADER=$2
 
if [ -z "$EXTENSION" ]; then
 
    echo "Please provide the file extension to work on."
    echo "Such as: "
    echo "     header.sh  cs"
    exit -1;
fi
 
if [ -z "$HEADER" ]; then
 
    echo "Please provide the file header to work on."
    echo "Such as: "
    echo "     header.sh cs license.txt"
    exit -1;
fi
 
while read line; do result="$result"$(echo "$line")"\n"; done < $HEADER
 
LIST=`find -name "*.$EXTENSION" -type f -not -wholename "*.svn*"|xargs grep -L  $searchPattern $1`
#echo $LIST
 
for found in $LIST
do
awk 'NR==1{print "'"$result"'"}1' $found > $tempFile
mv $tempFile $found
if [ -e tmp ]
then rm tmp
fi
echo $found"...Done file"
done

La explicación es la siguiente:

Defino la ruta de un archivo temporal en linux:

tempFile=”/tmp/header.tmp”
searchPattern=”License”

Los argumentos de entrada del shell script:

EXTENSION=$1
HEADER=$2

Posteriormente se validan estos argumentos con if [ -z ]
Se lee el archivo donde se guarda la cabecera que sera insertada al comienzo del codigo fuente:

while read line; do result=”$result”$(echo “$line”)”\n”; done < $HEADER

La sentencia:

LIST=`find -name “*.$EXTENSION” -type f -not -wholename “*.svn*”|xargs grep -L $searchPattern $1`

encuentra todos los archivos con la extencion proporcionada en uno de los argumentos pero excluye los que son de directorios de la base de datos de subversion, con xargs -L buscamos los archivos que no tengan el patron buscado $searchPattern “License” esto significa que los archivos que ya tengan el encabezado no seran considerados en esa lista.

El codigo siguiente procesa cada archivo de la anterior lista; agregando el header que esta en la variable $result en la primera linea de cada archivo de codigo fuente, la salida es guardada en un archivo temporal, despues este archivo es movido y reemplaza al original sin la cabecera

for found in $LIST
do
awk ‘NR==1{print “‘”$result”‘”}1′ $found > $tempFile
mv $tempFile $found
if [ -e tmp ]
then rm tmp
fi

Con if [ -e tmp] se verifica si aun existe el archivo temporal, debe ser eliminado.

Este shell script aun puede mejorarse, pero el punto es que puede salvarte de apuros inclusive en otro tipo de tareas como en este caso inservar cabeceras en el codigo fuente de .net