2009-06-25 13 views
8

CVS Pour un script, je travaille à mettre en œuvre à l'aide bissectrice CVS, je veux savoir ce que l' « horodatage » est de la caisse actuelle. En d'autres termes, si je suis sur une branche/tag, je veux savoir quel est le dernier horodatage enregistré sur cette branche/tag. Si je suis en tête, je veux connaître le dernier horodatage de la tête.Comment obtenir programatically la dernière commettras date à une caisse

Je sais que ce n'est pas garanti à 100%, puisque les caisses cvs peuvent avoir des fichiers différents à différents horodatages/révisions/..., mais une solution correcte dans la plupart des cas est bien par moi.

Naïvement, je pensais que

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

allait le faire, mais il se trouve qu'il traverse toute l'histoire de commettre, pour toutes les branches/tags.

Répondre

2

fichiers CVS sur une branche étant à différents horodatages, la précision de choisir une fichier pour obtenir la dernière fois-info pour la branche vaut à peine.

Mais, il peut obtenir mieux s'il y a un fichier qui sera changé souvent. Pour , par exemple, dans l'une de mes bases, il y a un fichier version.h qui est mis à jour à chaque changement de version (mineur ou majeur). Cela peut être utilisé pour les informations de temps sur la version actuelle (encore une fois pas précis pour tous les fichiers dans la branche, mais il donne une ligne de fond).

Donc, si vous connaissez un fichier qui peut vous donner une valeur de ligne de fond,

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

vous donnera le dernier horodatage de ce fichier.


Si vous pouvez énumérer l'ensemble de fichiers de la base comme celui-ci,

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

alors, vous pouvez boucler la commande cvs ci-dessus pour chaque fichier,

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

Dernière ligne du genre vous donnera la date exacte pour le commit le plus récent.
Hélas, vous ne serez pas obtenir le nom du fichier (qui peut également être fait avec un peu plus fu)

+0

C'était la seule chose que je pouvais venir avec aussi, à peu près. À la fin, j'ai fait un journal de cvs cependant, et ai analysé cela pour tous les dossiers. Le faire sur chaque fichier allait être lent. –

+0

Je pense que cela ne supporte pas les dates collantes, c'est-à-dire qu'il donnera toujours la date la plus récente au lieu de la date choisie. – Penz

0

Une plus rapide façon d'obtenir la dernière fois qu'un fichier a été modifié (qui se base sur la réponse donnée par nik) est la suivante:

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

Si vous souhaitez obtenir que la date, l'utilisation:

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

Il utilise le drapeau -b qui utilise la branche par défaut et -d qui vous permet de dire CVS vous tenir compte que du dernière version jusqu'à un moment donné. L'expression `` passe ensuite la date du jour comme limite, vous donnant le commit le plus récent.

Sur le référentiel CVS gnuplot, en utilisant le drapeau -d diminue le temps d'exécution de ~ 4s à ~ 1.5s.

Questions connexes