Journal renommage de fichier sous CVS [script bash]

Posté par  (site web personnel) .
Étiquettes : aucune
0
5
déc.
2006
Bonjour,

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  (site web personnel) . Évalué à 3.

    Fallait oser ! Bravo pour l'initiative. Pour ceux qui ne lisent pas le bash depuis la maternelle, le script stocke dans des fichiers temporaires les versions 1 à N du fichier sous son ancien nom ainsi que les logs de commit associés. Puis création du fichier sous son nouveau nom et N commits.

    La seule info que tu perds, c'est l'heure du commit, je me trompe ?
    • [^] # Re: chapeau

      Posté par  (site web personnel) . Évalué à 1.

      J'interprète de la même manière : Donc perte des infos de date et d'heure.
    • [^] # Re: chapeau

      Posté par  (site web personnel) . Évalué à 1.

      On ne prend pas le log complet du fichier original.
      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  (site web personnel) . Évalué à 2.

    http://linuxfr.org/2004/02/24/15522.html

    (ah bon, c'est hors sujet ?)
    • [^] # Re: SubVersion 1.0 est sorti \o/

      Posté par  . Évalué à 2.

      Pour avoir experimenté, rien de tel qu'un shell sur la machine CVS et de faire ses petits mv à la main (seul moyen si c'est bien fait de ne pas perdre d'infos)
      • [^] # Re: SubVersion 1.0 est sorti \o/

        Posté par  (site web personnel) . Évalué à 1.

        1) sur certains projets tu n'auras pas accès au serveur CVS et/ou tu n'auras pas les droits pour faire ce que tu dis
        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  (site web personnel) . Évalué à 5.

      Imagine que tu es sur un gros projet qui existe déjà depuis longtemps.
      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  . Évalué à 3.

        Ce commentaire a été supprimé par l’équipe de modération.

        • [^] # Re: SubVersion 1.0 est sorti \o/

          Posté par  (site web personnel) . Évalué à 3.

          >de version de tout le projet (car pleins de scripts de déploiement
          >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  . Évalué à 2.

            Ce commentaire a été supprimé par l’équipe de modération.

          • [^] # Re: SubVersion 1.0 est sorti \o/

            Posté par  (site web personnel) . Évalué à 2.

            Ce qui est assez fort avec cvs2svn, c'est qu'il arrive à recréer des commit atomiques svn. À ce que j'ai entendu, il utilise les dates de commit "tiens celui là est assez proche de l'autre là, on va dire que c'est le même commit" :-)
  • # Erreur de commentaire?

    Posté par  . Évalué à 3.

    Salut François, juste une petite remarque concernant un commentaire, dont j'ai l'impression qu'il possède une coquille...

    # 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  (site web personnel) . Évalué à 1.

      Oui, le commentaire est faux.
      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.