2009-06-25 5 views
8

Para un script en el que estoy trabajando para implementar la bisección usando CVS, quiero averiguar qué es la 'marca de tiempo' del pago actual. En otras palabras, si estoy en una rama/etiqueta, quiero saber la última marca de tiempo que se envió a esa rama/etiqueta. Si estoy en cabeza, quiero saber la última marca de tiempo en la cabeza.Cómo obtener programáticamente la fecha de compromiso más reciente en un pago de CVS

Sé que esto no es 100% garantizado, ya que los cvs checkouts pueden tener diferentes archivos en diferentes marcas de tiempo/revisiones/..., pero una solución correcta en la mayoría de los casos está bien para mí.

Ingenuamente pensé que

cvs log -N | grep ^date: | sort | tail -n 1 | cut -d\; -f1 

iba a hacerlo, pero resulta que pasa a través de la totalidad cometer historia, para todas las ramas/etiquetas.

Respuesta

2

archivos CVS en una rama con diferentes marcas de tiempo, la precisión de elegir cualquier archivo para obtener la última información de tiempo de la rama apenas vale la pena.

Pero, puede mejorar si hay algún archivo que se cambiará a menudo. Por ejemplo, en una de mis bases, hay un archivo version.h que se actualiza en cada cambio de versión (menor o mayor). Eso se puede usar para información de tiempo en la versión actual (de nuevo no es preciso para todos los archivos en la rama, pero da una línea de fondo).

Por lo tanto, si usted sabe un archivo que le puede dar un valor línea de fondo,

cvs log path/to/version.h -r branch/tag | grep ^date | sort | tail -1 

le dará la última marca de tiempo para ese archivo.


Si se puede enumerar el conjunto completo de archivos de la base de este tipo,

find /base/dir -type f | grep -v CVS > files.txt 

continuación, puede recorrer los cvs comando anterior para cada archivo,

rm -f allFiles.txt 
for f in $(<files.txt); do cvs log $f ...etc... tail -1 >> allFiles.txt 
sort allFiles.txt | tail -1 

última línea del tipo le dará la fecha exacta para la confirmación más reciente.
Por desgracia, no obtendrá el nombre del archivo (que también se puede hacer con más fu)

+0

Eso fue lo único que pude encontrar también, más o menos. Al final, hice un registro cvs y lo analicé para todos los archivos. Hacerlo en cada archivo iba a ser muy lento. –

+0

Creo que esto no admite fechas fijas, es decir, todavía dará la fecha más reciente en lugar de la fecha elegida. – Penz

0

Una manera más rápida de obtener la última vez que se modificó un archivo (que se basa en la respuesta dada por nik) es:

cvs log -bd `date +%Y-%m-%d` ChangeLog | grep ^date 

Si desea obtener sólo la fecha, el uso:

cvs log -bd `date +%Y-%m-%d` ChangeLog | grep ^date | sed 's/date: \([^ ]*\).*/\1/' 

Este utiliza la bandera -b que utiliza la rama defecto y -d, que le permite decir CVS sólo se preocupan por la la última versión hasta un momento dado. La expresión `` pasa entonces la fecha actual como límite, lo que le proporciona la confirmación más reciente.

En el repositorio gnuplot CVS, el uso del indicador -d disminuye el tiempo de ejecución de ~ 4s a ~ 1.5s.

Cuestiones relacionadas