Author: franck.ducas@free.fr
Date: Sun Aug 20 22:22:26 2006
New Revision: 4772
Log:
Script sous perl qui simule un svn checkout par différence entre le site local et le site distant.
Comment l'utiliser:
Téléchargez le script dans le répertoire où vous avez installez votre spip local
Puis éditez les 5 paramètres personnels à modifier
Rendez le script exécutable par un chmod u+x spip_svncheckout
enfin lancez la commande
./spip_svncheckout
Testé sous Linux où ça fonctionne. Pour Windows, il faut installer un svn ligne de commande et passer les commandes système en DOS. Je ne suis pas allé plus loin dans le test sous Windows...
Que fait ce script:
Il recherche le numéro svn sur votre serveur distant (grace aux fichiers .svn/entries) Si ce fichier n'existe pas il utilisera le numéro 6797 (correspondant a Spip 1.9 du 1er juillet)
Ensuite il récupère le numéro svn de votre version local
Puis on utilise la commande
svn log -r numéro_svn_distant:numéro_svn_distant
Grace à cette commande on détecte tous les fichiers ou répertoires ajoutés, modifiés ou supprimés entre les deux versions.
Ensuite à la dernière étape (si vous etes d'accord)
il tranfere tous les fichiers ajoutés ou modifié sur votre serveur distant
Il supprime sur votre serveur distant les fichiers devenus obsolètes.
Le script ne crée pas encore le fichier .svn/entries sur votre serveur distant de telle sorte que lors d'une prochaine utilisation il retrouve le numéro de la version svn...
Merci à rudjob qui est l'auteur de ce script.
Added:
_outils_/svnup2ftp/
_outils_/svnup2ftp/svnup2ftp
Added: _outils_/svnup2ftp/svnup2ftp
--- _outils_/svnup2ftp/svnup2ftp (added)
+++ _outils_/svnup2ftp/svnup2ftp Sun Aug 20 22:22:26 2006
@@ -0,0 +1,403 @@
+#!/usr/bin/perl -w
+
+#use strict;
+use warnings;
+use File::Spec ;
+use Net::FTP ;
+
+
+######## Parametres personnels à modifier ###################
+#rentrée de ces données ftp
+my $nom_du_serveur_ftp = "ftp\.votrehebergeur\.fr" ;
+my $login_ftp = "votreloginftp" ;
+my $motdepasse_ftp = "votremotdepasse" ;
+my $ftp_directory = "/www" ; #assez souvent c'est le répertoire /www
+#nom du répertoire temporaire
+my $local_rep = "/cheminversrepertoiretemporaire/tmpexportsvn/" ;
+######## Fin des parametres personnels à modifier ##############
+
+
+
+
+#nom du fichier récapitulatif de tous les changement
+my $file_transfer = "file_transfer" ;
+
+print "Vous utilisez actuellement un script Perl qui vous permettra de mettre à jour votre version de spip sur votre serveur distant en comparaison avec votre version local \n Etes-vous sur de vouloir continuez (y ou n):\n" ;
+my $var = <STDIN> ;
+chomp($var) ;
+if ($var ne 'y' ){
+ print(" Au revoir\n") ;
+ exit( 1 ) ;
+ }
+print "Création d'un répertoire temporaire $local_rep pour effectuer les manipulations de fichiers et permettre l'archivage des fichiers modifier et supprimer\n Ce répertoire sera supprimer à la fin du script (Pas besoin de stocker inutilement des données)
\n" ;
+if ( -e $local_rep) {
+ system( "rm -r $local_rep" ) ;
+}
+system( "mkdir -p $local_rep" ) ;
+
+print "Première connexion ftp à votre serveur ftp pour récupérer le numéro de la version svn de votre serveur distant\n Cette étape ne modifira aucun de vos fichiers\n" ;
+my $ftp = Net::FTP->new("$nom_du_serveur_ftp",
+ Debug => 0, Passive =>1 ) or die("non no");
+$ftp->login("$login_ftp","$motdepasse_ftp") or die "Cannot login ", $ftp->message;
+$ftp->cwd("$ftp_directory") or die "No such directorie";
+system( "mkdir -p $local_rep\.svn") ;
+$ftp->get("\.svn/entries" , "$local_rep\.svn/entries" ) ;
+$ftp->quit ;
+
+print "fin de connexion ftp\n " ;
+my $rev_num = 0 ;
+if ( -e "$local_rep\.svn/entries" ) {
+ open ( HANDLE, "$local_rep\.svn/entries" ) ;
+ while (<HANDLE>) {
+ chomp( $_ );
+ if ( $_ =~ /(\s*)committed-rev="(\d*).*/ ) {
+ if ( $rev_num < $2 ) {
+ $rev_num = $2 ;
+ }
+ }
+ }
+ close(HANDLE) ;
+print "Le numéro svn de votre version spip sur votre serveur distant est $rev_num\n";
+} else {
+ print "Aucun numéro svn n'a pas pu etre détecté sur votre serveur distant une des raisons possibles et que vous utilisez SPIP 1.9 du 1er juillet (numéro svn 6797 )\nPar défaut nous utiliserons le numéro de version 6797\nEtes vous d'accord (y ou n):\n" ;
+ $var = <STDIN> ;
+ chomp($var) ;
+ if ($var eq 'y' ) {
+ $rev_num = 6797 ;
+ } else {
+ print "Veuillez entrer le numéro svn désiré:\n" ;
+ $rev_num = <STDIN> ;
+ chomp($rev_num);
+ print "vous avez choisi le numéro: $rev_num\n" ;
+ if ( $rev_num gt 999999 ) {
+ print "le numéro de version svn n'est pas bon\n" ;
+ print "Voulez-vous réécrire un nouveau version svn:\n" ;
+ $rev_num = <STDIN> ;
+ chomp($rev_num);
+ print "vous avez choisi le numéro: $rev_num\n" ;
+ if ( $rev_num gt 999999 ) {
+ print "Désolé le numéro svn n'est toujours pas bon\nAbandon de la procédure\n";
+ print "Suppression du répertoire $local_rep \n" ;
+ system( "rm -r $local_rep" ) ;
+ exit( 1 ) ;
+ }
+
+ }
+ }
+}
+
+my $rev_num_local = 0 ;
+ open ( HANDLE, ".svn/entries" ) ;
+ while (<HANDLE>) {
+ chomp( $_ );
+ if ( $_ =~ /(\s*)committed-rev="(\d*).*/ ) {
+ if ( $rev_num_local < $2 ) {
+ $rev_num_local = $2 ;
+ }
+ }
+ }
+ close(HANDLE) ;
+
+if( $rev_num == $rev_num_local)
+ {
+print "Vous avez le meme spip installé en local et sur votre serveur distant\n Bonne journée" ;
+ system( "rm -r $local_rep" ) ;
+ exit( 1 ) ;
+ }
+
+## Imprimer svn log dans le fichier toto
+system( "svn log -r $rev_num:$rev_num_local -v > toto" ) ;
+
+my @fileadd = () ;
+my @repadd = () ;
+my @filedelete = () ;
+my @repdelete = () ;
+my @test = () ;
+my $test_rep ;
+my $i = 0 ;
+my $okd = 0 ;
+my $okdr = 0 ;
+my $oka = 0 ;
+my $okar = 0 ;
+my $typemodif = "" ;
+my $filename = "" ;
+sub add_file_or_directory{
+ my ($filename)=@_;
+ my @test = split(/\//, $filename );
+ $filename = join( '/', @test );
+
+ if ( $test[$#test] =~ /\w*\.\w*/ ) {
+ $test_rep = join( '/', @test[0..($#test-1)]);
+ $i = 0 ;
+ $okd = 0 ;
+ foreach my $v (@filedelete) {
+ if ($v=~ /^($filename)$/) {
+ $okd = 1 ;
+ }
+ last if($v=~ /^($filename)$/);
+ $i++ ;
+ }
+ if ( $okd == 1 ) {
+ @filedelete = @filedelete[0..($i-1),($i+1)..$#filedelete];
+ $i = 0 ;
+ $okdr = 0 ;
+ foreach my $v (@repdelete) {
+ if ($v=~ /^($test_rep)$/) {
+ $okdr = 1 ;
+ }
+ last if($v=~ /^($test_rep)$/);
+ $i++ ;
+ }
+ if ( $okdr == 1 ) {
+ @repdelete = @repdelete[0..($i-1),($i+1)..$#repdelete];
+ push( @repadd, $test_rep ) ;
+ }
+ } else {
+ $i = 0 ;
+ $oka = 0 ;
+ foreach my $v (@fileadd) {
+ if ($v=~ /^($filename)$/) {
+ $oka = 1 ;
+ }
+ last if($v=~ /^($filename)$/);
+ $i++ ;
+ }
+ if ( $oka == 0 ) {
+ push( @fileadd, $filename) ;
+ my $okar = 0 ;
+ foreach my $v (@repadd) {
+ if ($v=~ /^($test_rep)$/) {
+ $okar = 1 ;
+ }
+ last if($v=~ /^($test_rep)$/);
+ }
+ if ( $okar == 0 ) {
+ push( @repadd, $test_rep ) ;
+ }
+ }
+ }
+ } else {
+ $i = 0 ;
+ $okdr = 0 ;
+ foreach my $v (@repdelete) {
+ if ($v=~ /^($filename)$/) {
+ $okdr = 1 ;
+ }
+ last if($v=~ /^($filename)$/);
+ $i++ ;
+ }
+ if ( $okdr == 1 ) {
+ @repdelete = @repdelete[0..($i-1),($i+1)..$#repdelete];
+ push( @repadd, $filename ) ;
+ } else {
+ $okar = 0 ;
+ foreach my $v (@repadd) {
+ if ($v=~ /^($filename)$/) {
+ $okar = 1 ;
+ }
+ last if($v=~ /^($filename)$/);
+ }
+ if ( $okar == 0 ) {
+ push( @repadd, $filename ) ;
+ }
+ }
+ }
+}
+
+sub delete_file_or_directory{
+ my ($filename)=@_;
+ my @test = split(/\//, $filename );
+ $filename = join( '/', @test );
+ if ( $test[$#test] =~ /\w*\.\w*/ ) {
+ $test_rep = join( '/', @test[0..($#test-1)]);
+ $i = 0 ;
+ $oka = 0 ;
+ foreach my $v (@fileadd) {
+ if ($v=~ /^($filename)$/) {
+ $oka = 1 ;
+ }
+ last if($v=~ /^($filename)$/);
+ $i++ ;
+ }
+ if ( $oka == 1 ) {
+ @fileadd = @fileadd[0..($i-1),($i+1)..$#fileadd];
+ } else {
+ $okd = 0 ;
+ foreach my $v (@filedelete) {
+ if ($v=~ /^($filename)$/) {
+ $okd = 1 ;
+ }
+ last if($v=~ /^($filename)$/);
+ }
+ if ( $okd == 0 ) {
+ push( @filedelete, $filename) ;
+ }
+ }
+ } else {
+ $i = 0 ;
+ $okar = 0 ;
+ foreach my $v (@repadd) {
+ if ($v=~ /^($filename)$/) {
+ $okar = 1 ;
+ }
+ last if($v=~ /^($filename)$/);
+ $i++ ;
+ }
+ if ( $okar == 1 ) {
+ @repadd = @repadd[0..($i-1),($i+1)..$#repadd];
+ push( @repdelete, $filename ) ;
+ } else {
+ $okdr = 0 ;
+ foreach my $v (@repdelete) {
+ if ($v=~ /^($filename)$/) {
+ $okdr = 1 ;
+ }
+ last if($v=~ /^($filename)$/);
+ }
+ if ( $okdr == 0 ) {
+ push( @repdelete, $filename ) ;
+ }
+ }
+ }
+}
+
+## Analyse du svn log pour découvrir les fichiers ajoutés modifié ou supprimés
+open ( HANDLE, "toto" ) ;
+while (<HANDLE>) {
+ chomp( $_ );
+ # if ( $_ =~ /^(\s){3}(\w)?\s*(\S*)(\s\(de\s\/spip\/)?([0-9a-zA-Z\/]*)?.*/ ) {
+ if ( $_ =~ /^(\s){3}(\w)?\s*(\S*)(\s\(de\s\/spip\/)?([0-9a-zA-Z\/\.]*)?.*/ ) {
+ my $file = $3 ;
+ $typemodif = $2 ;
+ local @test1 = split(/\//, $file );
+ shift(@test1) ;
+ shift(@test1) ;
+ $file = join( '/', @test1 );
+
+ if ( $5 ne "" ) {
+ $filenameold = $5 ;
+ @testold = split(/\//, $filenameold );
[... 125 lines stripped ...]