On à eu un stagiaire ces jours-ci. Il a fait un script pour renommer des fichiers sous CVS (en conservant l'historique du fichier plus ses messages de commit).
Vu que notre projet est sous CVS et qu'on ne peut pas passer sous un autre gestionnaire de version, ça nous est utile (et on n'a pas trouvé d'équivalent sur internet).
Vos commentaires et améliorations sont les bienvenus.
Merci,
François.
#!/bin/bash
# Description: a tool to rename a file under CVS, without losing its history
# and log history information
# this software is under the GNU General Public License
# Authors: Valentin Barbe and François Bérenger
#set -x
#echo "usage: cvs_move [old_name] [new_name] [--dry-run]"
# we need at least 2 parameters
if [ $# == 3 ]
then
if [ $3 == "--dry-run" ]
then
echo "cvs_name: here is what I plan to do:"
DRY_RUN="echo"
fi
else
echo "I am going to really do cvs manipulations, are you sure? {yes|no}"
read ANSWER
if [ $ANSWER == "yes" ]
then
DRY_RUN=""
else
echo "cvs_name: here is what I plan to do:"
DRY_RUN="echo"
fi
fi
if [[ $# < 2 ]]
then
echo "I need 2 parameters!"
echo "usage: cvs_move [old_name] [new_name]"
exit 1
fi
# old_name must exist
if [ ! -e $1 ]
then
echo $1" does not exist!"
echo "usage: cvs_move [old_name] [new_name]"
exit 1
fi
# old_name directory must exist
if [ ! -e `dirname $2` ]
then
echo $2"'s directory doesn't exist!"
echo "usage: cvs_move [old_name] [new_name]"
exit 1
fi
#maximum version number
nb_version=`cvs status $1 | grep "Repository revision" | cut -f2`
#get this version
#get its log
#create a shorter log prefixed by "cvs_move:"
for i in `awk "BEGIN { for (i = 1.1 ; i <= \""$nb_version"\" ; i += 0.1) { printf (\"%.1f\n\", i) } }"`
do
cvs update -p -r $i $1 > $1.v$i
cvs log -h -r$i $1 > header_log
cvs log -r$i $1 > complete_log
comm -1 -3 header_log complete_log | awk '{print "cvs_move:"$0}' > log_$1.v$i
done
#create new_name and put it under CVS control
$DRY_RUN cp $1.v1.1 $2
here=`pwd`
there=`dirname $2`
$DRY_RUN cd $there ; $DRY_RUN cvs add `basename $2` ; $DRY_RUN cd $here
#commit each old_name version with its associated log into new_name
for i in `ls $1.v*`
do
$DRY_RUN cp -f $i $2
$DRY_RUN cd $there
$DRY_RUN cvs commit -F $here/log_$i `basename $2`
$DRY_RUN cd $here
done
# chapeau
Posté par Pierrick Le Gall (site web personnel) . Évalué à 3.
La seule info que tu perds, c'est l'heure du commit, je me trompe ?
[^] # Re: chapeau
Posté par phoenix (site web personnel) . Évalué à 1.
[^] # Re: chapeau
Posté par zaurus (site web personnel) . Évalué à 1.
Cf. la partie avec la commande "comm". Mais ça peut se faire.
En plus on préfère préfixer le nouveau log afin de voir que le fichier
a été renommé par un script (partie avec "awk '{print "cvs_move:"$0}'").
# SubVersion 1.0 est sorti \o/
Posté par Victor STINNER (site web personnel) . Évalué à 2.
(ah bon, c'est hors sujet ?)
[^] # Re: SubVersion 1.0 est sorti \o/
Posté par Vincent LE LIGEOUR . Évalué à 2.
[^] # Re: SubVersion 1.0 est sorti \o/
Posté par zaurus (site web personnel) . Évalué à 1.
2) tu perds l'info de la position original de ton fichier
3) si tu filtres moins méchemment que nous le log CVS, tu peux ne pas perdre d'info de log dans les nouveaux ficiers. De plus, on ne fait que rajouter des choses dans CVS donc on ne perd pas d'infos.
Sinon, pour ceux qui sont un peu frileux: le 'cvs remove' et les 'rm' des fichiers temporaires créés sont laissés à la charge de l'utilisateur, c'est trop critique pour laisser le script faire ça automatiquement. De plus il y a une option --dry-run pour
se rassurer avant de lancer pour de vrai.
[^] # Re: SubVersion 1.0 est sorti \o/
Posté par zaurus (site web personnel) . Évalué à 5.
Tu n'as peut-être (sûrement) pas la possibilité de faire changer le gestionnaire
de version de tout le projet (car pleins de scripts de déploiement impactés).
Donc c'est bien de dire que subversion c'est mieux et que les nouveaux projets
doivent peut-être utiliser ça plutôt que CVS, mais ce n'est pas ça qui t'aidera à bouger ton fichier sous CVS...
[^] # Commentaire supprimé
Posté par Anonyme . Évalué à 3.
Ce commentaire a été supprimé par l’équipe de modération.
[^] # Re: SubVersion 1.0 est sorti \o/
Posté par Xavier Teyssier (site web personnel) . Évalué à 3.
>impactés)
Des scripts de déploiement ????
Tout dépend de ce que tu stockes dans ton CVS.
Imagine :
Tu as un parc avec n serveurs, chacun avec des confs différentes.
Tu montes un CVS qui contient un répertoire par hostname existant, ce répertoire pouvant contenir les confs dont tu as besoin.
Ainsi, si tu dois réinstaller l'un des serveurs, pour le configurer, il te suffit de faire un export des bons fichiers, les bons fichiers pouvant être déterminé via le hostname.
Si en plus tu taggues correctement tes fichiers archivés, tu peux aisément réinstaller tes serveurs dans la version voulue.
Concernant cvs2svn, j'envisage de le tester sous peu. Conserve t'il correctement l'ensemble des tags ? Et conserve t'il correctement l'historique des dates ?
[^] # Commentaire supprimé
Posté par Anonyme . Évalué à 2.
Ce commentaire a été supprimé par l’équipe de modération.
[^] # Re: SubVersion 1.0 est sorti \o/
Posté par Victor STINNER (site web personnel) . Évalué à 2.
# Erreur de commentaire?
Posté par theflex . Évalué à 3.
# old_name directory must exist
if [ ! -e `dirname $2` ]
then
echo $2"'s directory doesn't exist!"
echo "usage: cvs_move [old_name] [new_name]"
exit 1
fi
C'est pas : # new_name directory must exist ?
Bah oui je chipote sur un commentaire, mais c'est troublant.
[^] # Re: Erreur de commentaire?
Posté par zaurus (site web personnel) . Évalué à 1.
D'ailleurs, il pourrait aussi y avoir une fonction
function usage ()
{
echo "usage: cvs_move [old_name] [new_name]"
}
à la place des echo "usage..." un peu partout
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.